diff --git a/FlatCAM.py b/FlatCAM.py index b1701a99..1fa50a24 100644 --- a/FlatCAM.py +++ b/FlatCAM.py @@ -1,15 +1,14 @@ import sys, os -from PyQt5 import sip -from PyQt5 import QtGui, QtCore, QtWidgets +from PyQt5 import QtWidgets from PyQt5.QtCore import QSettings, Qt from FlatCAMApp import App from multiprocessing import freeze_support -import VisPyPatches +from flatcamGUI import VisPyPatches if sys.platform == "win32": # cx_freeze 'module win32' workaround - import OpenGL.platform.win32 + pass def debug_trace(): """ diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 379020e0..fb9c7a2c 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -6,48 +6,38 @@ # MIT Licence # ############################################################ -import sys -import traceback import urllib.request, urllib.parse, urllib.error import getopt -import os import random -import logging import simplejson as json import lzma -import re -import os from stat import S_IREAD, S_IRGRP, S_IROTH import subprocess import tkinter as tk -from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport -from PyQt5.QtCore import QSettings +from PyQt5 import QtPrintSupport -import time # Just used for debugging. Double check before removing. import urllib.request, urllib.parse, urllib.error -import webbrowser from contextlib import contextmanager -from xml.dom.minidom import parseString as parse_xml_string -from copy import copy,deepcopy -import numpy as np -from datetime import datetime import gc +from xml.dom.minidom import parseString as parse_xml_string + ######################################## ## Imports part of FlatCAM ## ######################################## from ObjectCollection import * from FlatCAMObj import * -from PlotCanvas import * -from FlatCAMGUI import * +from flatcamGUI.PlotCanvas import * +from flatcamGUI.FlatCAMGUI import * from FlatCAMCommon import LoudDict from FlatCAMPostProc import load_postprocessors + from FlatCAMEditor import FlatCAMGeoEditor, FlatCAMExcEditor from FlatCAMProcess import * from FlatCAMWorkerStack import WorkerStack -from VisPyVisuals import Color +from flatcamGUI.VisPyVisuals import Color from vispy.gloo.util import _screenshot from vispy.io import write_png @@ -56,12 +46,19 @@ from flatcamTools import * from multiprocessing import Pool import tclCommands -# from ParseFont import * +import gettext +import FlatCAMTranslation as fcTranslate +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext ######################################## ## App ## ######################################## + + class App(QtCore.QObject): """ The main application class. The constructor starts the GUI. @@ -93,8 +90,8 @@ class App(QtCore.QObject): log.addHandler(handler) # Version - version = 8.911 - version_date = "2019/03/4" + version = 8.912 + version_date = "2019/03/17" beta = True # current date now @@ -302,20 +299,29 @@ class App(QtCore.QObject): self.defaults_form_fields = { # General App "units": self.ui.general_defaults_form.general_app_group.units_radio, + "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio, + "global_language": self.ui.general_defaults_form.general_app_group.language_cb, + "global_shell_at_startup": self.ui.general_defaults_form.general_app_group.shell_startup_cb, "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb, "global_send_stats": self.ui.general_defaults_form.general_app_group.send_stats_cb, + "global_pan_button": self.ui.general_defaults_form.general_app_group.pan_button_radio, + "global_mselect_key": self.ui.general_defaults_form.general_app_group.mselect_radio, + "global_project_at_startup": self.ui.general_defaults_form.general_app_group.project_startup_cb, "global_project_autohide": self.ui.general_defaults_form.general_app_group.project_autohide_cb, - "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio, - "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_combo, - "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb, "global_toggle_tooltips": self.ui.general_defaults_form.general_app_group.toggle_tooltips_cb, - # General GUI + "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_combo, + "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb, + + # General GUI Preferences "global_gridx": self.ui.general_defaults_form.general_gui_group.gridx_entry, "global_gridy": self.ui.general_defaults_form.general_gui_group.gridy_entry, "global_snap_max": self.ui.general_defaults_form.general_gui_group.snap_max_dist_entry, + "global_workspace": self.ui.general_defaults_form.general_gui_group.workspace_cb, + "global_workspaceT": self.ui.general_defaults_form.general_gui_group.wk_cb, + "global_plot_fill": self.ui.general_defaults_form.general_gui_group.pf_color_entry, "global_plot_line": self.ui.general_defaults_form.general_gui_group.pl_color_entry, "global_sel_fill": self.ui.general_defaults_form.general_gui_group.sf_color_entry, @@ -324,11 +330,9 @@ class App(QtCore.QObject): "global_alt_sel_line": self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry, "global_draw_color": self.ui.general_defaults_form.general_gui_group.draw_color_entry, "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry, - "global_pan_button": self.ui.general_defaults_form.general_app_group.pan_button_radio, - "global_mselect_key": self.ui.general_defaults_form.general_app_group.mselect_radio, - # "global_pan_with_space_key": self.ui.general_defaults_form.general_gui_group.pan_with_space_cb, - "global_workspace": self.ui.general_defaults_form.general_gui_group.workspace_cb, - "global_workspaceT": self.ui.general_defaults_form.general_gui_group.wk_cb, + + # General GUI Settings + "global_hover": self.ui.general_defaults_form.general_gui_set_group.hover_cb, # Gerber General "gerber_plot": self.ui.gerber_defaults_form.gerber_gen_group.plot_cb, @@ -549,21 +553,40 @@ class App(QtCore.QObject): self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name) + ############################# + #### LOAD LANGUAGES #### + ############################# + + self.languages = fcTranslate.load_languages() + for name in sorted(self.languages.values()): + self.ui.general_defaults_form.general_app_group.language_cb.addItem(name) + self.defaults = LoudDict() self.defaults.set_change_callback(self.on_defaults_dict_change) # When the dictionary changes. self.defaults.update({ + # Global APP Preferences "global_serial": 0, "global_stats": {}, "units": "IN", + "global_app_level": 'b', + "global_language": 'English', "global_version_check": True, "global_send_stats": True, + "global_pan_button": '2', + "global_mselect_key": 'Control', "global_project_at_startup": False, "global_project_autohide": True, - "global_app_level": 'b', + "global_toggle_tooltips": True, + "global_compression_level": 3, + "global_save_compressed": True, + # Global GUI Preferences "global_gridx": 0.0393701, "global_gridy": 0.0393701, "global_snap_max": 0.001968504, + "global_workspace": False, + "global_workspaceT": "A4P", + "global_grid_context_menu": { 'in': [0.01, 0.02, 0.025, 0.05, 0.1], 'mm': [0.1, 0.2, 0.5, 1, 2.54] @@ -577,11 +600,7 @@ class App(QtCore.QObject): "global_alt_sel_line": '#006E20BF', "global_draw_color": '#FF0000', "global_sel_draw_color": '#0000FF', - "global_pan_button": '2', - "global_mselect_key": 'Control', - # "global_pan_with_space_key": False, - "global_workspace": False, - "global_workspaceT": "A4P", + "global_toolbar_view": 127, "global_background_timeout": 300000, # Default value is 5 minutes @@ -605,9 +624,6 @@ class App(QtCore.QObject): "global_shell_shape": [500, 300], # Shape of the shell in pixels. "global_shell_at_startup": False, # Show the shell at startup. "global_recent_limit": 10, # Max. items in recent list. - "global_compression_level": 3, - "global_save_compressed": True, - "global_toggle_tooltips": True, "fit_key": 'V', "zoom_out_key": '-', @@ -617,6 +633,9 @@ class App(QtCore.QObject): "global_point_clipboard_format": "(%.4f, %.4f)", "global_zdownrate": None, + # General GUI Settings + "global_hover": True, + # Gerber General "gerber_plot": True, "gerber_solid": True, @@ -810,9 +829,30 @@ class App(QtCore.QObject): ############################### ### Load defaults from file ### + ############################### + if user_defaults: self.load_defaults(filename='current_defaults') + ############################ + ##### APPLY APP LANGUAGE ### + ############################ + + ret_val = fcTranslate.apply_language('strings') + + if ret_val == "no language": + self.inform.emit(_("[ERROR] Could not find the Language files. The App strings are missing.")) + log.debug("Could not find the Language files. The App strings are missing.") + else: + # make the current language the current selection on the language combobox + self.ui.general_defaults_form.general_app_group.language_cb.setCurrentText(ret_val) + log.debug("App.__init__() --> Applied %s language." % str(ret_val).capitalize()) + + + ################################### + ### CREATE UNIQUE SERIAL NUMBER ### + ################################### + chars = 'abcdefghijklmnopqrstuvwxyz0123456789' if self.defaults['global_serial'] == 0 or len(str(self.defaults['global_serial'])) < 10: self.defaults['global_serial'] = ''.join([random.choice(chars) for i in range(20)]) @@ -1337,7 +1377,9 @@ class App(QtCore.QObject): ### GUI PREFERENCES SIGNALS ### ############################### self.ui.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units - self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(self.on_language_apply) + self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect( + lambda: fcTranslate.on_language_apply_click(self, restart=True) + ) self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(self.on_toggle_units) ############################### @@ -1561,6 +1603,9 @@ class App(QtCore.QObject): # Variable to store the status of the code editor self.toggle_codeeditor = False + # Variable to be used for situations when we don't want the LMB click on canvas to auto open the Project Tab + self.click_noproject = False + self.cursor = None # Variable to store the GCODE that was edited @@ -1582,7 +1627,7 @@ class App(QtCore.QObject): self.poly_not_cleared = False # VisPy visuals - self.hover_shapes = ShapeCollection(parent=self.plotcanvas.vispy_canvas.view.scene, layers=7) + self.hover_shapes = ShapeCollection(parent=self.plotcanvas.vispy_canvas.view.scene, layers=1) self.isHovering = False self.notHovering = True @@ -1596,7 +1641,13 @@ class App(QtCore.QObject): if not factory_defaults: self.save_factory_defaults(silent=False) # ONLY AT FIRST STARTUP INIT THE GUI LAYOUT TO 'COMPACT' - self.on_layout(index=None, lay='compact') + initial_lay = 'compact' + self.on_layout(index=None, lay=initial_lay) + # Set the combobox in Preferences to the current layout + idx = self.app.ui.general_defaults_form.general_gui_set_group.layout_combo.findText( + initial_lay.capitalize() + ) + self.app.ui.general_defaults_form.general_gui_set_group.layout_combo.setCurrentIndex(idx) factory_file.close() # and then make the factory_defaults.FlatConfig file read_only os it can't be modified after creation. @@ -1618,7 +1669,7 @@ class App(QtCore.QObject): project_name = str(argument) if project_name == "": - self.inform.emit("Open cancelled.") + self.inform.emit(_("Open cancelled.")) else: # self.open_project(project_name) run_from_arg = True @@ -1632,7 +1683,7 @@ class App(QtCore.QObject): file_name = str(argument) if file_name == "": - self.inform.emit("Open Config file failed.") + self.inform.emit(_("Open Config file failed.")) else: # run_from_arg = True # self.worker_task.emit({'fcn': self.open_config_file, @@ -1702,11 +1753,11 @@ class App(QtCore.QObject): before=self.ui.menueditorigin) self.cutout_tool = CutOut(self) - self.cutout_tool.install(icon=QtGui.QIcon('share/cut16.png'), pos=self.ui.menutool, + self.cutout_tool.install(icon=QtGui.QIcon('share/cut16_bis.png'), pos=self.ui.menutool, before=self.measurement_tool.menuAction) self.ncclear_tool = NonCopperClear(self) - self.ncclear_tool.install(icon=QtGui.QIcon('share/flatcam_icon16.png'), pos=self.ui.menutool, + self.ncclear_tool.install(icon=QtGui.QIcon('share/ncc16.png'), pos=self.ui.menutool, before=self.measurement_tool.menuAction, separator=True) self.paint_tool = ToolPaint(self) @@ -1784,17 +1835,17 @@ class App(QtCore.QObject): self.ui.shell_btn.triggered.connect(self.on_toggle_shell) # Tools Toolbar Signals - self.ui.dblsided_btn.triggered.connect(lambda: self.dblsidedtool.run()) - self.ui.cutout_btn.triggered.connect(lambda: self.cutout_tool.run()) - self.ui.ncc_btn.triggered.connect(lambda: self.ncclear_tool.run()) - self.ui.paint_btn.triggered.connect(lambda: self.paint_tool.run()) + self.ui.dblsided_btn.triggered.connect(lambda: self.dblsidedtool.run(toggle=True)) + self.ui.cutout_btn.triggered.connect(lambda: self.cutout_tool.run(toggle=True)) + self.ui.ncc_btn.triggered.connect(lambda: self.ncclear_tool.run(toggle=True)) + self.ui.paint_btn.triggered.connect(lambda: self.paint_tool.run(toggle=True)) - self.ui.panelize_btn.triggered.connect(lambda: self.panelize_tool.run()) - self.ui.film_btn.triggered.connect(lambda: self.film_tool.run()) - self.ui.solder_btn.triggered.connect(lambda: self.paste_tool.run()) + self.ui.panelize_btn.triggered.connect(lambda: self.panelize_tool.run(toggle=True)) + self.ui.film_btn.triggered.connect(lambda: self.film_tool.run(toggle=True)) + self.ui.solder_btn.triggered.connect(lambda: self.paste_tool.run(toggle=True)) - self.ui.calculators_btn.triggered.connect(lambda: self.calculator_tool.run()) - self.ui.transform_btn.triggered.connect(lambda: self.transform_tool.run()) + self.ui.calculators_btn.triggered.connect(lambda: self.calculator_tool.run(toggle=True)) + self.ui.transform_btn.triggered.connect(lambda: self.transform_tool.run(toggle=True)) def object2editor(self): """ @@ -1808,12 +1859,16 @@ class App(QtCore.QObject): self.ui.popmenu_edit.setVisible(False) self.ui.popmenu_save.setVisible(True) + # adjust the status of the menu entries related to the editor + self.ui.menueditedit.setDisabled(True) + self.ui.menueditok.setDisabled(False) + edited_object = self.collection.get_active() if isinstance(edited_object, FlatCAMGeometry): # for now, if the Geometry is MultiGeo do not allow the editing if edited_object.multigeo is True: - self.inform.emit("[WARNING_NOTCL]Editing a MultiGeo Geometry is not possible for the moment.") + self.inform.emit(_("[WARNING_NOTCL] Editing a MultiGeo Geometry is not possible for the moment.")) return # store the Geometry Editor Toolbar visibility before entering in the Editor @@ -1834,7 +1889,7 @@ class App(QtCore.QObject): # set call source to the Editor we go into self.call_source = 'exc_editor' else: - self.inform.emit("[WARNING_NOTCL]Select a Geometry or Excellon Object to edit.") + self.inform.emit(_("[WARNING_NOTCL]Select a Geometry or Excellon Object to edit.")) return # make sure that we can't select another object while in Editor Mode: @@ -1845,7 +1900,7 @@ class App(QtCore.QObject): self.ui.plot_tab_area.setTabText(0, "EDITOR Area") self.ui.plot_tab_area.protectTab(0) - self.inform.emit("[WARNING_NOTCL]Editor is activated ...") + self.inform.emit(_("[WARNING_NOTCL]Editor is activated ...")) self.should_we_save = True @@ -1857,56 +1912,62 @@ class App(QtCore.QObject): """ self.report_usage("editor2object()") - # adjust the visibility of some of the canvas context menu - self.ui.popmenu_edit.setVisible(True) - self.ui.popmenu_save.setVisible(False) + # adjust the status of the menu entries related to the editor + self.ui.menueditedit.setDisabled(False) + self.ui.menueditok.setDisabled(True) - edited_obj = self.collection.get_active() - obj_type = "" + # do not update a geometry or excellon object unless it comes out of an editor + if self.call_source != 'app': + # adjust the visibility of some of the canvas context menu + self.ui.popmenu_edit.setVisible(True) + self.ui.popmenu_save.setVisible(False) - if isinstance(edited_obj, FlatCAMGeometry): - obj_type = "Geometry" - self.geo_editor.update_fcgeometry(edited_obj) - self.geo_editor.update_options(edited_obj) - self.geo_editor.deactivate() + edited_obj = self.collection.get_active() + obj_type = "" - # update the geo object options so it is including the bounding box values - try: - xmin, ymin, xmax, ymax = edited_obj.bounds() - edited_obj.options['xmin'] = xmin - edited_obj.options['ymin'] = ymin - edited_obj.options['xmax'] = xmax - edited_obj.options['ymax'] = ymax - except AttributeError: - self.inform.emit("[WARNING] Object empty after edit.") + if isinstance(edited_obj, FlatCAMGeometry): + obj_type = "Geometry" + self.geo_editor.update_fcgeometry(edited_obj) + self.geo_editor.update_options(edited_obj) + self.geo_editor.deactivate() - elif isinstance(edited_obj, FlatCAMExcellon): - obj_type = "Excellon" - self.exc_editor.update_fcexcellon(edited_obj) - self.exc_editor.update_options(edited_obj) - self.exc_editor.deactivate() + # update the geo object options so it is including the bounding box values + try: + xmin, ymin, xmax, ymax = edited_obj.bounds() + edited_obj.options['xmin'] = xmin + edited_obj.options['ymin'] = ymin + edited_obj.options['xmax'] = xmax + edited_obj.options['ymax'] = ymax + except AttributeError: + self.inform.emit(_("[WARNING] Object empty after edit.")) - else: - self.inform.emit("[WARNING_NOTCL]Select a Geometry or Excellon Object to update.") - return + elif isinstance(edited_obj, FlatCAMExcellon): + obj_type = "Excellon" + self.exc_editor.update_fcexcellon(edited_obj) + self.exc_editor.update_options(edited_obj) + self.exc_editor.deactivate() - # if notebook is hidden we show it - if self.ui.splitter.sizes()[0] == 0: - self.ui.splitter.setSizes([1, 1]) + else: + self.inform.emit(_("[WARNING_NOTCL]Select a Geometry or Excellon Object to update.")) + return - # restore the call_source to app - self.call_source = 'app' + # if notebook is hidden we show it + if self.ui.splitter.sizes()[0] == 0: + self.ui.splitter.setSizes([1, 1]) - edited_obj.plot() - self.ui.plot_tab_area.setTabText(0, "Plot Area") - self.ui.plot_tab_area.protectTab(0) - self.inform.emit("[selected] %s is updated, returning to App..." % obj_type) + # restore the call_source to app + self.call_source = 'app' - # reset the Object UI to original settings - # edited_obj.set_ui(edited_obj.ui_type()) - # edited_obj.build_ui() - # make sure that we reenable the selection on Project Tab after returning from Editor Mode: - self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) + edited_obj.plot() + self.ui.plot_tab_area.setTabText(0, "Plot Area") + self.ui.plot_tab_area.protectTab(0) + self.inform.emit(_("[selected] %s is updated, returning to App...") % obj_type) + + # reset the Object UI to original settings + # edited_obj.set_ui(edited_obj.ui_type()) + # edited_obj.build_ui() + # make sure that we reenable the selection on Project Tab after returning from Editor Mode: + self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) def get_last_folder(self): @@ -2223,7 +2284,7 @@ class App(QtCore.QObject): f.close() except IOError: self.log.error("Could not load defaults file.") - self.inform.emit("[ERROR] Could not load defaults file.") + self.inform.emit(_("[ERROR] Could not load defaults file.")) # in case the defaults file can't be loaded, show all toolbars self.defaults["global_toolbar_view"] = 255 return @@ -2235,7 +2296,7 @@ class App(QtCore.QObject): self.defaults["global_toolbar_view"] = 255 e = sys.exc_info()[0] App.log.error(str(e)) - self.inform.emit("[ERROR] Failed to parse defaults file.") + self.inform.emit(_("[ERROR] Failed to parse defaults file.")) return self.defaults.update(defaults) log.debug("FlatCAM defaults loaded from: %s" % filename) @@ -2256,15 +2317,15 @@ class App(QtCore.QObject): filter = "Config File (*.FlatConfig);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Import FlatCAM Preferences", + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import FlatCAM Preferences"), directory=self.data_path, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Import FlatCAM Preferences", filter=filter) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import FlatCAM Preferences"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]FlatCAM preferences import cancelled.") + self.inform.emit(_("[WARNING_NOTCL]FlatCAM preferences import cancelled.")) else: try: f = open(filename) @@ -2272,7 +2333,7 @@ class App(QtCore.QObject): f.close() except IOError: self.log.error("Could not load defaults file.") - self.inform.emit("[ERROR_NOTCL] Could not load defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Could not load defaults file.")) return try: @@ -2280,10 +2341,10 @@ class App(QtCore.QObject): except: e = sys.exc_info()[0] App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL] Failed to parse defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to parse defaults file.")) return self.defaults.update(defaults_from_file) - self.inform.emit("[success]Imported Defaults from %s" %filename) + self.inform.emit(_("[success]Imported Defaults from %s") %filename) def on_export_preferences(self): @@ -2292,18 +2353,18 @@ class App(QtCore.QObject): filter = "Config File (*.FlatConfig);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export FlatCAM Preferences", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export FlatCAM Preferences"), directory=self.data_path + '/preferences_' + self.date.replace('-', ''), filter=filter ) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export FlatCAM Preferences", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export FlatCAM Preferences"), filter=filter) filename = str(filename) defaults_from_file = {} if filename == "": - self.inform.emit("[WARNING_NOTCL]FlatCAM preferences export cancelled.") + self.inform.emit(_("[WARNING_NOTCL]FlatCAM preferences export cancelled.")) return else: try: @@ -2319,7 +2380,7 @@ class App(QtCore.QObject): e = sys.exc_info()[0] App.log.error("Could not load defaults file.") App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL]Could not load defaults file.") + self.inform.emit(_("[ERROR_NOTCL]Could not load defaults file.")) return try: @@ -2338,7 +2399,7 @@ class App(QtCore.QObject): json.dump(defaults_from_file, f) f.close() except: - self.inform.emit("[ERROR_NOTCL] Failed to write defaults to file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to write defaults to file.")) return self.file_saved.emit("preferences", filename) @@ -2390,7 +2451,7 @@ class App(QtCore.QObject): f = open(self.data_path + '/recent.json', 'w') except IOError: App.log.error("Failed to open recent items file for writing.") - self.inform.emit('[ERROR_NOTCL]Failed to open recent files file for writing.') + self.inform.emit(_('[ERROR_NOTCL]Failed to open recent files file for writing.')) return #try: @@ -2475,8 +2536,8 @@ class App(QtCore.QObject): try: return_value = initialize(obj, self) except Exception as e: - msg = "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" - msg += "Object (%s) failed because: %s \n\n" % (kind, str(e)) + msg = _("[ERROR_NOTCL] An internal error has ocurred. See shell.\n") + msg += _("Object ({kind}) failed because: {error} \n\n").format(kind=kind, error=str(e)) msg += traceback.format_exc() self.inform.emit(msg) @@ -2496,7 +2557,7 @@ class App(QtCore.QObject): # Check units and convert if necessary # This condition CAN be true because initialize() can change obj.units if self.options["units"].upper() != obj.units.upper(): - self.inform.emit("Converting units to " + self.options["units"] + ".") + self.inform.emit(_("Converting units to ") + self.options["units"] + ".") obj.convert_units(self.options["units"]) t3 = time.time() self.log.debug("%f seconds converting units." % (t3 - t2)) @@ -2554,17 +2615,17 @@ class App(QtCore.QObject): # self.inform.emit('[selected] %s created & selected: %s' % # (str(obj.kind).capitalize(), str(obj.options['name']))) if obj.kind == 'gerber': - self.inform.emit('[selected]%s created/selected: %s' % - (obj.kind.capitalize(), 'green', str(obj.options['name']))) + self.inform.emit(_('[selected]{kind} created/selected: {name}').format( + kind=obj.kind.capitalize(), color='green', name=str(obj.options['name']))) elif obj.kind == 'excellon': - self.inform.emit('[selected]%s created/selected: %s' % - (obj.kind.capitalize(), 'brown', str(obj.options['name']))) + self.inform.emit(_('[selected]{kind} created/selected: {name}').format( + kind=obj.kind.capitalize(), color='brown', name=str(obj.options['name']))) elif obj.kind == 'cncjob': - self.inform.emit('[selected]%s created/selected: %s' % - (obj.kind.capitalize(), 'blue', str(obj.options['name']))) + self.inform.emit(_('[selected]{kind} created/selected: {name}').format( + kind=obj.kind.capitalize(), color='blue', name=str(obj.options['name']))) elif obj.kind == 'geometry': - self.inform.emit('[selected]%s created/selected: %s' % - (obj.kind.capitalize(), 'red', str(obj.options['name']))) + self.inform.emit(_('[selected]{kind} created/selected: {name}').format( + kind=obj.kind.capitalize(), color='red', name=str(obj.options['name']))) # update the SHELL auto-completer model with the name of the new object self.myKeywords.append(obj.options['name']) @@ -2746,7 +2807,7 @@ class App(QtCore.QObject): e = sys.exc_info()[0] App.log.error("Could not load defaults file.") App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL] Could not load defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Could not load defaults file.")) return try: @@ -2755,7 +2816,7 @@ class App(QtCore.QObject): e = sys.exc_info()[0] App.log.error("Failed to parse defaults file.") App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL] Failed to parse defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to parse defaults file.")) return # Update options @@ -2769,7 +2830,7 @@ class App(QtCore.QObject): json.dump(defaults, f, default=to_dict, indent=2, sort_keys=True) f.close() except: - self.inform.emit("[ERROR_NOTCL] Failed to write defaults to file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to write defaults to file.")) return # Save the toolbar view @@ -2801,7 +2862,7 @@ class App(QtCore.QObject): self.defaults["global_toolbar_view"] = tb_status if not silent: - self.inform.emit("[success]Defaults saved.") + self.inform.emit(_("[success]Defaults saved.")) def save_factory_defaults(self, silent=False): """ @@ -2822,7 +2883,7 @@ class App(QtCore.QObject): e = sys.exc_info()[0] App.log.error("Could not load factory defaults file.") App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL] Could not load factory defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Could not load factory defaults file.")) return try: @@ -2831,7 +2892,7 @@ class App(QtCore.QObject): e = sys.exc_info()[0] App.log.error("Failed to parse factory defaults file.") App.log.error(str(e)) - self.inform.emit("[ERROR_NOTCL] Failed to parse factory defaults file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to parse factory defaults file.")) return # Update options @@ -2845,20 +2906,19 @@ class App(QtCore.QObject): json.dump(factory_defaults, f_f_def_s, default=to_dict, indent=2, sort_keys=True) f_f_def_s.close() except: - self.inform.emit("[ERROR_NOTCL] Failed to write factory defaults to file.") + self.inform.emit(_("[ERROR_NOTCL] Failed to write factory defaults to file.")) return if silent is False: - self.inform.emit("Factory defaults saved.") + self.inform.emit(_("Factory defaults saved.")) def final_save(self): if self.should_we_save and self.collection.get_list(): msgbox = QtWidgets.QMessageBox() - # msgbox.setText("Save changes ...") - msgbox.setText("There are files/objects modified in FlatCAM. " + msgbox.setText(_("There are files/objects modified in FlatCAM. " "\n" - "Do you want to Save the project?") - msgbox.setWindowTitle("Save changes") + "Do you want to Save the project?")) + msgbox.setWindowTitle(_("Save changes")) msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png')) msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Cancel) @@ -2871,8 +2931,19 @@ class App(QtCore.QObject): elif response == QtWidgets.QMessageBox.Cancel: self.should_we_quit = False return + self.save_defaults() - log.debug("Application defaults saved ... Exit event.") + log.debug("App.final_save() --> App Defaults saved.") + + # save toolbar state to file + settings = QSettings("Open Source", "FlatCAM") + settings.setValue('saved_gui_state', self.ui.saveState()) + settings.setValue('maximized_gui', self.ui.isMaximized()) + + # This will write the setting to the platform specific storage. + del settings + log.debug("App.final_save() --> App UI state saved.") + QtWidgets.qApp.quit() def on_toggle_shell(self): """ @@ -2907,12 +2978,12 @@ class App(QtCore.QObject): # if len(set(geo_type_list)) == 1 means that all list elements are the same if len(set(geo_type_list)) != 1: - self.inform.emit("[ERROR] Failed join. The Geometry objects are of different types.\n" + self.inform.emit(_("[ERROR] Failed join. The Geometry objects are of different types.\n" "At least one is MultiGeo type and the other is SingleGeo type. A possibility is to " "convert from one to another and retry joining \n" "but in the case of converting from MultiGeo to SingleGeo, informations may be lost and " "the result may not be what was expected. \n" - "Check the generated GCODE.") + "Check the generated GCODE.")) return # if at least one True object is in the list then due of the previous check, all list elements are True objects @@ -2948,7 +3019,7 @@ class App(QtCore.QObject): for obj in objs: if not isinstance(obj, FlatCAMExcellon): - self.inform.emit("[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects.") + self.inform.emit(_("[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects.")) return def initialize(obj, app): @@ -2970,7 +3041,7 @@ class App(QtCore.QObject): for obj in objs: if not isinstance(obj, FlatCAMGerber): - self.inform.emit("[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects.") + self.inform.emit(_("[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects.")) return def initialize(obj, app): @@ -2985,11 +3056,11 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("[ERROR_NOTCL]Failed. Select a Geometry Object and try again.") + self.inform.emit(_("[ERROR_NOTCL]Failed. Select a Geometry Object and try again.")) return if not isinstance(obj, FlatCAMGeometry): - self.inform.emit("[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" % type(obj)) + self.inform.emit(_("[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s") % type(obj)) return obj.multigeo = True @@ -3002,7 +3073,7 @@ class App(QtCore.QObject): self.should_we_save = True - self.inform.emit("[success] A Geometry object was converted to MultiGeo type.") + self.inform.emit(_("[success] A Geometry object was converted to MultiGeo type.")) def on_convert_multigeo_to_singlegeo(self): self.report_usage("on_convert_multigeo_to_singlegeo()") @@ -3010,11 +3081,11 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("[ERROR_NOTCL]Failed. Select a Geometry Object and try again.") + self.inform.emit(_("[ERROR_NOTCL]Failed. Select a Geometry Object and try again.")) return if not isinstance(obj, FlatCAMGeometry): - self.inform.emit("[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" % type(obj)) + self.inform.emit(_("[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s") % type(obj)) return obj.multigeo = False @@ -3028,7 +3099,7 @@ class App(QtCore.QObject): self.should_we_save = True - self.inform.emit("[success] A Geometry object was converted to SingleGeo type.") + self.inform.emit(_("[success] A Geometry object was converted to SingleGeo type.")) def on_options_dict_change(self, field): self.options_write_form_field(field) @@ -3212,7 +3283,7 @@ class App(QtCore.QObject): current.to_form() self.plot_all() - self.inform.emit("[success]Converted units to %s" % self.defaults["units"]) + self.inform.emit(_("[success]Converted units to %s") % self.defaults["units"]) # self.ui.units_label.setText("[" + self.options["units"] + "]") self.set_screen_units(self.defaults["units"]) else: @@ -3223,7 +3294,7 @@ class App(QtCore.QObject): else: self.ui.general_defaults_form.general_app_group.units_radio.set_value('MM') self.toggle_units_ignore = False - self.inform.emit("[WARNING_NOTCL]Units conversion cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Units conversion cancelled.")) self.options_read_form() self.defaults_read_form() @@ -3235,13 +3306,6 @@ class App(QtCore.QObject): self.ui.general_defaults_form.general_app_group.units_radio.set_value("MM") self.on_toggle_units() - def on_language_apply(self): - self.report_usage("on_language_apply()") - - # TODO: apply the language - # app restart section - pass - def on_fullscreen(self): self.report_usage("on_fullscreen()") @@ -3795,7 +3859,7 @@ class App(QtCore.QObject): filter_group = " G-Code Files (*.nc);; G-Code Files (*.txt);; G-Code Files (*.tap);; G-Code Files (*.cnc);; " \ "All Files (*.*)" path, _ = QtWidgets.QFileDialog.getOpenFileName( - caption='Open file', directory=self.get_last_folder(), filter=filter_group) + caption=_('Open file'), directory=self.get_last_folder(), filter=filter_group) if path: file = QtCore.QFile(path) if file.open(QtCore.QIODevice.ReadOnly): @@ -3846,15 +3910,15 @@ class App(QtCore.QObject): try: filename = str(QtWidgets.QFileDialog.getSaveFileName( - caption="Export G-Code ...", + caption=_("Export G-Code ..."), directory=self.defaults["global_last_folder"] + '/' + str(obj_name), filter=_filter_ )[0]) except TypeError: - filename = str(QtWidgets.QFileDialog.getSaveFileName(caption="Export G-Code ...", filter=_filter_)[0]) + filename = str(QtWidgets.QFileDialog.getSaveFileName(caption=_("Export G-Code ..."), filter=_filter_)[0]) if filename == "": - self.inform.emit("[WARNING_NOTCL]Export Code cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Export Code cancelled.")) return else: try: @@ -3864,14 +3928,14 @@ class App(QtCore.QObject): f.write(line) except FileNotFoundError: - self.inform.emit("[WARNING] No such file or directory") + self.inform.emit(_("[WARNING] No such file or directory")) return # Just for adding it to the recent files list. self.file_opened.emit("cncjob", filename) self.file_saved.emit("cncjob", filename) - self.inform.emit("Saved to: " + filename) + self.inform.emit(_("Saved to: %s") % filename) def handleFindGCode(self): self.report_usage("handleFindGCode()") @@ -3934,16 +3998,16 @@ class App(QtCore.QObject): if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return self.collection.get_active().on_tool_add(dia=float(val)) else: self.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + _("[WARNING_NOTCL] Adding Tool cancelled ...")) else: msgbox = QtWidgets.QMessageBox() - msgbox.setText("Adding Tool works only when Advanced is checked.\n" - "Go to Preferences -> General - Show Advanced Options.") + msgbox.setText(_("Adding Tool works only when Advanced is checked.\n" + "Go to Preferences -> General - Show Advanced Options.")) msgbox.setWindowTitle("Tool adding ...") msgbox.setWindowIcon(QtGui.QIcon('share/warning.png')) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) @@ -3966,34 +4030,34 @@ class App(QtCore.QObject): if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return self.ncclear_tool.on_tool_add(dia=float(val)) else: self.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + _("[WARNING_NOTCL] Adding Tool cancelled ...")) # and only if the tool is Paint Area Tool elif tool_widget == self.paint_tool.toolName: if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return self.paint_tool.on_tool_add(dia=float(val)) else: self.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + _("[WARNING_NOTCL] Adding Tool cancelled ...")) # and only if the tool is Solder Paste Dispensing Tool elif tool_widget == self.paste_tool.toolName: if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return self.paste_tool.on_tool_add(dia=float(val)) else: self.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + _("[WARNING_NOTCL] Adding Tool cancelled ...")) # It's meant to delete tools in tool tables via a 'Delete' shortcut key but only if certain conditions are met @@ -4047,13 +4111,13 @@ class App(QtCore.QObject): while (self.collection.get_active()): self.delete_first_selected() - self.inform.emit("Object(s) deleted ...") + self.inform.emit(_("Object(s) deleted ...")) # make sure that the selection shape is deleted, too self.delete_selection_shape() else: - self.inform.emit("Failed. No object(s) selected...") + self.inform.emit(_("Failed. No object(s) selected...")) else: - self.inform.emit("Save the work in Editor and try again ...") + self.inform.emit(_("Save the work in Editor and try again ...")) def on_set_origin(self): """ @@ -4066,7 +4130,7 @@ class App(QtCore.QObject): #and ask him to click on the desired position self.report_usage("on_set_origin()") - self.inform.emit('Click to set the origin ...') + self.inform.emit(_('Click to set the origin ...')) self.plotcanvas.vis_connect('mouse_press', self.on_set_zero_click) @@ -4078,15 +4142,15 @@ class App(QtCore.QObject): """ self.report_usage("on_jump_to()") - dia_box = Dialog_box(title="Jump to ...", - label="Enter the coordinates in format X,Y:", + dia_box = Dialog_box(title=_("Jump to ..."), + label=_("Enter the coordinates in format X,Y:"), icon=QtGui.QIcon('share/jump_to16.png')) if dia_box.ok is True: try: location = eval(dia_box.location) if not isinstance(location, tuple): - self.inform.emit("Wrong coordinates. Enter coordinates in format: X,Y") + self.inform.emit(_("Wrong coordinates. Enter coordinates in format: X,Y")) return except: return @@ -4101,7 +4165,7 @@ class App(QtCore.QObject): jump_loc = self.plotcanvas.vispy_canvas.translate_coords_2((location[0], location[1])) cursor.setPos(canvas_origin.x() + jump_loc[0], (canvas_origin.y() + jump_loc[1])) - self.inform.emit("Done.") + self.inform.emit(_("Done.")) def on_copy_object(self): self.report_usage("on_copy_object()") @@ -4233,7 +4297,7 @@ class App(QtCore.QObject): obj.options['xmax'] = c obj.options['ymax'] = d # self.plot_all(zoom=False) - self.inform.emit('[success] Origin set ...') + self.inform.emit(_('[success] Origin set ...')) self.plotcanvas.vis_disconnect('mouse_press', self.on_set_zero_click) self.should_we_save = True @@ -4251,7 +4315,7 @@ class App(QtCore.QObject): def on_preferences(self): # add the tab if it was closed - self.ui.plot_tab_area.addTab(self.ui.preferences_tab, "Preferences") + self.ui.plot_tab_area.addTab(self.ui.preferences_tab, _("Preferences")) # delete the absolute and relative position and messages in the infobar self.ui.position_label.setText("") @@ -4271,7 +4335,7 @@ class App(QtCore.QObject): ymaxlist = [] if not obj_list: - self.inform.emit("[WARNING_NOTCL] No object selected to Flip on Y axis.") + self.inform.emit(_("[WARNING_NOTCL] No object selected to Flip on Y axis.")) else: try: # first get a bounding box to fit all @@ -4296,9 +4360,9 @@ class App(QtCore.QObject): obj.mirror('X', [px, py]) obj.plot() self.object_changed.emit(obj) - self.inform.emit("[success] Flip on Y axis done.") + self.inform.emit(_("[success] Flip on Y axis done.")) except Exception as e: - self.inform.emit("[ERROR_NOTCL] Due of %s, Flip action was not executed." % str(e)) + self.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e)) return def on_flipx(self): @@ -4311,7 +4375,7 @@ class App(QtCore.QObject): ymaxlist = [] if not obj_list: - self.inform.emit("[WARNING_NOTCL] No object selected to Flip on X axis.") + self.inform.emit(_("[WARNING_NOTCL] No object selected to Flip on X axis.")) else: try: # first get a bounding box to fit all @@ -4336,9 +4400,9 @@ class App(QtCore.QObject): obj.mirror('Y', [px, py]) obj.plot() self.object_changed.emit(obj) - self.inform.emit("[success] Flip on X axis done.") + self.inform.emit(_("[success] Flip on X axis done.")) except Exception as e: - self.inform.emit("[ERROR_NOTCL] Due of %s, Flip action was not executed." % str(e)) + self.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e)) return def on_rotate(self, silent=False, preset=None): @@ -4351,10 +4415,10 @@ class App(QtCore.QObject): ymaxlist = [] if not obj_list: - self.inform.emit("[WARNING_NOTCL] No object selected to Rotate.") + self.inform.emit(_("[WARNING_NOTCL] No object selected to Rotate.")) else: if silent is False: - rotatebox = FCInputDialog(title="Transform", text="Enter the Angle value:", + rotatebox = FCInputDialog(title=_("Transform"), text=_("Enter the Angle value:"), min=-360, max=360, decimals=4, init_val=float(self.defaults['tools_transform_rotate'])) num, ok = rotatebox.get_value() @@ -4384,9 +4448,9 @@ class App(QtCore.QObject): sel_obj.rotate(-float(num), point=(px, py)) sel_obj.plot() self.object_changed.emit(sel_obj) - self.inform.emit("[success] Rotation done.") + self.inform.emit(_("[success] Rotation done.")) except Exception as e: - self.inform.emit("[ERROR_NOTCL] Due of %s, rotation movement was not executed." % str(e)) + self.inform.emit(_("[ERROR_NOTCL] Due of %s, rotation movement was not executed.") % str(e)) return def on_skewx(self): @@ -4397,9 +4461,9 @@ class App(QtCore.QObject): yminlist = [] if not obj_list: - self.inform.emit("[WARNING_NOTCL] No object selected to Skew/Shear on X axis.") + self.inform.emit(_("[WARNING_NOTCL] No object selected to Skew/Shear on X axis.")) else: - skewxbox = FCInputDialog(title="Transform", text="Enter the Angle value:", + skewxbox = FCInputDialog(title=_("Transform"), text=_("Enter the Angle value:"), min=-360, max=360, decimals=4, init_val=float(self.defaults['tools_transform_skew_x'])) num, ok = skewxbox.get_value() @@ -4418,7 +4482,7 @@ class App(QtCore.QObject): obj.skew(num, 0, point=(xminimal, yminimal)) obj.plot() self.object_changed.emit(obj) - self.inform.emit("[success] Skew on X axis done.") + self.inform.emit(_("[success] Skew on X axis done.")) def on_skewy(self): self.report_usage("on_skewy()") @@ -4428,9 +4492,9 @@ class App(QtCore.QObject): yminlist = [] if not obj_list: - self.inform.emit("[WARNING_NOTCL] No object selected to Skew/Shear on Y axis.") + self.inform.emit(_("[WARNING_NOTCL] No object selected to Skew/Shear on Y axis.")) else: - skewybox = FCInputDialog(title="Transform", text="Enter the Angle value:", + skewybox = FCInputDialog(title=_("Transform"), text=_("Enter the Angle value:"), min=-360, max=360, decimals=4, init_val=float(self.defaults['tools_transform_skew_y'])) num, ok = skewybox.get_value() @@ -4449,7 +4513,7 @@ class App(QtCore.QObject): obj.skew(0, num, point=(xminimal, yminimal)) obj.plot() self.object_changed.emit(obj) - self.inform.emit("[success] Skew on Y axis done.") + self.inform.emit(_("[success] Skew on Y axis done.")) def delete_first_selected(self): # Keep this for later @@ -4545,19 +4609,19 @@ class App(QtCore.QObject): if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float format.")) return else: if val not in self.defaults["global_grid_context_menu"][str(units)]: self.defaults["global_grid_context_menu"][str(units)].append(val) self.inform.emit( - "[success] New Grid added ...") + _("[success] New Grid added ...")) else: self.inform.emit( - "[WARNING_NOTCL] Grid already exists ...") + _("[WARNING_NOTCL] Grid already exists ...")) else: self.inform.emit( - "[WARNING_NOTCL] Adding New Grid cancelled ...") + _("[WARNING_NOTCL] Adding New Grid cancelled ...")) def on_grid_delete(self): ## Current application units in lower Case @@ -4572,20 +4636,20 @@ class App(QtCore.QObject): if ok: if float(val) == 0: self.inform.emit( - "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float format.") + _("[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float format.")) return else: try: self.defaults["global_grid_context_menu"][str(units)].remove(val) except ValueError: self.inform.emit( - "[ERROR_NOTCL] Grid Value does not exist ...") + _("[ERROR_NOTCL] Grid Value does not exist ...")) return self.inform.emit( - "[success] Grid Value deleted ...") + _("[success] Grid Value deleted ...")) else: self.inform.emit( - "[WARNING_NOTCL] Delete Grid value cancelled ...") + _("[WARNING_NOTCL] Delete Grid value cancelled ...")) def on_shortcut_list(self): self.report_usage("on_shortcut_list()") @@ -4624,11 +4688,11 @@ class App(QtCore.QObject): name = obj.options["name"] except AttributeError: log.debug("on_copy_name() --> No object selected to copy it's name") - self.inform.emit("[WARNING_NOTCL]No object selected to copy it's name") + self.inform.emit(_("[WARNING_NOTCL]No object selected to copy it's name")) return self.clipboard.setText(name) - self.inform.emit("Name copied on clipboard ...") + self.inform.emit(_("Name copied on clipboard ...")) def on_mouse_click_over_plot(self, event): """ @@ -4666,6 +4730,9 @@ class App(QtCore.QObject): # If the SHIFT key is pressed when LMB is clicked then the coordinates are copied to clipboard if modifiers == QtCore.Qt.ShiftModifier: + # do not auto open the Project Tab + self.click_noproject = True + self.clipboard.setText(self.defaults["global_point_clipboard_format"] % (self.pos[0], self.pos[1])) return @@ -4733,34 +4800,36 @@ class App(QtCore.QObject): self.draw_moving_selection_shape(self.pos, pos) self.selection_type = True - # hover effect - for obj in self.collection.get_list(): - try: - # select the object(s) only if it is enabled (plotted) - if obj.options['plot']: - if obj not in self.collection.get_selected(): - poly_obj = Polygon( - [(obj.options['xmin'], obj.options['ymin']), - (obj.options['xmax'], obj.options['ymin']), - (obj.options['xmax'], obj.options['ymax']), - (obj.options['xmin'], obj.options['ymax'])] - ) - if Point(pos).within(poly_obj): - if obj.isHovering is False: - obj.isHovering = True - obj.notHovering = True - # create the selection box around the selected object - self.draw_hover_shape(obj, color='#d1e0e0') - else: - if obj.notHovering is True: - obj.notHovering = False - obj.isHovering = False - self.delete_hover_shape() - except: - # the Exception here will happen if we try to select on screen and we have an newly (and empty) - # just created Geometry or Excellon object that do not have the xmin, xmax, ymin, ymax options. - # In this case poly_obj creation (see above) will fail - pass + # hover effect - enabled in Preferences -> General -> GUI Settings + if self.defaults['global_hover']: + for obj in self.collection.get_list(): + try: + # select the object(s) only if it is enabled (plotted) + if obj.options['plot']: + if obj not in self.collection.get_selected(): + poly_obj = Polygon( + [(obj.options['xmin'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymax']), + (obj.options['xmin'], obj.options['ymax'])] + ) + if Point(pos).within(poly_obj): + if obj.isHovering is False: + obj.isHovering = True + obj.notHovering = True + # create the selection box around the selected object + self.draw_hover_shape(obj, color='#d1e0e0') + else: + if obj.notHovering is True: + obj.notHovering = False + obj.isHovering = False + self.delete_hover_shape() + except: + # the Exception here will happen if we try to select on screen and we have an + # newly (and empty) just created Geometry or Excellon object that do not have the + # xmin, xmax, ymin, ymax options. + # In this case poly_obj creation (see above) will fail + pass except: self.ui.position_label.setText("") @@ -4850,8 +4919,10 @@ class App(QtCore.QObject): try: # select the object(s) only if it is enabled (plotted) if obj.options['plot']: - poly_obj = Polygon([(obj.options['xmin'], obj.options['ymin']), (obj.options['xmax'], obj.options['ymin']), - (obj.options['xmax'], obj.options['ymax']), (obj.options['xmin'], obj.options['ymax'])]) + poly_obj = Polygon([(obj.options['xmin'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymax']), + (obj.options['xmin'], obj.options['ymax'])]) if sel_type is True: if poly_obj.within(poly_selection): # create the selection box around the selected object @@ -4889,11 +4960,20 @@ class App(QtCore.QObject): self.collection.set_all_inactive() # delete the possible selection box around a possible selected object self.delete_selection_shape() - # and as a convenience move the focus to the Project tab because Selected tab is now empty - self.ui.notebook.setCurrentWidget(self.ui.project_tab) - # delete any text in the status bar, implicitly the last object name that was selected - self.inform.emit("") + # and as a convenience move the focus to the Project tab because Selected tab is now empty but + # only when working on App + if self.call_source == 'app': + if self.click_noproject is False: + self.ui.notebook.setCurrentWidget(self.ui.project_tab) + else: + # restore auto open the Project Tab + self.click_noproject = False + + # delete any text in the status bar, implicitly the last object name that was selected + self.inform.emit("") + else: + self.call_source = 'app' else: # case when there is only an object under the click and we toggle it @@ -4907,17 +4987,17 @@ class App(QtCore.QObject): # self.inform.emit('[selected] %s: %s selected' % # (str(curr_sel_obj.kind).capitalize(), str(curr_sel_obj.options['name']))) if curr_sel_obj.kind == 'gerber': - self.inform.emit('[selected]%s selected' % - ('green', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='green', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'excellon': - self.inform.emit('[selected]%s selected' % - ('brown', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='brown', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'cncjob': - self.inform.emit('[selected]%s selected' % - ('blue', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='blue', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'geometry': - self.inform.emit('[selected]%s selected' % - ('red', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='red', name=str(curr_sel_obj.options['name']))) elif self.collection.get_active().options['name'] not in objects_under_the_click_list: self.collection.set_all_inactive() @@ -4930,23 +5010,26 @@ class App(QtCore.QObject): # self.inform.emit('[selected] %s: %s selected' % # (str(curr_sel_obj.kind).capitalize(), str(curr_sel_obj.options['name']))) if curr_sel_obj.kind == 'gerber': - self.inform.emit('[selected]%s selected' % - ('green', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='green', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'excellon': - self.inform.emit('[selected]%s selected' % - ('brown', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='brown', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'cncjob': - self.inform.emit('[selected]%s selected' % - ('blue', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='blue', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'geometry': - self.inform.emit('[selected]%s selected' % - ('red', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='red', name=str(curr_sel_obj.options['name']))) else: self.collection.set_all_inactive() self.delete_selection_shape() - self.inform.emit("") - + if self.call_source == 'app': + # delete any text in the status bar, implicitly the last object name that was selected + self.inform.emit("") + else: + self.call_source = 'app' else: # If there is no selected object # make active the first element of the overlapped objects list @@ -4975,17 +5058,17 @@ class App(QtCore.QObject): # self.inform.emit('[selected] %s: %s selected' % # (str(curr_sel_obj.kind).capitalize(), str(curr_sel_obj.options['name']))) if curr_sel_obj.kind == 'gerber': - self.inform.emit('[selected]%s selected' % - ('green', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='green', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'excellon': - self.inform.emit('[selected]%s selected' % - ('brown', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='brown', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'cncjob': - self.inform.emit('[selected]%s selected' % - ('blue', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='blue', name=str(curr_sel_obj.options['name']))) elif curr_sel_obj.kind == 'geometry': - self.inform.emit('[selected]%s selected' % - ('red', str(curr_sel_obj.options['name']))) + self.inform.emit(_('[selected]{name} selected').format( + color='red', name=str(curr_sel_obj.options['name']))) # for obj in self.collection.get_list(): # obj.plot() @@ -5024,11 +5107,11 @@ class App(QtCore.QObject): if color: face = Color(color) - face.alpha = 0.3 + face.alpha = 0.2 outline = Color(color, alpha=0.8) else: face = Color(self.defaults['global_sel_fill']) - face.alpha = 0.1 + face.alpha = 0.2 outline = self.defaults['global_sel_line'] self.hover_shapes.add(hover_rect, color=outline, face_color=face, update=True, layer=0, tolerance=None) @@ -5058,10 +5141,10 @@ class App(QtCore.QObject): sel_rect = sel_rect.buffer(0.00787) if color: - face = Color(color, alpha=0.1) + face = Color(color, alpha=0.2) outline = Color(color, alpha=0.8) else: - face = Color(self.defaults['global_sel_fill'], alpha=0.1) + face = Color(self.defaults['global_sel_fill'], alpha=0.2) outline = Color(self.defaults['global_sel_line'], alpha=0.8) self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect, color=outline, @@ -5101,10 +5184,10 @@ class App(QtCore.QObject): if self.collection.get_list() and self.should_we_save: msgbox = QtWidgets.QMessageBox() # msgbox.setText("Save changes ...") - msgbox.setText("There are files/objects opened in FlatCAM.\n" + msgbox.setText(_("There are files/objects opened in FlatCAM.\n" "Creating a New project will delete them.\n" - "Do you want to Save the project?") - msgbox.setWindowTitle("Save changes") + "Do you want to Save the project?")) + msgbox.setWindowTitle(_("Save changes")) msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png')) msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) @@ -5119,7 +5202,7 @@ class App(QtCore.QObject): self.on_file_new() else: self.on_file_new() - self.inform.emit("[success] New Project created...") + self.inform.emit(_("[success] New Project created...")) def on_file_new(self): """ @@ -5182,7 +5265,7 @@ class App(QtCore.QObject): def obj_properties(self): self.report_usage("obj_properties()") - self.properties_tool.run() + self.properties_tool.run(toggle=False) def on_project_context_save(self): obj = self.collection.get_active() @@ -5200,18 +5283,18 @@ class App(QtCore.QObject): try: obj = self.collection.get_active() except: - self.inform.emit("[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file.") + self.inform.emit(_("[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file.")) return 'fail' # then append the text from GCode to the text editor try: file = StringIO(obj.source_file) except AttributeError: - self.inform.emit("[WARNING_NOTCL] There is no selected object for which to see it's source file code.") + self.inform.emit(_("[WARNING_NOTCL] There is no selected object for which to see it's source file code.")) return 'fail' # add the tab if it was closed - self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, "Code Editor") + self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, _("Code Editor")) # first clear previous text in text editor (if any) self.ui.code_editor.clear() @@ -5224,7 +5307,7 @@ class App(QtCore.QObject): self.ui.code_editor.append(proc_line) except Exception as e: log.debug('App.on_view_source() -->%s' % str(e)) - self.inform.emit('[ERROR]App.on_view_source() -->%s' % str(e)) + self.inform.emit(_('[ERROR]App.on_view_source() -->%s') % str(e)) return self.ui.code_editor.moveCursor(QtGui.QTextCursor.Start) @@ -5262,15 +5345,15 @@ class App(QtCore.QObject): "All Files (*.*)" try: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open Gerber", + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Gerber"), directory=self.get_last_folder(), filter=_filter_) except TypeError: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open Gerber", filter=_filter_) + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Gerber"), filter=_filter_) filenames = [str(filename) for filename in filenames] if len(filenames) == 0: - self.inform.emit("[WARNING_NOTCL]Open Gerber cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Open Gerber cancelled.")) else: for filename in filenames: if filename != '': @@ -5291,15 +5374,15 @@ class App(QtCore.QObject): "All Files (*.*)" try: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open Excellon", + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Excellon"), directory=self.get_last_folder(), filter=_filter_) except TypeError: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open Excellon", filter=_filter_) + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Excellon"), filter=_filter_) filenames = [str(filename) for filename in filenames] if len(filenames) == 0: - self.inform.emit("[WARNING_NOTCL]Open Excellon cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open Excellon cancelled.")) else: for filename in filenames: if filename != '': @@ -5321,15 +5404,15 @@ class App(QtCore.QObject): " *.din *.xpi *.hnc *.h *.i *.ncp *.min *.gcd *.rol *.mpr *.ply *.out *.eia *.plt *.sbp *.mpf);;" \ "All Files (*.*)" try: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open G-Code", + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open G-Code"), directory=self.get_last_folder(), filter=_filter_) except TypeError: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Open G-Code", filter=_filter_) + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open G-Code"), filter=_filter_) filenames = [str(filename) for filename in filenames] if len(filenames) == 0: - self.inform.emit("[WARNING_NOTCL]Open G-Code cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open G-Code cancelled.")) else: for filename in filenames: if filename != '': @@ -5347,10 +5430,10 @@ class App(QtCore.QObject): App.log.debug("on_file_openproject()") _filter_ = "FlatCAM Project (*.FlatPrj);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Project", + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Project"), directory=self.get_last_folder(), filter=_filter_) except TypeError: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Project", filter = _filter_) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Project"), filter = _filter_) # The Qt methods above will return a QString which can cause problems later. # So far json.dump() will fail to serialize it. @@ -5358,7 +5441,7 @@ class App(QtCore.QObject): filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Open Project cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open Project cancelled.")) else: # self.worker_task.emit({'fcn': self.open_project, # 'params': [filename]}) @@ -5377,13 +5460,14 @@ class App(QtCore.QObject): App.log.debug("on_file_openconfig()") _filter_ = "FlatCAM Config (*.FlatConfig);;FlatCAM Config (*.json);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Configuration File", + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Configuration File"), directory=self.data_path, filter=_filter_) except TypeError: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Configuration File", filter = _filter_) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Configuration File"), + filter = _filter_) if filename == "": - self.inform.emit("[WARNING_NOTCL]Open COnfig cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open Config cancelled.")) else: self.open_config_file(filename) @@ -5398,8 +5482,8 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("WARNING: No object selected.") - msg = "Please Select a Geometry object to export" + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) + msg = _("Please Select a Geometry object to export") msgbox = QtWidgets.QMessageBox() msgbox.setInformativeText(msg) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) @@ -5410,7 +5494,7 @@ class App(QtCore.QObject): # Check for more compatible types and add as required if (not isinstance(obj, FlatCAMGeometry) and not isinstance(obj, FlatCAMGerber) and not isinstance(obj, FlatCAMCNCjob) and not isinstance(obj, FlatCAMExcellon)): - msg = "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." + msg = _("[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used.") msgbox = QtWidgets.QMessageBox() msgbox.setInformativeText(msg) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) @@ -5422,17 +5506,17 @@ class App(QtCore.QObject): filter = "SVG File (*.svg);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export SVG", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export SVG"), directory=self.get_last_save_folder() + '/' + str(name), filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export SVG", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export SVG"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Export SVG cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Export SVG cancelled.")) return else: self.export_svg(name, filename) @@ -5446,22 +5530,22 @@ class App(QtCore.QObject): image = _screenshot() data = np.asarray(image) if not data.ndim == 3 and data.shape[-1] in (3, 4): - self.inform.emit('[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4') + self.inform.emit(_('[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4')) return filter_ = "PNG File (*.png);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export PNG Image", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export PNG Image"), directory=self.get_last_save_folder() + '/png_' + str(self.date).replace('-', ''), filter=filter_) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export PNG Image", filter=filter_) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export PNG Image"), filter=filter_) filename = str(filename) if filename == "": - self.inform.emit("Export PNG cancelled.") + self.inform.emit(_("Export PNG cancelled.")) return else: write_png(filename, data) @@ -5478,29 +5562,29 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("[WARNING_NOTCL] No object selected. Please select an Gerber object to export.") + self.inform.emit(_("[WARNING_NOTCL] No object selected. Please select an Gerber object to export.")) return # Check for more compatible types and add as required if not isinstance(obj, FlatCAMGerber): - self.inform.emit("[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files...") + self.inform.emit(_("[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files...")) return name = self.collection.get_active().options["name"] filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( + filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption="Save Gerber source file", directory=self.get_last_save_folder() + '/' + name, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Gerber source file", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Gerber source file"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Save Gerber source file cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Save Gerber source file cancelled.")) return else: self.save_source_file(name, filename) @@ -5517,29 +5601,29 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("[WARNING_NOTCL] No object selected. Please select an Excellon object to export.") + self.inform.emit(_("[WARNING_NOTCL] No object selected. Please select an Excellon object to export.")) return # Check for more compatible types and add as required if not isinstance(obj, FlatCAMExcellon): - self.inform.emit("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...") + self.inform.emit(_("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...")) return name = self.collection.get_active().options["name"] filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Save Excellon source file", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Save Excellon source file"), directory=self.get_last_save_folder() + '/' + name, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Excellon source file", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Excellon source file"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Saving Excellon source file cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Saving Excellon source file cancelled.")) return else: self.save_source_file(name, filename) @@ -5556,29 +5640,29 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("[WARNING_NOTCL] No object selected. Please Select an Excellon object to export.") + self.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an Excellon object to export.")) return # Check for more compatible types and add as required if not isinstance(obj, FlatCAMExcellon): - self.inform.emit("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...") + self.inform.emit(_("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...")) return name = self.collection.get_active().options["name"] filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export Excellon", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export Excellon"), directory=self.get_last_save_folder() + '/' + name, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Excellon", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export Excellon"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Export Excellon cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Export Excellon cancelled.")) return else: self.export_excellon(name, filename) @@ -5595,8 +5679,8 @@ class App(QtCore.QObject): obj = self.collection.get_active() if obj is None: - self.inform.emit("W[WARNING_NOTCL] No object selected.") - msg = "Please Select a Geometry object to export" + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) + msg = _("Please Select a Geometry object to export") msgbox = QtWidgets.QMessageBox() msgbox.setInformativeText(msg) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) @@ -5606,7 +5690,7 @@ class App(QtCore.QObject): # Check for more compatible types and add as required if not isinstance(obj, FlatCAMGeometry): - msg = "[ERROR_NOTCL] Only Geometry objects can be used." + msg = _("[ERROR_NOTCL] Only Geometry objects can be used.") msgbox = QtWidgets.QMessageBox() msgbox.setInformativeText(msg) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) @@ -5618,17 +5702,17 @@ class App(QtCore.QObject): filter = "DXF File (*.DXF);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export DXF", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export DXF"), directory=self.get_last_save_folder() + '/' + name, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export DXF", filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export DXF"), filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Export DXF cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Export DXF cancelled.")) return else: self.export_dxf(name, filename) @@ -5646,10 +5730,10 @@ class App(QtCore.QObject): filter = "SVG File (*.svg);;All Files (*.*)" try: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Import SVG", + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Import SVG"), directory=self.get_last_folder(), filter=filter) except TypeError: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Import SVG", filter=filter) + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Import SVG"), filter=filter) if type_of_obj is not "geometry" and type_of_obj is not "gerber": type_of_obj = "geometry" @@ -5657,7 +5741,7 @@ class App(QtCore.QObject): filenames = [str(filename) for filename in filenames] if len(filenames) == 0: - self.inform.emit("[WARNING_NOTCL]Open SVG cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Open SVG cancelled.")) else: for filename in filenames: if filename != '': @@ -5676,10 +5760,10 @@ class App(QtCore.QObject): filter = "DXF File (*.DXF);;All Files (*.*)" try: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Import DXF", + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Import DXF"), directory=self.get_last_folder(), filter=filter) except TypeError: - filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(caption="Import DXF", filter=filter) + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Import DXF"), filter=filter) if type_of_obj is not "geometry" and type_of_obj is not "gerber": type_of_obj = "geometry" @@ -5687,7 +5771,7 @@ class App(QtCore.QObject): filenames = [str(filename) for filename in filenames] if len(filenames) == 0: - self.inform.emit("[WARNING_NOTCL]Open DXF cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open DXF cancelled.")) else: for filename in filenames: if filename != '': @@ -5705,10 +5789,10 @@ class App(QtCore.QObject): App.log.debug("on_file_runscript()") _filter_ = "TCL script (*.TCL);;TCL script (*.TXT);;All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open TCL script", + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open TCL script"), directory=self.get_last_folder(), filter=_filter_) except TypeError: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open TCL script", filter=_filter_) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open TCL script"), filter=_filter_) # The Qt methods above will return a QString which can cause problems later. # So far json.dump() will fail to serialize it. @@ -5716,7 +5800,7 @@ class App(QtCore.QObject): filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Open TCL script cancelled.") + self.inform.emit(_("[WARNING_NOTCL]Open TCL script cancelled.")) else: try: with open(filename, "r") as tcl_script: @@ -5763,17 +5847,17 @@ class App(QtCore.QObject): filter_ = "FlatCAM Project (*.FlatPrj);; All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Save Project As ...", - directory=self.get_last_save_folder() + '/Project_' + self.date.replace('-', ''), + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Save Project As ..."), + directory=_('{l_save}/Project_{date}').format(l_save=str(self.get_last_save_folder()), date=str(self.date.replace('-', ''))), filter=filter_) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Project As ...", filter=filter_) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Project As ..."), filter=filter_) filename = str(filename) if filename == '': - self.inform.emit("[WARNING_NOTCL]Save Project cancelled.") + self.inform.emit(_("[WARNING_NOTCL] Save Project cancelled.")) return try: @@ -5783,16 +5867,6 @@ class App(QtCore.QObject): except IOError: exists = False - # msg = "Project file exists. Overwrite?" - # if exists: - # msgbox = QtWidgets.QMessageBox() - # msgbox.setInformativeText(msg) - # msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel |QtWidgets.QMessageBox.Ok) - # msgbox.setDefaultButton(QtWidgets.QMessageBox.Cancel) - # result = msgbox.exec_() - # if result ==QtWidgets.QMessageBox.Cancel: - # return - if thread is True: self.worker_task.emit({'fcn': self.save_project, 'params': [filename]}) @@ -5828,7 +5902,7 @@ class App(QtCore.QObject): # TODO: The return behavior has not been established... should raise exception? return "Could not retrieve object: %s" % obj_name - with self.proc_container.new("Exporting SVG") as proc: + with self.proc_container.new(_("Exporting SVG")) as proc: exported_svg = obj.export_svg(scale_factor=scale_factor) # Determine bounding area for svg export @@ -5861,7 +5935,7 @@ class App(QtCore.QObject): fp.write(svgcode.toprettyxml()) self.file_saved.emit("SVG", filename) - self.inform.emit("[success] SVG file exported to " + filename) + self.inform.emit(_("[success] SVG file exported to %s") % filename) def export_svg_negative(self, obj_name, box_name, filename, boundary, scale_factor=0.00, use_thread=True): """ @@ -5892,7 +5966,7 @@ class App(QtCore.QObject): return "Could not retrieve object: %s" % box_name if box is None: - self.inform.emit("[WARNING_NOTCL]No object Box. Using instead %s" % obj) + self.inform.emit(_("[WARNING_NOTCL]No object Box. Using instead %s") % obj) box = obj def make_negative_film(): @@ -5966,10 +6040,10 @@ class App(QtCore.QObject): self.progress.emit(100) self.file_saved.emit("SVG", filename) - self.inform.emit("[success] SVG file exported to " + filename) + self.inform.emit(_("[success] SVG file exported to %s") % filename) if use_thread is True: - proc = self.proc_container.new("Generating Film ... Please wait.") + proc = self.proc_container.new(_("Generating Film ... Please wait.")) def job_thread_film(app_obj): try: @@ -6012,7 +6086,7 @@ class App(QtCore.QObject): return "Could not retrieve object: %s" % box_name if box is None: - self.inform.emit("[WARNING_NOTCL]No object Box. Using instead %s" % obj) + self.inform.emit(_("[WARNING_NOTCL]No object Box. Using instead %s") % obj) box = obj def make_black_film(): @@ -6080,10 +6154,10 @@ class App(QtCore.QObject): self.progress.emit(100) self.file_saved.emit("SVG", filename) - self.inform.emit("[success] SVG file exported to " + filename) + self.inform.emit(_("[success] SVG file exported to %s") % filename) if use_thread is True: - proc = self.proc_container.new("Generating Film ... Please wait.") + proc = self.proc_container.new(_("Generating Film ... Please wait.")) def job_thread_film(app_obj): try: @@ -6230,26 +6304,26 @@ class App(QtCore.QObject): fp.write(exported_excellon) self.file_saved.emit("Excellon", filename) - self.inform.emit("[success] Excellon file exported to " + filename) + self.inform.emit(_("[success] Excellon file exported to %s") % filename) except Exception as e: log.debug("App.export_excellon.make_excellon() --> %s" % str(e)) return 'fail' if use_thread is True: - with self.proc_container.new("Exporting Excellon") as proc: + with self.proc_container.new(_("Exporting Excellon")) as proc: def job_thread_exc(app_obj): ret = make_excellon() if ret == 'fail': - self.inform.emit('[ERROR_NOTCL] Could not export Excellon file.') + self.inform.emit(_('[ERROR_NOTCL] Could not export Excellon file.')) return self.worker_task.emit({'fcn': job_thread_exc, 'params': [self]}) else: ret = make_excellon() if ret == 'fail': - self.inform.emit('[ERROR_NOTCL] Could not export Excellon file.') + self.inform.emit(_('[ERROR_NOTCL] Could not export Excellon file.')) return def export_dxf(self, obj_name, filename, use_thread=True): @@ -6288,25 +6362,25 @@ class App(QtCore.QObject): dxf_code.saveas(filename) self.file_saved.emit("DXF", filename) - self.inform.emit("[success] DXF file exported to " + filename) + self.inform.emit(_("[success] DXF file exported to %s") % filename) except: return 'fail' if use_thread is True: - with self.proc_container.new("Exporting DXF") as proc: + with self.proc_container.new(_("Exporting DXF")) as proc: def job_thread_exc(app_obj): ret = make_dxf() if ret == 'fail': - self.inform.emit('[[WARNING_NOTCL]] Could not export DXF file.') + self.inform.emit(_('[[WARNING_NOTCL]] Could not export DXF file.')) return self.worker_task.emit({'fcn': job_thread_exc, 'params': [self]}) else: ret = make_dxf() if ret == 'fail': - self.inform.emit('[[WARNING_NOTCL]] Could not export DXF file.') + self.inform.emit(_('[[WARNING_NOTCL]] Could not export DXF file.')) return def import_svg(self, filename, geo_type='geometry', outname=None): @@ -6326,8 +6400,8 @@ class App(QtCore.QObject): elif geo_type == "gerber": obj_type = geo_type else: - self.inform.emit("[ERROR_NOTCL] Not supported type was choosed as parameter. " - "Only Geometry and Gerber are supported") + self.inform.emit(_("[ERROR_NOTCL] Not supported type is picked as parameter. " + "Only Geometry and Gerber are supported")) return units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() @@ -6336,7 +6410,7 @@ class App(QtCore.QObject): geo_obj.import_svg(filename, obj_type, units=units) geo_obj.multigeo = False - with self.proc_container.new("Importing SVG") as proc: + with self.proc_container.new(_("Importing SVG")) as proc: # Object name name = outname or filename.split('/')[-1].split('\\')[-1] @@ -6347,7 +6421,7 @@ class App(QtCore.QObject): self.file_opened.emit("svg", filename) # GUI feedback - self.inform.emit("[success] Opened: " + filename) + self.inform.emit(_("[success] Opened: %s") % filename) self.progress.emit(100) def import_dxf(self, filename, geo_type='geometry', outname=None): @@ -6368,8 +6442,8 @@ class App(QtCore.QObject): elif geo_type == "gerber": obj_type = geo_type else: - self.inform.emit("[ERROR_NOTCL] Not supported type was choosed as parameter. " - "Only Geometry and Gerber are supported") + self.inform.emit(_("[ERROR_NOTCL] Not supported type is picked as parameter. " + "Only Geometry and Gerber are supported")) return units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() @@ -6378,7 +6452,7 @@ class App(QtCore.QObject): geo_obj.import_dxf(filename, obj_type, units=units) geo_obj.multigeo = False - with self.proc_container.new("Importing DXF") as proc: + with self.proc_container.new(_("Importing DXF")) as proc: # Object name name = outname or filename.split('/')[-1].split('\\')[-1] @@ -6389,7 +6463,7 @@ class App(QtCore.QObject): self.file_opened.emit("dxf", filename) # GUI feedback - self.inform.emit("[success] Opened: " + filename) + self.inform.emit(_("[success] Opened: %s") % filename) self.progress.emit(100) def import_image(self, filename, type='gerber', dpi=96, mode='black', mask=[250, 250, 250, 250], outname=None): @@ -6409,15 +6483,15 @@ class App(QtCore.QObject): elif type == "gerber": obj_type = type else: - self.inform.emit("[ERROR_NOTCL] Not supported type was picked as parameter. " - "Only Geometry and Gerber are supported") + self.inform.emit(_("[ERROR_NOTCL] Not supported type is picked as parameter. " + "Only Geometry and Gerber are supported")) return def obj_init(geo_obj, app_obj): geo_obj.import_image(filename, units=units, dpi=dpi, mode=mode, mask=mask) geo_obj.multigeo = False - with self.proc_container.new("Importing Image") as proc: + with self.proc_container.new(_("Importing Image")) as proc: # Object name name = outname or filename.split('/')[-1].split('\\')[-1] @@ -6429,7 +6503,7 @@ class App(QtCore.QObject): self.file_opened.emit("image", filename) # GUI feedback - self.inform.emit("[success] Opened: " + filename) + self.inform.emit(_("[success] Opened: %s") % filename) self.progress.emit(100) def open_gerber(self, filename, outname=None): @@ -6458,18 +6532,18 @@ class App(QtCore.QObject): try: gerber_obj.parse_file(filename) except IOError: - app_obj.inform.emit("[ERROR_NOTCL] Failed to open file: " + filename) + app_obj.inform.emit(_("[ERROR_NOTCL] Failed to open file: %s") % filename) app_obj.progress.emit(0) - self.inform.emit('[ERROR_NOTCL] Failed to open file: ' + filename) + self.inform.emit(_('[ERROR_NOTCL] Failed to open file: %s') % filename) return "fail" except ParseError as err: - app_obj.inform.emit("[ERROR_NOTCL] Failed to parse file: " + filename + ". " + str(err)) + app_obj.inform.emit(_("[ERROR_NOTCL] Failed to parse file: {name}. {error}").format(name=filename, error=str(err))) app_obj.progress.emit(0) self.log.error(str(err)) return "fail" except: - msg = "[ERROR] An internal error has ocurred. See shell.\n" + msg = _("[ERROR] An internal error has ocurred. See shell.\n") msg += traceback.format_exc() app_obj.inform.emit(msg) return "fail" @@ -6478,7 +6552,7 @@ class App(QtCore.QObject): # app_obj.inform.emit("[ERROR] No geometry found in file: " + filename) # self.collection.set_active(gerber_obj.options["name"]) # self.collection.delete_active() - self.inform.emit("[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation.") + self.inform.emit(_("[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation.")) return "fail" # Further parsing @@ -6486,7 +6560,7 @@ class App(QtCore.QObject): App.log.debug("open_gerber()") - with self.proc_container.new("Opening Gerber") as proc: + with self.proc_container.new(_("Opening Gerber")) as proc: self.progress.emit(10) @@ -6496,7 +6570,7 @@ class App(QtCore.QObject): ### Object creation ### ret = self.new_object("gerber", name, obj_init, autoselected=False) if ret == 'fail': - self.inform.emit('[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file.') + self.inform.emit(_('[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file.')) return # Register recent file @@ -6505,8 +6579,7 @@ class App(QtCore.QObject): self.progress.emit(100) # GUI feedback - self.inform.emit("[success] Opened: " + filename) - + self.inform.emit(_("[success] Opened: %s") % filename) def open_excellon(self, filename, outname=None): """ @@ -6532,15 +6605,15 @@ class App(QtCore.QObject): ret = excellon_obj.parse_file(filename) if ret == "fail": log.debug("Excellon parsing failed.") - self.inform.emit("[ERROR_NOTCL] This is not Excellon file.") + self.inform.emit(_("[ERROR_NOTCL] This is not Excellon file.")) return "fail" except IOError: - app_obj.inform.emit("[ERROR_NOTCL] Cannot open file: " + filename) + app_obj.inform.emit(_("[ERROR_NOTCL] Cannot open file: %s") % filename) log.debug("Could not open Excellon object.") self.progress.emit(0) # TODO: self and app_bjj mixed return "fail" except: - msg = "[ERROR_NOTCL] An internal error has occurred. See shell.\n" + msg = _("[ERROR_NOTCL] An internal error has occurred. See shell.\n") msg += traceback.format_exc() app_obj.inform.emit(msg) return "fail" @@ -6556,24 +6629,24 @@ class App(QtCore.QObject): for tool in excellon_obj.tools: if excellon_obj.tools[tool]['solid_geometry']: return - app_obj.inform.emit("[ERROR_NOTCL] No geometry found in file: " + filename) + app_obj.inform.emit(_("[ERROR_NOTCL] No geometry found in file: %s") % filename) return "fail" - with self.proc_container.new("Opening Excellon."): + with self.proc_container.new(_("Opening Excellon.")): # Object name name = outname or filename.split('/')[-1].split('\\')[-1] ret = self.new_object("excellon", name, obj_init, autoselected=False) if ret == 'fail': - self.inform.emit('[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file.') + self.inform.emit(_('[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file.')) return # Register recent file self.file_opened.emit("excellon", filename) # GUI feedback - self.inform.emit("[success] Opened: " + filename) + self.inform.emit(_("[success] Opened: %s") % filename) # self.progress.emit(100) def open_gcode(self, filename, outname=None): @@ -6605,7 +6678,7 @@ class App(QtCore.QObject): gcode = f.read() f.close() except IOError: - app_obj_.inform.emit("[ERROR_NOTCL] Failed to open " + filename) + app_obj_.inform.emit(_("[ERROR_NOTCL] Failed to open %s") % filename) self.progress.emit(0) return "fail" @@ -6615,13 +6688,13 @@ class App(QtCore.QObject): ret = job_obj.gcode_parse() if ret == "fail": - self.inform.emit("[ERROR_NOTCL] This is not GCODE") + self.inform.emit(_("[ERROR_NOTCL] This is not GCODE")) return "fail" self.progress.emit(60) job_obj.create_geometry() - with self.proc_container.new("Opening G-Code."): + with self.proc_container.new(_("Opening G-Code.")): # Object name name = outname or filename.split('/')[-1].split('\\')[-1] @@ -6629,16 +6702,16 @@ class App(QtCore.QObject): # New object creation and file processing ret = self.new_object("cncjob", name, obj_init, autoselected=False) if ret == 'fail': - self.inform.emit("[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n " + self.inform.emit(_("[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n " "Attempting to create a FlatCAM CNCJob Object from " - "G-Code file failed during processing") + "G-Code file failed during processing")) return "fail" # Register recent file self.file_opened.emit("cncjob", filename) # GUI feedback - self.inform.emit("[success] Opened: " + filename) + self.inform.emit(_("[success] Opened: %s") % filename) self.progress.emit(100) def open_config_file(self, filename, run_from_arg=None): @@ -6652,7 +6725,7 @@ class App(QtCore.QObject): App.log.debug("Opening config file: " + filename) # add the tab if it was closed - self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, "Code Editor") + self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, _("Code Editor")) # first clear previous text in text editor (if any) self.ui.code_editor.clear() @@ -6669,7 +6742,7 @@ class App(QtCore.QObject): f.close() except IOError: App.log.error("Failed to open config file: %s" % filename) - self.inform.emit("[ERROR_NOTCL] Failed to open config file: %s" % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to open config file: %s") % filename) return def open_project(self, filename, run_from_arg=None): @@ -6694,14 +6767,14 @@ class App(QtCore.QObject): f = open(filename, 'r') except IOError: App.log.error("Failed to open project file: %s" % filename) - self.inform.emit("[ERROR_NOTCL] Failed to open project file: %s" % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to open project file: %s") % filename) return try: d = json.load(f, object_hook=dict2obj) except: App.log.error("Failed to parse project file: %s" % filename) - self.inform.emit("[ERROR_NOTCL] Failed to parse project file: %s" % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to parse project file: %s") % filename) f.close() # Open and parse a compressed Project file @@ -6711,7 +6784,7 @@ class App(QtCore.QObject): d = json.loads(file_content, object_hook=dict2obj) except IOError: App.log.error("Failed to open project file: %s" % filename) - self.inform.emit("[ERROR_NOTCL] Failed to open project file: %s" % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to open project file: %s") % filename) return self.file_opened.emit("project", filename) @@ -6737,7 +6810,7 @@ class App(QtCore.QObject): App.log.debug(obj['kind'] + ": " + obj['options']['name']) self.new_object(obj['kind'], obj['options']['name'], obj_init, active=False, fit=False, plot=True) self.plot_all() - self.inform.emit("[success] Project loaded from: " + filename) + self.inform.emit(_("[success] Project loaded from: %s") % filename) self.should_we_save = False @@ -6867,9 +6940,9 @@ class App(QtCore.QObject): def shelp(p=None): if not p: - return "Available commands:\n" + \ + return _("Available commands:\n") + \ '\n'.join([' ' + cmd for cmd in sorted(commands)]) + \ - "\n\nType help for usage.\n Example: help open_gerber" + _("\n\nType help for usage.\n Example: help open_gerber") if p not in commands: return "Unknown command: %s" % p @@ -7017,7 +7090,7 @@ class App(QtCore.QObject): commands = { 'help': { 'fcn': shelp, - 'help': "Shows list of commands." + 'help': _("Shows list of commands.") }, } @@ -7070,14 +7143,14 @@ class App(QtCore.QObject): f = open(self.data_path + '/recent.json') except IOError: App.log.error("Failed to load recent item list.") - self.inform.emit("[ERROR_NOTCL] Failed to load recent item list.") + self.inform.emit(_("[ERROR_NOTCL] Failed to load recent item list.")) return try: self.recent = json.load(f) except json.scanner.JSONDecodeError: App.log.error("Failed to parse recent item list.") - self.inform.emit("[ERROR_NOTCL] Failed to parse recent item list.") + self.inform.emit(_("[ERROR_NOTCL] Failed to parse recent item list.")) f.close() return f.close() @@ -7138,14 +7211,14 @@ class App(QtCore.QObject): # label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) sel_title = QtWidgets.QTextEdit( - 'Shortcut Key List') + _('Shortcut Key List')) sel_title.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) sel_title.setFrameStyle(QtWidgets.QFrame.NoFrame) # font = self.sel_title.font() # font.setPointSize(12) # self.sel_title.setFont(font) - selected_text = ''' + selected_text = _('''

Selected Tab - Choose an Item from Project Tab

Details:
@@ -7167,7 +7240,7 @@ The normal flow when working in FlatCAM is the following:

A list of key shortcuts is available through an menu entry in Help -> Shortcuts List or through it's own key shortcut: F3.

- ''' + ''') sel_title.setText(selected_text) sel_title.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) @@ -7249,14 +7322,14 @@ The normal flow when working in FlatCAM is the following:

except: # App.log.warning("Failed checking for latest version. Could not connect.") self.log.warning("Failed checking for latest version. Could not connect.") - self.inform.emit("[WARNING_NOTCL] Failed checking for latest version. Could not connect.") + self.inform.emit(_("[WARNING_NOTCL] Failed checking for latest version. Could not connect.")) return try: data = json.load(f) except Exception as e: App.log.error("Could not parse information about latest version.") - self.inform.emit("[ERROR_NOTCL] Could not parse information about latest version.") + self.inform.emit(_("[ERROR_NOTCL] Could not parse information about latest version.")) App.log.debug("json.load(): %s" % str(e)) f.close() return @@ -7266,17 +7339,15 @@ The normal flow when working in FlatCAM is the following:

### Latest version? if self.version >= data["version"]: App.log.debug("FlatCAM is up to date!") - self.inform.emit("[success] FlatCAM is up to date!") + self.inform.emit(_("[success] FlatCAM is up to date!")) return App.log.debug("Newer version available.") self.message.emit( - "Newer Version Available", - str("There is a newer version of FlatCAM " + - "available for download:

" + - "" + data["name"] + "
" + - data["message"].replace("\n", "
")), - "info" + _("Newer Version Available"), + _("There is a newer version of FlatCAM available for download:\n\n") + + "%s" % str(data["name"]) + "\n%s" % str(data["message"]), + _("info") ) def on_zoom_fit(self, event): @@ -7295,19 +7366,19 @@ The normal flow when working in FlatCAM is the following:

self.report_usage("disable_all_plots()") self.disable_plots(self.collection.get_list()) - self.inform.emit("[success]All plots disabled.") + self.inform.emit(_("[success]All plots disabled.")) def disable_other_plots(self): self.report_usage("disable_other_plots()") self.disable_plots(self.collection.get_non_selected()) - self.inform.emit("[success]All non selected plots disabled.") + self.inform.emit(_("[success]All non selected plots disabled.")) def enable_all_plots(self): self.report_usage("enable_all_plots()") self.enable_plots(self.collection.get_list()) - self.inform.emit("[success]All plots enabled.") + self.inform.emit(_("[success]All plots enabled.")) # TODO: FIX THIS ''' @@ -7417,13 +7488,13 @@ The normal flow when working in FlatCAM is the following:

""" self.log.debug("save_project()") - with self.proc_container.new("Saving FlatCAM Project") as proc: + with self.proc_container.new(_("Saving FlatCAM Project")) as proc: ## Capture the latest changes # Current object try: self.collection.get_active().read_form() except: - self.log.debug("[WARNING] There was no active object") + self.log.debug("There was no active object") pass # Project options self.options_read_form() @@ -7438,13 +7509,13 @@ The normal flow when working in FlatCAM is the following:

g = json.dumps(d, default=to_dict, indent=2, sort_keys=True).encode('utf-8') # # Write f.write(g) - self.inform.emit("[success] Project saved to: %s" % filename) + self.inform.emit(_("[success] Project saved to: %s") % filename) else: # Open file try: f = open(filename, 'w') except IOError: - App.log.error("[ERROR] Failed to open file for saving: %s", filename) + App.log.error("Failed to open file for saving: %s", filename) return # Write @@ -7456,22 +7527,22 @@ The normal flow when working in FlatCAM is the following:

try: saved_f = open(filename, 'r') except IOError: - self.inform.emit("[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it.") % filename) return try: saved_d = json.load(saved_f, object_hook=dict2obj) except: self.inform.emit( - "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." % filename) + _("[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it.") % filename) f.close() return saved_f.close() if 'version' in saved_d: - self.inform.emit("[success] Project saved to: %s" % filename) + self.inform.emit(_("[success] Project saved to: %s") % filename) else: - self.inform.emit("[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." % filename) + self.inform.emit(_("[ERROR_NOTCL] Failed to save project file: %s. Retry to save it.") % filename) def on_options_app2project(self): """ @@ -7514,7 +7585,7 @@ The normal flow when working in FlatCAM is the following:

self.options_read_form() obj = self.collection.get_active() if obj is None: - self.inform.emit("WARNING: No object selected.") + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) return for option in self.options: if option.find(obj.kind + "_") == 0: @@ -7534,7 +7605,7 @@ The normal flow when working in FlatCAM is the following:

obj = self.collection.get_active() if obj is None: - self.inform.emit("WARNING: No object selected.") + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) return obj.read_form() for option in obj.options: @@ -7555,7 +7626,7 @@ The normal flow when working in FlatCAM is the following:

obj = self.collection.get_active() if obj is None: - self.inform.emit("WARNING: No object selected.") + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) return obj.read_form() for option in obj.options: @@ -7577,7 +7648,7 @@ The normal flow when working in FlatCAM is the following:

self.defaults_read_form() obj = self.collection.get_active() if obj is None: - self.inform.emit("WARNING: No object selected.") + self.inform.emit(_("[WARNING_NOTCL] No object selected.")) return for option in self.defaults: if option.find(obj.kind + "_") == 0: diff --git a/FlatCAMEditor.py b/FlatCAMEditor.py index c9ff97a3..5c58f85d 100644 --- a/FlatCAMEditor.py +++ b/FlatCAMEditor.py @@ -6,33 +6,35 @@ # MIT Licence # ############################################################ +############################################################ # +# File Modified: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +############################################################ + from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt, QSettings -import FlatCAMApp from camlib import * from FlatCAMTool import FlatCAMTool -from ObjectUI import LengthEntry, RadioSet +from flatcamGUI.ObjectUI import LengthEntry, RadioSet -from shapely.geometry import Polygon, LineString, Point, LinearRing, MultiLineString -from shapely.geometry import MultiPoint, MultiPolygon -from shapely.geometry import box as shply_box -from shapely.ops import cascaded_union, unary_union +from shapely.geometry import LineString, LinearRing, MultiLineString +from shapely.ops import cascaded_union import shapely.affinity as affinity -from shapely.wkt import loads as sloads -from shapely.wkt import dumps as sdumps -from shapely.geometry.base import BaseGeometry -from numpy import arctan2, Inf, array, sqrt, pi, ceil, sin, cos, sign, dot -from numpy.linalg import solve +from numpy import arctan2, Inf, array, sqrt, sign, dot from rtree import index as rtindex -from GUIElements import OptionalInputSection, FCCheckBox, FCEntry, FCEntry2, FCComboBox, FCTextAreaRich, \ - VerticalScrollArea, FCTable, FCDoubleSpinner, FCButton, EvalEntry2, FCInputDialog -from ParseFont import * -from vispy.scene.visuals import Markers -from copy import copy -import freetype as ft +from flatcamGUI.GUIElements import OptionalInputSection, FCCheckBox, FCEntry, FCComboBox, FCTextAreaRich, \ + FCTable, FCDoubleSpinner, FCButton, EvalEntry2, FCInputDialog +from flatcamParsers.ParseFont import * +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext class BufferSelectionTool(FlatCAMTool): """ @@ -71,33 +73,33 @@ class BufferSelectionTool(FlatCAMTool): # Buffer distance self.buffer_distance_entry = FCEntry() - form_layout.addRow("Buffer distance:", self.buffer_distance_entry) - self.buffer_corner_lbl = QtWidgets.QLabel("Buffer corner:") + form_layout.addRow(_("Buffer distance:"), self.buffer_distance_entry) + self.buffer_corner_lbl = QtWidgets.QLabel(_("Buffer corner:")) self.buffer_corner_lbl.setToolTip( - "There are 3 types of corners:\n" + _("There are 3 types of corners:\n" " - 'Round': the corner is rounded for exterior buffer.\n" " - 'Square:' the corner is met in a sharp angle for exterior buffer.\n" - " - 'Beveled:' the corner is a line that directly connects the features meeting in the corner" + " - 'Beveled:' the corner is a line that directly connects the features meeting in the corner") ) self.buffer_corner_cb = FCComboBox() - self.buffer_corner_cb.addItem("Round") - self.buffer_corner_cb.addItem("Square") - self.buffer_corner_cb.addItem("Beveled") + self.buffer_corner_cb.addItem(_("Round")) + self.buffer_corner_cb.addItem(_("Square")) + self.buffer_corner_cb.addItem(_("Beveled")) form_layout.addRow(self.buffer_corner_lbl, self.buffer_corner_cb) # Buttons hlay = QtWidgets.QHBoxLayout() self.buffer_tools_box.addLayout(hlay) - self.buffer_int_button = QtWidgets.QPushButton("Buffer Interior") + self.buffer_int_button = QtWidgets.QPushButton(_("Buffer Interior")) hlay.addWidget(self.buffer_int_button) - self.buffer_ext_button = QtWidgets.QPushButton("Buffer Exterior") + self.buffer_ext_button = QtWidgets.QPushButton(_("Buffer Exterior")) hlay.addWidget(self.buffer_ext_button) hlay1 = QtWidgets.QHBoxLayout() self.buffer_tools_box.addLayout(hlay1) - self.buffer_button = QtWidgets.QPushButton("Full Buffer") + self.buffer_button = QtWidgets.QPushButton(_("Full Buffer")) hlay1.addWidget(self.buffer_button) self.layout.addStretch() @@ -118,7 +120,7 @@ class BufferSelectionTool(FlatCAMTool): if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) - self.app.ui.notebook.setTabText(2, "Buffer Tool") + self.app.ui.notebook.setTabText(2, _("Buffer Tool")) def on_buffer(self): try: @@ -129,8 +131,8 @@ class BufferSelectionTool(FlatCAMTool): buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.')) self.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (which is really an INT) @@ -146,8 +148,8 @@ class BufferSelectionTool(FlatCAMTool): buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.')) self.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (which is really an INT) @@ -163,8 +165,8 @@ class BufferSelectionTool(FlatCAMTool): buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.')) self.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (which is really an INT) @@ -411,10 +413,10 @@ class PaintOptionsTool(FlatCAMTool): self.layout.addLayout(grid) # Tool dia - ptdlabel = QtWidgets.QLabel('Tool dia:') + ptdlabel = QtWidgets.QLabel(_('Tool dia:')) ptdlabel.setToolTip( - "Diameter of the tool to\n" - "be used in the operation." + _( "Diameter of the tool to\n" + "be used in the operation.") ) grid.addWidget(ptdlabel, 0, 0) @@ -422,9 +424,9 @@ class PaintOptionsTool(FlatCAMTool): grid.addWidget(self.painttooldia_entry, 0, 1) # Overlap - ovlabel = QtWidgets.QLabel('Overlap:') + ovlabel = QtWidgets.QLabel(_('Overlap:')) ovlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _("How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" "A value here of 0.25 means 25% from the tool diameter found above.\n\n" "Adjust the value starting with lower values\n" @@ -432,7 +434,7 @@ class PaintOptionsTool(FlatCAMTool): "not painted.\n" "Lower values = faster processing, faster execution on PCB.\n" "Higher values = slow processing and slow execution on CNC\n" - "due of too many paths." + "due of too many paths.") ) grid.addWidget(ovlabel, 1, 0) self.paintoverlap_entry = FCEntry() @@ -440,45 +442,45 @@ class PaintOptionsTool(FlatCAMTool): grid.addWidget(self.paintoverlap_entry, 1, 1) # Margin - marginlabel = QtWidgets.QLabel('Margin:') + marginlabel = QtWidgets.QLabel(_('Margin:')) marginlabel.setToolTip( - "Distance by which to avoid\n" + _( "Distance by which to avoid\n" "the edges of the polygon to\n" - "be painted." + "be painted.") ) grid.addWidget(marginlabel, 2, 0) self.paintmargin_entry = FCEntry() grid.addWidget(self.paintmargin_entry, 2, 1) # Method - methodlabel = QtWidgets.QLabel('Method:') + methodlabel = QtWidgets.QLabel(_('Method:')) methodlabel.setToolTip( - "Algorithm to paint the polygon:
" + _("Algorithm to paint the polygon:
" "Standard: Fixed step inwards.
" - "Seed-based: Outwards from seed." + "Seed-based: Outwards from seed.") ) grid.addWidget(methodlabel, 3, 0) self.paintmethod_combo = RadioSet([ - {"label": "Standard", "value": "standard"}, - {"label": "Seed-based", "value": "seed"}, - {"label": "Straight lines", "value": "lines"} + {"label": _("Standard"), "value": "standard"}, + {"label": _("Seed-based"), "value": "seed"}, + {"label": _("Straight lines"), "value": "lines"} ], orientation='vertical', stretch=False) grid.addWidget(self.paintmethod_combo, 3, 1) # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel = QtWidgets.QLabel(_("Connect:")) pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." + _( "Draw lines between resulting\n" + "segments to minimize tool lifts.") ) grid.addWidget(pathconnectlabel, 4, 0) self.pathconnect_cb = FCCheckBox() grid.addWidget(self.pathconnect_cb, 4, 1) - contourlabel = QtWidgets.QLabel("Contour:") + contourlabel = QtWidgets.QLabel(_("Contour:")) contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." + _("Cut around the perimeter of the polygon\n" + "to trim rough edges.") ) grid.addWidget(contourlabel, 5, 0) self.paintcontour_cb = FCCheckBox() @@ -489,7 +491,7 @@ class PaintOptionsTool(FlatCAMTool): hlay = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay) hlay.addStretch() - self.paint_button = QtWidgets.QPushButton("Paint") + self.paint_button = QtWidgets.QPushButton(_("Paint")) hlay.addWidget(self.paint_button) self.layout.addStretch() @@ -507,7 +509,7 @@ class PaintOptionsTool(FlatCAMTool): if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) - self.app.ui.notebook.setTabText(2, "Paint Tool") + self.app.ui.notebook.setTabText(2, _("Paint Tool")) def set_tool_ui(self): ## Init GUI @@ -543,7 +545,7 @@ class PaintOptionsTool(FlatCAMTool): def on_paint(self): if not self.fcdraw.selected: - self.app.inform.emit("[WARNING_NOTCL] Paint cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Paint cancelled. No shape selected.")) return try: @@ -554,8 +556,8 @@ class PaintOptionsTool(FlatCAMTool): tooldia = float(self.painttooldia_entry.get_value().replace(',', '.')) self.painttooldia_entry.set_value(tooldia) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return try: overlap = float(self.paintoverlap_entry.get_value()) @@ -565,8 +567,8 @@ class PaintOptionsTool(FlatCAMTool): overlap = float(self.paintoverlap_entry.get_value().replace(',', '.')) self.paintoverlap_entry.set_value(overlap) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Overlap value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Overlap value is missing or wrong format. " + "Add it and retry.")) return try: @@ -577,8 +579,8 @@ class PaintOptionsTool(FlatCAMTool): margin = float(self.paintmargin_entry.get_value().replace(',', '.')) self.paintmargin_entry.set_value(margin) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Margin distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Margin distance value is missing or wrong format. " + "Add it and retry.")) return method = self.paintmethod_combo.get_value() contour = self.paintcontour_cb.get_value() @@ -586,7 +588,7 @@ class PaintOptionsTool(FlatCAMTool): self.fcdraw.paint(tooldia, overlap, margin, connect=connect, contour=contour, method=method) self.fcdraw.select_tool("select") - self.app.ui.notebook.setTabText(2, "Tools") + self.app.ui.notebook.setTabText(2, _("Tools")) self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) self.app.ui.splitter.setSizes([0, 1]) @@ -597,12 +599,12 @@ class TransformEditorTool(FlatCAMTool): Inputs to specify how to paint the selected polygons. """ - toolName = "Transform Tool" - rotateName = "Rotate" - skewName = "Skew/Shear" - scaleName = "Scale" - flipName = "Mirror (Flip)" - offsetName = "Offset" + toolName = _("Transform Tool") + rotateName = _("Rotate") + skewName = _("Skew/Shear") + scaleName = _("Scale") + flipName = _("Mirror (Flip)") + offsetName = _("Offset") def __init__(self, app, draw_app): FlatCAMTool.__init__(self, app) @@ -613,7 +615,7 @@ class TransformEditorTool(FlatCAMTool): self.transform_lay = QtWidgets.QVBoxLayout() self.layout.addLayout(self.transform_lay) ## Title - title_label = QtWidgets.QLabel("%s" % ('Editor ' + self.toolName)) + title_label = QtWidgets.QLabel("%s" % (_('Editor %s') % self.toolName)) title_label.setStyleSheet(""" QLabel { @@ -645,12 +647,12 @@ class TransformEditorTool(FlatCAMTool): self.transform_lay.addLayout(form_layout) form_child = QtWidgets.QHBoxLayout() - self.rotate_label = QtWidgets.QLabel("Angle:") + self.rotate_label = QtWidgets.QLabel(_("Angle:")) self.rotate_label.setToolTip( - "Angle for Rotation action, in degrees.\n" + _( "Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" "Positive numbers for CW motion.\n" - "Negative numbers for CCW motion." + "Negative numbers for CCW motion.") ) self.rotate_label.setFixedWidth(50) @@ -659,11 +661,11 @@ class TransformEditorTool(FlatCAMTool): self.rotate_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.rotate_button = FCButton() - self.rotate_button.set_value("Rotate") + self.rotate_button.set_value(_("Rotate")) self.rotate_button.setToolTip( - "Rotate the selected shape(s).\n" + _("Rotate the selected shape(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected shapes." + "the bounding box for all selected shapes.") ) self.rotate_button.setFixedWidth(60) @@ -684,10 +686,10 @@ class TransformEditorTool(FlatCAMTool): form1_child_1 = QtWidgets.QHBoxLayout() form1_child_2 = QtWidgets.QHBoxLayout() - self.skewx_label = QtWidgets.QLabel("Angle X:") + self.skewx_label = QtWidgets.QLabel(_("Angle X:")) self.skewx_label.setToolTip( - "Angle for Skew action, in degrees.\n" - "Float number between -360 and 359." + _( "Angle for Skew action, in degrees.\n" + "Float number between -360 and 359.") ) self.skewx_label.setFixedWidth(50) self.skewx_entry = FCEntry() @@ -695,17 +697,17 @@ class TransformEditorTool(FlatCAMTool): # self.skewx_entry.setFixedWidth(60) self.skewx_button = FCButton() - self.skewx_button.set_value("Skew X") + self.skewx_button.set_value(_("Skew X")) self.skewx_button.setToolTip( - "Skew/shear the selected shape(s).\n" + _( "Skew/shear the selected shape(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected shapes.") + "the bounding box for all selected shapes.")) self.skewx_button.setFixedWidth(60) - self.skewy_label = QtWidgets.QLabel("Angle Y:") + self.skewy_label = QtWidgets.QLabel(_("Angle Y:")) self.skewy_label.setToolTip( - "Angle for Skew action, in degrees.\n" - "Float number between -360 and 359." + _( "Angle for Skew action, in degrees.\n" + "Float number between -360 and 359.") ) self.skewy_label.setFixedWidth(50) self.skewy_entry = FCEntry() @@ -713,11 +715,11 @@ class TransformEditorTool(FlatCAMTool): # self.skewy_entry.setFixedWidth(60) self.skewy_button = FCButton() - self.skewy_button.set_value("Skew Y") + self.skewy_button.set_value(_("Skew Y")) self.skewy_button.setToolTip( - "Skew/shear the selected shape(s).\n" + _("Skew/shear the selected shape(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected shapes.") + "the bounding box for all selected shapes.")) self.skewy_button.setFixedWidth(60) form1_child_1.addWidget(self.skewx_entry) @@ -741,9 +743,9 @@ class TransformEditorTool(FlatCAMTool): form2_child_1 = QtWidgets.QHBoxLayout() form2_child_2 = QtWidgets.QHBoxLayout() - self.scalex_label = QtWidgets.QLabel("Factor X:") + self.scalex_label = QtWidgets.QLabel(_("Factor X:")) self.scalex_label.setToolTip( - "Factor for Scale action over X axis." + _("Factor for Scale action over X axis.") ) self.scalex_label.setFixedWidth(50) self.scalex_entry = FCEntry() @@ -751,16 +753,16 @@ class TransformEditorTool(FlatCAMTool): # self.scalex_entry.setFixedWidth(60) self.scalex_button = FCButton() - self.scalex_button.set_value("Scale X") + self.scalex_button.set_value(_("Scale X")) self.scalex_button.setToolTip( - "Scale the selected shape(s).\n" + _( "Scale the selected shape(s).\n" "The point of reference depends on \n" - "the Scale reference checkbox state.") + "the Scale reference checkbox state.")) self.scalex_button.setFixedWidth(60) - self.scaley_label = QtWidgets.QLabel("Factor Y:") + self.scaley_label = QtWidgets.QLabel(_("Factor Y:")) self.scaley_label.setToolTip( - "Factor for Scale action over Y axis." + _("Factor for Scale action over Y axis.") ) self.scaley_label.setFixedWidth(50) self.scaley_entry = FCEntry() @@ -768,29 +770,29 @@ class TransformEditorTool(FlatCAMTool): # self.scaley_entry.setFixedWidth(60) self.scaley_button = FCButton() - self.scaley_button.set_value("Scale Y") + self.scaley_button.set_value(_("Scale Y")) self.scaley_button.setToolTip( - "Scale the selected shape(s).\n" + _( "Scale the selected shape(s).\n" "The point of reference depends on \n" - "the Scale reference checkbox state.") + "the Scale reference checkbox state.")) self.scaley_button.setFixedWidth(60) self.scale_link_cb = FCCheckBox() self.scale_link_cb.set_value(True) - self.scale_link_cb.setText("Link") + self.scale_link_cb.setText(_("Link")) self.scale_link_cb.setToolTip( - "Scale the selected shape(s)\n" - "using the Scale Factor X for both axis.") + _("Scale the selected shape(s)\n" + "using the Scale Factor X for both axis.")) self.scale_link_cb.setFixedWidth(50) self.scale_zero_ref_cb = FCCheckBox() self.scale_zero_ref_cb.set_value(True) - self.scale_zero_ref_cb.setText("Scale Reference") + self.scale_zero_ref_cb.setText(_("Scale Reference")) self.scale_zero_ref_cb.setToolTip( - "Scale the selected shape(s)\n" + _("Scale the selected shape(s)\n" "using the origin reference when checked,\n" "and the center of the biggest bounding box\n" - "of the selected shapes when unchecked.") + "of the selected shapes when unchecked.")) form2_child_1.addWidget(self.scalex_entry) form2_child_1.addWidget(self.scalex_button) @@ -815,9 +817,9 @@ class TransformEditorTool(FlatCAMTool): form3_child_1 = QtWidgets.QHBoxLayout() form3_child_2 = QtWidgets.QHBoxLayout() - self.offx_label = QtWidgets.QLabel("Value X:") + self.offx_label = QtWidgets.QLabel(_("Value X:")) self.offx_label.setToolTip( - "Value for Offset action on X axis." + _("Value for Offset action on X axis.") ) self.offx_label.setFixedWidth(50) self.offx_entry = FCEntry() @@ -825,16 +827,17 @@ class TransformEditorTool(FlatCAMTool): # self.offx_entry.setFixedWidth(60) self.offx_button = FCButton() - self.offx_button.set_value("Offset X") + self.offx_button.set_value(_("Offset X")) self.offx_button.setToolTip( - "Offset the selected shape(s).\n" + _( "Offset the selected shape(s).\n" "The point of reference is the middle of\n" "the bounding box for all selected shapes.\n") + ) self.offx_button.setFixedWidth(60) - self.offy_label = QtWidgets.QLabel("Value Y:") + self.offy_label = QtWidgets.QLabel(_("Value Y:")) self.offy_label.setToolTip( - "Value for Offset action on Y axis." + _("Value for Offset action on Y axis.") ) self.offy_label.setFixedWidth(50) self.offy_entry = FCEntry() @@ -842,11 +845,12 @@ class TransformEditorTool(FlatCAMTool): # self.offy_entry.setFixedWidth(60) self.offy_button = FCButton() - self.offy_button.set_value("Offset Y") + self.offy_button.set_value(_("Offset Y")) self.offy_button.setToolTip( - "Offset the selected shape(s).\n" + _("Offset the selected shape(s).\n" "The point of reference is the middle of\n" "the bounding box for all selected shapes.\n") + ) self.offy_button.setFixedWidth(60) form3_child_1.addWidget(self.offx_entry) @@ -872,26 +876,26 @@ class TransformEditorTool(FlatCAMTool): form4_child_1 = QtWidgets.QHBoxLayout() self.flipx_button = FCButton() - self.flipx_button.set_value("Flip on X") + self.flipx_button.set_value(_("Flip on X")) self.flipx_button.setToolTip( - "Flip the selected shape(s) over the X axis.\n" - "Does not create a new shape.\n " + _("Flip the selected shape(s) over the X axis.\n" + "Does not create a new shape.") ) self.flipx_button.setFixedWidth(60) self.flipy_button = FCButton() - self.flipy_button.set_value("Flip on Y") + self.flipy_button.set_value(_("Flip on Y")) self.flipy_button.setToolTip( - "Flip the selected shape(s) over the X axis.\n" - "Does not create a new shape.\n " + _("Flip the selected shape(s) over the X axis.\n" + "Does not create a new shape.") ) self.flipy_button.setFixedWidth(60) self.flip_ref_cb = FCCheckBox() self.flip_ref_cb.set_value(True) - self.flip_ref_cb.setText("Ref Pt") + self.flip_ref_cb.setText(_("Ref Pt")) self.flip_ref_cb.setToolTip( - "Flip the selected shape(s)\n" + _("Flip the selected shape(s)\n" "around the point in Point Entry Field.\n" "\n" "The point coordinates can be captured by\n" @@ -900,13 +904,14 @@ class TransformEditorTool(FlatCAMTool): "Then click Add button to insert coordinates.\n" "Or enter the coords in format (x, y) in the\n" "Point Entry field and click Flip on X(Y)") + ) self.flip_ref_cb.setFixedWidth(50) - self.flip_ref_label = QtWidgets.QLabel("Point:") + self.flip_ref_label = QtWidgets.QLabel(_("Point:")) self.flip_ref_label.setToolTip( - "Coordinates in format (x, y) used as reference for mirroring.\n" + _("Coordinates in format (x, y) used as reference for mirroring.\n" "The 'x' in (x, y) will be used when using Flip on X and\n" - "the 'y' in (x, y) will be used when using Flip on Y and" + "the 'y' in (x, y) will be used when using Flip on Y.") ) self.flip_ref_label.setFixedWidth(50) self.flip_ref_entry = EvalEntry2("(0, 0)") @@ -914,11 +919,12 @@ class TransformEditorTool(FlatCAMTool): # self.flip_ref_entry.setFixedWidth(60) self.flip_ref_button = FCButton() - self.flip_ref_button.set_value("Add") + self.flip_ref_button.set_value(_("Add")) self.flip_ref_button.setToolTip( - "The point coordinates can be captured by\n" + _( "The point coordinates can be captured by\n" "left click on canvas together with pressing\n" "SHIFT key. Then click Add button to insert.") + ) self.flip_ref_button.setFixedWidth(60) form4_child_hlay.addStretch() @@ -966,7 +972,7 @@ class TransformEditorTool(FlatCAMTool): if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) - self.app.ui.notebook.setTabText(2, "Transform Tool") + self.app.ui.notebook.setTabText(2, _("Transform Tool")) def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+T', **kwargs) @@ -1030,7 +1036,7 @@ class TransformEditorTool(FlatCAMTool): def template(self): if not self.fcdraw.selected: - self.app.inform.emit("[WARNING_NOTCL] Transformation cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Transformation cancelled. No shape selected.")) return @@ -1051,8 +1057,8 @@ class TransformEditorTool(FlatCAMTool): try: value = float(self.rotate_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Rotate, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Rotate, " + "use a number.")) return self.app.worker_task.emit({'fcn': self.on_rotate_action, 'params': [value]}) @@ -1088,8 +1094,8 @@ class TransformEditorTool(FlatCAMTool): try: value = float(self.skewx_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Skew X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Skew X, " + "use a number.")) return # self.on_skew("X", value) @@ -1109,8 +1115,8 @@ class TransformEditorTool(FlatCAMTool): try: value = float(self.skewy_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Skew Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Skew Y, " + "use a number.")) return # self.on_skew("Y", value) @@ -1130,8 +1136,8 @@ class TransformEditorTool(FlatCAMTool): try: xvalue = float(self.scalex_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Scale X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Scale X, " + "use a number.")) return # scaling to zero has no sense so we remove it, because scaling with 1 does nothing @@ -1167,8 +1173,8 @@ class TransformEditorTool(FlatCAMTool): try: yvalue = float(self.scaley_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Scale Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Scale Y, " + "use a number.")) return # scaling to zero has no sense so we remove it, because scaling with 1 does nothing @@ -1199,8 +1205,8 @@ class TransformEditorTool(FlatCAMTool): try: value = float(self.offx_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Offset X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Offset X, " + "use a number.")) return # self.on_offset("X", value) @@ -1220,8 +1226,8 @@ class TransformEditorTool(FlatCAMTool): try: value = float(self.offy_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Offset Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Offset Y, " + "use a number.")) return # self.on_offset("Y", value) @@ -1238,10 +1244,10 @@ class TransformEditorTool(FlatCAMTool): ymaxlist = [] if not shape_list: - self.app.inform.emit("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!") + self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!")) return else: - with self.app.proc_container.new("Appying Rotate"): + with self.app.proc_container.new(_("Appying Rotate")): try: # first get a bounding box to fit all for sha in shape_list: @@ -1269,12 +1275,12 @@ class TransformEditorTool(FlatCAMTool): # self.draw_app.transform_complete.emit() - self.app.inform.emit("[success] Done. Rotate completed.") + self.app.inform.emit(_("[success] Done. Rotate completed.")) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, rotation movement was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, rotation movement was not executed.") % str(e)) return def on_flip(self, axis): @@ -1285,10 +1291,10 @@ class TransformEditorTool(FlatCAMTool): ymaxlist = [] if not shape_list: - self.app.inform.emit("[WARNING_NOTCL] No shape selected. Please Select a shape to flip!") + self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to flip!")) return else: - with self.app.proc_container.new("Applying Flip"): + with self.app.proc_container.new(_("Applying Flip")): try: # get mirroring coords from the point entry if self.flip_ref_cb.isChecked(): @@ -1318,10 +1324,10 @@ class TransformEditorTool(FlatCAMTool): for sha in shape_list: if axis is 'X': sha.mirror('X', (px, py)) - self.app.inform.emit('[success] Flip on the Y axis done ...') + self.app.inform.emit(_('[success] Flip on the Y axis done ...')) elif axis is 'Y': sha.mirror('Y', (px, py)) - self.app.inform.emit('[success] Flip on the X axis done ...') + self.app.inform.emit(_('[success] Flip on the X axis done ...')) self.draw_app.replot() # self.draw_app.add_shape(DrawToolShape(sha.geo)) @@ -1331,7 +1337,7 @@ class TransformEditorTool(FlatCAMTool): self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Flip action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e)) return def on_skew(self, axis, num): @@ -1340,10 +1346,10 @@ class TransformEditorTool(FlatCAMTool): yminlist = [] if not shape_list: - self.app.inform.emit("[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!") + self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!")) return else: - with self.app.proc_container.new("Applying Skew"): + with self.app.proc_container.new(_("Applying Skew")): try: # first get a bounding box to fit all for sha in shape_list: @@ -1368,11 +1374,11 @@ class TransformEditorTool(FlatCAMTool): # # self.draw_app.transform_complete.emit() - self.app.inform.emit('[success] Skew on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success] Skew on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Skew action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Skew action was not executed.") % str(e)) return def on_scale(self, axis, xfactor, yfactor, point=None): @@ -1383,10 +1389,10 @@ class TransformEditorTool(FlatCAMTool): ymaxlist = [] if not shape_list: - self.app.inform.emit("[WARNING_NOTCL] No shape selected. Please Select a shape to scale!") + self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to scale!")) return else: - with self.app.proc_container.new("Applying Scale"): + with self.app.proc_container.new(_("Applying Scale")): try: # first get a bounding box to fit all for sha in shape_list: @@ -1419,10 +1425,10 @@ class TransformEditorTool(FlatCAMTool): # # self.draw_app.transform_complete.emit() - self.app.inform.emit('[success] Scale on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success] Scale on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Scale action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Scale action was not executed.") % str(e)) return def on_offset(self, axis, num): @@ -1431,10 +1437,10 @@ class TransformEditorTool(FlatCAMTool): yminlist = [] if not shape_list: - self.app.inform.emit("[WARNING_NOTCL] No shape selected. Please Select a shape to offset!") + self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to offset!")) return else: - with self.app.proc_container.new("Applying Offset"): + with self.app.proc_container.new(_("Applying Offset")): try: # first get a bounding box to fit all for sha in shape_list: @@ -1458,16 +1464,16 @@ class TransformEditorTool(FlatCAMTool): # # self.draw_app.transform_complete.emit() - self.app.inform.emit('[success] Offset on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success] Offset on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Offset action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Offset action was not executed.") % str(e)) return def on_rotate_key(self): - val_box = FCInputDialog(title="Rotate ...", - text='Enter an Angle Value (degrees):', + val_box = FCInputDialog(title=_("Rotate ..."), + text=_('Enter an Angle Value (degrees):'), min=-359.9999, max=360.0000, decimals=4, init_val=float(self.app.defaults['tools_transform_rotate'])) val_box.setWindowIcon(QtGui.QIcon('share/rotate.png')) @@ -1476,17 +1482,19 @@ class TransformEditorTool(FlatCAMTool): if ok: self.on_rotate(val=val) self.app.inform.emit( - "[success] Geometry shape rotate done...") + _("[success] Geometry shape rotate done...") + ) return else: self.app.inform.emit( - "[WARNING_NOTCL] Geometry shape rotate cancelled...") + _("[WARNING_NOTCL] Geometry shape rotate cancelled...") + ) def on_offx_key(self): units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() - val_box = FCInputDialog(title="Offset on X axis ...", - text=('Enter a distance Value (%s):' % str(units)), + val_box = FCInputDialog(title=_("Offset on X axis ..."), + text=(_('Enter a distance Value (%s):') % str(units)), min=-9999.9999, max=10000.0000, decimals=4, init_val=float(self.app.defaults['tools_transform_offset_x'])) val_box.setWindowIcon(QtGui.QIcon('share/offsetx32.png')) @@ -1495,17 +1503,17 @@ class TransformEditorTool(FlatCAMTool): if ok: self.on_offx(val=val) self.app.inform.emit( - "[success] Geometry shape offset on X axis done...") + _("[success] Geometry shape offset on X axis done...")) return else: self.app.inform.emit( - "[WARNING_NOTCL] Geometry shape offset X cancelled...") + _("[WARNING_NOTCL] Geometry shape offset X cancelled...")) def on_offy_key(self): units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() - val_box = FCInputDialog(title="Offset on Y axis ...", - text=('Enter a distance Value (%s):' % str(units)), + val_box = FCInputDialog(title=_("Offset on Y axis ..."), + text=(_('Enter a distance Value (%s):') % str(units)), min=-9999.9999, max=10000.0000, decimals=4, init_val=float(self.app.defaults['tools_transform_offset_y'])) val_box.setWindowIcon(QtGui.QIcon('share/offsety32.png')) @@ -1514,15 +1522,15 @@ class TransformEditorTool(FlatCAMTool): if ok: self.on_offx(val=val) self.app.inform.emit( - "[success] Geometry shape offset on Y axis done...") + _("[success] Geometry shape offset on Y axis done...")) return else: self.app.inform.emit( - "[WARNING_NOTCL] Geometry shape offset Y cancelled...") + _("[WARNING_NOTCL] Geometry shape offset Y cancelled...")) def on_skewx_key(self): - val_box = FCInputDialog(title="Skew on X axis ...", - text='Enter an Angle Value (degrees):', + val_box = FCInputDialog(title=_("Skew on X axis ..."), + text=_('Enter an Angle Value (degrees):'), min=-359.9999, max=360.0000, decimals=4, init_val=float(self.app.defaults['tools_transform_skew_x'])) val_box.setWindowIcon(QtGui.QIcon('share/skewX.png')) @@ -1531,15 +1539,15 @@ class TransformEditorTool(FlatCAMTool): if ok: self.on_skewx(val=val) self.app.inform.emit( - "[success] Geometry shape skew on X axis done...") + _("[success] Geometry shape skew on X axis done...")) return else: self.app.inform.emit( - "[WARNING_NOTCL] Geometry shape skew X cancelled...") + _( "[WARNING_NOTCL] Geometry shape skew X cancelled...")) def on_skewy_key(self): - val_box = FCInputDialog(title="Skew on Y axis ...", - text='Enter an Angle Value (degrees):', + val_box = FCInputDialog(title=_("Skew on Y axis ..."), + text=_('Enter an Angle Value (degrees):'), min=-359.9999, max=360.0000, decimals=4, init_val=float(self.app.defaults['tools_transform_skew_y'])) val_box.setWindowIcon(QtGui.QIcon('share/skewY.png')) @@ -1548,11 +1556,11 @@ class TransformEditorTool(FlatCAMTool): if ok: self.on_skewx(val=val) self.app.inform.emit( - "[success] Geometry shape skew on Y axis done...") + _( "[success] Geometry shape skew on Y axis done...")) return else: self.app.inform.emit( - "[WARNING_NOTCL] Geometry shape skew Y cancelled...") + _("[WARNING_NOTCL] Geometry shape skew Y cancelled...")) class DrawToolShape(object): @@ -1883,14 +1891,14 @@ class FCCircle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'circle' - self.start_msg = "Click on CENTER ..." + self.start_msg = _("Click on CENTER ...") self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] def click(self, point): self.points.append(point) if len(self.points) == 1: - self.draw_app.app.inform.emit("Click on Circle perimeter point to complete ...") + self.draw_app.app.inform.emit(_("Click on Circle perimeter point to complete ...")) return "Click on perimeter to complete ..." if len(self.points) == 2: @@ -1914,7 +1922,7 @@ class FCCircle(FCShapeTool): radius = distance(p1, p2) self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4))) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Adding Circle completed.") + self.draw_app.app.inform.emit(_("[success]Done. Adding Circle completed.")) class FCArc(FCShapeTool): @@ -1922,7 +1930,7 @@ class FCArc(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'arc' - self.start_msg = "Click on CENTER ..." + self.start_msg = _("Click on CENTER ...") # Direction of rotation between point 1 and 2. # 'cw' or 'ccw'. Switch direction by hitting the @@ -1941,11 +1949,11 @@ class FCArc(FCShapeTool): self.points.append(point) if len(self.points) == 1: - self.draw_app.app.inform.emit("Click on Start arc point ...") + self.draw_app.app.inform.emit(_("Click on Start arc point ...")) return "Click on 1st point ..." if len(self.points) == 2: - self.draw_app.app.inform.emit("Click on End arc point to complete ...") + self.draw_app.app.inform.emit(_("Click on End arc point to complete ...")) return "Click on 2nd point to complete ..." if len(self.points) == 3: @@ -2100,7 +2108,7 @@ class FCArc(FCShapeTool): self.geometry = DrawToolShape(LineString(arc(center, radius, startangle, stopangle, self.direction, self.steps_per_circ))) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Arc completed.") + self.draw_app.app.inform.emit(_("[success]Done. Arc completed.")) class FCRectangle(FCShapeTool): @@ -2112,7 +2120,7 @@ class FCRectangle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'rectangle' - self.start_msg = "Click on 1st corner ..." + self.start_msg = _("Click on 1st corner ...") def click(self, point): self.points.append(point) @@ -2140,7 +2148,7 @@ class FCRectangle(FCShapeTool): # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]) self.geometry = DrawToolShape(Polygon([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])])) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Rectangle completed.") + self.draw_app.app.inform.emit("_([success]Done. Rectangle completed.") class FCPolygon(FCShapeTool): @@ -2152,14 +2160,14 @@ class FCPolygon(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'polygon' - self.start_msg = "Click on 1st point ..." + self.start_msg = _("Click on 1st point ...") def click(self, point): self.draw_app.in_action = True self.points.append(point) if len(self.points) > 0: - self.draw_app.app.inform.emit("Click on next Point or click Right mouse button to complete ...") + self.draw_app.app.inform.emit(_("Click on next Point or click Right mouse button to complete ...")) return "Click on next point or hit ENTER to complete ..." return "" @@ -2182,7 +2190,7 @@ class FCPolygon(FCShapeTool): self.geometry = DrawToolShape(Polygon(self.points)) self.draw_app.in_action = False self.complete = True - self.draw_app.app.inform.emit("[success]Done. Polygon completed.") + self.draw_app.app.inform.emit(_("[success]Done. Polygon completed.")) def on_key(self, key): if key == 'backspace': @@ -2201,7 +2209,7 @@ class FCPath(FCPolygon): self.draw_app.in_action = False self.complete = True - self.draw_app.app.inform.emit("[success]Done. Path completed.") + self.draw_app.app.inform.emit(_("[success]Done. Path completed.")) def utility_geometry(self, data=None): if len(self.points) > 0: @@ -2461,14 +2469,14 @@ class FCMove(FCShapeTool): # self.shape_buffer = self.draw_app.shape_buffer if not self.draw_app.selected: - self.draw_app.app.inform.emit("[WARNING_NOTCL] Move cancelled. No shape selected.") + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Move cancelled. No shape selected.")) return self.origin = None self.destination = None - self.start_msg = "Click on reference point." + self.start_msg = _("Click on reference point.") def set_origin(self, origin): - self.draw_app.app.inform.emit("Click on destination point.") + self.draw_app.app.inform.emit(_("Click on destination point.")) self.origin = origin def click(self, point): @@ -2499,7 +2507,7 @@ class FCMove(FCShapeTool): # self.draw_app.set_selected(g) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Geometry(s) Move completed.") + self.draw_app.app.inform.emit(_("[success]Done. Geometry(s) Move completed.")) def utility_geometry(self, data=None): """ @@ -2544,7 +2552,7 @@ class FCCopy(FCMove): self.geometry = [DrawToolShape(affinity.translate(geom.geo, xoff=dx, yoff=dy)) for geom in self.draw_app.get_selected()] self.complete = True - self.draw_app.app.inform.emit("[success]Done. Geometry(s) Copy completed.") + self.draw_app.app.inform.emit(_("[success]Done. Geometry(s) Copy completed.")) class FCText(FCShapeTool): @@ -2556,7 +2564,7 @@ class FCText(FCShapeTool): self.draw_app = draw_app self.app = draw_app.app - self.start_msg = "Click on the Destination point..." + self.start_msg = _("Click on the Destination point...") self.origin = (0, 0) self.text_gui = TextInputTool(self.app) @@ -2570,8 +2578,8 @@ class FCText(FCShapeTool): self.geometry = DrawToolShape(affinity.translate(self.text_gui.text_path, xoff=dx, yoff=dy)) except Exception as e: log.debug("Font geometry is empty or incorrect: %s" % str(e)) - self.draw_app.app.inform.emit("[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " - "supported. Error: %s" % str(e)) + self.draw_app.app.inform.emit(_("[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " + "supported. Error: %s") % str(e)) self.text_gui.text_path = [] self.text_gui.hide_tool() self.draw_app.select_tool('select') @@ -2580,7 +2588,7 @@ class FCText(FCShapeTool): self.text_gui.text_path = [] self.text_gui.hide_tool() self.complete = True - self.draw_app.app.inform.emit("[success]Done. Adding Text completed.") + self.draw_app.app.inform.emit(_("[success]Done. Adding Text completed.")) def utility_geometry(self, data=None): """ @@ -2608,18 +2616,18 @@ class FCBuffer(FCShapeTool): self.draw_app = draw_app self.app = draw_app.app - self.start_msg = "Create buffer geometry ..." + self.start_msg = _("Create buffer geometry ...") self.origin = (0, 0) self.buff_tool = BufferSelectionTool(self.app, self.draw_app) self.buff_tool.run() - self.app.ui.notebook.setTabText(2, "Buffer Tool") + self.app.ui.notebook.setTabText(2, _("Buffer Tool")) if self.draw_app.app.ui.splitter.sizes()[0] == 0: self.draw_app.app.ui.splitter.setSizes([1, 1]) self.activate() def on_buffer(self): if not self.draw_app.selected: - self.app.inform.emit("[WARNING_NOTCL] Buffer cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected.")) return try: @@ -2630,22 +2638,22 @@ class FCBuffer(FCShapeTool): buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.')) self.buff_tool.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT) join_style = self.buff_tool.buffer_corner_cb.currentIndex() + 1 self.draw_app.buffer(buffer_distance, join_style) - self.app.ui.notebook.setTabText(2, "Tools") + self.app.ui.notebook.setTabText(2, _("Tools")) self.draw_app.app.ui.splitter.setSizes([0, 1]) self.disactivate() - self.draw_app.app.inform.emit("[success]Done. Buffer Tool completed.") + self.draw_app.app.inform.emit(_("[success]Done. Buffer Tool completed.")) def on_buffer_int(self): if not self.draw_app.selected: - self.app.inform.emit("[WARNING_NOTCL] Buffer cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected.")) return try: @@ -2656,22 +2664,22 @@ class FCBuffer(FCShapeTool): buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.')) self.buff_tool.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT) join_style = self.buff_tool.buffer_corner_cb.currentIndex() + 1 self.draw_app.buffer_int(buffer_distance, join_style) - self.app.ui.notebook.setTabText(2, "Tools") + self.app.ui.notebook.setTabText(2, _("Tools")) self.draw_app.app.ui.splitter.setSizes([0, 1]) self.disactivate() - self.draw_app.app.inform.emit("[success]Done. Buffer Int Tool completed.") + self.draw_app.app.inform.emit(_("[success]Done. Buffer Int Tool completed.")) def on_buffer_ext(self): if not self.draw_app.selected: - self.app.inform.emit("[WARNING_NOTCL] Buffer cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected.")) return try: @@ -2682,18 +2690,18 @@ class FCBuffer(FCShapeTool): buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.')) self.buff_tool.buffer_distance_entry.set_value(buffer_distance) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " + "Add it and retry.")) return # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT) join_style = self.buff_tool.buffer_corner_cb.currentIndex() + 1 self.draw_app.buffer_ext(buffer_distance, join_style) - self.app.ui.notebook.setTabText(2, "Tools") + self.app.ui.notebook.setTabText(2, _("Tools")) self.draw_app.app.ui.splitter.setSizes([0, 1]) self.disactivate() - self.draw_app.app.inform.emit("[success]Done. Buffer Ext Tool completed.") + self.draw_app.app.inform.emit(_("[success]Done. Buffer Ext Tool completed.")) def activate(self): self.buff_tool.buffer_button.clicked.disconnect() @@ -2726,7 +2734,7 @@ class FCPaint(FCShapeTool): self.draw_app = draw_app self.app = draw_app.app - self.start_msg = "Create Paint geometry ..." + self.start_msg = _("Create Paint geometry ...") self.origin = (0, 0) self.draw_app.paint_tool.run() @@ -2740,7 +2748,7 @@ class FCTransform(FCShapeTool): self.draw_app = draw_app self.app = draw_app.app - self.start_msg = "Shape transformations ..." + self.start_msg = _("Shape transformations ...") self.origin = (0, 0) self.draw_app.transform_tool.run() @@ -2765,7 +2773,7 @@ class FCDrillAdd(FCShapeTool): self.draw_app.tools_table_exc.setCurrentItem(item) except KeyError: - self.draw_app.app.inform.emit("[WARNING_NOTCL] To add a drill first select a tool") + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add a drill first select a tool")) self.draw_app.select_tool("select") return @@ -2774,7 +2782,7 @@ class FCDrillAdd(FCShapeTool): if isinstance(geo, DrawToolShape) and geo.geo is not None: self.draw_app.draw_utility_geometry(geo=geo) - self.draw_app.app.inform.emit("Click on target location ...") + self.draw_app.app.inform.emit(_("Click on target location ...")) # Switch notebook to Selected page self.draw_app.app.ui.notebook.setCurrentWidget(self.draw_app.app.ui.selected_tab) @@ -2814,7 +2822,7 @@ class FCDrillAdd(FCShapeTool): self.draw_app.current_storage = self.draw_app.storage_dict[self.selected_dia] self.geometry = DrawToolShape(self.util_shape(self.points)) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Drill added.") + self.draw_app.app.inform.emit(_("[success]Done. Drill added.")) class FCDrillArray(FCShapeTool): @@ -2856,7 +2864,7 @@ class FCDrillArray(FCShapeTool): item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1) self.draw_app.tools_table_exc.setCurrentItem(item) except KeyError: - self.draw_app.app.inform.emit("[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table") + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table")) return geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y), static=True) @@ -2864,7 +2872,7 @@ class FCDrillArray(FCShapeTool): if isinstance(geo, DrawToolShape) and geo.geo is not None: self.draw_app.draw_utility_geometry(geo=geo) - self.draw_app.app.inform.emit("Click on target location ...") + self.draw_app.app.inform.emit(_("Click on target location ...")) # Switch notebook to Selected page self.draw_app.app.ui.notebook.setCurrentWidget(self.draw_app.app.ui.selected_tab) @@ -2881,7 +2889,7 @@ class FCDrillArray(FCShapeTool): self.flag_for_circ_array = True self.set_origin(point) - self.draw_app.app.inform.emit("Click on the Drill Circular Array Start position") + self.draw_app.app.inform.emit(_("Click on the Drill Circular Array Start position")) else: self.destination = point self.make() @@ -2903,10 +2911,10 @@ class FCDrillArray(FCShapeTool): self.drill_angle = float(self.draw_app.drill_angle_entry.get_value()) except TypeError: self.draw_app.app.inform.emit( - "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot separator.") + _("[ERROR_NOTCL] The value is not Float. Check for comma instead of dot separator.")) return except Exception as e: - self.draw_app.app.inform.emit("[ERROR_NOTCL] The value is mistyped. Check the value.") + self.draw_app.app.inform.emit(_("[ERROR_NOTCL] The value is mistyped. Check the value.")) return if self.drill_array == 'Linear': @@ -2999,7 +3007,7 @@ class FCDrillArray(FCShapeTool): self.geometry.append(DrawToolShape(geo)) else: if (self.drill_angle * self.drill_array_size) > 360: - self.draw_app.app.inform.emit("[WARNING_NOTCL]Too many drills for the selected spacing angle.") + self.draw_app.app.inform.emit(_("[WARNING_NOTCL]Too many drills for the selected spacing angle.")) return radius = distance(self.destination, self.origin) @@ -3016,7 +3024,7 @@ class FCDrillArray(FCShapeTool): geo = self.util_shape((x, y)) self.geometry.append(DrawToolShape(geo)) self.complete = True - self.draw_app.app.inform.emit("[success]Done. Drill Array added.") + self.draw_app.app.inform.emit(_("[success]Done. Drill Array added.")) self.draw_app.in_action = True self.draw_app.array_frame.hide() return @@ -3027,7 +3035,7 @@ class FCDrillResize(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'drill_resize' - self.draw_app.app.inform.emit("Click on the Drill(s) to resize ...") + self.draw_app.app.inform.emit(_("Click on the Drill(s) to resize ...")) self.resize_dia = None self.draw_app.resize_frame.show() self.points = None @@ -3047,7 +3055,7 @@ class FCDrillResize(FCShapeTool): try: new_dia = self.draw_app.resdrill_entry.get_value() except: - self.draw_app.app.inform.emit("[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize.") + self.draw_app.app.inform.emit(_("[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize.")) return if new_dia not in self.draw_app.olddia_newdia: @@ -3119,7 +3127,7 @@ class FCDrillResize(FCShapeTool): self.draw_app.resize_frame.hide() self.complete = True - self.draw_app.app.inform.emit("[success]Done. Drill Resize completed.") + self.draw_app.app.inform.emit(_("[success]Done. Drill Resize completed.")) # MS: always return to the Select Tool self.draw_app.select_tool("select") @@ -3137,9 +3145,9 @@ class FCDrillMove(FCShapeTool): if self.draw_app.launched_from_shortcuts is True: self.draw_app.launched_from_shortcuts = False - self.draw_app.app.inform.emit("Click on target location ...") + self.draw_app.app.inform.emit(_("Click on target location ...")) else: - self.draw_app.app.inform.emit("Click on reference location ...") + self.draw_app.app.inform.emit(_("Click on reference location ...")) self.current_storage = None self.geometry = [] @@ -3162,7 +3170,7 @@ class FCDrillMove(FCShapeTool): if self.origin is None: self.set_origin(point) - self.draw_app.app.inform.emit("Click on target location ...") + self.draw_app.app.inform.emit(_("Click on target location ...")) return else: self.destination = point @@ -3194,7 +3202,7 @@ class FCDrillMove(FCShapeTool): sel_shapes_to_be_deleted = [] self.draw_app.build_ui() - self.draw_app.app.inform.emit("[success]Done. Drill(s) Move completed.") + self.draw_app.app.inform.emit(_("[success]Done. Drill(s) Move completed.")) def utility_geometry(self, data=None): """ @@ -3247,7 +3255,7 @@ class FCDrillCopy(FCDrillMove): sel_shapes_to_be_deleted = [] self.draw_app.build_ui() - self.draw_app.app.inform.emit("[success]Done. Drill(s) copied.") + self.draw_app.app.inform.emit(_("[success]Done. Drill(s) copied.")) ######################## @@ -3897,7 +3905,7 @@ class FlatCAMGeoEditor(QtCore.QObject): self.active_tool.make() if self.active_tool.complete: self.on_shape_complete() - self.app.inform.emit("[success]Done.") + self.app.inform.emit(_("[success]Done.")) # MS: always return to the Select Tool if modifier key is not pressed # else return to the current tool @@ -4023,21 +4031,21 @@ class FlatCAMGeoEditor(QtCore.QObject): def on_move_click(self): if not self.selected: - self.app.inform.emit("[WARNING_NOTCL] Move cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Move cancelled. No shape selected.")) return self.on_move() self.active_tool.set_origin(self.snap(self.x, self.y)) def on_copy_click(self): if not self.selected: - self.app.inform.emit("[WARNING_NOTCL] Copy cancelled. No shape selected.") + self.app.inform.emit(_("[WARNING_NOTCL] Copy cancelled. No shape selected.")) return self.app.ui.geo_copy_btn.setChecked(True) self.app.geo_editor.on_tool_select('copy') self.app.geo_editor.active_tool.set_origin(self.app.geo_editor.snap( self.app.geo_editor.x, self.app.geo_editor.y)) - self.app.inform.emit("Click on target point.") + self.app.inform.emit(_("Click on target point.")) def on_corner_snap(self): self.app.ui.corner_snap_btn.trigger() @@ -4278,7 +4286,7 @@ class FlatCAMGeoEditor(QtCore.QObject): results = shapes[0].geo except Exception as e: log.debug("FlatCAMGeoEditor.intersection() --> %s" % str(e)) - self.app.inform.emit("[WARNING_NOTCL]A selection of at least 2 geo items is required to do Intersection.") + self.app.inform.emit(_("[WARNING_NOTCL]A selection of at least 2 geo items is required to do Intersection.")) self.select_tool('select') return @@ -4316,7 +4324,7 @@ class FlatCAMGeoEditor(QtCore.QObject): if buf_distance < 0: self.app.inform.emit( - "[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to generate an 'inside' shape") + _( "[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to generate an 'inside' shape")) # deselect everything self.selected = [] @@ -4324,11 +4332,11 @@ class FlatCAMGeoEditor(QtCore.QObject): return if len(selected) == 0: - self.app.inform.emit("[WARNING_NOTCL] Nothing selected for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering.")) return if not isinstance(buf_distance, float): - self.app.inform.emit("[WARNING_NOTCL] Invalid distance for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering.")) # deselect everything self.selected = [] @@ -4338,7 +4346,7 @@ class FlatCAMGeoEditor(QtCore.QObject): pre_buffer = cascaded_union([t.geo for t in selected]) results = pre_buffer.buffer(buf_distance - 1e-10, resolution=32, join_style=join_style) if results.is_empty: - self.app.inform.emit("[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value.") + self.app.inform.emit(_("[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value.")) # deselect everything self.selected = [] self.replot() @@ -4346,25 +4354,27 @@ class FlatCAMGeoEditor(QtCore.QObject): self.add_shape(DrawToolShape(results)) self.replot() - self.app.inform.emit("[success]Full buffer geometry created.") + self.app.inform.emit(_("[success]Full buffer geometry created.")) def buffer_int(self, buf_distance, join_style): selected = self.get_selected() if buf_distance < 0: self.app.inform.emit( - "[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to generate an 'inside' shape") + _("[ERROR_NOTCL]Negative buffer value is not accepted. " + "Use Buffer interior to generate an 'inside' shape") + ) # deselect everything self.selected = [] self.replot() return if len(selected) == 0: - self.app.inform.emit("[WARNING_NOTCL] Nothing selected for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering.")) return if not isinstance(buf_distance, float): - self.app.inform.emit("[WARNING_NOTCL] Invalid distance for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering.")) # deselect everything self.selected = [] self.replot() @@ -4373,7 +4383,7 @@ class FlatCAMGeoEditor(QtCore.QObject): pre_buffer = cascaded_union([t.geo for t in selected]) results = pre_buffer.buffer(-buf_distance + 1e-10, resolution=32, join_style=join_style) if results.is_empty: - self.app.inform.emit("[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value.") + self.app.inform.emit(_("[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value.")) # deselect everything self.selected = [] self.replot() @@ -4385,7 +4395,7 @@ class FlatCAMGeoEditor(QtCore.QObject): self.add_shape(DrawToolShape(results.exterior)) self.replot() - self.app.inform.emit("[success]Exterior buffer geometry created.") + self.app.inform.emit(_("[success]Exterior buffer geometry created.")) # selected = self.get_selected() # # if len(selected) == 0: @@ -4423,19 +4433,19 @@ class FlatCAMGeoEditor(QtCore.QObject): selected = self.get_selected() if buf_distance < 0: - self.app.inform.emit("[ERROR_NOTCL]Negative buffer value is not accepted. " - "Use Buffer interior to generate an 'inside' shape") + self.app.inform.emit(_("[ERROR_NOTCL]Negative buffer value is not accepted. " + "Use Buffer interior to generate an 'inside' shape")) # deselect everything self.selected = [] self.replot() return if len(selected) == 0: - self.app.inform.emit("[WARNING_NOTCL] Nothing selected for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering.")) return if not isinstance(buf_distance, float): - self.app.inform.emit("[WARNING_NOTCL] Invalid distance for buffering.") + self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering.")) # deselect everything self.selected = [] self.replot() @@ -4444,7 +4454,7 @@ class FlatCAMGeoEditor(QtCore.QObject): pre_buffer = cascaded_union([t.geo for t in selected]) results = pre_buffer.buffer(buf_distance - 1e-10, resolution=32, join_style=join_style) if results.is_empty: - self.app.inform.emit("[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value.") + self.app.inform.emit(_("[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value.")) # deselect everything self.selected = [] self.replot() @@ -4456,7 +4466,7 @@ class FlatCAMGeoEditor(QtCore.QObject): self.add_shape(DrawToolShape(results.exterior)) self.replot() - self.app.inform.emit("[success]Exterior buffer geometry created.") + self.app.inform.emit(_("[success]Exterior buffer geometry created.")) # def paint(self, tooldia, overlap, margin, method): # selected = self.get_selected() @@ -4520,19 +4530,19 @@ class FlatCAMGeoEditor(QtCore.QObject): selected = self.get_selected() if len(selected) == 0: - self.app.inform.emit("[WARNING_NOTCL]Nothing selected for painting.") + self.app.inform.emit(_("[WARNING_NOTCL]Nothing selected for painting.")) return for param in [tooldia, overlap, margin]: if not isinstance(param, float): param_name = [k for k, v in locals().items() if v is param][0] - self.app.inform.emit("[WARNING] Invalid value for {}".format(param)) + self.app.inform.emit(_("[WARNING] Invalid value for {}").format(param)) results = [] if overlap >= 1: self.app.inform.emit( - "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 (100%).") + _("[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 (100%).")) return def recurse(geometry, reset=True): @@ -4591,8 +4601,8 @@ class FlatCAMGeoEditor(QtCore.QObject): except Exception as e: log.debug("Could not Paint the polygons. %s" % str(e)) self.app.inform.emit( - "[ERROR] Could not do Paint. Try a different combination of parameters. " - "Or a different method of Paint\n%s" % str(e)) + _("[ERROR] Could not do Paint. Try a different combination of parameters. " + "Or a different method of Paint\n%s") % str(e)) return # add the result to the results list @@ -4602,7 +4612,7 @@ class FlatCAMGeoEditor(QtCore.QObject): for r in results: self.add_shape(DrawToolShape(r)) self.app.inform.emit( - "[success] Paint done.") + _("[success] Paint done.")) self.replot() @@ -4634,14 +4644,14 @@ class FlatCAMExcEditor(QtCore.QObject): self.title_box.addWidget(self.icon, stretch=0) ## Title label - self.title_label = QtWidgets.QLabel("" + 'Excellon Editor' + "") + self.title_label = QtWidgets.QLabel("%s" % _('Excellon Editor')) self.title_label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.title_box.addWidget(self.title_label, stretch=1) ## Object name self.name_box = QtWidgets.QHBoxLayout() layout.addLayout(self.name_box) - name_label = QtWidgets.QLabel("Name:") + name_label = QtWidgets.QLabel(_("Name:")) self.name_box.addWidget(name_label) self.name_entry = FCEntry() self.name_box.addWidget(self.name_entry) @@ -4661,10 +4671,10 @@ class FlatCAMExcEditor(QtCore.QObject): self.drills_frame.setLayout(self.tools_box) #### Tools Drills #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel("%s" % _('Tools Table')) self.tools_table_label.setToolTip( - "Tools in this Excellon object\n" - "when are used for drilling." + _( "Tools in this Excellon object\n" + "when are used for drilling.") ) self.tools_box.addWidget(self.tools_table_label) @@ -4672,7 +4682,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.tools_box.addWidget(self.tools_table_exc) self.tools_table_exc.setColumnCount(4) - self.tools_table_exc.setHorizontalHeaderLabels(['#', 'Diameter', 'D', 'S']) + self.tools_table_exc.setHorizontalHeaderLabels(['#', _('Diameter'), 'D', 'S']) self.tools_table_exc.setSortingEnabled(False) self.tools_table_exc.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) @@ -4680,19 +4690,19 @@ class FlatCAMExcEditor(QtCore.QObject): self.tools_box.addWidget(self.empty_label) #### Add a new Tool #### - self.addtool_label = QtWidgets.QLabel('Add/Delete Tool') + self.addtool_label = QtWidgets.QLabel('%s' % _('Add/Delete Tool')) self.addtool_label.setToolTip( - "Add/Delete a tool to the tool list\n" - "for this Excellon object." + _("Add/Delete a tool to the tool list\n" + "for this Excellon object.") ) self.tools_box.addWidget(self.addtool_label) grid1 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid1) - addtool_entry_lbl = QtWidgets.QLabel('Tool Dia:') + addtool_entry_lbl = QtWidgets.QLabel(_('Tool Dia:')) addtool_entry_lbl.setToolTip( - "Diameter for the new tool" + _("Diameter for the new tool") ) grid1.addWidget(addtool_entry_lbl, 0, 0) @@ -4701,10 +4711,10 @@ class FlatCAMExcEditor(QtCore.QObject): self.addtool_entry.setValidator(QtGui.QDoubleValidator(0.0001, 99.9999, 4)) hlay.addWidget(self.addtool_entry) - self.addtool_btn = QtWidgets.QPushButton('Add Tool') + self.addtool_btn = QtWidgets.QPushButton(_('Add Tool')) self.addtool_btn.setToolTip( - "Add a new tool to the tool list\n" - "with the diameter specified above." + _( "Add a new tool to the tool list\n" + "with the diameter specified above.") ) self.addtool_btn.setFixedWidth(80) hlay.addWidget(self.addtool_btn) @@ -4713,10 +4723,10 @@ class FlatCAMExcEditor(QtCore.QObject): grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) - self.deltool_btn = QtWidgets.QPushButton('Delete Tool') + self.deltool_btn = QtWidgets.QPushButton(_('Delete Tool')) self.deltool_btn.setToolTip( - "Delete a tool in the tool list\n" - "by selecting a row in the tool table." + _( "Delete a tool in the tool list\n" + "by selecting a row in the tool table.") ) grid2.addWidget(self.deltool_btn, 0, 1) @@ -4733,18 +4743,18 @@ class FlatCAMExcEditor(QtCore.QObject): self.emptyresize_label = QtWidgets.QLabel('') self.resize_box.addWidget(self.emptyresize_label) - self.drillresize_label = QtWidgets.QLabel('Resize Drill(s)') + self.drillresize_label = QtWidgets.QLabel('%s' % _("Resize Drill(s)")) self.drillresize_label.setToolTip( - "Resize a drill or a selection of drills." + _("Resize a drill or a selection of drills.") ) self.resize_box.addWidget(self.drillresize_label) grid3 = QtWidgets.QGridLayout() self.resize_box.addLayout(grid3) - res_entry_lbl = QtWidgets.QLabel('Resize Dia:') + res_entry_lbl = QtWidgets.QLabel(_('Resize Dia:')) res_entry_lbl.setToolTip( - "Diameter to resize to." + _( "Diameter to resize to.") ) grid3.addWidget(addtool_entry_lbl, 0, 0) @@ -4752,9 +4762,9 @@ class FlatCAMExcEditor(QtCore.QObject): self.resdrill_entry = LengthEntry() hlay2.addWidget(self.resdrill_entry) - self.resize_btn = QtWidgets.QPushButton('Resize') + self.resize_btn = QtWidgets.QPushButton(_('Resize')) self.resize_btn.setToolTip( - "Resize drill(s)" + _("Resize drill(s)") ) self.resize_btn.setFixedWidth(80) hlay2.addWidget(self.resize_btn) @@ -4776,28 +4786,28 @@ class FlatCAMExcEditor(QtCore.QObject): self.emptyarray_label = QtWidgets.QLabel('') self.array_box.addWidget(self.emptyarray_label) - self.drillarray_label = QtWidgets.QLabel('Add Drill Array') + self.drillarray_label = QtWidgets.QLabel('%s' % _("Add Drill Array")) self.drillarray_label.setToolTip( - "Add an array of drills (linear or circular array)" + _("Add an array of drills (linear or circular array)") ) self.array_box.addWidget(self.drillarray_label) self.array_type_combo = FCComboBox() self.array_type_combo.setToolTip( - "Select the type of drills array to create.\n" - "It can be Linear X(Y) or Circular" + _( "Select the type of drills array to create.\n" + "It can be Linear X(Y) or Circular") ) - self.array_type_combo.addItem("Linear") - self.array_type_combo.addItem("Circular") + self.array_type_combo.addItem(_("Linear")) + self.array_type_combo.addItem(_("Circular")) self.array_box.addWidget(self.array_type_combo) self.array_form = QtWidgets.QFormLayout() self.array_box.addLayout(self.array_form) - self.drill_array_size_label = QtWidgets.QLabel('Nr of drills:') + self.drill_array_size_label = QtWidgets.QLabel(_('Nr of drills:')) self.drill_array_size_label.setToolTip( - "Specify how many drills to be in the array." + _("Specify how many drills to be in the array.") ) self.drill_array_size_label.setFixedWidth(100) @@ -4814,36 +4824,36 @@ class FlatCAMExcEditor(QtCore.QObject): self.linear_form = QtWidgets.QFormLayout() self.linear_box.addLayout(self.linear_form) - self.drill_axis_label = QtWidgets.QLabel('Direction:') + self.drill_axis_label = QtWidgets.QLabel(_('Direction:')) self.drill_axis_label.setToolTip( - "Direction on which the linear array is oriented:\n" + _("Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" "- 'Y' - vertical axis or \n" - "- 'Angle' - a custom angle for the array inclination" + "- 'Angle' - a custom angle for the array inclination") ) self.drill_axis_label.setFixedWidth(100) self.drill_axis_radio = RadioSet([{'label': 'X', 'value': 'X'}, {'label': 'Y', 'value': 'Y'}, - {'label': 'Angle', 'value': 'A'}]) + {'label': _('Angle'), 'value': 'A'}]) self.drill_axis_radio.set_value('X') self.linear_form.addRow(self.drill_axis_label, self.drill_axis_radio) - self.drill_pitch_label = QtWidgets.QLabel('Pitch:') + self.drill_pitch_label = QtWidgets.QLabel(_('Pitch:')) self.drill_pitch_label.setToolTip( - "Pitch = Distance between elements of the array." + _("Pitch = Distance between elements of the array.") ) self.drill_pitch_label.setFixedWidth(100) self.drill_pitch_entry = LengthEntry() self.linear_form.addRow(self.drill_pitch_label, self.drill_pitch_entry) - self.linear_angle_label = QtWidgets.QLabel('Angle:') + self.linear_angle_label = QtWidgets.QLabel(_('Angle:')) self.linear_angle_label.setToolTip( - "Angle at which the linear array is placed.\n" + _( "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" "Min value is: -359.99 degrees.\n" - "Max value is: 360.00 degrees." + "Max value is: 360.00 degrees.") ) self.linear_angle_label.setFixedWidth(100) @@ -4859,10 +4869,10 @@ class FlatCAMExcEditor(QtCore.QObject): self.circular_box.setContentsMargins(0, 0, 0, 0) self.array_circular_frame.setLayout(self.circular_box) - self.drill_direction_label = QtWidgets.QLabel('Direction:') + self.drill_direction_label = QtWidgets.QLabel(_('Direction:')) self.drill_direction_label.setToolTip( - "Direction for circular array." - "Can be CW = clockwise or CCW = counter clockwise." + _( "Direction for circular array." + "Can be CW = clockwise or CCW = counter clockwise.") ) self.drill_direction_label.setFixedWidth(100) @@ -4874,9 +4884,9 @@ class FlatCAMExcEditor(QtCore.QObject): self.drill_direction_radio.set_value('CW') self.circular_form.addRow(self.drill_direction_label, self.drill_direction_radio) - self.drill_angle_label = QtWidgets.QLabel('Angle:') + self.drill_angle_label = QtWidgets.QLabel(_('Angle:')) self.drill_angle_label.setToolTip( - "Angle at which each element in circular array is placed." + _("Angle at which each element in circular array is placed.") ) self.drill_angle_label.setFixedWidth(100) @@ -5197,7 +5207,7 @@ class FlatCAMExcEditor(QtCore.QObject): empty_b = QtWidgets.QTableWidgetItem('') empty_b.setFlags(empty_b.flags() ^ QtCore.Qt.ItemIsEnabled) - label_tot_drill_count = QtWidgets.QTableWidgetItem('Total Drills') + label_tot_drill_count = QtWidgets.QTableWidgetItem(_('Total Drills')) tot_drill_count = QtWidgets.QTableWidgetItem('%d' % self.tot_drill_cnt) label_tot_drill_count.setFlags(label_tot_drill_count.flags() ^ QtCore.Qt.ItemIsEnabled) @@ -5229,7 +5239,7 @@ class FlatCAMExcEditor(QtCore.QObject): empty_3 = QtWidgets.QTableWidgetItem('') empty_3.setFlags(empty_3.flags() ^ QtCore.Qt.ItemIsEnabled) - label_tot_slot_count = QtWidgets.QTableWidgetItem('Total Slots') + label_tot_slot_count = QtWidgets.QTableWidgetItem(_('Total Slots')) tot_slot_count = QtWidgets.QTableWidgetItem('%d' % self.tot_slot_cnt) label_tot_slot_count.setFlags(label_tot_slot_count.flags() ^ QtCore.Qt.ItemIsEnabled) tot_slot_count.setFlags(tot_slot_count.flags() ^ QtCore.Qt.ItemIsEnabled) @@ -5303,8 +5313,9 @@ class FlatCAMExcEditor(QtCore.QObject): try: tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " "use a number.") + ) return if tool_dia not in self.olddia_newdia: @@ -5315,15 +5326,16 @@ class FlatCAMExcEditor(QtCore.QObject): # each time a tool diameter is edited or added self.olddia_newdia[tool_dia] = tool_dia else: - self.app.inform.emit("[WARNING_NOTCL]Tool already in the original or actual tool list.\n" + self.app.inform.emit(_("[WARNING_NOTCL]Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. ") + ) return # since we add a new tool, we update also the initial state of the tool_table through it's dictionary # we add a new entry in the tool2tooldia dict self.tool2tooldia[len(self.olddia_newdia)] = tool_dia - self.app.inform.emit("[success]Added new tool with dia: %s %s" % (str(tool_dia), str(self.units))) + self.app.inform.emit(_("[success]Added new tool with dia: {dia} {units}").format(dia=str(tool_dia), units=str(self.units))) self.build_ui() @@ -5354,7 +5366,7 @@ class FlatCAMExcEditor(QtCore.QObject): else: deleted_tool_dia_list.append(float('%.4f' % dia)) except: - self.app.inform.emit("[WARNING_NOTCL]Select a tool in Tool Table") + self.app.inform.emit(_("[WARNING_NOTCL]Select a tool in Tool Table")) return for deleted_tool_dia in deleted_tool_dia_list: @@ -5387,7 +5399,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.olddia_newdia.pop(deleted_tool_dia, None) - self.app.inform.emit("[success]Deleted tool with dia: %s %s" % (str(deleted_tool_dia), str(self.units))) + self.app.inform.emit(_("[success]Deleted tool with dia: {del_dia} {units}").format(del_dia=str(deleted_tool_dia), units=str(self.units))) self.replot() # self.app.inform.emit("Could not delete selected tool") @@ -5730,7 +5742,7 @@ class FlatCAMExcEditor(QtCore.QObject): # reset the tool table self.tools_table_exc.clear() - self.tools_table_exc.setHorizontalHeaderLabels(['#', 'Diameter', 'D', 'S']) + self.tools_table_exc.setHorizontalHeaderLabels(['#', _('Diameter'), 'D', 'S']) self.last_tool_selected = None # delete the edited Excellon object which will be replaced by a new one having the edited content of the first @@ -5784,15 +5796,16 @@ class FlatCAMExcEditor(QtCore.QObject): excellon_obj.create_geometry() except KeyError: self.app.inform.emit( - "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon creation.") + _( "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon creation.") + ) except: - msg = "[ERROR] An internal error has ocurred. See shell.\n" + msg = _("[ERROR] An internal error has ocurred. See shell.\n") msg += traceback.format_exc() app_obj.inform.emit(msg) raise # raise - with self.app.proc_container.new("Creating Excellon."): + with self.app.proc_container.new(_("Creating Excellon.")): try: self.app.new_object("excellon", outname, obj_init) @@ -5801,7 +5814,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.app.progress.emit(100) return - self.app.inform.emit("[success]Excellon editing finished.") + self.app.inform.emit(_("[success]Excellon editing finished.")) # self.progress.emit(100) def on_tool_select(self, tool): @@ -5818,7 +5831,7 @@ class FlatCAMExcEditor(QtCore.QObject): # self.draw_app.select_tool('select') self.complete = True current_tool = 'select' - self.app.inform.emit("[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected")) # This is to make the group behave as radio group if current_tool in self.tools_exc: @@ -6208,7 +6221,8 @@ class FlatCAMExcEditor(QtCore.QObject): continue if shape_plus in self.selected: - self.plot_shape(geometry=shape_plus.geo, color=self.app.defaults['global_sel_draw_color'], linewidth=2) + self.plot_shape(geometry=shape_plus.geo, color=self.app.defaults['global_sel_draw_color'], + linewidth=2) continue self.plot_shape(geometry=shape_plus.geo, color=self.app.defaults['global_draw_color']) @@ -6299,7 +6313,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.selected = [] self.build_ui() - self.app.inform.emit("[success]Done. Drill(s) deleted.") + self.app.inform.emit(_("[success]Done. Drill(s) deleted.")) def delete_shape(self, shape): self.is_modified = True @@ -6369,7 +6383,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.delete_utility_geometry() self.array_circular_frame.show() self.array_linear_frame.hide() - self.app.inform.emit("Click on the circular array Center position") + self.app.inform.emit(_("Click on the circular array Center position")) def on_linear_angle_radio(self): val = self.drill_axis_radio.get_value() diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 751bd0e9..ab32e1ce 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -6,25 +6,26 @@ # MIT Licence # ############################################################ -from io import StringIO -from PyQt5 import QtCore, QtGui -from PyQt5.QtCore import Qt import copy import inspect # TODO: For debugging only. -from shapely.geometry.base import JOIN_STYLE from datetime import datetime -import FlatCAMApp -from ObjectUI import * +from flatcamGUI.ObjectUI import * from FlatCAMCommon import LoudDict -from FlatCAMEditor import FlatCAMGeoEditor from camlib import * -from VisPyVisuals import ShapeCollectionVisual import itertools +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + -# Interrupts plotting process if FlatCAMObj has been deleted class ObjectDeleted(Exception): + # Interrupts plotting process if FlatCAMObj has been deleted pass @@ -37,6 +38,8 @@ class ValidationError(Exception): ######################################## ## FlatCAMObj ## ######################################## + + class FlatCAMObj(QtCore.QObject): """ Base type of objects handled in FlatCAM. These become interactive @@ -187,7 +190,7 @@ class FlatCAMObj(QtCore.QObject): log.debug("on_name_activate() --> Could not remove the old object name from auto-completer model list") self.options["name"] = self.ui.name_entry.get_value() - self.app.inform.emit("[success]Name changed from %s to %s" % (old_name, new_name)) + self.app.inform.emit(_("[success]Name changed from {old} to {new}").format(old=old_name, new=new_name)) def on_offset_button_click(self): self.app.report_usage("obj_on_offset_button") @@ -525,7 +528,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # Show/Hide Advanced Options if self.app.defaults["global_app_level"] == 'b': - self.ui.level.setText('Basic') + self.ui.level.setText(_( + 'Basic' + )) self.ui.apertures_table_label.hide() self.ui.aperture_table_visibility_cb.hide() self.ui.milling_type_label.hide() @@ -533,9 +538,12 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.ui.generate_ext_iso_button.hide() self.ui.generate_int_iso_button.hide() self.ui.follow_cb.hide() - + self.ui.padding_area_label.show() else: - self.ui.level.setText('Advanced') + self.ui.level.setText(_( + 'Advanced' + )) + self.ui.padding_area_label.hide() # set initial state of the aperture table and associated widgets self.on_aperture_table_visibility_change() @@ -887,7 +895,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): for g in geo_obj.solid_geometry: if g: - app_obj.inform.emit("[success]Isolation geometry created: %s" % geo_obj.options["name"]) + app_obj.inform.emit(_( + "[success]Isolation geometry created: %s" + ) % geo_obj.options["name"]) break else: empty_cnt += 1 @@ -940,7 +950,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): for g in geo_obj.solid_geometry: if g: - app_obj.inform.emit("[success]Isolation geometry created: %s" % geo_obj.options["name"]) + app_obj.inform.emit(_( + "[success]Isolation geometry created: %s" + ) % geo_obj.options["name"]) break else: empty_cnt += 1 @@ -1013,7 +1025,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): factor = self.ui.scale_aperture_entry.get_value() except Exception as e: log.debug("FlatCAMGerber.on_scale_aperture_click() --> %s" % str(e)) - self.app.inform.emit("[ERROR_NOTCL] The aperture scale factor value is missing or wrong format.") + self.app.inform.emit(_( + "[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." + )) return def scale_recursion(geom): @@ -1026,7 +1040,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): return affinity.scale(geom, factor, factor, origin='center') if not self.ui.apertures_table.selectedItems(): - self.app.inform.emit("[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try again.") + self.app.inform.emit(_( + "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try again." + )) return for x in self.ui.apertures_table.selectedItems(): @@ -1044,7 +1060,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): buff_value = self.ui.buffer_aperture_entry.get_value() except Exception as e: log.debug("FlatCAMGerber.on_scale_aperture_click() --> %s" % str(e)) - self.app.inform.emit("[ERROR_NOTCL] The aperture buffer value is missing or wrong format.") + self.app.inform.emit(_( + "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." + )) return def buffer_recursion(geom): @@ -1057,7 +1075,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): return geom.buffer(buff_value, join_style=2) if not self.ui.apertures_table.selectedItems(): - self.app.inform.emit("[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try again.") + self.app.inform.emit(_( + "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try again." + )) return for x in self.ui.apertures_table.selectedItems(): @@ -1113,20 +1133,22 @@ class FlatCAMGerber(FlatCAMObj, Gerber): log.debug("on_new_modified_gerber()") - with self.app.proc_container.new("Generating Gerber") as proc: + with self.app.proc_container.new(_("Generating Gerber")) as proc: self.app.progress.emit(10) ### Object creation ### ret = self.app.new_object("gerber", name, obj_init, autoselected=False) if ret == 'fail': - self.app.inform.emit('[ERROR_NOTCL] Cretion of Gerber failed.') + self.app.inform.emit(_( + '[ERROR_NOTCL] Cretion of Gerber failed.' + )) return self.app.progress.emit(100) # GUI feedback - self.app.inform.emit("[success] Created: " + name) + self.app.inform.emit(_("[success] Created: %s") % name) def convert_units(self, units): """ @@ -1246,7 +1268,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): else: visibility = kwargs['visible'] - with self.app.proc_container.new("Plotting Apertures") as proc: + with self.app.proc_container.new(_("Plotting Apertures")) as proc: self.app.progress.emit(30) def job_thread(app_obj): @@ -1700,7 +1722,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): empty_1 = QtWidgets.QTableWidgetItem('') empty_1.setFlags(~QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - label_tot_drill_count = QtWidgets.QTableWidgetItem('Total Drills') + label_tot_drill_count = QtWidgets.QTableWidgetItem(_('Total Drills')) tot_drill_count = QtWidgets.QTableWidgetItem('%d' % self.tot_drill_cnt) label_tot_drill_count.setFlags(QtCore.Qt.ItemIsEnabled) tot_drill_count.setFlags(QtCore.Qt.ItemIsEnabled) @@ -1726,7 +1748,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): empty_3 = QtWidgets.QTableWidgetItem('') empty_3.setFlags(~QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - label_tot_slot_count = QtWidgets.QTableWidgetItem('Total Slots') + label_tot_slot_count = QtWidgets.QTableWidgetItem(_('Total Slots')) tot_slot_count = QtWidgets.QTableWidgetItem('%d' % self.tot_slot_cnt) label_tot_slot_count.setFlags(QtCore.Qt.ItemIsEnabled) tot_slot_count.setFlags(QtCore.Qt.ItemIsEnabled) @@ -1860,7 +1882,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # Show/Hide Advanced Options if self.app.defaults["global_app_level"] == 'b': - self.ui.level.setText('Basic') + self.ui.level.setText(_( + 'Basic' + )) self.ui.tools_table.setColumnHidden(4, True) self.ui.estartz_label.hide() @@ -1874,7 +1898,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): self.ui.feedrate_probe_label.hide() self.ui.feedrate_probe_entry.hide() else: - self.ui.level.setText('Advanced') + self.ui.level.setText(_( + 'Advanced' + )) assert isinstance(self.ui, ExcellonObjectUI), \ "Expected a ExcellonObjectUI, got %s" % type(self.ui) @@ -1928,8 +1954,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): self.ui.tools_table.currentItem().setText( self.ui.tools_table.currentItem().text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, use a number." + )) self.ui.tools_table.currentItem().setText(str(self.tool_offset[dia])) return @@ -2151,12 +2178,16 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): log.debug("Tools 'all' and sorted are: %s" % str(tools)) if len(tools) == 0: - self.app.inform.emit("[ERROR_NOTCL]Please select one or more tools from the list and try again.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Please select one or more tools from the list and try again." + )) return False, "Error: No tools." for tool in tools: if tooldia > self.tools[tool]["C"]: - self.app.inform.emit("[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled." + )) return False, "Error: Milling tool is larger than hole." def geo_init(geo_obj, app_obj): @@ -2169,7 +2200,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # get the tool_table items in a list of row items tool_table_items = self.get_selected_tools_table_items() # insert an information only element in the front - tool_table_items.insert(0, ["Tool_nr", "Diameter", "Drills_Nr", "Slots_Nr"]) + tool_table_items.insert(0, [_("Tool_nr"), _("Diameter"), _("Drills_Nr"), _("Slots_Nr")]) geo_obj.options['Tools_in_use'] = tool_table_items geo_obj.options['type'] = 'Excellon Geometry' @@ -2238,7 +2269,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): log.debug("Tools 'all' and sorted are: %s" % str(tools)) if len(tools) == 0: - self.app.inform.emit("[ERROR_NOTCL]Please select one or more tools from the list and try again.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Please select one or more tools from the list and try again." + )) return False, "Error: No tools." for tool in tools: @@ -2246,7 +2279,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): adj_toolstable_tooldia = float('%.4f' % float(tooldia)) adj_file_tooldia = float('%.4f' % float(self.tools[tool]["C"])) if adj_toolstable_tooldia > adj_file_tooldia + 0.0001: - self.app.inform.emit("[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." + )) return False, "Error: Milling tool is larger than hole." def geo_init(geo_obj, app_obj): @@ -2259,7 +2294,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # get the tool_table items in a list of row items tool_table_items = self.get_selected_tools_table_items() # insert an information only element in the front - tool_table_items.insert(0, ["Tool_nr", "Diameter", "Drills_Nr", "Slots_Nr"]) + tool_table_items.insert(0, [_("Tool_nr"), _("Diameter"), _("Drills_Nr"), _("Slots_Nr")]) geo_obj.options['Tools_in_use'] = tool_table_items geo_obj.options['type'] = 'Excellon Geometry' @@ -2349,7 +2384,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): if self.ui.tools_table.rowCount() == 3: tools.append(self.ui.tools_table.item(0, 0).text()) else: - self.app.inform.emit("[ERROR_NOTCL]Please select one or more tools from the list and try again.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Please select one or more tools from the list and try again." + )) return xmin = self.options['xmin'] @@ -2368,7 +2405,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # get the tool_table items in a list of row items tool_table_items = self.get_selected_tools_table_items() # insert an information only element in the front - tool_table_items.insert(0, ["Tool_nr", "Diameter", "Drills_Nr", "Slots_Nr"]) + tool_table_items.insert(0, [_("Tool_nr"), _("Diameter"), _("Drills_Nr"), _("Slots_Nr")]) ### Add properties to the object @@ -2405,7 +2442,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]' + )) try: job_obj.feedrate_probe = float(self.options["feedrate_probe"]) @@ -2415,8 +2454,11 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' - 'or self.options["feedrate_probe"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' + 'or self.options["feedrate_probe"]' + ) + ) # There could be more than one drill size... # job_obj.tooldia = # TODO: duplicate variable! @@ -2425,7 +2467,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): tools_csv = ','.join(tools) ret_val = job_obj.generate_from_excellon_by_tool(self, tools_csv, drillz=float(self.options['drillz']), - toolchange=float(self.options["toolchange"]), + toolchange=self.options["toolchange"], toolchangexy=self.app.defaults["excellon_toolchangexy"], toolchangez=float(self.options["toolchangez"]), startz=float(self.options["startz"]) if @@ -2445,7 +2487,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # To be run in separate thread def job_thread(app_obj): - with self.app.proc_container.new("Generating CNC Code"): + with self.app.proc_container.new(_("Generating CNC Code")): app_obj.new_object("cncjob", job_name, job_init) app_obj.progress.emit(100) @@ -2470,8 +2512,10 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): else: coords_xy = [float(eval(coord)) for coord in self.app.defaults["excellon_toolchangexy"].split(",")] if len(coords_xy) < 2: - self.app.inform.emit("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " - "in the format (x, y) \nbut now there is only one value, not two. ") + self.app.inform.emit(_( + "[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " + "in the format (x, y) \nbut now there is only one value, not two. " + )) return 'fail' coords_xy[0] *= factor coords_xy[1] *= factor @@ -2715,7 +2759,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if not isinstance(geo, FlatCAMGerber) and not isinstance(geo, FlatCAMExcellon): for tool_uid in geo.tools: max_uid += 1 - geo_final.tools[max_uid] = copy.deepcopy(geo.tools[tool_uid]) + geo_final.tools[max_uid] = deepcopy(geo.tools[tool_uid]) @staticmethod def get_pts(o): @@ -2816,8 +2860,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # those elements are the ones used for generating GCode self.sel_tools = {} - self.offset_item_options = ["Path", "In", "Out", "Custom"] - self.type_item_options = ["Iso", "Rough", "Finish"] + self.offset_item_options = [_("Path"), _("In"), _("Out"), _("Custom")] + self.type_item_options = [_("Iso"), _("Rough"), _("Finish")] self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"] # flag to store if the V-Shape tool is selected in self.ui.geo_tools_table @@ -3058,9 +3102,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.tools.update({ self.tooluid: { 'tooldia': float(self.options["cnctooldia"]), - 'offset': 'Path', + 'offset': _('Path'), 'offset_value': 0.0, - 'type': 'Rough', + 'type': _('Rough'), 'tool_type': 'C1', 'data': self.default_data, 'solid_geometry': self.solid_geometry @@ -3075,12 +3119,12 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): temp_tools = {} new_key = 0.0 for tooluid_key in self.tools: - val = copy.deepcopy(self.tools[tooluid_key]) - new_key = copy.deepcopy(int(tooluid_key)) + val = deepcopy(self.tools[tooluid_key]) + new_key = deepcopy(int(tooluid_key)) temp_tools[new_key] = val self.tools.clear() - self.tools = copy.deepcopy(temp_tools) + self.tools = deepcopy(temp_tools) self.ui.tool_offset_entry.hide() self.ui.tool_offset_lbl.hide() @@ -3095,13 +3139,15 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.geo_tools_table.setupContextMenu() self.ui.geo_tools_table.addContextMenu( - "Copy", self.on_tool_copy, icon=QtGui.QIcon("share/copy16.png")) + _("Copy"), self.on_tool_copy, icon=QtGui.QIcon("share/copy16.png")) self.ui.geo_tools_table.addContextMenu( - "Delete", lambda: self.on_tool_delete(all=None), icon=QtGui.QIcon("share/delete32.png")) + _("Delete"), lambda: self.on_tool_delete(all=None), icon=QtGui.QIcon("share/delete32.png")) # Show/Hide Advanced Options if self.app.defaults["global_app_level"] == 'b': - self.ui.level.setText('Basic') + self.ui.level.setText(_( + 'Basic' + )) self.ui.geo_tools_table.setColumnHidden(2, True) self.ui.geo_tools_table.setColumnHidden(3, True) @@ -3121,11 +3167,13 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.feedrate_probe_label.hide() self.ui.feedrate_probe_entry.hide() else: - self.ui.level.setText('Advanced') + self.ui.level.setText(_( + 'Advanced' + )) self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click) - self.ui.paint_tool_button.clicked.connect(self.app.paint_tool.run) + self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=False)) self.ui.pp_geometry_name_cb.activated.connect(self.on_pp_changed) def set_tool_offset_visibility(self, current_row): @@ -3135,7 +3183,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): tool_offset = self.ui.geo_tools_table.cellWidget(current_row, 2) if tool_offset is not None: tool_offset_txt = tool_offset.currentText() - if tool_offset_txt == 'Custom': + if tool_offset_txt == _('Custom'): self.ui.tool_offset_entry.show() self.ui.tool_offset_lbl.show() else: @@ -3169,8 +3217,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.tool_offset_entry.get_value().replace(',', '.') ) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + ) + ) return def ui_connect(self): @@ -3307,7 +3358,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if tooldia is None: self.build_ui() - self.app.inform.emit("[ERROR_NOTCL] Please enter the desired tool diameter in Float format.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." + )) return # construct a list of all 'tooluid' in the self.tools @@ -3334,11 +3387,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.tools.update({ self.tooluid: { 'tooldia': tooldia, - 'offset': 'Path', + 'offset': _('Path'), 'offset_value': 0.0, - 'type': 'Rough', + 'type': _('Rough'), 'tool_type': 'C1', - 'data': copy.deepcopy(self.default_data), + 'data': deepcopy(self.default_data), 'solid_geometry': self.solid_geometry } }) @@ -3363,8 +3416,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): 'offset_value': last_offset_value, 'type': last_type, 'tool_type': last_tool_type, - 'data': copy.deepcopy(last_data), - 'solid_geometry': copy.deepcopy(last_solid_geometry) + 'data': deepcopy(last_data), + 'solid_geometry': deepcopy(last_solid_geometry) } }) # print("CURRENT", self.tools[-1]) @@ -3380,10 +3433,14 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ser_attrs.append('tools') if change_message is False: - self.app.inform.emit("[success] Tool added in Tool Table.") + self.app.inform.emit(_( + "[success] Tool added in Tool Table." + )) else: change_message = False - self.app.inform.emit("[ERROR_NOTCL]Default Tool added. Wrong value format entered.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Default Tool added. Wrong value format entered." + )) self.build_ui() def on_tool_copy(self, all=None): @@ -3409,9 +3466,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): tooluid_copy = int(self.ui.geo_tools_table.item(current_row.row(), 5).text()) self.set_tool_offset_visibility(current_row.row()) max_uid += 1 - self.tools[int(max_uid)] = copy.deepcopy(self.tools[tooluid_copy]) + self.tools[int(max_uid)] = deepcopy(self.tools[tooluid_copy]) except AttributeError: - self.app.inform.emit("[WARNING_NOTCL]Failed. Select a tool to copy.") + self.app.inform.emit(_( + "[WARNING_NOTCL]Failed. Select a tool to copy." + )) self.build_ui() return except Exception as e: @@ -3419,16 +3478,18 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # deselect the table # self.ui.geo_tools_table.clearSelection() else: - self.app.inform.emit("[WARNING_NOTCL]Failed. Select a tool to copy.") + self.app.inform.emit(_( + "[WARNING_NOTCL]Failed. Select a tool to copy." + )) self.build_ui() return else: # we copy all tools in geo_tools_table try: - temp_tools = copy.deepcopy(self.tools) + temp_tools = deepcopy(self.tools) max_uid += 1 for tooluid in temp_tools: - self.tools[int(max_uid)] = copy.deepcopy(temp_tools[tooluid]) + self.tools[int(max_uid)] = deepcopy(temp_tools[tooluid]) temp_tools.clear() except Exception as e: log.debug("on_tool_copy() --> " + str(e)) @@ -3446,7 +3507,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ser_attrs.append('tools') self.build_ui() - self.app.inform.emit("[success] Tool was copied in Tool Table.") + self.app.inform.emit(_( + "[success] Tool was copied in Tool Table." + )) def on_tool_edit(self, current_item): @@ -3460,8 +3523,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: d = float(self.ui.geo_tools_table.item(current_row, 1).text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return tool_dia = float('%.4f' % d) @@ -3475,7 +3540,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): except: pass - self.app.inform.emit("[success] Tool was edited in Tool Table.") + self.app.inform.emit(_( + "[success] Tool was edited in Tool Table." + )) self.build_ui() def on_tool_delete(self, all=None): @@ -3493,18 +3560,20 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): tooluid_del = int(self.ui.geo_tools_table.item(current_row.row(), 5).text()) self.set_tool_offset_visibility(current_row.row()) - temp_tools = copy.deepcopy(self.tools) + temp_tools = deepcopy(self.tools) for tooluid_key in self.tools: if int(tooluid_key) == tooluid_del: # if the self.tools has only one tool and we delete it then we move the solid_geometry # as a property of the object otherwise there will be nothing to hold it if len(self.tools) == 1: - self.solid_geometry = copy.deepcopy(self.tools[tooluid_key]['solid_geometry']) + self.solid_geometry = deepcopy(self.tools[tooluid_key]['solid_geometry']) temp_tools.pop(tooluid_del, None) - self.tools = copy.deepcopy(temp_tools) + self.tools = deepcopy(temp_tools) temp_tools.clear() except AttributeError: - self.app.inform.emit("[WARNING_NOTCL]Failed. Select a tool to delete.") + self.app.inform.emit(_( + "[WARNING_NOTCL]Failed. Select a tool to delete." + )) self.build_ui() return except Exception as e: @@ -3512,7 +3581,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # deselect the table # self.ui.geo_tools_table.clearSelection() else: - self.app.inform.emit("[WARNING_NOTCL]Failed. Select a tool to delete.") + self.app.inform.emit(_( + "[WARNING_NOTCL]Failed. Select a tool to delete." + )) self.build_ui() return else: @@ -3534,7 +3605,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ser_attrs.append('tools') self.build_ui() - self.app.inform.emit("[success] Tool was deleted in Tool Table.") + self.app.inform.emit(_( + "[success] Tool was deleted in Tool Table." + )) obj_active = self.app.collection.get_active() # if the object was MultiGeo and now it has no tool at all (therefore no geometry) @@ -3637,8 +3710,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: vdia = float(self.ui.tipdia_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return try: @@ -3648,8 +3723,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: half_vangle = float(self.ui.tipangle_entry.get_value().replace(',', '.')) / 2 except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return @@ -3679,7 +3756,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): cb_txt = cw.currentText() if cw_col == 2: tooluid_value['offset'] = cb_txt - if cb_txt == 'Custom': + if cb_txt == _('Custom'): self.ui.tool_offset_entry.show() self.ui.tool_offset_lbl.show() else: @@ -3690,8 +3767,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): elif cw_col == 3: # force toolpath type as 'Iso' if the tool type is V-Shape if self.ui.geo_tools_table.cellWidget(cw_row, 4).currentText() == 'V': - tooluid_value['type'] = 'Iso' - idx = self.ui.geo_tools_table.cellWidget(cw_row, 3).findText('Iso') + tooluid_value['type'] = _('Iso') + idx = self.ui.geo_tools_table.cellWidget(cw_row, 3).findText(_('Iso')) self.ui.geo_tools_table.cellWidget(cw_row, 3).setCurrentIndex(idx) else: tooluid_value['type'] = cb_txt @@ -3700,7 +3777,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # if the tool_type selected is V-Shape then autoselect the toolpath type as Iso if cb_txt == 'V': - idx = self.ui.geo_tools_table.cellWidget(cw_row, 3).findText('Iso') + idx = self.ui.geo_tools_table.cellWidget(cw_row, 3).findText(_('Iso')) self.ui.geo_tools_table.cellWidget(cw_row, 3).setCurrentIndex(idx) self.ui_update_v_shape(tool_type_txt=self.ui.geo_tools_table.cellWidget(cw_row, 4).currentText()) @@ -3763,8 +3840,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): offset_value_item = float(self.ui.tool_offset_entry.get_value().replace(',', '.') ) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return # this new dict will hold the actual useful data, another dict that is the value of key 'data' @@ -3797,19 +3876,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # updated from self.app.defaults if data_key not in self.form_fields: temp_data[data_key] = value[data_key] - temp_dia[key] = copy.deepcopy(temp_data) + temp_dia[key] = deepcopy(temp_data) temp_data.clear() if key == 'solid_geometry': - temp_dia[key] = copy.deepcopy(self.tools[tooluid_key]['solid_geometry']) + temp_dia[key] = deepcopy(self.tools[tooluid_key]['solid_geometry']) - temp_tools[tooluid_key] = copy.deepcopy(temp_dia) + temp_tools[tooluid_key] = deepcopy(temp_dia) else: - temp_tools[tooluid_key] = copy.deepcopy(tooluid_value) + temp_tools[tooluid_key] = deepcopy(tooluid_value) self.tools.clear() - self.tools = copy.deepcopy(temp_tools) + self.tools = deepcopy(temp_tools) temp_tools.clear() self.ui_connect() @@ -3940,8 +4019,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: if self.special_group: - self.app.inform.emit("[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." % - str(self.special_group)) + self.app.inform.emit(_( + "[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." + ) % str(self.special_group)) return except AttributeError: pass @@ -3956,15 +4036,17 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: tooldia = float(self.ui.geo_tools_table.item(x.row(), 1).text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong Tool Dia value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong Tool Dia value format entered, " + "use a number." + )) return tooluid = int(self.ui.geo_tools_table.item(x.row(), 5).text()) for tooluid_key, tooluid_value in self.tools.items(): if int(tooluid_key) == tooluid: self.sel_tools.update({ - tooluid: copy.deepcopy(tooluid_value) + tooluid: deepcopy(tooluid_value) }) self.mtool_gen_cncjob() self.ui.geo_tools_table.clearSelection() @@ -3975,13 +4057,15 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): for tooluid_key, tooluid_value in self.tools.items(): if int(tooluid_key) == tooluid: self.sel_tools.update({ - tooluid: copy.deepcopy(tooluid_value) + tooluid: deepcopy(tooluid_value) }) self.mtool_gen_cncjob() self.ui.geo_tools_table.clearSelection() else: - self.app.inform.emit("[ERROR_NOTCL] Failed. No tool selected in the tool table ...") + self.app.inform.emit(_( + "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." + )) def mtool_gen_cncjob(self, segx=None, segy=None, use_thread=True): """ @@ -4017,8 +4101,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): ymax = self.options['ymax'] except Exception as e: log.debug("FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s\n" % str(e)) - msg = "[ERROR] An internal error has ocurred. See shell.\n" - msg += 'FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s' % str(e) + msg = _("[ERROR] An internal error has ocurred. See shell.\n") + msg += _('FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s') % str(e) msg += traceback.format_exc() self.app.inform.emit(msg) return @@ -4052,7 +4136,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]' + )) try: job_obj.feedrate_probe = float(self.options["feedrate_probe"]) @@ -4062,8 +4148,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' - 'or self.options["feedrate_probe"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' + 'or self.options["feedrate_probe"]' + )) for tooluid_key in self.sel_tools: tool_cnt += 1 @@ -4136,7 +4224,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if data_key == "dwelltime": dwelltime = data_value - datadict = copy.deepcopy(diadict_value) + datadict = deepcopy(diadict_value) dia_cnc_dict.update({ diadict_key: datadict }) @@ -4160,15 +4248,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.') ) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return if offset_value: tool_offset = float(offset_value) else: self.app.inform.emit( - "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" - "Add a Tool Offset or change the Offset Type." + _( + "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" + "Add a Tool Offset or change the Offset Type." + ) ) return dia_cnc_dict.update({ @@ -4220,7 +4312,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): app_obj.progress.emit(80) job_obj.cnc_tools.update({ - tooluid_key: copy.deepcopy(dia_cnc_dict) + tooluid_key: deepcopy(dia_cnc_dict) }) dia_cnc_dict.clear() @@ -4255,7 +4347,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]' + )) try: job_obj.feedrate_probe = float(self.options["feedrate_probe"]) @@ -4265,8 +4359,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' - 'or self.options["feedrate_probe"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' + 'or self.options["feedrate_probe"]' + )) # make sure that trying to make a CNCJob from an empty file is not creating an app crash if not self.solid_geometry: @@ -4275,7 +4371,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if self.tools[tooluid_key]['solid_geometry'] is None: a += 1 if a == len(self.tools): - self.app.inform.emit('[ERROR_NOTCL]Cancelled. Empty file, it has no geometry...') + self.app.inform.emit(_( + '[ERROR_NOTCL]Cancelled. Empty file, it has no geometry...' + )) return 'fail' for tooluid_key in self.sel_tools: @@ -4359,7 +4457,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if data_key == "dwelltime": dwelltime = data_value - datadict = copy.deepcopy(diadict_value) + datadict = deepcopy(diadict_value) dia_cnc_dict.update({ diadict_key: datadict }) @@ -4383,15 +4481,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.') ) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return if offset_value: tool_offset = float(offset_value) else: self.app.inform.emit( - "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" - "Add a Tool Offset or change the Offset Type." + _( + "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" + "Add a Tool Offset or change the Offset Type." + ) ) return dia_cnc_dict.update({ @@ -4438,7 +4540,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): app_obj.progress.emit(80) job_obj.cnc_tools.update({ - tooluid_key: copy.deepcopy(dia_cnc_dict) + tooluid_key: deepcopy(dia_cnc_dict) }) dia_cnc_dict.clear() @@ -4448,12 +4550,12 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # separate solid_geometry in the self.tools dictionary def job_thread(app_obj): if self.solid_geometry: - with self.app.proc_container.new("Generating CNC Code"): + with self.app.proc_container.new(_("Generating CNC Code")): if app_obj.new_object("cncjob", outname, job_init_single_geometry) != 'fail': app_obj.inform.emit("[success]CNCjob created: %s" % outname) app_obj.progress.emit(100) else: - with self.app.proc_container.new("Generating CNC Code"): + with self.app.proc_container.new(_("Generating CNC Code")): if app_obj.new_object("cncjob", outname, job_init_multi_geometry) != 'fail': app_obj.inform.emit("[success]CNCjob created: %s" % outname) app_obj.progress.emit(100) @@ -4560,7 +4662,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["z_pdepth"] or self.options["z_pdepth"]' + )) try: job_obj.feedrate_probe = float(self.options["feedrate_probe"]) @@ -4570,8 +4674,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.')) except ValueError: self.app.inform.emit( - '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' - 'or self.options["feedrate_probe"]') + _( + '[ERROR_NOTCL]Wrong value format for self.defaults["feedrate_probe"] ' + 'or self.options["feedrate_probe"]' + )) # TODO: The tolerance should not be hard coded. Just for testing. job_obj.generate_from_geometry_2(self, tooldia=tooldia, offset=offset, tolerance=0.0005, @@ -4595,7 +4701,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if use_thread: # To be run in separate thread def job_thread(app_obj): - with self.app.proc_container.new("Generating CNC Code"): + with self.app.proc_container.new(_("Generating CNC Code")): app_obj.new_object("cncjob", outname, job_init) app_obj.inform.emit("[success]CNCjob created: %s" % outname) app_obj.progress.emit(100) @@ -4627,7 +4733,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: xfactor = float(xfactor) except: - self.app.inform.emit("[ERROR_NOTCL] Scale factor has to be a number: integer or float.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Scale factor has to be a number: integer or float.")) return if yfactor is None: @@ -4636,7 +4743,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: yfactor = float(yfactor) except: - self.app.inform.emit("[ERROR_NOTCL] Scale factor has to be a number: integer or float.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Scale factor has to be a number: integer or float." + )) return if point is None: @@ -4672,7 +4781,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): else: self.solid_geometry=scale_recursion(self.solid_geometry) - self.app.inform.emit("[success]Geometry Scale done.") + self.app.inform.emit(_( + "[success]Geometry Scale done." + )) def offset(self, vect): """ @@ -4687,8 +4798,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): try: dx, dy = vect except TypeError: - self.app.inform.emit("[ERROR_NOTCL]An (x,y) pair of values are needed. " - "Probable you entered only one value in the Offset field.") + self.app.inform.emit(_( + "[ERROR_NOTCL]An (x,y) pair of values are needed. " + "Probable you entered only one value in the Offset field." + )) return def translate_recursion(geom): @@ -4705,7 +4818,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.tools[tool]['solid_geometry'] = translate_recursion(self.tools[tool]['solid_geometry']) else: self.solid_geometry=translate_recursion(self.solid_geometry) - self.app.inform.emit("[success]Geometry Offset done.") + self.app.inform.emit(_( + "[success]Geometry Offset done." + )) def convert_units(self, units): self.ui_disconnect() @@ -4731,8 +4846,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): else: coords_xy = [float(eval(coord)) for coord in self.app.defaults["geometry_toolchangexy"].split(",")] if len(coords_xy) < 2: - self.app.inform.emit("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " - "in the format (x, y) \nbut now there is only one value, not two. ") + self.app.inform.emit(_( + "[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " + "in the format (x, y) \nbut now there is only one value, not two. " + )) return 'fail' coords_xy[0] *= factor coords_xy[1] *= factor @@ -4770,8 +4887,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): custom_offset = float(self.ui.tool_offset_entry.get_value().replace(',', '.') ) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_( + "[ERROR_NOTCL]Wrong value format entered, " + "use a number." + )) return except TypeError: pass @@ -4793,16 +4912,16 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # copy the other dict entries that are not convertible if data_key not in param_list: data_copy[data_key] = data_value - tool_dia_copy[dia_key] = copy.deepcopy(data_copy) + tool_dia_copy[dia_key] = deepcopy(data_copy) data_copy.clear() temp_tools_dict.update({ - tooluid_key: copy.deepcopy(tool_dia_copy) + tooluid_key: deepcopy(tool_dia_copy) }) tool_dia_copy.clear() self.tools.clear() - self.tools = copy.deepcopy(temp_tools_dict) + self.tools = deepcopy(temp_tools_dict) # if there is a value in the new tool field then convert that one too tooldia = self.ui.addtool_entry.get_value() @@ -4989,7 +5108,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # flag to store if the CNCJob is part of a special group of CNCJob objects that can't be processed by the # default engine of FlatCAM. They generated by some of tools and are special cases of CNCJob objects. - self. special_group = None + self.special_group = None # for now it show if the plot will be done for multi-tool CNCJob (True) or for single tool # (like the one in the TCL Command), False @@ -5173,11 +5292,15 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # Show/Hide Advanced Options if self.app.defaults["global_app_level"] == 'b': - self.ui.level.setText('Basic') + self.ui.level.setText(_( + 'Basic' + )) self.ui.cnc_frame.hide() else: - self.ui.level.setText('Advanced') + self.ui.level.setText(_( + 'Advanced' + )) self.ui.cnc_frame.show() self.ui.updateplot_button.clicked.connect(self.on_updateplot_button_click) @@ -5237,18 +5360,19 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): try: dir_file_to_save = self.app.get_last_save_folder() + '/' + str(name) - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export Machine Code ...", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export Machine Code ..."), directory=dir_file_to_save, filter=_filter_ ) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Machine Code ...", filter=_filter_) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export Machine Code ..."), filter=_filter_) filename = str(filename) if filename == '': - self.app.inform.emit("[WARNING_NOTCL]Export Machine Code cancelled ...") + self.app.inform.emit(_( + "[WARNING_NOTCL]Export Machine Code cancelled ...")) return preamble = str(self.ui.prepend_text.get_value()) @@ -5259,7 +5383,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): return self.app.file_saved.emit("gcode", filename) - self.app.inform.emit("[success] Machine Code file saved to: %s" % filename) + self.app.inform.emit(_("[success] Machine Code file saved to: %s") % filename) def on_modifygcode_button_click(self, *args): preamble = str(self.ui.prepend_text.get_value()) @@ -5271,7 +5395,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): self.app.gcode_edited = gc # add the tab if it was closed - self.app.ui.plot_tab_area.addTab(self.app.ui.cncjob_tab, "Code Editor") + self.app.ui.plot_tab_area.addTab(self.app.ui.cncjob_tab, _("Code Editor")) # delete the absolute and relative position and messages in the infobar self.app.ui.position_label.setText("") @@ -5290,7 +5414,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): self.app.ui.code_editor.append(proc_line) except Exception as e: log.debug('FlatCAMCNNJob.on_modifygcode_button_click() -->%s' % str(e)) - self.app.inform.emit('[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s' % str(e)) + self.app.inform.emit(_('[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s') % str(e)) return self.app.ui.code_editor.moveCursor(QtGui.QTextCursor.Start) @@ -5396,8 +5520,8 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): try: if self.special_group: - self.app.inform.emit("[WARNING_NOTCL]This CNCJob object can't be processed because " - "it is a %s CNCJob object." % str(self.special_group)) + self.app.inform.emit(_("[WARNING_NOTCL]This CNCJob object can't be processed because " + "it is a %s CNCJob object.") % str(self.special_group)) return 'fail' except AttributeError: pass @@ -5448,7 +5572,9 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # if it did not find 'G20' and it did not find 'G21' then there is an error and return if g_idx == -1: - self.app.inform.emit("[ERROR_NOTCL] G-code does not have a units code: either G20 or G21") + self.app.inform.emit(_( + "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" + )) return g = gcode[:g_idx] + preamble + '\n' + gcode[g_idx:] + postamble @@ -5459,12 +5585,16 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): if 'M6' in g: m6_code = self.parse_custom_toolchange_code(self.ui.toolchange_text.get_value()) if m6_code is None or m6_code == '': - self.app.inform.emit("[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled " - "but it's empty.") + self.app.inform.emit(_( + "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled " + "but it's empty." + )) return 'fail' g = g.replace('M6', m6_code) - self.app.inform.emit("[success] Toolchange G-code was replaced by a custom code.") + self.app.inform.emit(_( + "[success] Toolchange G-code was replaced by a custom code." + )) # lines = StringIO(self.gcode) lines = StringIO(g) @@ -5477,7 +5607,9 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): f.write(line) except FileNotFoundError: - self.app.inform.emit("[WARNING_NOTCL] No such file or directory") + self.app.inform.emit(_( + "[WARNING_NOTCL] No such file or directory" + )) return elif to_file is False: # Just for adding it to the recent files list. @@ -5491,11 +5623,12 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): def on_toolchange_custom_clicked(self, signal): try: if 'toolchange_custom' not in str(self.options['ppname_e']).lower(): - print(self.options['ppname_e']) if self.ui.toolchange_cb.get_value(): self.ui.toolchange_cb.set_value(False) self.app.inform.emit( - "[WARNING_NOTCL] The used postprocessor file has to have in it's name: 'toolchange_custom'") + _( + "[WARNING_NOTCL] The used postprocessor file has to have in it's name: 'toolchange_custom'" + )) except KeyError: try: for key in self.cnc_tools: @@ -5505,11 +5638,15 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): if self.ui.toolchange_cb.get_value(): self.ui.toolchange_cb.set_value(False) self.app.inform.emit( - "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " - "'toolchange_custom'") + _( + "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " + "'toolchange_custom'" + )) except KeyError: self.app.inform.emit( - "[ERROR] There is no postprocessor file.") + _( + "[ERROR] There is no postprocessor file." + )) def get_gcode(self, preamble='', postamble=''): #we need this to be able get_gcode separatelly for shell command export_gcode @@ -5635,7 +5772,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # copy the other dict entries that are not convertible if data_key not in param_list: data_copy[data_key] = data_value - tool_dia_copy[dia_key] = copy.deepcopy(data_copy) + tool_dia_copy[dia_key] = deepcopy(data_copy) data_copy.clear() if dia_key == 'gcode': @@ -5651,15 +5788,15 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # for g in dia_value: # g['geom'] = affinity.scale(g['geom'], factor, factor, origin=(0, 0)) # - # tool_dia_copy['gcode_parsed'] = copy.deepcopy(dia_value) + # tool_dia_copy['gcode_parsed'] = deepcopy(dia_value) # tool_dia_copy['solid_geometry'] = cascaded_union([geo['geom'] for geo in dia_value]) temp_tools_dict.update({ - tooluid_key: copy.deepcopy(tool_dia_copy) + tooluid_key: deepcopy(tool_dia_copy) }) tool_dia_copy.clear() self.cnc_tools.clear() - self.cnc_tools = copy.deepcopy(temp_tools_dict) + self.cnc_tools = deepcopy(temp_tools_dict) # end of file diff --git a/FlatCAMPostProc.py b/FlatCAMPostProc.py index 6e158be4..80c4e9b7 100644 --- a/FlatCAMPostProc.py +++ b/FlatCAMPostProc.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Matthieu Berthomé # +# Date: 5/26/2017 # +# MIT Licence # +############################################################ + from importlib.machinery import SourceFileLoader import os from abc import ABCMeta, abstractmethod diff --git a/FlatCAMProcess.py b/FlatCAMProcess.py index 9e1e882f..d71e62d8 100644 --- a/FlatCAMProcess.py +++ b/FlatCAMProcess.py @@ -6,7 +6,7 @@ # MIT Licence # ############################################################ -from FlatCAMGUI import FlatCAMActivityView +from flatcamGUI.FlatCAMGUI import FlatCAMActivityView from PyQt5 import QtCore import weakref diff --git a/FlatCAMTool.py b/FlatCAMTool.py index 0ddeefcf..db313cac 100644 --- a/FlatCAMTool.py +++ b/FlatCAMTool.py @@ -83,11 +83,11 @@ class FlatCAMTool(QtWidgets.QWidget): # Put ourself in the GUI self.app.ui.tool_scroll_area.setWidget(self) - # Set the tool name as the widget object name - self.app.ui.tool_scroll_area.widget().setObjectName(self.toolName) - # Switch notebook to tool page self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab) + # Set the tool name as the widget object name + self.app.ui.tool_scroll_area.widget().setObjectName(self.toolName) + self.show() diff --git a/FlatCAMTranslation.py b/FlatCAMTranslation.py new file mode 100644 index 00000000..7d11c531 --- /dev/null +++ b/FlatCAMTranslation.py @@ -0,0 +1,129 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + +import os +import sys + +from PyQt5 import QtWidgets, QtGui +from PyQt5.QtCore import QSettings + +from flatcamGUI.GUIElements import log +import gettext + +# ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes +languages_dict = { + 'zh': 'Chinese', + 'de': 'German', + 'en': 'English', + 'es': 'Spanish', + 'fr': 'French', + 'it': 'Italian', + 'ro': 'Romanian', + 'ru': 'Russian', +} + +translations = {} + +languages_path_search = '' + + +def load_languages(): + languages_path_search = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale') + + available_translations = next(os.walk(languages_path_search))[1] + + for lang in available_translations: + try: + if lang in languages_dict.keys(): + translations[lang] = languages_dict[lang] + except KeyError as e: + log.debug("FlatCAMTranslations.load_languages() --> %s" % str(e)) + return translations + + +def languages_dir(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale') + + +def on_language_apply_click(app, restart=False): + """ + Using instructions from here: + https://inventwithpython.com/blog/2014/12/20/translate-your-python-3-program-with-the-gettext-module/ + + :return: + """ + name = app.ui.general_defaults_form.general_app_group.language_cb.currentText() + + # do nothing if trying to apply the language that is the current language (already applied). + settings = QSettings("Open Source", "FlatCAM") + if settings.contains("language"): + current_language = settings.value('language', type=str) + if current_language == name: + return + + if restart: + msgbox = QtWidgets.QMessageBox() + msgbox.setText("The application will restart.") + msgbox.setInformativeText("Are you sure do you want to change the current language to %s?" % name.capitalize()) + msgbox.setWindowTitle("Apply Language ...") + msgbox.setWindowIcon(QtGui.QIcon('share/language32.png')) + msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Cancel) + msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes) + + response = msgbox.exec_() + + if response == QtWidgets.QMessageBox.Cancel: + return + else: + settings = QSettings("Open Source", "FlatCAM") + saved_language = name + settings.setValue('language', saved_language) + # This will write the setting to the platform specific storage. + del settings + + restart_program(app=app) + +def apply_language(domain, lang=None): + lang_code = '' + + if lang is None: + settings = QSettings("Open Source", "FlatCAM") + if settings.contains("language"): + name = settings.value('language') + else: + name = settings.value('English') + else: + name = str(lang) + + for lang_code, lang_usable in load_languages().items(): + if lang_usable == name: + # break and then use the current key as language + break + + if lang_code == '': + return "no language" + else: + try: + current_lang = gettext.translation(str(domain), localedir=languages_dir(), languages=[lang_code]) + current_lang.install() + except Exception as e: + log.debug("FlatCAMTranslation.apply_language() --> %s" % str(e)) + + return name + + +def restart_program(app): + """Restarts the current program. + Note: this function does not return. Any cleanup action (like + saving data) must be done before calling this function. + """ + app.save_defaults() + python = sys.executable + os.execl(python, python, *sys.argv) + + diff --git a/ObjectCollection.py b/ObjectCollection.py index e63025ec..07c6d52e 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -6,6 +6,10 @@ # MIT Licence # ############################################################ +############################################################ +# File modified by: Dennis Hayrullin # +############################################################ + # from PyQt5.QtCore import QModelIndex from FlatCAMObj import * import inspect # TODO: Remove @@ -14,6 +18,14 @@ from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt # import webbrowser +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class KeySensitiveListView(QtWidgets.QTreeView): """ @@ -65,7 +77,7 @@ class KeySensitiveListView(QtWidgets.QTreeView): # file drop from outside application if drop_indicator == QtWidgets.QAbstractItemView.OnItem: if self.filename == "": - self.app.inform.emit("Open cancelled.") + self.app.inform.emit(_("Open cancelled.")) else: if self.filename.lower().rpartition('.')[-1] in self.app.grb_list: self.app.worker_task.emit({'fcn': self.app.open_gerber, @@ -387,7 +399,7 @@ class ObjectCollection(QtCore.QAbstractItemModel): "setData() --> Could not remove the old object name from auto-completer model list") obj.build_ui() - self.app.inform.emit("Object renamed from %s to %s" % (old_name, new_name)) + self.app.inform.emit(_("Object renamed from {old} to {new}").format(old=old_name, new=new_name)) return True @@ -681,17 +693,17 @@ class ObjectCollection(QtCore.QAbstractItemModel): obj = current.indexes()[0].internalPointer().obj if obj.kind == 'gerber': - self.app.inform.emit('[selected]%s selected' % - ('green', str(obj.options['name']))) + self.app.inform.emit(_('[selected]{name} selected').format( + color='green', name=str(obj.options['name']))) elif obj.kind == 'excellon': - self.app.inform.emit('[selected]%s selected' % - ('brown', str(obj.options['name']))) + self.app.inform.emit(_('[selected]{name} selected').format( + color='brown', name=str(obj.options['name']))) elif obj.kind == 'cncjob': - self.app.inform.emit('[selected]%s selected' % - ('blue', str(obj.options['name']))) + self.app.inform.emit(_('[selected]{name} selected').format( + color='blue', name=str(obj.options['name']))) elif obj.kind == 'geometry': - self.app.inform.emit('[selected]%s selected' % - ('red', str(obj.options['name']))) + self.app.inform.emit(_('[selected]{name} selected').format( + color='red', name=str(obj.options['name']))) except IndexError: FlatCAMApp.App.log.debug("on_list_selection_change(): Index Error (Nothing selected?)") @@ -721,7 +733,7 @@ class ObjectCollection(QtCore.QAbstractItemModel): try: a_idx.build_ui() except Exception as e: - self.app.inform.emit("[ERROR] Cause of error: %s" % str(e)) + self.app.inform.emit(_("[ERROR] Cause of error: %s") % str(e)) raise def get_list(self): diff --git a/README.md b/README.md index 67b1b419..93d0d72b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,87 @@ CAD program, and create G-Code for Isolation routing. ================================================= +17.03.2019 + +- remade the layout in 2Sided Tool +- work in progress for translation in Romanian - 91% +- changed some of the app strings formatting to work better with Poedit translation software +- fixed bug in Drillcncjob TclCommand +- finished translation in Romanian + + +16.03.2019 + +- fixed bug in Paint Tool - Single Poly: no geometry was generated +- work in progress for translation in Romanian - 70% + +13.03.2019 + +- made the layout combobox current item from Preferences -> General window to reflect the current layout +- remade the POT translate file +- work in progress in translation for Romanian language 44% +- fix for showing tools by activating them from the Menu - final fix. + +11.03.2019 + +- changed some icons here and there +- fixed the Properties Project menu entry to work on the new way +- in Properties tool now the Gerber apertures show the number of polygons in 'solid_geometry' instead of listing the objects +- added a visual cue in Menu -> Edit about the entries to enter the Editor and to Save & Exit Editor. When one is enabled the other is disabled. +- grouped all the UI files in flatcamGUI folder +- grouped all parser files in flatcamParsers folder +- another changes to the final_save() function +- some strings were left outside the translation formatting - fixed +- finished the replacement of '_' symbols throughout the app which conflicted with the _() function used by the i18n +- reverted changes in Tools regarding the toggle effect - now they work as expected + +10.03.2019 + +- added a fix in the Gerber parser when adding the geometry in the self.apertures dict for the case that the current aperture is None (Allegro does that) +- finished support for internationalization by adding a set of .po/.mo files for the English language. Unfortunately the final action can be done only when Beta will be out of Beta (no more changes) or when I will decide to stop working on this app. +- changed the tooltip for 'feedrate_rapids' parameter to point out that this parameter is useful only for the Marlin postprocessor +- fix app crash for the case that there are no translation files +- fixed some forgotten strings to be prepared for internationalization in ToolCalculators +- fixed Tools menu no longer working due of changes +- added some test translation for the ToolCalculators (in Romanian) +- fixed bug in ToolCutOut where for each tool invocation the signals were reconnected +- fixed some issues with ToolMeasurement due of above changes +- updated the App.final_save() function +- fixed an issue created by the fact that I used the '_' char inside the app to designate unused info and that conflicted with the _() function used by gettext +- made impossible to try to reapply current language that it's already applied (un-necessary) + +8.03.2019 + +- fixed issue when doing th CTRL (or SHIFT) + LMB, the focus is automatically moved to Project Tab +- further work in internationalization, added a fallback to English language in case there is no translation for a string +- fix for issue #262: when doing Edit-> Save & Close Editor on a Geometry that is not generated through first entering into an Editor, the geometry disappear +- finished preparing for internationalization for the files: camlib and objectCollection +- fixed tools shortcuts not working anymore due of the new toggle parameter for the .run(). +- finished preparing for internationalization for the files: FlatCAMEditor, FlatCAMGUI +- finished preparing for internationalization for the files: FlatCAMObj, ObjectUI +- sorted the languages in the Preferences combobox + +7.03.2019 + +- made showing a shape when hovering over objects, optional, by adding a Preferences -> General parameter +- starting to work in internationalization using gettext() +- Finished adding _() in FlatCAM Tools +- fixed Measuring Tool - after doing a measurement the Notebook was switching to Project Tab without letting the user see the results +- more work on the translation engine; the app now restarts after a language is applied +- added protection against using Travel Z parameter with negative or zero value (in Geometry). +- made sure that when the Measuring Tools is active after last click the Status bar is no longer deleted + +6.03.2019 + +- modified the way the FlatCAM Tools are run from toolbar as opposed of running them from other sources +- some Gerber UI changes + +5.03.2019 + +- modified the grbl-laser postprocessor lift_code() +- treated an error created by Z_Cut parameter being None +- changed the hover and selection box transparency + 4.03.2019 - finished work on object hovering diff --git a/camlib.py b/camlib.py index b15e65c3..4f271798 100644 --- a/camlib.py +++ b/camlib.py @@ -9,17 +9,21 @@ #import traceback from io import StringIO + +import numpy as np from numpy import arctan2, Inf, array, sqrt, pi, ceil, sin, cos, dot, float32, \ transpose from numpy.linalg import solve, norm -import re -import sys + +import re, sys, os, platform +import math +from copy import deepcopy + import traceback from decimal import Decimal -import collections - from rtree import index as rtindex +from lxml import etree as ET # See: http://toblerity.org/shapely/manual.html from shapely.geometry import Polygon, LineString, Point, LinearRing, MultiLineString @@ -31,47 +35,43 @@ from shapely.wkt import loads as sloads from shapely.wkt import dumps as sdumps from shapely.geometry.base import BaseGeometry from shapely.geometry import shape -from shapely import speedups +import collections from collections import Iterable -import numpy as np import rasterio from rasterio.features import shapes - -from copy import deepcopy +import ezdxf # TODO: Commented for FlatCAM packaging with cx_freeze - -from xml.dom.minidom import parseString as parse_xml_string - # from scipy.spatial import KDTree, Delaunay -from ParseSVG import * -from ParseDXF import * +from flatcamParsers.ParseSVG import * +from flatcamParsers.ParseDXF import * import logging -import os -# import pprint -import platform import FlatCAMApp -import math - if platform.architecture()[0] == '64bit': from ortools.constraint_solver import pywrapcp from ortools.constraint_solver import routing_enums_pb2 - log = logging.getLogger('base2') log.setLevel(logging.DEBUG) -# log.setLevel(logging.WARNING) -# log.setLevel(logging.INFO) + formatter = logging.Formatter('[%(levelname)s] %(message)s') handler = logging.StreamHandler() handler.setFormatter(formatter) log.addHandler(handler) +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class ParseError(Exception): pass @@ -197,7 +197,7 @@ class Geometry(object): if isinstance(self.solid_geometry, list): return len(self.solid_geometry) == 0 - self.app.inform.emit("[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list.") + self.app.inform.emit(_("[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list.")) return def subtract_polygon(self, points): @@ -1384,9 +1384,9 @@ class Geometry(object): self.tools[tool]['solid_geometry'] = mirror_geom(self.tools[tool]['solid_geometry']) else: self.solid_geometry = mirror_geom(self.solid_geometry) - self.app.inform.emit('[success]Object was mirrored ...') + self.app.inform.emit(_('[success]Object was mirrored ...')) except AttributeError: - self.app.inform.emit("[ERROR_NOTCL] Failed to mirror. No object selected") + self.app.inform.emit(_("[ERROR_NOTCL] Failed to mirror. No object selected")) def rotate(self, angle, point): """ @@ -1422,9 +1422,9 @@ class Geometry(object): self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry']) else: self.solid_geometry = rotate_geom(self.solid_geometry) - self.app.inform.emit('[success]Object was rotated ...') + self.app.inform.emit(_('[success]Object was rotated ...')) except AttributeError: - self.app.inform.emit("[ERROR_NOTCL] Failed to rotate. No object selected") + self.app.inform.emit(_("[ERROR_NOTCL] Failed to rotate. No object selected")) def skew(self, angle_x, angle_y, point): """ @@ -1458,9 +1458,9 @@ class Geometry(object): self.tools[tool]['solid_geometry'] = skew_geom(self.tools[tool]['solid_geometry']) else: self.solid_geometry = skew_geom(self.solid_geometry) - self.app.inform.emit('[success]Object was skewed ...') + self.app.inform.emit(_('[success]Object was skewed ...')) except AttributeError: - self.app.inform.emit("[ERROR_NOTCL] Failed to skew. No object selected") + self.app.inform.emit(_("[ERROR_NOTCL] Failed to skew. No object selected")) # if type(self.solid_geometry) == list: # self.solid_geometry = [affinity.skew(g, angle_x, angle_y, origin=(px, py)) @@ -2548,8 +2548,8 @@ class Gerber (Geometry): else: if '0' not in self.apertures: self.apertures['0'] = {} - self.apertures['0']['solid_geometry'] = [] self.apertures['0']['type'] = 'REG' + self.apertures['0']['solid_geometry'] = [] used_aperture = '0' try: @@ -2611,7 +2611,7 @@ class Gerber (Geometry): if path[-1] != [linear_x, linear_y]: path.append([linear_x, linear_y]) - if making_region is False: + if making_region is False: # if the aperture is rectangle then add a rectangular shape having as parameters the # coordinates of the start and end point and also the width and height # of the 'R' aperture @@ -2635,29 +2635,56 @@ class Gerber (Geometry): except: pass last_path_aperture = current_aperture + # we do this for the case that a region is done without having defined any aperture + # Allegro does that + if last_path_aperture is None: + if '0' not in self.apertures: + self.apertures['0'] = {} + self.apertures['0']['type'] = 'REG' + self.apertures['0']['solid_geometry'] = [] + last_path_aperture = '0' else: - self.app.inform.emit("[WARNING] Coordinates missing, line ignored: %s" % str(gline)) - self.app.inform.emit("[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!") + self.app.inform.emit(_("[WARNING] Coordinates missing, line ignored: %s") % str(gline)) + self.app.inform.emit(_("[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!")) elif current_operation_code == 2: if len(path) > 1: geo = None - ## --- BUFFERED --- + # --- BUFFERED --- # this treats the case when we are storing geometry as paths only if making_region: + # we do this for the case that a region is done without having defined any aperture + # Allegro does that + if last_path_aperture is None: + if '0' not in self.apertures: + self.apertures['0'] = {} + self.apertures['0']['type'] = 'REG' + self.apertures['0']['solid_geometry'] = [] + last_path_aperture = '0' geo = Polygon() else: geo = LineString(path) + try: if self.apertures[last_path_aperture]["type"] != 'R': if not geo.is_empty: follow_buffer.append(geo) - except: - follow_buffer.append(geo) + except Exception as e: + log.debug("camlib.Gerber.parse_lines() --> %s" % str(e)) + if not geo.is_empty: + follow_buffer.append(geo) # this treats the case when we are storing geometry as solids if making_region: + # we do this for the case that a region is done without having defined any aperture + # Allegro does that + if last_path_aperture is None: + if '0' not in self.apertures: + self.apertures['0'] = {} + self.apertures['0']['type'] = 'REG' + self.apertures['0']['solid_geometry'] = [] + last_path_aperture = '0' elem = [linear_x, linear_y] if elem != path[-1]: path.append([linear_x, linear_y]) @@ -2666,9 +2693,9 @@ class Gerber (Geometry): geo = Polygon(path) except ValueError: log.warning("Problem %s %s" % (gline, line_num)) - self.app.inform.emit("[ERROR] Region does not have enough points. " + self.app.inform.emit(_("[ERROR] Region does not have enough points. " "File will be processed but there are parser errors. " - "Line number: %s" % str(line_num)) + "Line number: %s") % str(line_num)) else: if last_path_aperture is None: log.warning("No aperture defined for curent path. (%d)" % line_num) @@ -2684,7 +2711,8 @@ class Gerber (Geometry): except KeyError: self.apertures[last_path_aperture]['solid_geometry'] = [] self.apertures[last_path_aperture]['solid_geometry'].append(geo) - except: + except Exception as e: + log.debug("camlib.Gerber.parse_lines() --> %s" % str(e)) poly_buffer.append(geo) try: self.apertures[last_path_aperture]['solid_geometry'].append(geo) @@ -2696,8 +2724,8 @@ class Gerber (Geometry): if linear_x is not None and linear_y is not None: path = [[linear_x, linear_y]] # Start new path else: - self.app.inform.emit("[WARNING] Coordinates missing, line ignored: %s" % str(gline)) - self.app.inform.emit("[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!") + self.app.inform.emit(_("[WARNING] Coordinates missing, line ignored: %s") % str(gline)) + self.app.inform.emit(_("[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!")) # Flash # Not allowed in region mode. @@ -3020,7 +3048,7 @@ class Gerber (Geometry): log.error("Gerber PARSING FAILED. Line %d: %s" % (line_num, gline)) loc = 'Gerber Line #%d Gerber Line Content: %s\n' % (line_num, gline) + repr(err) - self.app.inform.emit("[ERROR]Gerber Parser ERROR.\n%s:" % loc) + self.app.inform.emit(_("[ERROR]Gerber Parser ERROR.\n%s:") % loc) @staticmethod def create_flash_geometry(location, aperture, steps_per_circle=None): @@ -3198,7 +3226,7 @@ class Gerber (Geometry): try: xfactor = float(xfactor) except: - self.app.inform.emit("[ERROR_NOTCL] Scale factor has to be a number: integer or float.") + self.app.inform.emit(_("[ERROR_NOTCL] Scale factor has to be a number: integer or float.")) return if yfactor is None: @@ -3207,7 +3235,7 @@ class Gerber (Geometry): try: yfactor = float(yfactor) except: - self.app.inform.emit("[ERROR_NOTCL] Scale factor has to be a number: integer or float.") + self.app.inform.emit(_("[ERROR_NOTCL] Scale factor has to be a number: integer or float.")) return if point is None: @@ -3236,7 +3264,7 @@ class Gerber (Geometry): except Exception as e: log.debug('FlatCAMGeometry.scale() --> %s' % str(e)) - self.app.inform.emit("[success]Gerber Scale done.") + self.app.inform.emit(_("[success]Gerber Scale done.")) ## solid_geometry ??? @@ -3269,8 +3297,8 @@ class Gerber (Geometry): try: dx, dy = vect except TypeError: - self.app.inform.emit("[ERROR_NOTCL]An (x,y) pair of values are needed. " - "Probable you entered only one value in the Offset field.") + self.app.inform.emit(_("[ERROR_NOTCL]An (x,y) pair of values are needed. " + "Probable you entered only one value in the Offset field.")) return def offset_geom(obj): @@ -3293,7 +3321,7 @@ class Gerber (Geometry): except Exception as e: log.debug('FlatCAMGeometry.offset() --> %s' % str(e)) - self.app.inform.emit("[success]Gerber Offset done.") + self.app.inform.emit(_("[success]Gerber Offset done.")) def mirror(self, axis, point): """ @@ -3669,7 +3697,7 @@ class Excellon(Geometry): # and we need to exit from here if self.detect_gcode_re.search(eline): log.warning("This is GCODE mark: %s" % eline) - self.app.inform.emit('[ERROR_NOTCL] This is GCODE mark: %s' % eline) + self.app.inform.emit(_('[ERROR_NOTCL] This is GCODE mark: %s') % eline) return # Header Begin (M48) # @@ -4198,8 +4226,8 @@ class Excellon(Geometry): log.info("Zeros: %s, Units %s." % (self.zeros, self.units)) except Exception as e: log.error("Excellon PARSING FAILED. Line %d: %s" % (line_num, eline)) - msg = "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" - msg += '[ERROR] Excellon Parser error.\nParsing Failed. Line %d: %s\n' % (line_num, eline) + msg = _("[ERROR_NOTCL] An internal error has ocurred. See shell.\n") + msg += _('[ERROR] Excellon Parser error.\nParsing Failed. Line {l_nr}: {line}\n').format(l_nr=line_num, line=eline) msg += traceback.format_exc() self.app.inform.emit(msg) @@ -4276,9 +4304,9 @@ class Excellon(Geometry): for drill in self.drills: # poly = drill['point'].buffer(self.tools[drill['tool']]["C"]/2.0) if drill['tool'] is '': - self.app.inform.emit("[WARNING] Excellon.create_geometry() -> a drill location was skipped " + self.app.inform.emit(_("[WARNING] Excellon.create_geometry() -> a drill location was skipped " "due of not having a tool associated.\n" - "Check the resulting GCode.") + "Check the resulting GCode.")) log.debug("Excellon.create_geometry() -> a drill location was skipped " "due of not having a tool associated") continue @@ -4812,7 +4840,7 @@ class CNCjob(Geometry): try: value = getattr(self, command) except AttributeError: - self.app.inform.emit("[ERROR] There is no such parameter: %s" % str(match)) + self.app.inform.emit(_("[ERROR] There is no such parameter: %s") % str(match)) log.debug("CNCJob.parse_custom_toolchange_code() --> AttributeError ") return 'fail' text = text.replace(match, str(value)) @@ -4877,15 +4905,15 @@ class CNCjob(Geometry): :rtype: None """ if drillz > 0: - self.app.inform.emit("[WARNING] The Cut Z parameter has positive value. " + self.app.inform.emit(_("[WARNING] The Cut Z parameter has positive value. " "It is the depth value to drill into material.\n" "The Cut Z parameter needs to have a negative value, assuming it is a typo " "therefore the app will convert the value to negative. " - "Check the resulting CNC code (Gcode etc).") + "Check the resulting CNC code (Gcode etc).")) self.z_cut = -drillz elif drillz == 0: - self.app.inform.emit("[WARNING] The Cut Z parameter is zero. " - "There will be no cut, skipping %s file" % exobj.options['name']) + self.app.inform.emit(_("[WARNING] The Cut Z parameter is zero. " + "There will be no cut, skipping %s file") % exobj.options['name']) return 'fail' else: self.z_cut = drillz @@ -4898,8 +4926,8 @@ class CNCjob(Geometry): else: self.xy_toolchange = [float(eval(a)) for a in toolchangexy.split(",")] if len(self.xy_toolchange) < 2: - self.app.inform.emit("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " - "in the format (x, y) \nbut now there is only one value, not two. ") + self.app.inform.emit(_("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " + "in the format (x, y) \nbut now there is only one value, not two. ")) return 'fail' except Exception as e: log.debug("camlib.CNCJob.generate_from_excellon_by_tool() --> %s" % str(e)) @@ -5100,7 +5128,7 @@ class CNCjob(Geometry): else: log.debug("camlib.CNCJob.generate_from_excellon_by_tool() --> " "The loaded Excellon file has no drills ...") - self.app.inform.emit('[ERROR_NOTCL]The loaded Excellon file has no drills ...') + self.app.inform.emit(_('[ERROR_NOTCL]The loaded Excellon file has no drills ...')) return 'fail' log.debug("The total travel distance with OR-TOOLS Metaheuristics is: %s" % str(measured_distance)) @@ -5172,7 +5200,12 @@ class CNCjob(Geometry): else: current_tooldia = float('%.3f' % float(exobj.tools[tool]["C"])) - z_offset = float(self.tool_offset[current_tooldia]) * (-1) + # TODO apply offset only when using the GUI, for TclCommand this will create an error + # because the values for Z offset are created in build_ui() + try: + z_offset = float(self.tool_offset[current_tooldia]) * (-1) + except KeyError: + z_offset = 0 self.z_cut += z_offset # Drillling! @@ -5190,12 +5223,12 @@ class CNCjob(Geometry): else: log.debug("camlib.CNCJob.generate_from_excellon_by_tool() --> " "The loaded Excellon file has no drills ...") - self.app.inform.emit('[ERROR_NOTCL]The loaded Excellon file has no drills ...') + self.app.inform.emit(_('[ERROR_NOTCL]The loaded Excellon file has no drills ...')) return 'fail' log.debug("The total travel distance with OR-TOOLS Basic Algorithm is: %s" % str(measured_distance)) else: - self.app.inform.emit("[ERROR_NOTCL] Wrong optimization type selected.") + self.app.inform.emit(_("[ERROR_NOTCL] Wrong optimization type selected.")) return 'fail' else: log.debug("Using Travelling Salesman drill path optimization.") @@ -5241,7 +5274,7 @@ class CNCjob(Geometry): else: log.debug("camlib.CNCJob.generate_from_excellon_by_tool() --> " "The loaded Excellon file has no drills ...") - self.app.inform.emit('[ERROR_NOTCL]The loaded Excellon file has no drills ...') + self.app.inform.emit(_('[ERROR_NOTCL]The loaded Excellon file has no drills ...')) return 'fail' log.debug("The total travel distance with Travelling Salesman Algorithm is: %s" % str(measured_distance)) @@ -5329,8 +5362,8 @@ class CNCjob(Geometry): else: self.xy_toolchange = [float(eval(a)) for a in toolchangexy.split(",")] if len(self.xy_toolchange) < 2: - self.app.inform.emit("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " - "in the format (x, y) \nbut now there is only one value, not two. ") + self.app.inform.emit(_("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " + "in the format (x, y) \nbut now there is only one value, not two. ")) return 'fail' except Exception as e: log.debug("camlib.CNCJob.generate_from_multitool_geometry() --> %s" % str(e)) @@ -5339,16 +5372,38 @@ class CNCjob(Geometry): self.pp_geometry_name = pp_geometry_name if pp_geometry_name else 'default' self.f_plunge = self.app.defaults["geometry_f_plunge"] + if self.z_cut is None: + self.app.inform.emit(_("[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad combinations of " + "other parameters.")) + return 'fail' + if self.z_cut > 0: - self.app.inform.emit("[WARNING] The Cut Z parameter has positive value. " + self.app.inform.emit(_("[WARNING] The Cut Z parameter has positive value. " "It is the depth value to cut into material.\n" "The Cut Z parameter needs to have a negative value, assuming it is a typo " "therefore the app will convert the value to negative." - "Check the resulting CNC code (Gcode etc).") + "Check the resulting CNC code (Gcode etc).")) self.z_cut = -self.z_cut elif self.z_cut == 0: - self.app.inform.emit("[WARNING] The Cut Z parameter is zero. " - "There will be no cut, skipping %s file" % self.options['name']) + self.app.inform.emit(_("[WARNING] The Cut Z parameter is zero. " + "There will be no cut, skipping %s file") % self.options['name']) + return 'fail' + + if self.z_move is None: + self.app.inform.emit(_("[ERROR_NOTCL] Travel Z parameter is None or zero.")) + return 'fail' + + if self.z_move < 0: + self.app.inform.emit(_("[WARNING] The Travel Z parameter has negative value. " + "It is the height value to travel between cuts.\n" + "The Z Travel parameter needs to have a positive value, assuming it is a typo " + "therefore the app will convert the value to positive." + "Check the resulting CNC code (Gcode etc).")) + self.z_move = -self.z_move + elif self.z_move == 0: + self.app.inform.emit(_("[WARNING] The Z Travel parameter is zero. " + "This is dangerous, skipping %s file") % self.options['name']) + return 'fail' ## Index first and last points in paths # What points to index. @@ -5476,14 +5531,14 @@ class CNCjob(Geometry): """ if not isinstance(geometry, Geometry): - self.app.inform.emit("[ERROR]Expected a Geometry, got %s" % type(geometry)) + self.app.inform.emit(_("[ERROR]Expected a Geometry, got %s") % type(geometry)) return 'fail' log.debug("Generate_from_geometry_2()") # if solid_geometry is empty raise an exception if not geometry.solid_geometry: - self.app.inform.emit("[ERROR_NOTCL]Trying to generate a CNC Job " - "from a Geometry object without solid_geometry.") + self.app.inform.emit(_("[ERROR_NOTCL]Trying to generate a CNC Job " + "from a Geometry object without solid_geometry.")) temp_solid_geometry = [] @@ -5521,9 +5576,9 @@ class CNCjob(Geometry): # if the offset is less than half of the total length or less than half of the total width of the # solid geometry it's obvious we can't do the offset if -offset > ((c - a) / 2) or -offset > ((d - b) / 2): - self.app.inform.emit("[ERROR_NOTCL]The Tool Offset value is too negative to use " + self.app.inform.emit(_("[ERROR_NOTCL]The Tool Offset value is too negative to use " "for the current_geometry.\n" - "Raise the value (in module) and try again.") + "Raise the value (in module) and try again.")) return 'fail' # hack: make offset smaller by 0.0000000001 which is insignificant difference but allow the job # to continue @@ -5578,8 +5633,8 @@ class CNCjob(Geometry): else: self.xy_toolchange = [float(eval(a)) for a in toolchangexy.split(",")] if len(self.xy_toolchange) < 2: - self.app.inform.emit("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " - "in the format (x, y) \nbut now there is only one value, not two. ") + self.app.inform.emit(_("[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be " + "in the format (x, y) \nbut now there is only one value, not two. ")) return 'fail' except Exception as e: log.debug("camlib.CNCJob.generate_from_geometry_2() --> %s" % str(e)) @@ -5588,16 +5643,38 @@ class CNCjob(Geometry): self.pp_geometry_name = pp_geometry_name if pp_geometry_name else 'default' self.f_plunge = self.app.defaults["geometry_f_plunge"] + if self.z_cut is None: + self.app.inform.emit(_("[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad combinations of " + "other parameters.")) + return 'fail' + if self.z_cut > 0: - self.app.inform.emit("[WARNING] The Cut Z parameter has positive value. " + self.app.inform.emit(_("[WARNING] The Cut Z parameter has positive value. " "It is the depth value to cut into material.\n" "The Cut Z parameter needs to have a negative value, assuming it is a typo " "therefore the app will convert the value to negative." - "Check the resulting CNC code (Gcode etc).") + "Check the resulting CNC code (Gcode etc).")) self.z_cut = -self.z_cut elif self.z_cut == 0: - self.app.inform.emit("[WARNING] The Cut Z parameter is zero. " - "There will be no cut, skipping %s file" % geometry.options['name']) + self.app.inform.emit(_("[WARNING] The Cut Z parameter is zero. " + "There will be no cut, skipping %s file") % geometry.options['name']) + return 'fail' + + if self.z_move is None: + self.app.inform.emit(_("[ERROR_NOTCL] Travel Z parameter is None or zero.")) + return 'fail' + + if self.z_move < 0: + self.app.inform.emit(_("[WARNING] The Travel Z parameter has negative value. " + "It is the height value to travel between cuts.\n" + "The Z Travel parameter needs to have a positive value, assuming it is a typo " + "therefore the app will convert the value to positive." + "Check the resulting CNC code (Gcode etc).")) + self.z_move = -self.z_move + elif self.z_move == 0: + self.app.inform.emit(_("[WARNING] The Z Travel parameter is zero. " + "This is dangerous, skipping %s file") % self.options['name']) + return 'fail' ## Index first and last points in paths # What points to index. @@ -5721,7 +5798,7 @@ class CNCjob(Geometry): if not kwargs: log.debug("camlib.generate_from_solderpaste_geo() --> No tool in the solderpaste geometry.") - self.app.inform.emit("[ERROR_NOTCL] There is no tool data in the SolderPaste geometry.") + self.app.inform.emit(_("[ERROR_NOTCL] There is no tool data in the SolderPaste geometry.")) # this is the tool diameter, it is used as such to accommodate the postprocessor who need the tool diameter diff --git a/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py similarity index 66% rename from FlatCAMGUI.py rename to flatcamGUI/FlatCAMGUI.py index cf4f55b2..42797493 100644 --- a/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -6,14 +6,25 @@ # MIT Licence # ############################################################ -from PyQt5 import QtGui, QtCore, QtWidgets -from PyQt5.QtCore import Qt, QSettings -from GUIElements import * +############################################################ +# File Modified (major mod): Marius Adrian Stanciu # +# Date: 3/10/2019 # +############################################################ + +from PyQt5.QtCore import QSettings +from flatcamGUI.GUIElements import * import platform import webbrowser from FlatCAMEditor import FCShapeTool +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext class FlatCAMGUI(QtWidgets.QMainWindow): # Emitted when persistent window geometry needs to be retained @@ -36,71 +47,73 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menu = self.menuBar() ### File ### - self.menufile = self.menu.addMenu('&File') + self.menufile = self.menu.addMenu(_('&File')) self.menufile.setToolTipsVisible(True) # New Project - self.menufilenewproject = QtWidgets.QAction(QtGui.QIcon('share/file16.png'), '&New Project ...\tCTRL+N', self) + self.menufilenewproject = QtWidgets.QAction(QtGui.QIcon('share/file16.png'), + _('&New Project ...\tCTRL+N'), self) self.menufilenewproject.setToolTip( - "Will create a new, blank project" + _("Will create a new, blank project") ) self.menufile.addAction(self.menufilenewproject) # New Category (Excellon, Geometry) - self.menufilenew = self.menufile.addMenu(QtGui.QIcon('share/file16.png'), '&New') + self.menufilenew = self.menufile.addMenu(QtGui.QIcon('share/file16.png'), _('&New')) self.menufilenew.setToolTipsVisible(True) - self.menufilenewgeo = self.menufilenew.addAction(QtGui.QIcon('share/new_geo16.png'), '&New Geometry\tN') + self.menufilenewgeo = self.menufilenew.addAction(QtGui.QIcon('share/geometry16.png'), _('Geometry\tN')) self.menufilenewgeo.setToolTip( - "Will create a new, empty Geometry Object." + _("Will create a new, empty Geometry Object.") ) - self.menufilenewexc = self.menufilenew.addAction(QtGui.QIcon('share/new_geo16.png'), 'New Excellon\tL') + self.menufilenewexc = self.menufilenew.addAction(QtGui.QIcon('share/drill16.png'), _('Excellon\tL')) self.menufilenewexc.setToolTip( - "Will create a new, empty Excellon Object." + _("Will create a new, empty Excellon Object.") ) - self.menufile_open = self.menufile.addMenu(QtGui.QIcon('share/folder32_bis.png'), 'Open') + self.menufile_open = self.menufile.addMenu(QtGui.QIcon('share/folder32_bis.png'), _('Open')) self.menufile_open.setToolTipsVisible(True) # Open gerber ... self.menufileopengerber = QtWidgets.QAction(QtGui.QIcon('share/flatcam_icon24.png'), - 'Open &Gerber ...\tCTRL+G', self) + _('Open &Gerber ...\tCTRL+G'), self) self.menufile_open.addAction(self.menufileopengerber) self.menufile_open.addSeparator() # Open Excellon ... self.menufileopenexcellon = QtWidgets.QAction(QtGui.QIcon('share/open_excellon32.png'), - 'Open &Excellon ...\tCTRL+E', + _('Open &Excellon ...\tCTRL+E'), self) self.menufile_open.addAction(self.menufileopenexcellon) # Open G-Code ... - self.menufileopengcode = QtWidgets.QAction(QtGui.QIcon('share/code.png'), 'Open G-&Code ...', self) + self.menufileopengcode = QtWidgets.QAction(QtGui.QIcon('share/code.png'), _('Open G-&Code ...'), self) self.menufile_open.addAction(self.menufileopengcode) # Open Project ... - self.menufileopenproject = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Project ...', self) + self.menufileopenproject = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), _('Open &Project ...'), self) self.menufile_open.addAction(self.menufileopenproject) self.menufile_open.addSeparator() # Open Config File... - self.menufileopenconfig = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), 'Open Config ...', self) + self.menufileopenconfig = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), _('Open Config ...'), self) self.menufile_open.addAction(self.menufileopenconfig) # Recent - self.recent = self.menufile.addMenu(QtGui.QIcon('share/recent_files.png'), "Recent files") + self.recent = self.menufile.addMenu(QtGui.QIcon('share/recent_files.png'), _("Recent files")) # Separator self.menufile.addSeparator() # Run Scripts - self.menufilerunscript = QtWidgets.QAction(QtGui.QIcon('share/script16.png'), 'Run Script ...\tSHIFT+S', self) + self.menufilerunscript = QtWidgets.QAction(QtGui.QIcon('share/script16.png'), _('Run Script ...\tSHIFT+S'), + self) self.menufilerunscript.setToolTip( - "Will run the opened Tcl Script thus\n" + _( "Will run the opened Tcl Script thus\n" "enabling the automation of certain\n" - "functions of FlatCAM." + "functions of FlatCAM.") ) self.menufile.addAction(self.menufilerunscript) @@ -108,50 +121,51 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menufile.addSeparator() # Import ... - self.menufileimport = self.menufile.addMenu(QtGui.QIcon('share/import.png'), 'Import') + self.menufileimport = self.menufile.addMenu(QtGui.QIcon('share/import.png'), _('Import')) self.menufileimportsvg = QtWidgets.QAction(QtGui.QIcon('share/svg16.png'), - '&SVG as Geometry Object ...', self) + _('&SVG as Geometry Object ...'), self) self.menufileimport.addAction(self.menufileimportsvg) self.menufileimportsvg_as_gerber = QtWidgets.QAction(QtGui.QIcon('share/svg16.png'), - '&SVG as Gerber Object ...', self) + _('&SVG as Gerber Object ...'), self) self.menufileimport.addAction(self.menufileimportsvg_as_gerber) self.menufileimport.addSeparator() self.menufileimportdxf = QtWidgets.QAction(QtGui.QIcon('share/dxf16.png'), - '&DXF as Geometry Object ...', self) + _('&DXF as Geometry Object ...'), self) self.menufileimport.addAction(self.menufileimportdxf) self.menufileimportdxf_as_gerber = QtWidgets.QAction(QtGui.QIcon('share/dxf16.png'), - '&DXF as Gerber Object ...', self) + _('&DXF as Gerber Object ...'), self) self.menufileimport.addAction(self.menufileimportdxf_as_gerber) self.menufileimport.addSeparator() # Export ... - self.menufileexport = self.menufile.addMenu(QtGui.QIcon('share/export.png'), 'Export') + self.menufileexport = self.menufile.addMenu(QtGui.QIcon('share/export.png'), _('Export')) self.menufileexport.setToolTipsVisible(True) - self.menufileexportsvg = QtWidgets.QAction(QtGui.QIcon('share/export.png'), 'Export &SVG ...', self) + self.menufileexportsvg = QtWidgets.QAction(QtGui.QIcon('share/export.png'), _('Export &SVG ...'), self) self.menufileexport.addAction(self.menufileexportsvg) - self.menufileexportdxf = QtWidgets.QAction(QtGui.QIcon('share/export.png'), 'Export DXF ...', self) + self.menufileexportdxf = QtWidgets.QAction(QtGui.QIcon('share/export.png'), _('Export DXF ...'), self) self.menufileexport.addAction(self.menufileexportdxf) self.menufileexport.addSeparator() - self.menufileexportpng = QtWidgets.QAction(QtGui.QIcon('share/export_png32.png'), 'Export &PNG ...', self) + self.menufileexportpng = QtWidgets.QAction(QtGui.QIcon('share/export_png32.png'), _('Export &PNG ...'), self) self.menufileexportpng.setToolTip( - "Will export an image in PNG format,\n" + _("Will export an image in PNG format,\n" "the saved image will contain the visual \n" - "information currently in FlatCAM Plot Area." + "information currently in FlatCAM Plot Area.") ) self.menufileexport.addAction(self.menufileexportpng) self.menufileexport.addSeparator() - self.menufileexportexcellon = QtWidgets.QAction(QtGui.QIcon('share/drill32.png'), 'Export &Excellon ...', self) + self.menufileexportexcellon = QtWidgets.QAction(QtGui.QIcon('share/drill32.png'), _('Export &Excellon ...'), + self) self.menufileexportexcellon.setToolTip( - "Will export an Excellon Object as Excellon file,\n" + _( "Will export an Excellon Object as Excellon file,\n" "the coordinates format, the file units and zeros\n" - "are set in Preferences -> Excellon Export." + "are set in Preferences -> Excellon Export.") ) self.menufileexport.addAction(self.menufileexportexcellon) @@ -160,24 +174,24 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menufile.addSeparator() # Save Defaults - self.menufilesavedefaults = QtWidgets.QAction(QtGui.QIcon('share/defaults.png'), 'Save &Defaults', self) + self.menufilesavedefaults = QtWidgets.QAction(QtGui.QIcon('share/defaults.png'), _('Save &Defaults'), self) self.menufile.addAction(self.menufilesavedefaults) # Separator self.menufile.addSeparator() - self.menufile_save = self.menufile.addMenu(QtGui.QIcon('share/save_as.png'), 'Save') + self.menufile_save = self.menufile.addMenu(QtGui.QIcon('share/save_as.png'), _('Save')) # Save Project - self.menufilesaveproject = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project ...', self) + self.menufilesaveproject = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), _('&Save Project ...'), self) self.menufile_save.addAction(self.menufilesaveproject) # Save Project As ... self.menufilesaveprojectas = QtWidgets.QAction(QtGui.QIcon('share/save_as.png'), - 'Save Project &As ...\tCTRL+S', self) + _('Save Project &As ...\tCTRL+S'), self) self.menufile_save.addAction(self.menufilesaveprojectas) # Save Project Copy ... - self.menufilesaveprojectcopy = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), 'Save Project C&opy ...', + self.menufilesaveprojectcopy = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), _('Save Project C&opy ...'), self) self.menufile_save.addAction(self.menufilesaveprojectcopy) @@ -185,77 +199,87 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menufile.addSeparator() # Quit - self.menufile_exit = QtWidgets.QAction(QtGui.QIcon('share/power16.png'), 'E&xit', self) + self.menufile_exit = QtWidgets.QAction(QtGui.QIcon('share/power16.png'), _('E&xit'), self) # exitAction.setShortcut('Ctrl+Q') # exitAction.setStatusTip('Exit application') self.menufile.addAction(self.menufile_exit) ### Edit ### - self.menuedit = self.menu.addMenu('&Edit') + self.menuedit = self.menu.addMenu(_('&Edit')) # Separator self.menuedit.addSeparator() - self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), 'Edit Object\tE') - self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), 'Save && Close Editor\tCTRL+S') + self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), _('Edit Object\tE')) + self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), _('Save && Close Editor\tCTRL+S')) + + # adjust the initial state of the menu entries related to the editor + self.menueditedit.setDisabled(False) + self.menueditok.setDisabled(True) + # Separator self.menuedit.addSeparator() - self.menuedit_convert = self.menuedit.addMenu(QtGui.QIcon('share/convert24.png'), 'Conversion') + self.menuedit_convert = self.menuedit.addMenu(QtGui.QIcon('share/convert24.png'), _('Conversion')) self.menuedit_convertjoin = self.menuedit_convert.addAction( - QtGui.QIcon('share/join16.png'), '&Join Geo/Gerber/Exc -> Geo') + QtGui.QIcon('share/join16.png'), _('&Join Geo/Gerber/Exc -> Geo')) self.menuedit_convertjoin.setToolTip( - "Merge a selection of objects, which can be of type:\n" + _( "Merge a selection of objects, which can be of type:\n" "- Gerber\n" "- Excellon\n" "- Geometry\n" "into a new combo Geometry object.") + ) self.menuedit_convertjoinexc = self.menuedit_convert.addAction( - QtGui.QIcon('share/join16.png'), 'Join Excellon(s) -> Excellon') + QtGui.QIcon('share/join16.png'), _('Join Excellon(s) -> Excellon')) self.menuedit_convertjoinexc.setToolTip( - "Merge a selection of Excellon objects into a new combo Excellon object.") + _( "Merge a selection of Excellon objects into a new combo Excellon object.") + ) self.menuedit_convertjoingrb = self.menuedit_convert.addAction( - QtGui.QIcon('share/join16.png'), 'Join Gerber(s) -> Gerber') + QtGui.QIcon('share/join16.png'), _('Join Gerber(s) -> Gerber')) self.menuedit_convertjoingrb.setToolTip( - "Merge a selection of Gerber objects into a new combo Gerber object.") + _("Merge a selection of Gerber objects into a new combo Gerber object.") + ) # Separator self.menuedit_convert.addSeparator() self.menuedit_convert_sg2mg = self.menuedit_convert.addAction( - QtGui.QIcon('share/convert24.png'), 'Convert Single to MultiGeo') + QtGui.QIcon('share/convert24.png'), _('Convert Single to MultiGeo')) self.menuedit_convert_sg2mg.setToolTip( - "Will convert a Geometry object from single_geometry type\n" + _( "Will convert a Geometry object from single_geometry type\n" "to a multi_geometry type.") + ) self.menuedit_convert_mg2sg = self.menuedit_convert.addAction( - QtGui.QIcon('share/convert24.png'), 'Convert Multi to SingleGeo') + QtGui.QIcon('share/convert24.png'), _('Convert Multi to SingleGeo')) self.menuedit_convert_mg2sg.setToolTip( - "Will convert a Geometry object from multi_geometry type\n" + _( "Will convert a Geometry object from multi_geometry type\n" "to a single_geometry type.") + ) self.menuedit_convert.setToolTipsVisible(True) # Separator self.menuedit.addSeparator() - self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), '&Copy Object\tCTRL+C') + self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), _('&Copy Object\tCTRL+C')) self.menueditcopyobjectasgeom = self.menuedit.addAction(QtGui.QIcon('share/copy_geo.png'), - 'Copy as &Geom') + _('Copy as &Geom')) # Separator self.menuedit.addSeparator() - self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), '&Delete\tDEL') + self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), _('&Delete\tDEL')) # Separator self.menuedit.addSeparator() - self.menueditorigin = self.menuedit.addAction(QtGui.QIcon('share/origin.png'), 'Se&t Origin\tO') - self.menueditjump = self.menuedit.addAction(QtGui.QIcon('share/jump_to16.png'), 'Jump to Location\tJ') + self.menueditorigin = self.menuedit.addAction(QtGui.QIcon('share/origin.png'), _('Se&t Origin\tO')) + self.menueditjump = self.menuedit.addAction(QtGui.QIcon('share/jump_to16.png'), _('Jump to Location\tJ')) # Separator self.menuedit.addSeparator() self.menuedittoggleunits= self.menuedit.addAction(QtGui.QIcon('share/toggle_units16.png'), - 'Toggle Units\tQ') + _('Toggle Units\tQ')) self.menueditselectall = self.menuedit.addAction(QtGui.QIcon('share/select_all.png'), - '&Select All\tCTRL+A') + _('&Select All\tCTRL+A')) # Separator self.menuedit.addSeparator() - self.menueditpreferences = self.menuedit.addAction(QtGui.QIcon('share/pref.png'), '&Preferences\tSHIFT+P') + self.menueditpreferences = self.menuedit.addAction(QtGui.QIcon('share/pref.png'), _('&Preferences\tSHIFT+P')) ### Options ### - self.menuoptions = self.menu.addMenu('&Options') + self.menuoptions = self.menu.addMenu(_('&Options')) # self.menuoptions_transfer = self.menuoptions.addMenu(QtGui.QIcon('share/transfer.png'), 'Transfer options') # self.menuoptions_transfer_a2p = self.menuoptions_transfer.addAction("Application to Project") # self.menuoptions_transfer_p2a = self.menuoptions_transfer.addAction("Project to Application") @@ -270,73 +294,77 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # self.menuoptions_transform = self.menuoptions.addMenu(QtGui.QIcon('share/transform.png'), # '&Transform Object') self.menuoptions_transform_rotate = self.menuoptions.addAction(QtGui.QIcon('share/rotate.png'), - "&Rotate Selection\tSHIFT+(R)") + _("&Rotate Selection\tSHIFT+(R)")) # Separator self.menuoptions.addSeparator() self.menuoptions_transform_skewx = self.menuoptions.addAction(QtGui.QIcon('share/skewX.png'), - "&Skew on X axis\tSHIFT+X") + _("&Skew on X axis\tSHIFT+X")) self.menuoptions_transform_skewy = self.menuoptions.addAction(QtGui.QIcon('share/skewY.png'), - "S&kew on Y axis\tSHIFT+Y") + _( "S&kew on Y axis\tSHIFT+Y")) # Separator self.menuoptions.addSeparator() self.menuoptions_transform_flipx = self.menuoptions.addAction(QtGui.QIcon('share/flipx.png'), - "Flip on &X axis\tX") + _("Flip on &X axis\tX")) self.menuoptions_transform_flipy = self.menuoptions.addAction(QtGui.QIcon('share/flipy.png'), - "Flip on &Y axis\tY") + _("Flip on &Y axis\tY")) # Separator self.menuoptions.addSeparator() self.menuoptions_view_source = self.menuoptions.addAction(QtGui.QIcon('share/source32.png'), - "View source\tALT+S") + _("View source\tALT+S")) # Separator self.menuoptions.addSeparator() ### View ### - self.menuview = self.menu.addMenu('&View') - self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share/replot16.png'), 'Enable all plots\tALT+1') + self.menuview = self.menu.addMenu(_('&View')) + self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share/replot16.png'), _('Enable all plots\tALT+1')) self.menuviewdisableall = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'), - 'Disable all plots\tALT+2') + _('Disable all plots\tALT+2')) self.menuviewdisableother = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'), - 'Disable non-selected\tALT+3') + _('Disable non-selected\tALT+3')) # Separator self.menuview.addSeparator() - self.menuview_zoom_fit = self.menuview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit\tV") - self.menuview_zoom_in = self.menuview.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In\t-") - self.menuview_zoom_out = self.menuview.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out\t=") + self.menuview_zoom_fit = self.menuview.addAction(QtGui.QIcon('share/zoom_fit32.png'), _("&Zoom Fit\tV")) + self.menuview_zoom_in = self.menuview.addAction(QtGui.QIcon('share/zoom_in32.png'), _("&Zoom In\t-")) + self.menuview_zoom_out = self.menuview.addAction(QtGui.QIcon('share/zoom_out32.png'), _("&Zoom Out\t=")) self.menuview.addSeparator() self.menuview_toggle_code_editor = self.menuview.addAction(QtGui.QIcon('share/code_editor32.png'), - 'Toggle Code Editor\tCTRL+E') + _('Toggle Code Editor\tCTRL+E')) self.menuview.addSeparator() self.menuview_toggle_fscreen = self.menuview.addAction( - QtGui.QIcon('share/fscreen32.png'), "&Toggle FullScreen\tALT+F10") + QtGui.QIcon('share/fscreen32.png'), _("&Toggle FullScreen\tALT+F10")) self.menuview_toggle_parea = self.menuview.addAction( - QtGui.QIcon('share/plot32.png'), "&Toggle Plot Area\tCTRL+F10") + QtGui.QIcon('share/plot32.png'), _("&Toggle Plot Area\tCTRL+F10")) self.menuview_toggle_notebook = self.menuview.addAction( - QtGui.QIcon('share/notebook32.png'), "&Toggle Project/Sel/Tool\t`") + QtGui.QIcon('share/notebook32.png'), _("&Toggle Project/Sel/Tool\t`")) self.menuview.addSeparator() - self.menuview_toggle_grid = self.menuview.addAction(QtGui.QIcon('share/grid32.png'), "&Toggle Grid Snap\tG") - self.menuview_toggle_axis = self.menuview.addAction(QtGui.QIcon('share/axis32.png'), "&Toggle Axis\tSHIFT+G") + self.menuview_toggle_grid = self.menuview.addAction(QtGui.QIcon('share/grid32.png'), _("&Toggle Grid Snap\tG") + ) + self.menuview_toggle_axis = self.menuview.addAction(QtGui.QIcon('share/axis32.png'), _("&Toggle Axis\tSHIFT+G") + ) self.menuview_toggle_workspace = self.menuview.addAction(QtGui.QIcon('share/workspace24.png'), - "Toggle Workspace\tSHIFT+W") + _("Toggle Workspace\tSHIFT+W")) ### Tool ### # self.menutool = self.menu.addMenu('&Tool') - self.menutool = QtWidgets.QMenu('&Tool') + self.menutool = QtWidgets.QMenu(_('&Tool')) self.menutoolaction = self.menu.addMenu(self.menutool) - self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), '&Command Line\tS') + self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), _('&Command Line\tS')) ### Help ### - self.menuhelp = self.menu.addMenu('&Help') - self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), 'Help\tF1') - self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share/home16.png'), 'FlatCAM.org') + self.menuhelp = self.menu.addMenu(_('&Help')) + self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), _('Help\tF1')) + self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share/home16.png'), _('FlatCAM.org')) self.menuhelp.addSeparator() - self.menuhelp_shortcut_list = self.menuhelp.addAction(QtGui.QIcon('share/shortcuts24.png'), 'Shortcuts List\tF3') - self.menuhelp_videohelp = self.menuhelp.addAction(QtGui.QIcon('share/youtube32.png'), 'YouTube Channel\tF4') - self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/about32.png'), 'About') + self.menuhelp_shortcut_list = self.menuhelp.addAction(QtGui.QIcon('share/shortcuts24.png'), + _('Shortcuts List\tF3')) + self.menuhelp_videohelp = self.menuhelp.addAction(QtGui.QIcon('share/youtube32.png'), _('YouTube Channel\tF4') + ) + self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/about32.png'), _('About')) ### FlatCAM Editor menu ### @@ -347,68 +375,71 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # self.select_menuitem = self.menu.addAction(QtGui.QIcon('share/pointer16.png'), "Select 'Esc'") self.geo_add_circle_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/circle32.png'), 'Add Circle\tO' + QtGui.QIcon('share/circle32.png'), _('Add Circle\tO') ) - self.geo_add_arc_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/arc16.png'), 'Add Arc\tA') + self.geo_add_arc_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/arc16.png'), _('Add Arc\tA')) self.geo_editor_menu.addSeparator() self.geo_add_rectangle_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle\tR' + QtGui.QIcon('share/rectangle32.png'), _('Add Rectangle\tR') ) self.geo_add_polygon_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/polygon32.png'), 'Add Polygon\tN' + QtGui.QIcon('share/polygon32.png'), _('Add Polygon\tN') ) - self.geo_add_path_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/path32.png'), 'Add Path\tP') + self.geo_add_path_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/path32.png'), _('Add Path\tP')) self.geo_editor_menu.addSeparator() - self.geo_add_text_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/text32.png'), 'Add Text\tT') + self.geo_add_text_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/text32.png'), _('Add Text\tT')) self.geo_editor_menu.addSeparator() - self.geo_union_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/union16.png'), 'Polygon Union\tU') + self.geo_union_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/union16.png'), + _('Polygon Union\tU')) self.geo_intersection_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/intersection16.png'), - 'Polygon Intersection\tE') + _('Polygon Intersection\tE')) self.geo_subtract_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction\tS' + QtGui.QIcon('share/subtract16.png'), _('Polygon Subtraction\tS') ) self.geo_editor_menu.addSeparator() - self.geo_cutpath_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path\tX') + self.geo_cutpath_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/cutpath16.png'), + _('Cut Path\tX')) # self.move_menuitem = self.menu.addAction(QtGui.QIcon('share/move16.png'), "Move Objects 'm'") - self.geo_copy_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/copy16.png'), "Copy Geom\tC") + self.geo_copy_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/copy16.png'), _("Copy Geom\tC")) self.geo_delete_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/deleteshape16.png'), "Delete Shape\tDEL" + QtGui.QIcon('share/deleteshape16.png'), _("Delete Shape\tDEL") ) self.geo_editor_menu.addSeparator() - self.geo_move_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/move32.png'), "Move\tM") + self.geo_move_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/move32.png'), _("Move\tM")) self.geo_buffer_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/buffer16.png'), "Buffer Tool\tB" + QtGui.QIcon('share/buffer16.png'),_( "Buffer Tool\tB") ) self.geo_paint_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/paint16.png'), "Paint Tool\tI" + QtGui.QIcon('share/paint16.png'), _("Paint Tool\tI") ) self.geo_transform_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/transform.png'), "Transform Tool\tALT+R" + QtGui.QIcon('share/transform.png'),_( "Transform Tool\tALT+R") ) self.geo_editor_menu.addSeparator() self.geo_cornersnap_menuitem = self.geo_editor_menu.addAction( - QtGui.QIcon('share/corner32.png'), "Toggle Corner Snap\tK" + QtGui.QIcon('share/corner32.png'), _("Toggle Corner Snap\tK") ) - self.exc_editor_menu = QtWidgets.QMenu(">Excellon Editor<") + self.exc_editor_menu = QtWidgets.QMenu(_(">Excellon Editor<")) self.menu.addMenu(self.exc_editor_menu) self.exc_add_array_drill_menuitem = self.exc_editor_menu.addAction( - QtGui.QIcon('share/rectangle32.png'), 'Add Drill Array\tA') - self.exc_add_drill_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/plus16.png'), 'Add Drill\tD') + QtGui.QIcon('share/rectangle32.png'), _('Add Drill Array\tA')) + self.exc_add_drill_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/plus16.png'), + _('Add Drill\tD')) self.exc_editor_menu.addSeparator() self.exc_resize_drill_menuitem = self.exc_editor_menu.addAction( - QtGui.QIcon('share/resize16.png'), 'Resize Drill(S)\tR' + QtGui.QIcon('share/resize16.png'), _('Resize Drill(S)\tR') ) - self.exc_copy_drill_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/copy32.png'), 'Copy\tC') + self.exc_copy_drill_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/copy32.png'), _('Copy\tC')) self.exc_delete_drill_menuitem = self.exc_editor_menu.addAction( - QtGui.QIcon('share/deleteshape32.png'), 'Delete\tDEL' + QtGui.QIcon('share/deleteshape32.png'), _('Delete\tDEL') ) self.exc_editor_menu.addSeparator() self.exc_move_drill_menuitem = self.exc_editor_menu.addAction( - QtGui.QIcon('share/move32.png'), 'Move Drill(s)\tM') + QtGui.QIcon('share/move32.png'),_( 'Move Drill(s)\tM')) self.geo_editor_menu.menuAction().setVisible(False) self.geo_editor_menu.setDisabled(True) @@ -422,19 +453,19 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ################################ self.menuproject = QtWidgets.QMenu() - self.menuprojectenable = self.menuproject.addAction(QtGui.QIcon('share/replot32.png'), 'Enable Plot') - self.menuprojectdisable = self.menuproject.addAction(QtGui.QIcon('share/clear_plot32.png'), 'Disable Plot') + self.menuprojectenable = self.menuproject.addAction(QtGui.QIcon('share/replot32.png'), _('Enable Plot')) + self.menuprojectdisable = self.menuproject.addAction(QtGui.QIcon('share/clear_plot32.png'), _('Disable Plot')) self.menuproject.addSeparator() - self.menuprojectgeneratecnc = self.menuproject.addAction(QtGui.QIcon('share/cnc32.png'), 'Generate CNC') - self.menuprojectviewsource = self.menuproject.addAction(QtGui.QIcon('share/source32.png'), 'View Source') + self.menuprojectgeneratecnc = self.menuproject.addAction(QtGui.QIcon('share/cnc32.png'), _('Generate CNC')) + self.menuprojectviewsource = self.menuproject.addAction(QtGui.QIcon('share/source32.png'), _('View Source')) - self.menuprojectedit = self.menuproject.addAction(QtGui.QIcon('share/edit_ok32.png'), 'Edit') - self.menuprojectcopy = self.menuproject.addAction(QtGui.QIcon('share/copy32.png'), 'Copy') - self.menuprojectdelete = self.menuproject.addAction(QtGui.QIcon('share/delete32.png'), 'Delete') - self.menuprojectsave= self.menuproject.addAction(QtGui.QIcon('share/save_as.png'), 'Save') + self.menuprojectedit = self.menuproject.addAction(QtGui.QIcon('share/edit_ok32.png'), _('Edit')) + self.menuprojectcopy = self.menuproject.addAction(QtGui.QIcon('share/copy32.png'), _('Copy')) + self.menuprojectdelete = self.menuproject.addAction(QtGui.QIcon('share/delete32.png'), _('Delete')) + self.menuprojectsave= self.menuproject.addAction(QtGui.QIcon('share/save_as.png'), _('Save')) self.menuproject.addSeparator() - self.menuprojectproperties = self.menuproject.addAction(QtGui.QIcon('share/properties32.png'), 'Properties') + self.menuprojectproperties = self.menuproject.addAction(QtGui.QIcon('share/properties32.png'), _('Properties')) ################ ### Splitter ### @@ -463,35 +494,35 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ############### ### TOOLBAR INSTALLATION ### - self.toolbarfile = QtWidgets.QToolBar('File Toolbar') + self.toolbarfile = QtWidgets.QToolBar(_('File Toolbar')) self.toolbarfile.setObjectName('File_TB') self.addToolBar(self.toolbarfile) - self.toolbargeo = QtWidgets.QToolBar('Edit Toolbar') + self.toolbargeo = QtWidgets.QToolBar(_('Edit Toolbar')) self.toolbargeo.setObjectName('Edit_TB') self.addToolBar(self.toolbargeo) - self.toolbarview = QtWidgets.QToolBar('View Toolbar') + self.toolbarview = QtWidgets.QToolBar(_('View Toolbar')) self.toolbarview.setObjectName('View_TB') self.addToolBar(self.toolbarview) - self.toolbarshell = QtWidgets.QToolBar('Shell Toolbar') + self.toolbarshell = QtWidgets.QToolBar(_('Shell Toolbar')) self.toolbarshell.setObjectName('Shell_TB') self.addToolBar(self.toolbarshell) - self.toolbartools = QtWidgets.QToolBar('Tools Toolbar') + self.toolbartools = QtWidgets.QToolBar(_('Tools Toolbar')) self.toolbartools.setObjectName('Tools_TB') self.addToolBar(self.toolbartools) - self.exc_edit_toolbar = QtWidgets.QToolBar('Excellon Editor Toolbar') + self.exc_edit_toolbar = QtWidgets.QToolBar(_('Excellon Editor Toolbar')) self.exc_edit_toolbar.setObjectName('ExcEditor_TB') self.addToolBar(self.exc_edit_toolbar) - self.geo_edit_toolbar = QtWidgets.QToolBar('Geometry Editor Toolbar') + self.geo_edit_toolbar = QtWidgets.QToolBar(_('Geometry Editor Toolbar')) self.geo_edit_toolbar.setObjectName('GeoEditor_TB') self.addToolBar(self.geo_edit_toolbar) - self.snap_toolbar = QtWidgets.QToolBar('Grid Toolbar') + self.snap_toolbar = QtWidgets.QToolBar(_('Grid Toolbar')) self.snap_toolbar.setObjectName('Snap_TB') self.addToolBar(self.snap_toolbar) @@ -507,126 +538,127 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ### File Toolbar ### self.file_open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share/flatcam_icon32.png'), - "Open GERBER") - self.file_open_excellon_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), "Open EXCELLON") + _("Open Gerber")) + self.file_open_excellon_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), _("Open Excellon")) self.toolbarfile.addSeparator() - self.file_open_btn = self.toolbarfile.addAction(QtGui.QIcon('share/folder32.png'), "Open project") - self.file_save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), "Save project") + self.file_open_btn = self.toolbarfile.addAction(QtGui.QIcon('share/folder32.png'), _("Open project")) + self.file_save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), _("Save project")) ### Edit Toolbar ### - self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), "New Blank Geometry") - self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), "New Blank Excellon") + self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), _("New Blank Geometry")) + self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), _("New Blank Excellon")) self.toolbargeo.addSeparator() - self.editgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/edit32.png'), "Editor") + self.editgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/edit32.png'), _("Editor")) self.update_obj_btn = self.toolbargeo.addAction( - QtGui.QIcon('share/edit_ok32_bis.png'), "Save Object and close the Editor" + QtGui.QIcon('share/edit_ok32_bis.png'), _("Save Object and close the Editor") ) self.toolbargeo.addSeparator() - self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), "&Delete") + self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), _("&Delete")) ### View Toolbar ### - self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), "&Replot") - self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear plot") - self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), "Zoom In") - self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), "Zoom Out") - self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "Zoom Fit") + self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), _("&Replot")) + self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), _("&Clear plot")) + self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), _("Zoom In")) + self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), _("Zoom Out")) + self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), _("Zoom Fit")) # self.toolbarview.setVisible(False) ### Shell Toolbar ### - self.shell_btn = self.toolbarshell.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line") + self.shell_btn = self.toolbarshell.addAction(QtGui.QIcon('share/shell32.png'), _("&Command Line")) ### Tools Toolbar ### - self.dblsided_btn = self.toolbartools.addAction(QtGui.QIcon('share/doubleside32.png'), "2Sided Tool") - self.cutout_btn = self.toolbartools.addAction(QtGui.QIcon('share/cut16.png'), "&Cutout Tool") - self.ncc_btn = self.toolbartools.addAction(QtGui.QIcon('share/flatcam_icon32.png'), "NCC Tool") - self.paint_btn = self.toolbartools.addAction(QtGui.QIcon('share/paint20_1.png'), "Paint Tool") + self.dblsided_btn = self.toolbartools.addAction(QtGui.QIcon('share/doubleside32.png'), _("2Sided Tool")) + self.cutout_btn = self.toolbartools.addAction(QtGui.QIcon('share/cut16_bis.png'), _("&Cutout Tool")) + self.ncc_btn = self.toolbartools.addAction(QtGui.QIcon('share/ncc16.png'), _("NCC Tool")) + self.paint_btn = self.toolbartools.addAction(QtGui.QIcon('share/paint20_1.png'), _("Paint Tool")) self.toolbartools.addSeparator() - self.panelize_btn = self.toolbartools.addAction(QtGui.QIcon('share/panel16.png'), "Panel Tool") - self.film_btn = self.toolbartools.addAction(QtGui.QIcon('share/film16.png'), "Film Tool") - self.solder_btn = self.toolbartools.addAction(QtGui.QIcon('share/solderpastebis32.png'), "SolderPaste Tool") + self.panelize_btn = self.toolbartools.addAction(QtGui.QIcon('share/panel16.png'), _("Panel Tool")) + self.film_btn = self.toolbartools.addAction(QtGui.QIcon('share/film16.png'),_( "Film Tool")) + self.solder_btn = self.toolbartools.addAction(QtGui.QIcon('share/solderpastebis32.png'), _("SolderPaste Tool")) self.toolbartools.addSeparator() - self.calculators_btn = self.toolbartools.addAction(QtGui.QIcon('share/calculator24.png'), "Calculators Tool") - self.transform_btn = self.toolbartools.addAction(QtGui.QIcon('share/transform.png'), "Transform Tool") + self.calculators_btn = self.toolbartools.addAction(QtGui.QIcon('share/calculator24.png'), _("Calculators Tool")) + self.transform_btn = self.toolbartools.addAction(QtGui.QIcon('share/transform.png'), _("Transform Tool")) ### Drill Editor Toolbar ### - self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select") - self.add_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/plus16.png'), 'Add Drill Hole') + self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) + self.add_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/plus16.png'), _('Add Drill Hole')) self.add_drill_array_btn = self.exc_edit_toolbar.addAction( QtGui.QIcon('share/addarray16.png'), 'Add Drill Hole Array') - self.resize_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/resize16.png'), 'Resize Drill') + self.resize_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/resize16.png'), _('Resize Drill')) self.exc_edit_toolbar.addSeparator() - self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), 'Copy Drill') - self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), "Delete Drill") + self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) + self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), _("Delete Drill")) self.exc_edit_toolbar.addSeparator() - self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Drill") + self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Drill")) ### Geometry Editor Toolbar ### - self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select") - self.geo_add_circle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle') - self.geo_add_arc_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/arc32.png'), 'Add Arc') + self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) + self.geo_add_circle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/circle32.png'), _('Add Circle')) + self.geo_add_arc_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/arc32.png'), _('Add Arc')) self.geo_add_rectangle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'), - 'Add Rectangle') + _('Add Rectangle')) self.geo_edit_toolbar.addSeparator() - self.geo_add_path_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/path32.png'), 'Add Path') - self.geo_add_polygon_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon') + self.geo_add_path_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/path32.png'), _('Add Path')) + self.geo_add_polygon_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _('Add Polygon')) self.geo_edit_toolbar.addSeparator() - self.geo_add_text_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/text32.png'), 'Add Text') - self.geo_add_buffer_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), 'Add Buffer') - self.geo_add_paint_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/paint20_1.png'), 'Paint Shape') + self.geo_add_text_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/text32.png'), _('Add Text')) + self.geo_add_buffer_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Add Buffer')) + self.geo_add_paint_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/paint20_1.png'), _('Paint Shape')) self.geo_edit_toolbar.addSeparator() - self.geo_union_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union') + self.geo_union_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/union32.png'), _('Polygon Union')) self.geo_intersection_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/intersection32.png'), - 'Polygon Intersection') + _('Polygon Intersection')) self.geo_subtract_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), - 'Polygon Subtraction') + _('Polygon Subtraction')) self.geo_edit_toolbar.addSeparator() - self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), 'Cut Path') - self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), "Copy Shape(s)") + self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), _('Cut Path')) + self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy Shape(s)")) self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), - "Delete Shape '-'") - self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), "Transformations") + _("Delete Shape '-'")) + self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), + _("Transformations")) self.geo_edit_toolbar.addSeparator() - self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Objects ") + self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Objects ")) ### Snap Toolbar ### # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID # self.addToolBar(self.snap_toolbar) - self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), 'Snap to grid') + self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), _('Snap to grid')) self.grid_gap_x_entry = FCEntry2() self.grid_gap_x_entry.setMaximumWidth(70) - self.grid_gap_x_entry.setToolTip("Grid X distance") + self.grid_gap_x_entry.setToolTip(_("Grid X snapping distance")) self.snap_toolbar.addWidget(self.grid_gap_x_entry) self.grid_gap_y_entry = FCEntry2() self.grid_gap_y_entry.setMaximumWidth(70) - self.grid_gap_y_entry.setToolTip("Grid Y distance") + self.grid_gap_y_entry.setToolTip(_("Grid Y snapping distance")) self.snap_toolbar.addWidget(self.grid_gap_y_entry) self.grid_space_label = QtWidgets.QLabel(" ") self.snap_toolbar.addWidget(self.grid_space_label) self.grid_gap_link_cb = FCCheckBox() - self.grid_gap_link_cb.setToolTip("When active, value on Grid_X\n" - "is copied to the Grid_Y value.") + self.grid_gap_link_cb.setToolTip(_("When active, value on Grid_X\n" + "is copied to the Grid_Y value.")) self.snap_toolbar.addWidget(self.grid_gap_link_cb) self.ois_grid = OptionalInputSection(self.grid_gap_link_cb, [self.grid_gap_y_entry], logic=False) - self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), 'Snap to corner') + self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), _('Snap to corner')) self.snap_max_dist_entry = FCEntry() self.snap_max_dist_entry.setMaximumWidth(70) - self.snap_max_dist_entry.setToolTip("Max. magnet distance") + self.snap_max_dist_entry.setToolTip(_("Max. magnet distance")) self.snap_magnet = self.snap_toolbar.addWidget(self.snap_max_dist_entry) @@ -640,7 +672,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # project_tab.setMinimumWidth(250) # Hack self.project_tab_layout = QtWidgets.QVBoxLayout(self.project_tab) self.project_tab_layout.setContentsMargins(2, 2, 2, 2) - self.notebook.addTab(self.project_tab, "Project") + self.notebook.addTab(self.project_tab,_( "Project")) ### Selected ### self.selected_tab = QtWidgets.QWidget() @@ -649,14 +681,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.selected_tab_layout.setContentsMargins(2, 2, 2, 2) self.selected_scroll_area = VerticalScrollArea() self.selected_tab_layout.addWidget(self.selected_scroll_area) - self.notebook.addTab(self.selected_tab, "Selected") + self.notebook.addTab(self.selected_tab, _("Selected")) ### Tool ### self.tool_tab = QtWidgets.QWidget() self.tool_tab.setObjectName("tool_tab") self.tool_tab_layout = QtWidgets.QVBoxLayout(self.tool_tab) self.tool_tab_layout.setContentsMargins(2, 2, 2, 2) - self.notebook.addTab(self.tool_tab, "Tool") + self.notebook.addTab(self.tool_tab, _("Tool")) self.tool_scroll_area = VerticalScrollArea() self.tool_tab_layout.addWidget(self.tool_scroll_area) @@ -668,7 +700,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.right_lay.setContentsMargins(0, 0, 0, 0) self.right_widget.setLayout(self.right_lay) # self.plot_tab_area = FCTab() - self.plot_tab_area = FCDetachableTab(protect=False, protect_by_name=['Plot Area']) + self.plot_tab_area = FCDetachableTab(protect=False, protect_by_name=[_('Plot Area')]) self.plot_tab_area.useOldIndex(True) self.right_lay.addWidget(self.plot_tab_area) @@ -676,7 +708,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.plot_tab = QtWidgets.QWidget() self.plot_tab.setObjectName("plotarea") - self.plot_tab_area.addTab(self.plot_tab, "Plot Area") + self.plot_tab_area.addTab(self.plot_tab, _("Plot Area")) self.right_layout = QtWidgets.QVBoxLayout() self.right_layout.setContentsMargins(2, 2, 2, 2) @@ -700,7 +732,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.pref_tab_layout.addWidget(self.pref_tab_area) self.general_tab = QtWidgets.QWidget() - self.pref_tab_area.addTab(self.general_tab, "General") + self.pref_tab_area.addTab(self.general_tab, _("General")) self.general_tab_lay = QtWidgets.QVBoxLayout() self.general_tab_lay.setContentsMargins(2, 2, 2, 2) self.general_tab.setLayout(self.general_tab_lay) @@ -709,8 +741,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.general_tab_lay.addLayout(self.hlay1) self.options_combo = QtWidgets.QComboBox() - self.options_combo.addItem("APP. DEFAULTS") - self.options_combo.addItem("PROJ. OPTIONS ") + self.options_combo.addItem(_("APP. DEFAULTS")) + self.options_combo.addItem(_("PROJ. OPTIONS ")) self.hlay1.addWidget(self.options_combo) # disable this button as it may no longer be useful @@ -721,7 +753,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.general_tab_lay.addWidget(self.general_scroll_area) self.gerber_tab = QtWidgets.QWidget() - self.pref_tab_area.addTab(self.gerber_tab, "GERBER") + self.pref_tab_area.addTab(self.gerber_tab, _("GERBER")) self.gerber_tab_lay = QtWidgets.QVBoxLayout() self.gerber_tab_lay.setContentsMargins(2, 2, 2, 2) self.gerber_tab.setLayout(self.gerber_tab_lay) @@ -730,7 +762,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.gerber_tab_lay.addWidget(self.gerber_scroll_area) self.excellon_tab = QtWidgets.QWidget() - self.pref_tab_area.addTab(self.excellon_tab, "EXCELLON") + self.pref_tab_area.addTab(self.excellon_tab, _("EXCELLON")) self.excellon_tab_lay = QtWidgets.QVBoxLayout() self.excellon_tab_lay.setContentsMargins(2, 2, 2, 2) self.excellon_tab.setLayout(self.excellon_tab_lay) @@ -739,7 +771,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.excellon_tab_lay.addWidget(self.excellon_scroll_area) self.geometry_tab = QtWidgets.QWidget() - self.pref_tab_area.addTab(self.geometry_tab, "GEOMETRY") + self.pref_tab_area.addTab(self.geometry_tab, _("GEOMETRY")) self.geometry_tab_lay = QtWidgets.QVBoxLayout() self.geometry_tab_lay.setContentsMargins(2, 2, 2, 2) self.geometry_tab.setLayout(self.geometry_tab_lay) @@ -749,7 +781,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.cncjob_tab = QtWidgets.QWidget() self.cncjob_tab.setObjectName("cncjob_tab") - self.pref_tab_area.addTab(self.cncjob_tab, "CNC-JOB") + self.pref_tab_area.addTab(self.cncjob_tab, _("CNC-JOB")) self.cncjob_tab_lay = QtWidgets.QVBoxLayout() self.cncjob_tab_lay.setContentsMargins(2, 2, 2, 2) self.cncjob_tab.setLayout(self.cncjob_tab_lay) @@ -758,7 +790,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.cncjob_tab_lay.addWidget(self.cncjob_scroll_area) self.tools_tab = QtWidgets.QWidget() - self.pref_tab_area.addTab(self.tools_tab, "TOOLS") + self.pref_tab_area.addTab(self.tools_tab, _("TOOLS")) self.tools_tab_lay = QtWidgets.QVBoxLayout() self.tools_tab_lay.setContentsMargins(2, 2, 2, 2) self.tools_tab.setLayout(self.tools_tab_lay) @@ -775,28 +807,28 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.pref_tab_bottom_layout.addLayout(self.pref_tab_bottom_layout_1) self.pref_import_button = QtWidgets.QPushButton() - self.pref_import_button.setText("Import Preferences") + self.pref_import_button.setText(_("Import Preferences")) self.pref_import_button.setFixedWidth(130) self.pref_import_button.setToolTip( - "Import a full set of FlatCAM settings from a file\n" + _("Import a full set of FlatCAM settings from a file\n" "previously saved on HDD.\n\n" "FlatCAM automatically save a 'factory_defaults' file\n" - "on the first start. Do not delete that file.") + "on the first start. Do not delete that file.")) self.pref_tab_bottom_layout_1.addWidget(self.pref_import_button) self.pref_export_button = QtWidgets.QPushButton() - self.pref_export_button.setText("Export Preferences") + self.pref_export_button.setText(_("Export Preferences")) self.pref_export_button.setFixedWidth(130) self.pref_export_button.setToolTip( - "Export a full set of FlatCAM settings in a file\n" - "that is saved on HDD.") + _( "Export a full set of FlatCAM settings in a file\n" + "that is saved on HDD.")) self.pref_tab_bottom_layout_1.addWidget(self.pref_export_button) self.pref_open_button = QtWidgets.QPushButton() - self.pref_open_button.setText("Open Pref Folder") + self.pref_open_button.setText(_("Open Pref Folder")) self.pref_open_button.setFixedWidth(130) self.pref_open_button.setToolTip( - "Open the folder where FlatCAM save the preferences files.") + _("Open the folder where FlatCAM save the preferences files.")) self.pref_tab_bottom_layout_1.addWidget(self.pref_open_button) self.pref_tab_bottom_layout_2 = QtWidgets.QHBoxLayout() @@ -804,11 +836,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.pref_tab_bottom_layout.addLayout(self.pref_tab_bottom_layout_2) self.pref_save_button = QtWidgets.QPushButton() - self.pref_save_button.setText("Save Preferences") + self.pref_save_button.setText(_("Save Preferences")) self.pref_save_button.setFixedWidth(130) self.pref_save_button.setToolTip( - "Save the current settings in the 'current_defaults' file\n" - "which is the file storing the working default preferences.") + _("Save the current settings in the 'current_defaults' file\n" + "which is the file storing the working default preferences.")) self.pref_tab_bottom_layout_2.addWidget(self.pref_save_button) ######################################## @@ -821,7 +853,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.sh_hlay = QtWidgets.QHBoxLayout() self.sh_title = QtWidgets.QTextEdit( - 'Shortcut Key List') + _('Shortcut Key List')) self.sh_title.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.sh_title.setFrameStyle(QtWidgets.QFrame.NoFrame) self.sh_title.setMaximumHeight(30) @@ -832,273 +864,275 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.sh_tab_layout.addWidget(self.sh_title) self.sh_tab_layout.addLayout(self.sh_hlay) - self.app_sh_msg = '''General Shortcut list
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
F3 SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
- -''' + self.app_sh_msg = _( + '''General Shortcut list
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
F3 SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
+ + ''' + ) self.sh_app = QtWidgets.QTextEdit() self.sh_app.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) @@ -1107,206 +1141,208 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.sh_app.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.sh_hlay.addWidget(self.sh_app) - self.editor_sh_msg = '''Editor Shortcut list
-
-GEOMETRY EDITOR
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
A Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
-
-
-EXCELLON EDITOR
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
A Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
- ''' + self.editor_sh_msg = _( + '''Editor Shortcut list
+
+ GEOMETRY EDITOR
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
+
+
+ EXCELLON EDITOR
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
+ ''' + ) self.sh_editor = QtWidgets.QTextEdit() self.sh_editor.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.sh_editor.setText(self.editor_sh_msg) @@ -1319,45 +1355,45 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ############################################################## self.popMenu = QtWidgets.QMenu() - self.popmenu_disable = self.popMenu.addAction(QtGui.QIcon('share/clear_plot32.png'), "Disable") + self.popmenu_disable = self.popMenu.addAction(QtGui.QIcon('share/clear_plot32.png'), _("Disable")) self.popMenu.addSeparator() - self.cmenu_newmenu = self.popMenu.addMenu(QtGui.QIcon('share/file32.png'), "New") - self.popmenu_new_geo = self.cmenu_newmenu.addAction(QtGui.QIcon('share/new_geo32_bis.png'), "Geometry") - self.popmenu_new_exc = self.cmenu_newmenu.addAction(QtGui.QIcon('share/new_exc32.png'), "Excellon") + self.cmenu_newmenu = self.popMenu.addMenu(QtGui.QIcon('share/file32.png'), _("New")) + self.popmenu_new_geo = self.cmenu_newmenu.addAction(QtGui.QIcon('share/new_geo32_bis.png'), _("Geometry")) + self.popmenu_new_exc = self.cmenu_newmenu.addAction(QtGui.QIcon('share/new_exc32.png'), _("Excellon")) self.cmenu_newmenu.addSeparator() - self.popmenu_new_prj = self.cmenu_newmenu.addAction(QtGui.QIcon('share/file16.png'), "Project") + self.popmenu_new_prj = self.cmenu_newmenu.addAction(QtGui.QIcon('share/file16.png'), _("Project")) self.popMenu.addSeparator() - self.cmenu_gridmenu = self.popMenu.addMenu(QtGui.QIcon('share/grid32_menu.png'), "Grids") + self.cmenu_gridmenu = self.popMenu.addMenu(QtGui.QIcon('share/grid32_menu.png'), _("Grids")) - self.cmenu_viewmenu = self.popMenu.addMenu(QtGui.QIcon('share/view64.png'), "View") - self.zoomfit = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/zoom_fit32.png'), "Zoom Fit") - self.clearplot = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/clear_plot32.png'), "Clear Plot") - self.replot = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/replot32.png'), "Replot") + self.cmenu_viewmenu = self.popMenu.addMenu(QtGui.QIcon('share/view64.png'), _("View")) + self.zoomfit = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/zoom_fit32.png'), _("Zoom Fit")) + self.clearplot = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/clear_plot32.png'), _("Clear Plot")) + self.replot = self.cmenu_viewmenu.addAction(QtGui.QIcon('share/replot32.png'), _("Replot")) self.popMenu.addSeparator() - self.g_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/draw32.png'), "Geo Editor") - self.draw_line = self.g_editor_cmenu.addAction(QtGui.QIcon('share/path32.png'), "Line") - self.draw_rect = self.g_editor_cmenu.addAction(QtGui.QIcon('share/rectangle32.png'), "Rectangle") - self.draw_cut = self.g_editor_cmenu.addAction(QtGui.QIcon('share/cutpath32.png'), "Cut") + self.g_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/draw32.png'), _("Geo Editor")) + self.draw_line = self.g_editor_cmenu.addAction(QtGui.QIcon('share/path32.png'), _("Line")) + self.draw_rect = self.g_editor_cmenu.addAction(QtGui.QIcon('share/rectangle32.png'), _("Rectangle")) + self.draw_cut = self.g_editor_cmenu.addAction(QtGui.QIcon('share/cutpath32.png'), _("Cut")) self.g_editor_cmenu.addSeparator() - self.draw_move = self.g_editor_cmenu.addAction(QtGui.QIcon('share/move32.png'), "Move") + self.draw_move = self.g_editor_cmenu.addAction(QtGui.QIcon('share/move32.png'), _("Move")) - self.e_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/drill32.png'), "Exc Editor") - self.drill = self.e_editor_cmenu.addAction(QtGui.QIcon('share/drill32.png'), "Add Drill") - self.drill_array = self.e_editor_cmenu.addAction(QtGui.QIcon('share/addarray32.png'), "Add Drill Array") - self.drill_copy = self.e_editor_cmenu.addAction(QtGui.QIcon('share/copy32.png'), "Copy Drill(s)") + self.e_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/drill32.png'), _("Exc Editor")) + self.drill = self.e_editor_cmenu.addAction(QtGui.QIcon('share/drill32.png'), _("Add Drill")) + self.drill_array = self.e_editor_cmenu.addAction(QtGui.QIcon('share/addarray32.png'), _("Add Drill Array")) + self.drill_copy = self.e_editor_cmenu.addAction(QtGui.QIcon('share/copy32.png'), _("Copy Drill(s)")) self.popMenu.addSeparator() - self.popmenu_copy = self.popMenu.addAction(QtGui.QIcon('share/copy32.png'), "Copy") - self.popmenu_delete = self.popMenu.addAction(QtGui.QIcon('share/delete32.png'), "Delete") - self.popmenu_edit = self.popMenu.addAction(QtGui.QIcon('share/edit32.png'), "Edit") - self.popmenu_save = self.popMenu.addAction(QtGui.QIcon('share/floppy32.png'), "Save && Close Edit") + self.popmenu_copy = self.popMenu.addAction(QtGui.QIcon('share/copy32.png'), _("Copy")) + self.popmenu_delete = self.popMenu.addAction(QtGui.QIcon('share/delete32.png'), _("Delete")) + self.popmenu_edit = self.popMenu.addAction(QtGui.QIcon('share/edit32.png'), _("Edit")) + self.popmenu_save = self.popMenu.addAction(QtGui.QIcon('share/floppy32.png'), _("Save && Close Edit")) self.popmenu_save.setVisible(False) self.popMenu.addSeparator() - self.popmenu_move = self.popMenu.addAction(QtGui.QIcon('share/move32.png'), "Move") - self.popmenu_properties = self.popMenu.addAction(QtGui.QIcon('share/properties32.png'), "Properties") + self.popmenu_move = self.popMenu.addAction(QtGui.QIcon('share/move32.png'), _("Move")) + self.popmenu_properties = self.popMenu.addAction(QtGui.QIcon('share/properties32.png'), _("Properties")) #################################### @@ -1377,24 +1413,24 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.code_editor.setStyleSheet(stylesheet) - self.buttonPreview = QtWidgets.QPushButton('Print Preview') - self.buttonPrint = QtWidgets.QPushButton('Print Code') - self.buttonFind = QtWidgets.QPushButton('Find in Code') + self.buttonPreview = QtWidgets.QPushButton(_('Print Preview')) + self.buttonPrint = QtWidgets.QPushButton(_('Print Code')) + self.buttonFind = QtWidgets.QPushButton(_('Find in Code')) self.buttonFind.setFixedWidth(100) self.buttonPreview.setFixedWidth(100) self.entryFind = FCEntry() self.entryFind.setMaximumWidth(200) - self.buttonReplace = QtWidgets.QPushButton('Replace With') + self.buttonReplace = QtWidgets.QPushButton(_('Replace With')) self.buttonReplace.setFixedWidth(100) self.entryReplace = FCEntry() self.entryReplace.setMaximumWidth(200) - self.sel_all_cb = QtWidgets.QCheckBox('All') + self.sel_all_cb = QtWidgets.QCheckBox(_('All')) self.sel_all_cb.setToolTip( - "When checked it will replace all instances in the 'Find' box\n" - "with the text in the 'Replace' box.." + _("When checked it will replace all instances in the 'Find' box\n" + "with the text in the 'Replace' box..") ) - self.buttonOpen = QtWidgets.QPushButton('Open Code') - self.buttonSave = QtWidgets.QPushButton('Save Code') + self.buttonOpen = QtWidgets.QPushButton(_('Open Code')) + self.buttonSave = QtWidgets.QPushButton(_('Save Code')) self.cncjob_tab_layout.addWidget(self.code_editor, 0, 0, 1, 5) @@ -1429,13 +1465,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.rel_position_label = QtWidgets.QLabel( "Dx: 0.0000   Dy: 0.0000    ") self.rel_position_label.setMinimumWidth(110) - self.rel_position_label.setToolTip("Relative neasurement.\nReference is last click position") + self.rel_position_label.setToolTip(_("Relative neasurement.\nReference is last click position")) self.infobar.addWidget(self.rel_position_label) self.position_label = QtWidgets.QLabel( "    X: 0.0000   Y: 0.0000") self.position_label.setMinimumWidth(110) - self.position_label.setToolTip("Absolute neasurement.\nReference is (X=0, Y= 0) position") + self.position_label.setToolTip(_("Absolute neasurement.\nReference is (X=0, Y= 0) position")) self.infobar.addWidget(self.position_label) self.units_label = QtWidgets.QLabel("[in]") @@ -1551,123 +1587,132 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ### File Toolbar ### self.file_open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share/flatcam_icon32.png'), - "Open GERBER") - self.file_open_excellon_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), "Open EXCELLON") + _("Open Gerber")) + self.file_open_excellon_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), _("Open Excellon")) self.toolbarfile.addSeparator() - self.file_open_btn = self.toolbarfile.addAction(QtGui.QIcon('share/folder32.png'), "Open project") - self.file_save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), "Save project") + self.file_open_btn = self.toolbarfile.addAction(QtGui.QIcon('share/folder32.png'), _("Open project")) + self.file_save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), _("Save project")) ### Edit Toolbar ### - self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), "New Blank Geometry") - self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), "New Blank Excellon") + self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), _("New Blank Geometry")) + self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), _("New Blank Excellon")) self.toolbargeo.addSeparator() - self.editgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/edit32.png'), "Editor") + self.editgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/edit32.png'), _("Editor")) self.update_obj_btn = self.toolbargeo.addAction( - QtGui.QIcon('share/edit_ok32_bis.png'), "Save Object and close the Editor" + QtGui.QIcon('share/edit_ok32_bis.png'), _("Save Object and close the Editor") ) self.toolbargeo.addSeparator() - self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), "&Delete") + self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), _("&Delete")) ### View Toolbar ### - self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), "&Replot") - self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear plot") - self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), "Zoom In") - self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), "Zoom Out") - self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "Zoom Fit") + self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), _("&Replot")) + self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), _("&Clear plot")) + self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), _("Zoom In")) + self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), _("Zoom Out")) + self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), _("Zoom Fit")) # self.toolbarview.setVisible(False) ### Shell Toolbar ### - self.shell_btn = self.toolbarshell.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line") + self.shell_btn = self.toolbarshell.addAction(QtGui.QIcon('share/shell32.png'), _("&Command Line")) ### Tools Toolbar ### - self.dblsided_btn = self.toolbartools.addAction(QtGui.QIcon('share/doubleside32.png'), "2Sided Tool") - self.cutout_btn = self.toolbartools.addAction(QtGui.QIcon('share/cut16.png'), "&Cutout Tool") - self.ncc_btn = self.toolbartools.addAction(QtGui.QIcon('share/flatcam_icon32.png'), "NCC Tool") - self.paint_btn = self.toolbartools.addAction(QtGui.QIcon('share/paint20_1.png'), "Paint Tool") + self.dblsided_btn = self.toolbartools.addAction(QtGui.QIcon('share/doubleside32.png'), _("2Sided Tool")) + self.cutout_btn = self.toolbartools.addAction(QtGui.QIcon('share/cut16_bis.png'), _("&Cutout Tool")) + self.ncc_btn = self.toolbartools.addAction(QtGui.QIcon('share/ncc16.png'), _("NCC Tool")) + self.paint_btn = self.toolbartools.addAction(QtGui.QIcon('share/paint20_1.png'), _("Paint Tool")) self.toolbartools.addSeparator() - self.panelize_btn = self.toolbartools.addAction(QtGui.QIcon('share/panel16.png'), "Panel Tool") - self.film_btn = self.toolbartools.addAction(QtGui.QIcon('share/film16.png'), "Film Tool") - self.solder_btn = self.toolbartools.addAction(QtGui.QIcon('share/solderpastebis32.png'), "SolderPaste Tool") + self.panelize_btn = self.toolbartools.addAction(QtGui.QIcon('share/panel16.png'), _("Panel Tool")) + self.film_btn = self.toolbartools.addAction(QtGui.QIcon('share/film16.png'), _("Film Tool")) + self.solder_btn = self.toolbartools.addAction(QtGui.QIcon('share/solderpastebis32.png'), + _("SolderPaste Tool")) self.toolbartools.addSeparator() - self.calculators_btn = self.toolbartools.addAction(QtGui.QIcon('share/calculator24.png'), "Calculators Tool") - self.transform_btn = self.toolbartools.addAction(QtGui.QIcon('share/transform.png'), "Transform Tool") + self.calculators_btn = self.toolbartools.addAction(QtGui.QIcon('share/calculator24.png'), + _("Calculators Tool")) + self.transform_btn = self.toolbartools.addAction(QtGui.QIcon('share/transform.png'), _("Transform Tool")) ### Drill Editor Toolbar ### - self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select") - self.add_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/plus16.png'), 'Add Drill Hole') + self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) + self.add_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/plus16.png'), _('Add Drill Hole')) self.add_drill_array_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon('share/addarray16.png'), 'Add Drill Hole Array') - self.resize_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/resize16.png'), 'Resize Drill') + QtGui.QIcon('share/addarray16.png'), _('Add Drill Hole Array')) + self.resize_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/resize16.png'), _('Resize Drill')) self.exc_edit_toolbar.addSeparator() - self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), 'Copy Drill') - self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), "Delete Drill") + self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) + self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), + _("Delete Drill")) self.exc_edit_toolbar.addSeparator() - self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Drill") + self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Drill")) ### Geometry Editor Toolbar ### - self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select 'Esc'") - self.geo_add_circle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle') - self.geo_add_arc_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/arc32.png'), 'Add Arc') - self.geo_add_rectangle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle') + self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select 'Esc'")) + self.geo_add_circle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/circle32.png'), _('Add Circle')) + self.geo_add_arc_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/arc32.png'), _('Add Arc')) + self.geo_add_rectangle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'), + _('Add Rectangle')) self.geo_edit_toolbar.addSeparator() - self.geo_add_path_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/path32.png'), 'Add Path') - self.geo_add_polygon_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon') + self.geo_add_path_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/path32.png'), _('Add Path')) + self.geo_add_polygon_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), + _('Add Polygon')) self.geo_edit_toolbar.addSeparator() - self.geo_add_text_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/text32.png'), 'Add Text') - self.geo_add_buffer_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), 'Add Buffer') - self.geo_add_paint_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/paint20_1.png'), 'Paint Shape') + self.geo_add_text_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/text32.png'), _('Add Text')) + self.geo_add_buffer_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), + _('Add Buffer')) + self.geo_add_paint_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/paint20_1.png'), _('Paint Shape')) self.geo_edit_toolbar.addSeparator() - self.geo_union_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union') + self.geo_union_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/union32.png'), _('Polygon Union')) self.geo_intersection_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/intersection32.png'), - 'Polygon Intersection') - self.geo_subtract_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), 'Polygon Subtraction') + _('Polygon Intersection')) + self.geo_subtract_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), + _('Polygon Subtraction')) self.geo_edit_toolbar.addSeparator() - self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), 'Cut Path') - self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), "Copy Objects") - self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), "Delete Shape") - self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), "Transformations") + self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), _('Cut Path')) + self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy Objects")) + self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), + _("Delete Shape")) + self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), + _("Transformations")) self.geo_edit_toolbar.addSeparator() - self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Objects") + self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Objects")) ### Snap Toolbar ### # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID # self.addToolBar(self.snap_toolbar) - self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), 'Snap to grid') + self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), _('Snap to grid')) self.grid_gap_x_entry = FCEntry2() self.grid_gap_x_entry.setMaximumWidth(70) - self.grid_gap_x_entry.setToolTip("Grid X distance") + self.grid_gap_x_entry.setToolTip(_("Grid X snapping distance")) self.snap_toolbar.addWidget(self.grid_gap_x_entry) self.grid_gap_y_entry = FCEntry2() self.grid_gap_y_entry.setMaximumWidth(70) - self.grid_gap_y_entry.setToolTip("Grid Y distance") + self.grid_gap_y_entry.setToolTip(_("Grid Y snapping distance")) self.snap_toolbar.addWidget(self.grid_gap_y_entry) self.grid_space_label = QtWidgets.QLabel(" ") self.snap_toolbar.addWidget(self.grid_space_label) self.grid_gap_link_cb = FCCheckBox() - self.grid_gap_link_cb.setToolTip("When active, value on Grid_X\n" - "is copied to the Grid_Y value.") + self.grid_gap_link_cb.setToolTip(_("When active, value on Grid_X\n" + "is copied to the Grid_Y value.")) self.snap_toolbar.addWidget(self.grid_gap_link_cb) self.ois_grid = OptionalInputSection(self.grid_gap_link_cb, [self.grid_gap_y_entry], logic=False) - self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), 'Snap to corner') + self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), _('Snap to corner')) self.snap_max_dist_entry = FCEntry() self.snap_max_dist_entry.setMaximumWidth(70) - self.snap_max_dist_entry.setToolTip("Max. magnet distance") + self.snap_max_dist_entry.setToolTip(_("Max. magnet distance")) self.snap_magnet = self.snap_toolbar.addWidget(self.snap_max_dist_entry) self.grid_snap_btn.setCheckable(True) @@ -1774,7 +1819,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Rotate Object by 90 degree CCW if key == QtCore.Qt.Key_R: - self.app.on_rotate(silent=True, preset=-self.app.defaults['tools_transform_rotate']) + self.app.on_rotate(silent=True, preset=-float(self.app.defaults['tools_transform_rotate'])) return # Run a Script @@ -1811,36 +1856,36 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Calculator Tool if key == QtCore.Qt.Key_C: - self.app.calculator_tool.run() + self.app.calculator_tool.run(toggle=True) # 2-Sided PCB Tool if key == QtCore.Qt.Key_D: - self.app.dblsidedtool.run() + self.app.dblsidedtool.run(toggle=True) return # Solder Paste Dispensing Tool if key == QtCore.Qt.Key_K: - self.app.paste_tool.run() + self.app.paste_tool.run(toggle=True) return # Film Tool if key == QtCore.Qt.Key_L: - self.app.film_tool.run() + self.app.film_tool.run(toggle=True) return # Non-Copper Clear Tool if key == QtCore.Qt.Key_N: - self.app.ncclear_tool.run() + self.app.ncclear_tool.run(toggle=True) return # Paint Tool if key == QtCore.Qt.Key_P: - self.app.paint_tool.run() + self.app.paint_tool.run(toggle=True) return # Transformation Tool if key == QtCore.Qt.Key_R: - self.app.transform_tool.run() + self.app.transform_tool.run(toggle=True) return # View Source Object Content @@ -1850,12 +1895,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Cutout Tool if key == QtCore.Qt.Key_U: - self.app.cutout_tool.run() + self.app.cutout_tool.run(toggle=True) return # Panelize Tool if key == QtCore.Qt.Key_Z: - self.app.panelize_tool.run() + self.app.panelize_tool.run(toggle=True) return # Toggle Fullscreen @@ -2012,14 +2057,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.get_selected() is not None: self.app.geo_editor.cutpath() else: - msg = 'Please first select a geometry item to be cutted\n' \ + msg = _('Please first select a geometry item to be cutted\n' \ 'then select the geometry item that will be cutted\n' \ 'out of the first item. In the end press ~X~ key or\n' \ - 'the toolbar button.' + 'the toolbar button.') messagebox = QtWidgets.QMessageBox() messagebox.setText(msg) - messagebox.setWindowTitle("Warning") + messagebox.setWindowTitle(_("Warning")) messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) @@ -2066,7 +2111,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.active_tool.complete: self.app.geo_editor.on_shape_complete() - self.app.inform.emit("[success]Done.") + self.app.inform.emit(_("[success]Done.")) # automatically make the selection tool active after completing current action self.app.geo_editor.select_tool('select') return @@ -2078,7 +2123,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.active_tool.complete: self.app.geo_editor.on_shape_complete() - self.app.inform.emit("[success]Done.") + self.app.inform.emit(_("[success]Done.")) # automatically make the selection tool active after completing current action self.app.geo_editor.select_tool('select') @@ -2086,7 +2131,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_Escape or key == 'Escape': # TODO: ...? # self.on_tool_select("select") - self.app.inform.emit("[WARNING_NOTCL]Cancelled.") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled.")) self.app.geo_editor.delete_utility_geometry() @@ -2146,12 +2191,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.get_selected() is not None: self.app.geo_editor.intersection() else: - msg = "Please select geometry items \n" \ - "on which to perform Intersection Tool." + msg = _("Please select geometry items \n" \ + "on which to perform Intersection Tool.") messagebox = QtWidgets.QMessageBox() messagebox.setText(msg) - messagebox.setWindowTitle("Warning") + messagebox.setWindowTitle(_("Warning")) messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) @@ -2204,12 +2249,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.get_selected() is not None: self.app.geo_editor.subtract() else: - msg = "Please select geometry items \n" \ - "on which to perform Substraction Tool." + msg = _( + "Please select geometry items \n" + "on which to perform Substraction Tool.") messagebox = QtWidgets.QMessageBox() messagebox.setText(msg) - messagebox.setWindowTitle("Warning") + messagebox.setWindowTitle(_("Warning")) messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) @@ -2224,12 +2270,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.geo_editor.get_selected() is not None: self.app.geo_editor.union() else: - msg = "Please select geometry items \n" \ - "on which to perform union." + msg = _("Please select geometry items \n" + "on which to perform union.") messagebox = QtWidgets.QMessageBox() messagebox.setText(msg) - messagebox.setWindowTitle("Warning") + messagebox.setWindowTitle(_("Warning")) messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) @@ -2279,7 +2325,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_Escape or key == 'Escape': # TODO: ...? # self.on_tool_select("select") - self.app.inform.emit("[WARNING_NOTCL]Cancelled.") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled.")) self.app.exc_editor.delete_utility_geometry() @@ -2296,7 +2342,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.exc_editor.delete_selected() self.app.exc_editor.replot() else: - self.app.inform.emit("[WARNING_NOTCL]Cancelled. Nothing selected to delete.") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled. Nothing selected to delete.")) return # Delete tools in tools table if delete key event comes from the Selected Tab @@ -2357,19 +2403,19 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_C or key == 'C': self.app.exc_editor.launched_from_shortcuts = True if self.app.exc_editor.selected: - self.app.inform.emit("Click on target point.") + self.app.inform.emit(_("Click on target point.")) self.app.ui.copy_drill_btn.setChecked(True) self.app.exc_editor.on_tool_select('drill_copy') self.app.exc_editor.active_tool.set_origin( (self.app.exc_editor.snap_x, self.app.exc_editor.snap_y)) else: - self.app.inform.emit("[WARNING_NOTCL]Cancelled. Nothing selected to copy.") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled. Nothing selected to copy.")) return # Add Drill Hole Tool if key == QtCore.Qt.Key_D or key == 'D': self.app.exc_editor.launched_from_shortcuts = True - self.app.inform.emit("Click on target point.") + self.app.inform.emit(_("Click on target point.")) self.app.ui.add_drill_btn.setChecked(True) self.app.exc_editor.x = self.app.mouse[0] @@ -2403,13 +2449,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_M or key == 'M': self.app.exc_editor.launched_from_shortcuts = True if self.app.exc_editor.selected: - self.app.inform.emit("Click on target point.") + self.app.inform.emit(_("Click on target point.")) self.app.ui.move_drill_btn.setChecked(True) self.app.exc_editor.on_tool_select('drill_move') self.app.exc_editor.active_tool.set_origin( (self.app.exc_editor.snap_x, self.app.exc_editor.snap_y)) else: - self.app.inform.emit("[WARNING_NOTCL]Cancelled. Nothing selected to move.") + self.app.inform.emit(_("[WARNING_NOTCL]Cancelled. Nothing selected to move.")) return # Resize Tool @@ -2423,8 +2469,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.exc_editor.launched_from_shortcuts = True ## Current application units in Upper Case self.units = self.general_defaults_group.general_app_group.units_radio.get_value().upper() - tool_add_popup = FCInputDialog(title="New Tool ...", - text='Enter a Tool Diameter:', + tool_add_popup = FCInputDialog(title=_("New Tool ..."), + text=_('Enter a Tool Diameter:'), min=0.0000, max=99.9999, decimals=4) tool_add_popup.setWindowIcon(QtGui.QIcon('share/letter_t_32.png')) @@ -2432,10 +2478,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if ok: self.app.exc_editor.on_tool_add(tooldia=val) self.app.inform.emit( - "[success]Added new tool with dia: %s %s" % ('%.4f' % float(val), str(self.units))) + _("[success]Added new tool with dia: {dia} {units}").format(dia='%.4f' % float(val), units=str(self.units))) else: self.app.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + _("[WARNING_NOTCL] Adding Tool cancelled ...")) return # Zoom Fit @@ -2523,24 +2569,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.final_save.emit() - if self.app.should_we_quit is True: - # # save toolbar state to file - # with open(self.app.data_path + '\gui_state.config', 'wb') as stream: - # stream.write(self.saveState().data()) - # log.debug("FlatCAMGUI.__init__() --> UI state saved.") - # QtWidgets.qApp.quit() - - # save toolbar state to file - settings = QSettings("Open Source", "FlatCAM") - settings.setValue('saved_gui_state', self.saveState()) - settings.setValue('maximized_gui', self.isMaximized()) - - # This will write the setting to the platform specific storage. - del settings - log.debug("FlatCAMGUI.__init__() --> UI state saved.") - QtWidgets.qApp.quit() - else: - self.app.should_we_quit = True + if self.app.should_we_quit is False: event.ignore() @@ -2740,34 +2769,34 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box = QtWidgets.QFormLayout() # Grid X Entry - self.gridx_label = QtWidgets.QLabel('Grid X value:') + self.gridx_label = QtWidgets.QLabel(_('Grid X value:')) self.gridx_label.setToolTip( - "This is the Grid snap value on X axis." + _( "This is the Grid snap value on X axis.") ) self.gridx_entry = LengthEntry() # Grid Y Entry - self.gridy_label = QtWidgets.QLabel('Grid Y value:') + self.gridy_label = QtWidgets.QLabel(_('Grid Y value:')) self.gridy_label.setToolTip( - "This is the Grid snap value on Y axis." + _("This is the Grid snap value on Y axis.") ) self.gridy_entry = LengthEntry() # Snap Max Entry - self.snap_max_label = QtWidgets.QLabel('Snap Max:') - self.snap_max_label.setToolTip("Max. magnet distance") + self.snap_max_label = QtWidgets.QLabel(_('Snap Max:')) + self.snap_max_label.setToolTip(_("Max. magnet distance")) self.snap_max_dist_entry = FCEntry() # Workspace - self.workspace_lbl = QtWidgets.QLabel('Workspace:') + self.workspace_lbl = QtWidgets.QLabel(_('Workspace:')) self.workspace_lbl.setToolTip( - "Draw a delimiting rectangle on canvas.\n" - "The purpose is to illustrate the limits for our work." + _( "Draw a delimiting rectangle on canvas.\n" + "The purpose is to illustrate the limits for our work.") ) - self.workspace_type_lbl = QtWidgets.QLabel('Wk. format:') + self.workspace_type_lbl = QtWidgets.QLabel(_('Wk. format:')) self.workspace_type_lbl.setToolTip( - "Select the type of rectangle to be used on canvas,\n" - "as valid workspace." + _( "Select the type of rectangle to be used on canvas,\n" + "as valid workspace.") ) self.workspace_cb = FCCheckBox() self.wk_cb = FCComboBox() @@ -2779,11 +2808,11 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.wks = OptionalInputSection(self.workspace_cb, [self.workspace_type_lbl, self.wk_cb]) # Plot Fill Color - self.pf_color_label = QtWidgets.QLabel('Plot Fill:') + self.pf_color_label = QtWidgets.QLabel(_('Plot Fill:')) self.pf_color_label.setToolTip( - "Set the fill color for plotted objects.\n" + _( "Set the fill color for plotted objects.\n" "First 6 digits are the color and the last 2\n" - "digits are for alpha (transparency) level." + "digits are for alpha (transparency) level.") ) self.pf_color_entry = FCEntry() self.pf_color_button = QtWidgets.QPushButton() @@ -2795,9 +2824,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_1.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Plot Fill Transparency Level - self.pf_alpha_label = QtWidgets.QLabel('Alpha Level:') + self.pf_alpha_label = QtWidgets.QLabel(_('Alpha Level:')) self.pf_alpha_label.setToolTip( - "Set the fill transparency for plotted objects." + _( "Set the fill transparency for plotted objects.") ) self.pf_color_alpha_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.pf_color_alpha_slider.setMinimum(0) @@ -2814,9 +2843,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_2.addWidget(self.pf_color_alpha_spinner) # Plot Line Color - self.pl_color_label = QtWidgets.QLabel('Plot Line:') + self.pl_color_label = QtWidgets.QLabel(_('Plot Line:')) self.pl_color_label.setToolTip( - "Set the line color for plotted objects." + _( "Set the line color for plotted objects.") ) self.pl_color_entry = FCEntry() self.pl_color_button = QtWidgets.QPushButton() @@ -2828,12 +2857,12 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_3.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Plot Selection (left - right) Fill Color - self.sf_color_label = QtWidgets.QLabel('Sel. Fill:') + self.sf_color_label = QtWidgets.QLabel(_('Sel. Fill:')) self.sf_color_label.setToolTip( - "Set the fill color for the selection box\n" + _("Set the fill color for the selection box\n" "in case that the selection is done from left to right.\n" "First 6 digits are the color and the last 2\n" - "digits are for alpha (transparency) level." + "digits are for alpha (transparency) level.") ) self.sf_color_entry = FCEntry() self.sf_color_button = QtWidgets.QPushButton() @@ -2845,9 +2874,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_4.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Plot Selection (left - right) Fill Transparency Level - self.sf_alpha_label = QtWidgets.QLabel('Alpha Level:') + self.sf_alpha_label = QtWidgets.QLabel(_('Alpha Level:')) self.sf_alpha_label.setToolTip( - "Set the fill transparency for the 'left to right' selection box." + _("Set the fill transparency for the 'left to right' selection box.") ) self.sf_color_alpha_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.sf_color_alpha_slider.setMinimum(0) @@ -2864,9 +2893,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_5.addWidget(self.sf_color_alpha_spinner) # Plot Selection (left - right) Line Color - self.sl_color_label = QtWidgets.QLabel('Sel. Line:') + self.sl_color_label = QtWidgets.QLabel(_('Sel. Line:')) self.sl_color_label.setToolTip( - "Set the line color for the 'left to right' selection box." + _("Set the line color for the 'left to right' selection box.") ) self.sl_color_entry = FCEntry() self.sl_color_button = QtWidgets.QPushButton() @@ -2878,12 +2907,12 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_6.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Plot Selection (right - left) Fill Color - self.alt_sf_color_label = QtWidgets.QLabel('Sel2. Fill:') + self.alt_sf_color_label = QtWidgets.QLabel(_('Sel2. Fill:')) self.alt_sf_color_label.setToolTip( - "Set the fill color for the selection box\n" + _("Set the fill color for the selection box\n" "in case that the selection is done from right to left.\n" "First 6 digits are the color and the last 2\n" - "digits are for alpha (transparency) level." + "digits are for alpha (transparency) level.") ) self.alt_sf_color_entry = FCEntry() self.alt_sf_color_button = QtWidgets.QPushButton() @@ -2895,9 +2924,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_7.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Plot Selection (right - left) Fill Transparency Level - self.alt_sf_alpha_label = QtWidgets.QLabel('Alpha Level:') + self.alt_sf_alpha_label = QtWidgets.QLabel(_('Alpha Level:')) self.alt_sf_alpha_label.setToolTip( - "Set the fill transparency for selection 'right to left' box." + _("Set the fill transparency for selection 'right to left' box.") ) self.alt_sf_color_alpha_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.alt_sf_color_alpha_slider.setMinimum(0) @@ -2914,9 +2943,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_8.addWidget(self.alt_sf_color_alpha_spinner) # Plot Selection (right - left) Line Color - self.alt_sl_color_label = QtWidgets.QLabel('Sel2. Line:') + self.alt_sl_color_label = QtWidgets.QLabel(_('Sel2. Line:')) self.alt_sl_color_label.setToolTip( - "Set the line color for the 'right to left' selection box." + _("Set the line color for the 'right to left' selection box.") ) self.alt_sl_color_entry = FCEntry() self.alt_sl_color_button = QtWidgets.QPushButton() @@ -2928,9 +2957,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_9.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Editor Draw Color - self.draw_color_label = QtWidgets.QLabel('Editor Draw:') + self.draw_color_label = QtWidgets.QLabel(_('Editor Draw:')) self.alt_sf_color_label.setToolTip( - "Set the color for the shape." + _("Set the color for the shape.") ) self.draw_color_entry = FCEntry() self.draw_color_button = QtWidgets.QPushButton() @@ -2942,9 +2971,9 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI): self.form_box_child_10.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # Editor Draw Selection Color - self.sel_draw_color_label = QtWidgets.QLabel('Editor Draw Sel.:') + self.sel_draw_color_label = QtWidgets.QLabel(_('Editor Draw Sel.:')) self.sel_draw_color_label.setToolTip( - "Set the color of the shape when selected." + _("Set the color of the shape when selected.") ) self.sel_draw_color_entry = FCEntry() self.sel_draw_color_button = QtWidgets.QPushButton() @@ -2991,29 +3020,35 @@ class GeneralGUISetGroupUI(OptionsGroupUI): def __init__(self, parent=None): super(GeneralGUISetGroupUI, self).__init__(self) - self.setTitle(str("GUI Settings")) + self.setTitle(str(_("GUI Settings"))) # Create a form layout for the Application general settings self.form_box = QtWidgets.QFormLayout() # Layout selection - self.layout_label = QtWidgets.QLabel('Layout:') + self.layout_label = QtWidgets.QLabel(_('Layout:')) self.layout_label.setToolTip( - "Select an layout for FlatCAM.\n" - "It is applied immediately." + _("Select an layout for FlatCAM.\n" + "It is applied immediately.") ) self.layout_combo = FCComboBox() - self.layout_combo.addItem("Choose ...") + # don't translate the QCombo items as they are used in QSettings and identified by name self.layout_combo.addItem("Standard") self.layout_combo.addItem("Compact") - self.layout_combo.setCurrentIndex(0) + + # Set the current index for layout_combo + settings = QSettings("Open Source", "FlatCAM") + if settings.contains("layout"): + layout = settings.value('layout', type=str) + idx = self.layout_combo.findText(layout.capitalize()) + self.layout_combo.setCurrentIndex(idx) # Style selection - self.style_label = QtWidgets.QLabel('Style:') + self.style_label = QtWidgets.QLabel(_('Style:')) self.style_label.setToolTip( - "Select an style for FlatCAM.\n" - "It will be applied at the next app start." + _("Select an style for FlatCAM.\n" + "It will be applied at the next app start.") ) self.style_combo = FCComboBox() self.style_combo.addItems(QtWidgets.QStyleFactory.keys()) @@ -3023,12 +3058,13 @@ class GeneralGUISetGroupUI(OptionsGroupUI): self.style_combo.activated[str].connect(self.handle_style) # Enable High DPI Support - self.hdpi_label = QtWidgets.QLabel('HDPI Support:') + self.hdpi_label = QtWidgets.QLabel(_('HDPI Support:')) self.hdpi_label.setToolTip( - "Enable High DPI support for FlatCAM.\n" - "It will be applied at the next app start." + _("Enable High DPI support for FlatCAM.\n" + "It will be applied at the next app start.") ) self.hdpi_cb = FCCheckBox() + settings = QSettings("Open Source", "FlatCAM") if settings.contains("hdpi"): self.hdpi_cb.set_value(settings.value('hdpi', type=int)) @@ -3037,13 +3073,23 @@ class GeneralGUISetGroupUI(OptionsGroupUI): self.hdpi_cb.stateChanged.connect(self.handle_hdpi) # Clear Settings - self.clear_label = QtWidgets.QLabel('Clear GUI Settings:') + self.clear_label = QtWidgets.QLabel(_('Clear GUI Settings:')) self.clear_label.setToolTip( - "Clear the GUI settings for FlatCAM,\n" - "such as: layout, gui state, style, hdpi support etc." + _("Clear the GUI settings for FlatCAM,\n" + "such as: layout, gui state, style, hdpi support etc.") ) - self.clear_btn = FCButton("Clear") + self.clear_btn = FCButton(_("Clear")) self.clear_btn.clicked.connect(self.handle_clear) + + # Enable Hover box + self.hover_label = QtWidgets.QLabel(_('Hover Shape:')) + self.hover_label.setToolTip( + _("Enable display of a hover shape for FlatCAM objects.\n" + "It is displayed whenever the mouse cursor is hovering\n" + "over any kind of not-selected object.") + ) + self.hover_cb = FCCheckBox() + # Just to add empty rows self.spacelabel = QtWidgets.QLabel('') @@ -3054,6 +3100,7 @@ class GeneralGUISetGroupUI(OptionsGroupUI): self.form_box.addRow(self.style_label, self.style_combo) self.form_box.addRow(self.hdpi_label, self.hdpi_cb) self.form_box.addRow(self.clear_label, self.clear_btn) + self.form_box.addRow(self.hover_label, self.hover_cb) # Add the QFormLayout that holds the Application general defaults # to the main layout of this TAB @@ -3078,10 +3125,10 @@ class GeneralGUISetGroupUI(OptionsGroupUI): def handle_clear(self): msgbox = QtWidgets.QMessageBox() # msgbox.setText("Save changes ...") - msgbox.setText("Are you sure you want to delete the GUI Settings? " - "\n" + msgbox.setText(_("Are you sure you want to delete the GUI Settings? " + "\n") ) - msgbox.setWindowTitle("Clear GUI Settings") + msgbox.setWindowTitle(_("Clear GUI Settings")) msgbox.setWindowIcon(QtGui.QIcon('share/trash32.png')) msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) msgbox.setDefaultButton(QtWidgets.QMessageBox.No) @@ -3094,131 +3141,131 @@ class GeneralGUISetGroupUI(OptionsGroupUI): settings.remove(key) # This will write the setting to the platform specific storage. del settings - self.app.inform.emit("[success] GUI settings deleted ...") + self.app.inform.emit(_("[success] GUI settings deleted ...")) class GeneralAppPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): super(GeneralAppPrefGroupUI, self).__init__(self) - self.setTitle(str("App Preferences")) + self.setTitle(str(_("App Preferences"))) # Create a form layout for the Application general settings self.form_box = QtWidgets.QFormLayout() # Units for FlatCAM - self.unitslabel = QtWidgets.QLabel('Units:') - self.unitslabel.setToolTip("The default value for FlatCAM units.\n" + self.unitslabel = QtWidgets.QLabel(_('Units:')) + self.unitslabel.setToolTip(_("The default value for FlatCAM units.\n" "Whatever is selected here is set every time\n" - "FLatCAM is started.") + "FLatCAM is started.")) self.units_radio = RadioSet([{'label': 'IN', 'value': 'IN'}, {'label': 'MM', 'value': 'MM'}]) # Application Level for FlatCAM - self.app_level_label = QtWidgets.QLabel('APP. LEVEL:') - self.app_level_label.setToolTip("Choose the default level of usage for FlatCAM.\n" + self.app_level_label = QtWidgets.QLabel(_('APP. LEVEL:')) + self.app_level_label.setToolTip(_("Choose the default level of usage for FlatCAM.\n" "BASIC level -> reduced functionality, best for beginner's.\n" "ADVANCED level -> full functionality.\n\n" "The choice here will influence the parameters in\n" - "the Selected Tab for all kinds of FlatCAM objects.") - self.app_level_radio = RadioSet([{'label': 'Basic', 'value': 'b'}, - {'label': 'Advanced', 'value': 'a'}]) + "the Selected Tab for all kinds of FlatCAM objects.")) + self.app_level_radio = RadioSet([{'label': _('Basic'), 'value': 'b'}, + {'label': _('Advanced'), 'value': 'a'}]) # Languages for FlatCAM - self.languagelabel = QtWidgets.QLabel('Languages:') - self.languagelabel.setToolTip("Set the language used throughout FlatCAM.") + self.languagelabel = QtWidgets.QLabel(_('Languages:')) + self.languagelabel.setToolTip(_("Set the language used throughout FlatCAM.")) self.language_cb = FCComboBox() self.languagespace = QtWidgets.QLabel('') - self.language_apply_btn = FCButton("Apply Language") + self.language_apply_btn = FCButton(_("Apply Language")) # Shell StartUp CB - self.shell_startup_label = QtWidgets.QLabel('Shell at StartUp:') + self.shell_startup_label = QtWidgets.QLabel(_('Shell at StartUp:')) self.shell_startup_label.setToolTip( - "Check this box if you want the shell to\n" - "start automatically at startup." + _("Check this box if you want the shell to\n" + "start automatically at startup.") ) self.shell_startup_cb = FCCheckBox(label='') self.shell_startup_cb.setToolTip( - "Check this box if you want the shell to\n" - "start automatically at startup." + _("Check this box if you want the shell to\n" + "start automatically at startup.") ) # Version Check CB - self.version_check_label = QtWidgets.QLabel('Version Check:') + self.version_check_label = QtWidgets.QLabel(_('Version Check:')) self.version_check_label.setToolTip( - "Check this box if you want to check\n" - "for a new version automatically at startup." + _("Check this box if you want to check\n" + "for a new version automatically at startup.") ) self.version_check_cb = FCCheckBox(label='') self.version_check_cb.setToolTip( - "Check this box if you want to check\n" - "for a new version automatically at startup." + _("Check this box if you want to check\n" + "for a new version automatically at startup.") ) # Send Stats CB - self.send_stats_label = QtWidgets.QLabel('Send Stats:') + self.send_stats_label = QtWidgets.QLabel(_('Send Stats:')) self.send_stats_label.setToolTip( - "Check this box if you agree to send anonymous\n" - "stats automatically at startup, to help improve FlatCAM." + _("Check this box if you agree to send anonymous\n" + "stats automatically at startup, to help improve FlatCAM.") ) self.send_stats_cb= FCCheckBox(label='') self.send_stats_cb.setToolTip( - "Check this box if you agree to send anonymous\n" - "stats automatically at startup, to help improve FlatCAM." + _("Check this box if you agree to send anonymous\n" + "stats automatically at startup, to help improve FlatCAM.") ) self.ois_version_check = OptionalInputSection(self.version_check_cb, [self.send_stats_cb]) # Select mouse pan button - self.panbuttonlabel = QtWidgets.QLabel('Pan Button:') - self.panbuttonlabel.setToolTip("Select the mouse button to use for panning:\n" + self.panbuttonlabel = QtWidgets.QLabel(_('Pan Button:')) + self.panbuttonlabel.setToolTip(_("Select the mouse button to use for panning:\n" "- MMB --> Middle Mouse Button\n" - "- RMB --> Right Mouse Button") - self.pan_button_radio = RadioSet([{'label': 'MMB', 'value': '3'}, - {'label': 'RMB', 'value': '2'}]) + "- RMB --> Right Mouse Button")) + self.pan_button_radio = RadioSet([{'label': _('MMB'), 'value': '3'}, + {'label': _('RMB'), 'value': '2'}]) # Multiple Selection Modifier Key - self.mselectlabel = QtWidgets.QLabel('Multiple Sel:') - self.mselectlabel.setToolTip("Select the key used for multiple selection.") - self.mselect_radio = RadioSet([{'label': 'CTRL', 'value': 'Control'}, - {'label': 'SHIFT', 'value': 'Shift'}]) + self.mselectlabel = QtWidgets.QLabel(_('Multiple Sel:')) + self.mselectlabel.setToolTip(_("Select the key used for multiple selection.")) + self.mselect_radio = RadioSet([{'label': _('CTRL'), 'value': 'Control'}, + {'label': _('SHIFT'), 'value': 'Shift'}]) # Project at StartUp CB - self.project_startup_label = QtWidgets.QLabel('Project at StartUp:') + self.project_startup_label = QtWidgets.QLabel(_('Project at StartUp:')) self.project_startup_label.setToolTip( - "Check this box if you want the project/selected/tool tab area to\n" - "to be shown automatically at startup." + _("Check this box if you want the project/selected/tool tab area to\n" + "to be shown automatically at startup.") ) self.project_startup_cb = FCCheckBox(label='') self.project_startup_cb.setToolTip( - "Check this box if you want the project/selected/tool tab area to\n" - "to be shown automatically at startup." + _("Check this box if you want the project/selected/tool tab area to\n" + "to be shown automatically at startup.") ) # Project autohide CB - self.project_autohide_label = QtWidgets.QLabel('Project AutoHide:') + self.project_autohide_label = QtWidgets.QLabel(_('Project AutoHide:')) self.project_autohide_label.setToolTip( - "Check this box if you want the project/selected/tool tab area to\n" + _( "Check this box if you want the project/selected/tool tab area to\n" "hide automatically when there are no objects loaded and\n" - "to show whenever a new object is created." + "to show whenever a new object is created.") ) self.project_autohide_cb = FCCheckBox(label='') self.project_autohide_cb.setToolTip( - "Check this box if you want the project/selected/tool tab area to\n" + _("Check this box if you want the project/selected/tool tab area to\n" "hide automatically when there are no objects loaded and\n" - "to show whenever a new object is created." + "to show whenever a new object is created.") ) # Enable/Disable ToolTips globally - self.toggle_tooltips_label = QtWidgets.QLabel('Enable ToolTips:') + self.toggle_tooltips_label = QtWidgets.QLabel(_('Enable ToolTips:')) self.toggle_tooltips_label.setToolTip( - "Check this box if you want to have toolTips displayed\n" - "when hovering with mouse over items throughout the App." + _( "Check this box if you want to have toolTips displayed\n" + "when hovering with mouse over items throughout the App.") ) self.toggle_tooltips_cb = FCCheckBox(label='') self.toggle_tooltips_cb.setToolTip( - "Check this box if you want to have toolTips displayed\n" - "when hovering with mouse over items throughout the App." + _( "Check this box if you want to have toolTips displayed\n" + "when hovering with mouse over items throughout the App.") ) # Just to add empty rows @@ -3251,10 +3298,10 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): # hlay.addStretch() # Save compressed project CB - self.save_type_cb = FCCheckBox('Save Compressed Project') + self.save_type_cb = FCCheckBox(_('Save Compressed Project')) self.save_type_cb.setToolTip( - "Whether to save a compressed or uncompressed project.\n" - "When checked it will save a compressed FlatCAM project." + _("Whether to save a compressed or uncompressed project.\n" + "When checked it will save a compressed FlatCAM project.") ) # self.advanced_cb.setLayoutDirection(QtCore.Qt.RightToLeft) self.layout.addWidget(self.save_type_cb) @@ -3264,11 +3311,11 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): # Project LZMA Comppression Level self.compress_combo = FCComboBox() - self.compress_label = QtWidgets.QLabel('Compress Level:') + self.compress_label = QtWidgets.QLabel(_('Compression Level:')) self.compress_label.setToolTip( - "The level of compression used when saving\n" + _("The level of compression used when saving\n" "a FlatCAM project. Higher value means better compression\n" - "but require more RAM and time." + "but require more RAM usage and more processing time.") ) # self.advanced_cb.setLayoutDirection(QtCore.Qt.RightToLeft) self.compress_combo.addItems([str(i) for i in range(10)]) @@ -3292,38 +3339,38 @@ class GerberGenPrefGroupUI(OptionsGroupUI): self.setTitle(str("Gerber General")) ## Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.layout.addWidget(self.plot_options_label) grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) # Solid CB - self.solid_cb = FCCheckBox(label='Solid') + self.solid_cb = FCCheckBox(label=_('Solid')) self.solid_cb.setToolTip( - "Solid color polygons." + _("Solid color polygons.") ) grid0.addWidget(self.solid_cb, 0, 0) # Multicolored CB - self.multicolored_cb = FCCheckBox(label='M-Color') + self.multicolored_cb = FCCheckBox(label=_('M-Color')) self.multicolored_cb.setToolTip( - "Draw polygons in different colors." + _("Draw polygons in different colors.") ) grid0.addWidget(self.multicolored_cb, 0, 1) # Plot CB - self.plot_cb = FCCheckBox(label='Plot') + self.plot_cb = FCCheckBox(label=_('Plot')) self.plot_options_label.setToolTip( - "Plot (show) this object." + _("Plot (show) this object.") ) grid0.addWidget(self.plot_cb, 0, 2) # Number of circle steps for circular aperture linear approximation - self.circle_steps_label = QtWidgets.QLabel("Circle Steps:") + self.circle_steps_label = QtWidgets.QLabel(_("Circle Steps:")) self.circle_steps_label.setToolTip( - "The number of circle steps for Gerber \n" - "circular aperture linear approximation." + _("The number of circle steps for Gerber \n" + "circular aperture linear approximation.") ) grid0.addWidget(self.circle_steps_label, 1, 0) self.circle_steps_entry = IntEntry() @@ -3337,14 +3384,14 @@ class GerberOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Gerber Options Preferences", parent=parent) super(GerberOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Gerber Options")) + self.setTitle(str(_("Gerber Options"))) ## Isolation Routing - self.isolation_routing_label = QtWidgets.QLabel("Isolation Routing:") + self.isolation_routing_label = QtWidgets.QLabel(_("Isolation Routing:")) self.isolation_routing_label.setToolTip( - "Create a Geometry object with\n" - "toolpaths to cut outside polygons." + _("Create a Geometry object with\n" + "toolpaths to cut outside polygons.") ) self.layout.addWidget(self.isolation_routing_label) @@ -3352,58 +3399,58 @@ class GerberOptPrefGroupUI(OptionsGroupUI): grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) - tdlabel = QtWidgets.QLabel('Tool dia:') + tdlabel = QtWidgets.QLabel(_('Tool dia:')) tdlabel.setToolTip( - "Diameter of the cutting tool." + _("Diameter of the cutting tool.") ) grid0.addWidget(tdlabel, 0, 0) self.iso_tool_dia_entry = LengthEntry() grid0.addWidget(self.iso_tool_dia_entry, 0, 1) # Nr of passes - passlabel = QtWidgets.QLabel('Width (# passes):') + passlabel = QtWidgets.QLabel(_('Width (# passes):')) passlabel.setToolTip( - "Width of the isolation gap in\n" - "number (integer) of tool widths." + _("Width of the isolation gap in\n" + "number (integer) of tool widths.") ) grid0.addWidget(passlabel, 1, 0) self.iso_width_entry = IntEntry() grid0.addWidget(self.iso_width_entry, 1, 1) # Pass overlap - overlabel = QtWidgets.QLabel('Pass overlap:') + overlabel = QtWidgets.QLabel(_('Pass overlap:')) overlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _("How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" - "A value here of 0.25 means an overlap of 25% from the tool diameter found above." + "A value here of 0.25 means an overlap of 25%% from the tool diameter found above.") ) grid0.addWidget(overlabel, 2, 0) self.iso_overlap_entry = FloatEntry() grid0.addWidget(self.iso_overlap_entry, 2, 1) - milling_type_label = QtWidgets.QLabel('Milling Type:') + milling_type_label = QtWidgets.QLabel(_('Milling Type:')) milling_type_label.setToolTip( - "Milling type:\n" + _("Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" - "- conventional / useful when there is no backlash compensation" + "- conventional / useful when there is no backlash compensation") ) grid0.addWidget(milling_type_label, 3, 0) - self.milling_type_radio = RadioSet([{'label': 'Climb', 'value': 'cl'}, - {'label': 'Conv.', 'value': 'cv'}]) + self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'}, + {'label': _('Conv.'), 'value': 'cv'}]) grid0.addWidget(self.milling_type_radio, 3, 1) # Combine passes - self.combine_passes_cb = FCCheckBox(label='Combine Passes') + self.combine_passes_cb = FCCheckBox(label=_('Combine Passes')) self.combine_passes_cb.setToolTip( - "Combine all passes into one object" + _("Combine all passes into one object") ) grid0.addWidget(self.combine_passes_cb, 4, 0) ## Clear non-copper regions - self.clearcopper_label = QtWidgets.QLabel("Clear non-copper:") + self.clearcopper_label = QtWidgets.QLabel(_("Clear non-copper:")) self.clearcopper_label.setToolTip( - "Create a Geometry object with\n" - "toolpaths to cut all non-copper regions." + _("Create a Geometry object with\n" + "toolpaths to cut all non-copper regions.") ) self.layout.addWidget(self.clearcopper_label) @@ -3411,47 +3458,47 @@ class GerberOptPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid1) # Margin - bmlabel = QtWidgets.QLabel('Boundary Margin:') + bmlabel = QtWidgets.QLabel(_('Boundary Margin:')) bmlabel.setToolTip( - "Specify the edge of the PCB\n" + _("Specify the edge of the PCB\n" "by drawing a box around all\n" "objects with this minimum\n" - "distance." + "distance.") ) grid1.addWidget(bmlabel, 0, 0) self.noncopper_margin_entry = LengthEntry() grid1.addWidget(self.noncopper_margin_entry, 0, 1) # Rounded corners - self.noncopper_rounded_cb = FCCheckBox(label="Rounded corners") + self.noncopper_rounded_cb = FCCheckBox(label=_("Rounded corners")) self.noncopper_rounded_cb.setToolTip( - "Creates a Geometry objects with polygons\n" - "covering the copper-free areas of the PCB." + _("Creates a Geometry objects with polygons\n" + "covering the copper-free areas of the PCB.") ) grid1.addWidget(self.noncopper_rounded_cb, 1, 0, 1, 2) ## Bounding box - self.boundingbox_label = QtWidgets.QLabel('Bounding Box:') + self.boundingbox_label = QtWidgets.QLabel(_('Bounding Box:')) self.layout.addWidget(self.boundingbox_label) grid2 = QtWidgets.QGridLayout() self.layout.addLayout(grid2) - bbmargin = QtWidgets.QLabel('Boundary Margin:') + bbmargin = QtWidgets.QLabel(_('Boundary Margin:')) bbmargin.setToolTip( - "Distance of the edges of the box\n" - "to the nearest polygon." + _("Distance of the edges of the box\n" + "to the nearest polygon.") ) grid2.addWidget(bbmargin, 0, 0) self.bbmargin_entry = LengthEntry() grid2.addWidget(self.bbmargin_entry, 0, 1) - self.bbrounded_cb = FCCheckBox(label="Rounded corners") + self.bbrounded_cb = FCCheckBox(label=_("Rounded corners")) self.bbrounded_cb.setToolTip( - "If the bounding box is \n" + _("If the bounding box is \n" "to have rounded corners\n" "their radius is equal to\n" - "the margin." + "the margin.") ) grid2.addWidget(self.bbrounded_cb, 1, 0, 1, 2) self.layout.addStretch() @@ -3462,15 +3509,15 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Gerber Adv. Options Preferences", parent=parent) super(GerberAdvOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Gerber Adv. Options")) + self.setTitle(str(_("Gerber Adv. Options"))) ## Advanced Gerber Parameters - self.adv_param_label = QtWidgets.QLabel("Advanced Param.:") + self.adv_param_label = QtWidgets.QLabel(_("Advanced Param.:")) self.adv_param_label.setToolTip( - "A list of Gerber advanced parameters.\n" + _("A list of Gerber advanced parameters.\n" "Those parameters are available only for\n" - "Advanced App. Level." + "Advanced App. Level.") ) self.layout.addWidget(self.adv_param_label) @@ -3478,31 +3525,31 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid0) # Follow Attribute - self.follow_cb = FCCheckBox(label='"Follow"') + self.follow_cb = FCCheckBox(label=_('"Follow"')) self.follow_cb.setToolTip( - "Generate a 'Follow' geometry.\n" + _("Generate a 'Follow' geometry.\n" "This means that it will cut through\n" - "the middle of the trace." + "the middle of the trace.") ) grid0.addWidget(self.follow_cb, 0, 0) # Aperture Table Visibility CB - self.aperture_table_visibility_cb = FCCheckBox(label='Table Show/Hide') + self.aperture_table_visibility_cb = FCCheckBox(label=_('Table Show/Hide')) self.aperture_table_visibility_cb.setToolTip( - "Toggle the display of the Gerber Apertures Table.\n" + _("Toggle the display of the Gerber Apertures Table.\n" "Also, on hide, it will delete all mark shapes\n" - "that are drawn on canvas." + "that are drawn on canvas.") ) grid0.addWidget(self.aperture_table_visibility_cb, 1, 0) # Scale Aperture Factor - self.scale_aperture_label = QtWidgets.QLabel('Ap. Scale Factor:') + self.scale_aperture_label = QtWidgets.QLabel(_('Ap. Scale Factor:')) self.scale_aperture_label.setToolTip( - "Change the size of the selected apertures.\n" + _("Change the size of the selected apertures.\n" "Factor by which to multiply\n" - "geometric features of this object." + "geometric features of this object.") ) grid0.addWidget(self.scale_aperture_label, 2, 0) @@ -3510,11 +3557,11 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.scale_aperture_entry, 2, 1) # Buffer Aperture Factor - self.buffer_aperture_label = QtWidgets.QLabel('Ap. Buffer Factor:') + self.buffer_aperture_label = QtWidgets.QLabel(_('Ap. Buffer Factor:')) self.buffer_aperture_label.setToolTip( - "Change the size of the selected apertures.\n" + _("Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" - "geometric features of this object." + "geometric features of this object.") ) grid0.addWidget(self.buffer_aperture_label, 3, 0) @@ -3530,31 +3577,31 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Excellon Options", parent=parent) super(ExcellonGenPrefGroupUI, self).__init__(self) - self.setTitle(str("Excellon General")) + self.setTitle(str(_("Excellon General"))) # Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.layout.addWidget(self.plot_options_label) grid1 = QtWidgets.QGridLayout() self.layout.addLayout(grid1) - self.plot_cb = FCCheckBox(label='Plot') + self.plot_cb = FCCheckBox(label=_('Plot')) self.plot_cb.setToolTip( "Plot (show) this object." ) grid1.addWidget(self.plot_cb, 0, 0) - self.solid_cb = FCCheckBox(label='Solid') + self.solid_cb = FCCheckBox(label=_('Solid')) self.solid_cb.setToolTip( "Plot as solid circles." ) grid1.addWidget(self.solid_cb, 0, 1) # Excellon format - self.excellon_format_label = QtWidgets.QLabel("Excellon Format:") + self.excellon_format_label = QtWidgets.QLabel(_("Excellon Format:")) self.excellon_format_label.setToolTip( - "The NC drill files, usually named Excellon files\n" + _("The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" "Here we set the format used when the provided\n" "coordinates are not using period.\n" @@ -3573,16 +3620,16 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): "ALTIUM 2:4 INCH LZ\n" "Sprint Layout 2:4 INCH LZ" "\n" - "KiCAD 3:5 INCH TZ" + "KiCAD 3:5 INCH TZ") ) self.layout.addWidget(self.excellon_format_label) hlay1 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay1) - self.excellon_format_in_label = QtWidgets.QLabel("INCH:") + self.excellon_format_in_label = QtWidgets.QLabel(_("INCH:")) self.excellon_format_in_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_format_in_label.setToolTip( - "Default values for INCH are 2:4") + _("Default values for INCH are 2:4")) hlay1.addWidget(self.excellon_format_in_label, QtCore.Qt.AlignLeft) self.excellon_format_upper_in_entry = IntEntry() @@ -3590,8 +3637,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.excellon_format_upper_in_entry.setAlignment(QtCore.Qt.AlignRight) self.excellon_format_upper_in_entry.setFixedWidth(30) self.excellon_format_upper_in_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the whole part of Excellon coordinates." + _( "This numbers signify the number of digits in\n" + "the whole part of Excellon coordinates.") ) hlay1.addWidget(self.excellon_format_upper_in_entry, QtCore.Qt.AlignLeft) @@ -3604,18 +3651,18 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.excellon_format_lower_in_entry.setAlignment(QtCore.Qt.AlignRight) self.excellon_format_lower_in_entry.setFixedWidth(30) self.excellon_format_lower_in_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the decimal part of Excellon coordinates." + _("This numbers signify the number of digits in\n" + "the decimal part of Excellon coordinates.") ) hlay1.addWidget(self.excellon_format_lower_in_entry, QtCore.Qt.AlignLeft) hlay1.addStretch() hlay2 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay2) - self.excellon_format_mm_label = QtWidgets.QLabel("METRIC:") + self.excellon_format_mm_label = QtWidgets.QLabel(_("METRIC:")) self.excellon_format_mm_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_format_mm_label.setToolTip( - "Default values for METRIC are 3:3") + _("Default values for METRIC are 3:3")) hlay2.addWidget(self.excellon_format_mm_label, QtCore.Qt.AlignLeft) self.excellon_format_upper_mm_entry = IntEntry() @@ -3623,8 +3670,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.excellon_format_upper_mm_entry.setAlignment(QtCore.Qt.AlignRight) self.excellon_format_upper_mm_entry.setFixedWidth(30) self.excellon_format_upper_mm_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the whole part of Excellon coordinates." + _("This numbers signify the number of digits in\n" + "the whole part of Excellon coordinates.") ) hlay2.addWidget(self.excellon_format_upper_mm_entry, QtCore.Qt.AlignLeft) @@ -3637,8 +3684,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.excellon_format_lower_mm_entry.setAlignment(QtCore.Qt.AlignRight) self.excellon_format_lower_mm_entry.setFixedWidth(30) self.excellon_format_lower_mm_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the decimal part of Excellon coordinates." + _("This numbers signify the number of digits in\n" + "the decimal part of Excellon coordinates.") ) hlay2.addWidget(self.excellon_format_lower_mm_entry, QtCore.Qt.AlignLeft) hlay2.addStretch() @@ -3646,27 +3693,27 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): hlay3 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay3) - self.excellon_zeros_label = QtWidgets.QLabel('Default Zeros:') + self.excellon_zeros_label = QtWidgets.QLabel(_('Default Zeros:')) self.excellon_zeros_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_zeros_label.setToolTip( - "This sets the type of Excellon zeros.\n" + _("This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" "Trailing Zeros are removed.\n" "If TZ is checked then Trailing Zeros are kept\n" - "and Leading Zeros are removed." + "and Leading Zeros are removed.") ) hlay3.addWidget(self.excellon_zeros_label) - self.excellon_zeros_radio = RadioSet([{'label': 'LZ', 'value': 'L'}, - {'label': 'TZ', 'value': 'T'}]) + self.excellon_zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'L'}, + {'label': _('TZ'), 'value': 'T'}]) self.excellon_zeros_radio.setToolTip( - "This sets the default type of Excellon zeros.\n" + _("This sets the default type of Excellon zeros.\n" "If it is not detected in the parsed file the value here\n" "will be used." "If LZ then Leading Zeros are kept and\n" "Trailing Zeros are removed.\n" "If TZ is checked then Trailing Zeros are kept\n" - "and Leading Zeros are removed." + "and Leading Zeros are removed.") ) hlay3.addStretch() hlay3.addWidget(self.excellon_zeros_radio, QtCore.Qt.AlignRight) @@ -3674,23 +3721,23 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): hlay4 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay4) - self.excellon_units_label = QtWidgets.QLabel('Default Units:') + self.excellon_units_label = QtWidgets.QLabel(_('Default Units:')) self.excellon_units_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_units_label.setToolTip( - "This sets the default units of Excellon files.\n" + _("This sets the default units of Excellon files.\n" "If it is not detected in the parsed file the value here\n" "will be used." "Some Excellon files don't have an header\n" - "therefore this parameter will be used.\n" + "therefore this parameter will be used.") ) hlay4.addWidget(self.excellon_units_label) - self.excellon_units_radio = RadioSet([{'label': 'INCH', 'value': 'INCH'}, - {'label': 'MM', 'value': 'METRIC'}]) + self.excellon_units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'}, + {'label': _('MM'), 'value': 'METRIC'}]) self.excellon_units_radio.setToolTip( - "This sets the units of Excellon files.\n" + _("This sets the units of Excellon files.\n" "Some Excellon files don't have an header\n" - "therefore this parameter will be used.\n" + "therefore this parameter will be used.") ) hlay4.addStretch() hlay4.addWidget(self.excellon_units_radio, QtCore.Qt.AlignRight) @@ -3704,48 +3751,48 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): hlay6 = QtWidgets.QVBoxLayout() self.layout.addLayout(hlay6) - self.excellon_general_label = QtWidgets.QLabel("Excellon Optimization:") + self.excellon_general_label = QtWidgets.QLabel(_("Excellon Optimization:")) hlay6.addWidget(self.excellon_general_label) # Create a form layout for the Excellon general settings form_box_excellon = QtWidgets.QFormLayout() hlay6.addLayout(form_box_excellon) - self.excellon_optimization_label = QtWidgets.QLabel('Algorithm: ') + self.excellon_optimization_label = QtWidgets.QLabel(_('Algorithm: ')) self.excellon_optimization_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_optimization_label.setToolTip( - "This sets the optimization type for the Excellon drill path.\n" + _("This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" "Guided Local Path is used. Default search time is 3sec.\n" "Use set_sys excellon_search_time value Tcl Command to set other values.\n" "If Basic is checked then Google OR-Tools Basic algorithm is used.\n" "\n" "If DISABLED, then FlatCAM works in 32bit mode and it uses \n" - "Travelling Salesman algorithm for path optimization." + "Travelling Salesman algorithm for path optimization.") ) - self.excellon_optimization_radio = RadioSet([{'label': 'MH', 'value': 'M'}, - {'label': 'Basic', 'value': 'B'}]) + self.excellon_optimization_radio = RadioSet([{'label': _('MH'), 'value': 'M'}, + {'label': _('Basic'), 'value': 'B'}]) self.excellon_optimization_radio.setToolTip( - "This sets the optimization type for the Excellon drill path.\n" + _("This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" "Guided Local Path is used. Default search time is 3sec.\n" "Use set_sys excellon_search_time value Tcl Command to set other values.\n" "If Basic is checked then Google OR-Tools Basic algorithm is used.\n" "\n" "If DISABLED, then FlatCAM works in 32bit mode and it uses \n" - "Travelling Salesman algorithm for path optimization." + "Travelling Salesman algorithm for path optimization.") ) form_box_excellon.addRow(self.excellon_optimization_label, self.excellon_optimization_radio) - self.optimization_time_label = QtWidgets.QLabel('Optimization Time: ') + self.optimization_time_label = QtWidgets.QLabel(_('Optimization Time: ')) self.optimization_time_label.setAlignment(QtCore.Qt.AlignLeft) self.optimization_time_label.setToolTip( - "When OR-Tools Metaheuristic (MH) is enabled there is a\n" + _("When OR-Tools Metaheuristic (MH) is enabled there is a\n" "maximum threshold for how much time is spent doing the\n" "path optimization. This max duration is set here.\n" - "In seconds." + "In seconds.") ) @@ -3783,83 +3830,83 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Excellon Options", parent=parent) super(ExcellonOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Excellon Options")) + self.setTitle(str(_("Excellon Options"))) ## Create CNC Job - self.cncjob_label = QtWidgets.QLabel('Create CNC Job') + self.cncjob_label = QtWidgets.QLabel(_('Create CNC Job')) self.cncjob_label.setToolTip( - "Parameters used to create a CNC Job object\n" - "for this drill object." + _("Parameters used to create a CNC Job object\n" + "for this drill object.") ) self.layout.addWidget(self.cncjob_label) grid2 = QtWidgets.QGridLayout() self.layout.addLayout(grid2) - cutzlabel = QtWidgets.QLabel('Cut Z:') + cutzlabel = QtWidgets.QLabel(_('Cut Z:')) cutzlabel.setToolTip( - "Drill depth (negative)\n" - "below the copper surface." + _("Drill depth (negative)\n" + "below the copper surface.") ) grid2.addWidget(cutzlabel, 0, 0) self.cutz_entry = LengthEntry() grid2.addWidget(self.cutz_entry, 0, 1) - travelzlabel = QtWidgets.QLabel('Travel Z:') + travelzlabel = QtWidgets.QLabel(_('Travel Z:')) travelzlabel.setToolTip( - "Tool height when travelling\n" - "across the XY plane." + _("Tool height when travelling\n" + "across the XY plane.") ) grid2.addWidget(travelzlabel, 1, 0) self.travelz_entry = LengthEntry() grid2.addWidget(self.travelz_entry, 1, 1) # Tool change: - toolchlabel = QtWidgets.QLabel("Tool change:") + toolchlabel = QtWidgets.QLabel(_("Tool change:")) toolchlabel.setToolTip( - "Include tool-change sequence\n" - "in G-Code (Pause for tool change)." + _("Include tool-change sequence\n" + "in G-Code (Pause for tool change).") ) self.toolchange_cb = FCCheckBox() grid2.addWidget(toolchlabel, 2, 0) grid2.addWidget(self.toolchange_cb, 2, 1) - toolchangezlabel = QtWidgets.QLabel('Toolchange Z:') + toolchangezlabel = QtWidgets.QLabel(_('Toolchange Z:')) toolchangezlabel.setToolTip( - "Toolchange Z position." + _("Toolchange Z position.") ) grid2.addWidget(toolchangezlabel, 3, 0) self.toolchangez_entry = LengthEntry() grid2.addWidget(self.toolchangez_entry, 3, 1) - frlabel = QtWidgets.QLabel('Feedrate:') + frlabel = QtWidgets.QLabel(_('Feedrate:')) frlabel.setToolTip( - "Tool speed while drilling\n" - "(in units per minute)." + _("Tool speed while drilling\n" + "(in units per minute).") ) grid2.addWidget(frlabel, 4, 0) self.feedrate_entry = LengthEntry() grid2.addWidget(self.feedrate_entry, 4, 1) # Spindle speed - spdlabel = QtWidgets.QLabel('Spindle Speed:') + spdlabel = QtWidgets.QLabel(_('Spindle Speed:')) spdlabel.setToolTip( - "Speed of the spindle\n" - "in RPM (optional)" + _("Speed of the spindle\n" + "in RPM (optional)") ) grid2.addWidget(spdlabel, 5, 0) self.spindlespeed_entry = IntEntry(allow_empty=True) grid2.addWidget(self.spindlespeed_entry, 5, 1) # Dwell - dwelllabel = QtWidgets.QLabel('Dwell:') + dwelllabel = QtWidgets.QLabel(_('Dwell:')) dwelllabel.setToolTip( - "Pause to allow the spindle to reach its\n" - "speed before cutting." + _("Pause to allow the spindle to reach its\n" + "speed before cutting.") ) - dwelltime = QtWidgets.QLabel('Duration:') + dwelltime = QtWidgets.QLabel(_('Duration:')) dwelltime.setToolTip( - "Number of milliseconds for spindle to dwell." + _("Number of milliseconds for spindle to dwell.") ) self.dwell_cb = FCCheckBox() self.dwelltime_entry = FCEntry() @@ -3871,10 +3918,10 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): self.ois_dwell_exc = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry]) # postprocessor selection - pp_excellon_label = QtWidgets.QLabel("Postprocessor:") + pp_excellon_label = QtWidgets.QLabel(_("Postprocessor:")) pp_excellon_label.setToolTip( - "The postprocessor file that dictates\n" - "gcode output." + _("The postprocessor file that dictates\n" + "gcode output.") ) grid2.addWidget(pp_excellon_label, 8, 0) self.pp_excellon_name_cb = FCComboBox() @@ -3883,16 +3930,16 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): #### Choose what to use for Gcode creation: Drills, Slots or Both - excellon_gcode_type_label = QtWidgets.QLabel('Gcode: ') + excellon_gcode_type_label = QtWidgets.QLabel(_('Gcode: ')) excellon_gcode_type_label.setToolTip( - "Choose what to use for GCode generation:\n" + _("Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" "When choosing 'Slots' or 'Both', slots will be\n" - "converted to drills." + "converted to drills.") ) - self.excellon_gcode_type_radio = RadioSet([{'label': 'Drills', 'value': 'drills'}, - {'label': 'Slots', 'value': 'slots'}, - {'label': 'Both', 'value': 'both'}]) + self.excellon_gcode_type_radio = RadioSet([{'label': _('Drills'), 'value': 'drills'}, + {'label': _('Slots'), 'value': 'slots'}, + {'label': _('Both'), 'value': 'both'}]) grid2.addWidget(excellon_gcode_type_label, 9, 0) grid2.addWidget(self.excellon_gcode_type_radio, 9, 1) @@ -3901,25 +3948,25 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): self.excellon_gcode_type_radio.setVisible(False) #### Milling Holes #### - self.mill_hole_label = QtWidgets.QLabel('Mill Holes') + self.mill_hole_label = QtWidgets.QLabel(_('Mill Holes')) self.mill_hole_label.setToolTip( - "Create Geometry for milling holes." + _("Create Geometry for milling holes.") ) self.layout.addWidget(self.mill_hole_label) grid3 = QtWidgets.QGridLayout() self.layout.addLayout(grid3) - tdlabel = QtWidgets.QLabel('Drill Tool dia:') + tdlabel = QtWidgets.QLabel(_('Drill Tool dia:')) tdlabel.setToolTip( - "Diameter of the cutting tool." + _("Diameter of the cutting tool.") ) grid3.addWidget(tdlabel, 0, 0) self.tooldia_entry = LengthEntry() grid3.addWidget(self.tooldia_entry, 0, 1) - stdlabel = QtWidgets.QLabel('Slot Tool dia:') + stdlabel = QtWidgets.QLabel(_('Slot Tool dia:')) stdlabel.setToolTip( - "Diameter of the cutting tool\n" - "when milling slots." + _("Diameter of the cutting tool\n" + "when milling slots.") ) grid3.addWidget(stdlabel, 1, 0) self.slot_tooldia_entry = LengthEntry() @@ -3930,7 +3977,7 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): # Adding the Excellon Format Defaults Button self.excellon_defaults_button = QtWidgets.QPushButton() - self.excellon_defaults_button.setText(str("Defaults")) + self.excellon_defaults_button.setText(str(_("Defaults"))) self.excellon_defaults_button.setFixedWidth(80) grid4.addWidget(self.excellon_defaults_button, 0, 0, QtCore.Qt.AlignRight) @@ -3943,105 +3990,107 @@ class ExcellonAdvOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Excellon Advanced Options", parent=parent) super(ExcellonAdvOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Excellon Adv. Options")) + self.setTitle(str(_("Excellon Adv. Options"))) ###################### ## ADVANCED OPTIONS ## ###################### - self.cncjob_label = QtWidgets.QLabel('Advanced Options:') + self.cncjob_label = QtWidgets.QLabel(_('Advanced Options:')) self.cncjob_label.setToolTip( - "Parameters used to create a CNC Job object\n" - "for this drill object that are shown when App Level is Advanced." + _("Parameters used to create a CNC Job object\n" + "for this drill object that are shown when App Level is Advanced.") ) self.layout.addWidget(self.cncjob_label) grid1 = QtWidgets.QGridLayout() self.layout.addLayout(grid1) - offsetlabel = QtWidgets.QLabel('Offset Z:') + offsetlabel = QtWidgets.QLabel(_('Offset Z:')) offsetlabel.setToolTip( - "Some drill bits (the larger ones) need to drill deeper\n" + _("Some drill bits (the larger ones) need to drill deeper\n" "to create the desired exit hole diameter due of the tip shape.\n" - "The value here can compensate the Cut Z parameter.") + "The value here can compensate the Cut Z parameter.")) grid1.addWidget(offsetlabel, 0, 0) self.offset_entry = LengthEntry() grid1.addWidget(self.offset_entry, 0, 1) - toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') + toolchange_xy_label = QtWidgets.QLabel(_('Toolchange X,Y:')) toolchange_xy_label.setToolTip( - "Toolchange X,Y position." + _("Toolchange X,Y position.") ) grid1.addWidget(toolchange_xy_label, 1, 0) self.toolchangexy_entry = FCEntry() grid1.addWidget(self.toolchangexy_entry, 1, 1) - startzlabel = QtWidgets.QLabel('Start move Z:') + startzlabel = QtWidgets.QLabel(_('Start move Z:')) startzlabel.setToolTip( - "Height of the tool just after start.\n" - "Delete the value if you don't need this feature." + _("Height of the tool just after start.\n" + "Delete the value if you don't need this feature.") ) grid1.addWidget(startzlabel, 2, 0) self.estartz_entry = FloatEntry() grid1.addWidget(self.estartz_entry, 2, 1) - endzlabel = QtWidgets.QLabel('End move Z:') + endzlabel = QtWidgets.QLabel(_('End move Z:')) endzlabel.setToolTip( - "Height of the tool after\n" - "the last move at the end of the job." + _("Height of the tool after\n" + "the last move at the end of the job.") ) grid1.addWidget(endzlabel, 3, 0) self.eendz_entry = LengthEntry() grid1.addWidget(self.eendz_entry, 3, 1) - fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + fr_rapid_label = QtWidgets.QLabel(_('Feedrate Rapids:')) fr_rapid_label.setToolTip( - "Tool speed while drilling\n" - "with rapid move\n" - "(in units per minute)." + _("Tool speed while drilling\n" + "(in units per minute).\n" + "This is for the rapid move G00.\n" + "It is useful only for Marlin,\n" + "ignore for any other cases.") ) grid1.addWidget(fr_rapid_label, 4, 0) self.feedrate_rapid_entry = LengthEntry() grid1.addWidget(self.feedrate_rapid_entry, 4, 1) # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label = QtWidgets.QLabel(_("Probe Z depth:")) self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." + _("The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units.") ) grid1.addWidget(self.pdepth_label, 5, 0) self.pdepth_entry = FCEntry() grid1.addWidget(self.pdepth_entry, 5, 1) # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label = QtWidgets.QLabel(_("Feedrate Probe:")) self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." + _( "The feedrate used while the probe is probing.") ) grid1.addWidget(self.feedrate_probe_label, 6, 0) self.feedrate_probe_entry = FCEntry() grid1.addWidget(self.feedrate_probe_entry, 6, 1) - fplungelabel = QtWidgets.QLabel('Fast Plunge:') + fplungelabel = QtWidgets.QLabel(_('Fast Plunge:')) fplungelabel.setToolTip( - "By checking this, the vertical move from\n" + _("By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" "meaning the fastest speed available.\n" - "WARNING: the move is done at Toolchange X,Y coords." + "WARNING: the move is done at Toolchange X,Y coords.") ) self.fplunge_cb = FCCheckBox() grid1.addWidget(fplungelabel, 7, 0) grid1.addWidget(self.fplunge_cb, 7, 1) - fretractlabel = QtWidgets.QLabel('Fast Retract:') + fretractlabel = QtWidgets.QLabel(_('Fast Retract:')) fretractlabel.setToolTip( - "Exit hole strategy.\n" + _("Exit hole strategy.\n" " - When uncheked, while exiting the drilled hole the drill bit\n" "will travel slow, with set feedrate (G1), up to zero depth and then\n" "travel as fast as possible (G0) to the Z Move (travel height).\n" " - When checked the travel from Z cut (cut depth) to Z_move\n" - "(travel height) is done as fast as possible (G0) in one move." + "(travel height) is done as fast as possible (G0) in one move.") ) self.fretract_cb = FCCheckBox() grid1.addWidget(fretractlabel, 8, 0) @@ -4055,13 +4104,13 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): super(ExcellonExpPrefGroupUI, self).__init__(self) - self.setTitle(str("Excellon Export")) + self.setTitle(str(_("Excellon Export"))) # Plot options - self.export_options_label = QtWidgets.QLabel("Export Options:") + self.export_options_label = QtWidgets.QLabel(_("Export Options:")) self.export_options_label.setToolTip( - "The parameters set here are used in the file exported\n" - "when using the File -> Export -> Export Excellon menu entry." + _("The parameters set here are used in the file exported\n" + "when using the File -> Export -> Export Excellon menu entry.") ) self.layout.addWidget(self.export_options_label) @@ -4069,25 +4118,26 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI): self.layout.addLayout(form) # Excellon Units - self.excellon_units_label = QtWidgets.QLabel('Units:') + self.excellon_units_label = QtWidgets.QLabel(_('Units:')) self.excellon_units_label.setToolTip( - "The units used in the Excellon file." + _("The units used in the Excellon file.") ) - self.excellon_units_radio = RadioSet([{'label': 'INCH', 'value': 'INCH'}, {'label': 'MM', 'value': 'METRIC'}]) + self.excellon_units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'}, + {'label': _('MM'), 'value': 'METRIC'}]) self.excellon_units_radio.setToolTip( - "The units used in the Excellon file." + _("The units used in the Excellon file.") ) form.addRow(self.excellon_units_label, self.excellon_units_radio) # Excellon non-decimal format - self.digits_label = QtWidgets.QLabel("Int/Decimals:") + self.digits_label = QtWidgets.QLabel(_("Int/Decimals:")) self.digits_label.setToolTip( - "The NC drill files, usually named Excellon files\n" + _("The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" "Here we set the format used when the provided\n" - "coordinates are not using period." + "coordinates are not using period.") ) hlay1 = QtWidgets.QHBoxLayout() @@ -4097,8 +4147,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI): self.format_whole_entry.setAlignment(QtCore.Qt.AlignRight) self.format_whole_entry.setFixedWidth(30) self.format_whole_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the whole part of Excellon coordinates." + _("This numbers signify the number of digits in\n" + "the whole part of Excellon coordinates.") ) hlay1.addWidget(self.format_whole_entry, QtCore.Qt.AlignLeft) @@ -4111,8 +4161,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI): self.format_dec_entry.setAlignment(QtCore.Qt.AlignRight) self.format_dec_entry.setFixedWidth(30) self.format_dec_entry.setToolTip( - "This numbers signify the number of digits in\n" - "the decimal part of Excellon coordinates." + _("This numbers signify the number of digits in\n" + "the decimal part of Excellon coordinates.") ) hlay1.addWidget(self.format_dec_entry, QtCore.Qt.AlignLeft) hlay1.addStretch() @@ -4120,46 +4170,47 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI): form.addRow(self.digits_label, hlay1) # Select the Excellon Format - self.format_label = QtWidgets.QLabel("Format:") + self.format_label = QtWidgets.QLabel(_("Format:")) self.format_label.setToolTip( - "Select the kind of coordinates format used.\n" + _("Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" "When there is no decimal point, it is required to specify\n" "the number of digits for integer part and the number of decimals.\n" "Also it will have to be specified if LZ = leading zeros are kept\n" - "or TZ = trailing zeros are kept." + "or TZ = trailing zeros are kept.") ) - self.format_radio = RadioSet([{'label': 'Decimal', 'value': 'dec'}, {'label': 'No-Decimal', 'value': 'ndec'}]) + self.format_radio = RadioSet([{'label': _('Decimal'), 'value': 'dec'}, + {'label': _('No-Decimal'), 'value': 'ndec'}]) self.format_radio.setToolTip( - "Select the kind of coordinates format used.\n" + _("Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" "When there is no decimal point, it is required to specify\n" "the number of digits for integer part and the number of decimals.\n" "Also it will have to be specified if LZ = leading zeros are kept\n" - "or TZ = trailing zeros are kept." + "or TZ = trailing zeros are kept.") ) form.addRow(self.format_label, self.format_radio) # Excellon Zeros - self.zeros_label = QtWidgets.QLabel('Zeros:') + self.zeros_label = QtWidgets.QLabel(_('Zeros:')) self.zeros_label.setAlignment(QtCore.Qt.AlignLeft) self.zeros_label.setToolTip( - "This sets the type of Excellon zeros.\n" + _("This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" "Trailing Zeros are removed.\n" "If TZ is checked then Trailing Zeros are kept\n" - "and Leading Zeros are removed." + "and Leading Zeros are removed.") ) - self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'LZ'}, - {'label': 'TZ', 'value': 'TZ'}]) + self.zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'LZ'}, + {'label': _('TZ'), 'value': 'TZ'}]) self.zeros_radio.setToolTip( - "This sets the default type of Excellon zeros.\n" + _("This sets the default type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" "Trailing Zeros are removed.\n" "If TZ is checked then Trailing Zeros are kept\n" - "and Leading Zeros are removed." + "and Leading Zeros are removed.") ) form.addRow(self.zeros_label, self.zeros_radio) @@ -4181,43 +4232,43 @@ class GeometryGenPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Geometry General Preferences", parent=parent) super(GeometryGenPrefGroupUI, self).__init__(self) - self.setTitle(str("Geometry General")) + self.setTitle(str(_("Geometry General"))) ## Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.layout.addWidget(self.plot_options_label) # Plot CB - self.plot_cb = FCCheckBox(label='Plot') + self.plot_cb = FCCheckBox(label=_('Plot')) self.plot_cb.setToolTip( - "Plot (show) this object." + _("Plot (show) this object.") ) self.layout.addWidget(self.plot_cb) grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) # Number of circle steps for circular aperture linear approximation - self.circle_steps_label = QtWidgets.QLabel("Circle Steps:") + self.circle_steps_label = QtWidgets.QLabel(_("Circle Steps:")) self.circle_steps_label.setToolTip( - "The number of circle steps for Geometry \n" - "circle and arc shapes linear approximation." + _("The number of circle steps for Geometry \n" + "circle and arc shapes linear approximation.") ) grid0.addWidget(self.circle_steps_label, 1, 0) self.circle_steps_entry = IntEntry() grid0.addWidget(self.circle_steps_entry, 1, 1) # Tools - self.tools_label = QtWidgets.QLabel("Tools") + self.tools_label = QtWidgets.QLabel(_("Tools")) self.layout.addWidget(self.tools_label) grid0_b = QtWidgets.QGridLayout() self.layout.addLayout(grid0_b) # Tooldia - tdlabel = QtWidgets.QLabel('Tool dia: ') + tdlabel = QtWidgets.QLabel(_('Tool dia: ')) tdlabel.setToolTip( - "The diameter of the cutting\n" - "tool.." + _("The diameter of the cutting\n" + "tool..") ) grid0_b.addWidget(tdlabel, 0, 0) self.cnctooldia_entry = LengthEntry() @@ -4231,16 +4282,16 @@ class GeometryOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Geometry Options Preferences", parent=parent) super(GeometryOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Geometry Options")) + self.setTitle(str(_("Geometry Options"))) # ------------------------------ ## Create CNC Job # ------------------------------ - self.cncjob_label = QtWidgets.QLabel('Create CNC Job:') + self.cncjob_label = QtWidgets.QLabel(_('Create CNC Job:')) self.cncjob_label.setToolTip( - "Create a CNC Job object\n" + _("Create a CNC Job object\n" "tracing the contours of this\n" - "Geometry object." + "Geometry object.") ) self.layout.addWidget(self.cncjob_label) @@ -4248,30 +4299,30 @@ class GeometryOptPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid1) # Cut Z - cutzlabel = QtWidgets.QLabel('Cut Z:') + cutzlabel = QtWidgets.QLabel(_('Cut Z:')) cutzlabel.setToolTip( - "Cutting depth (negative)\n" - "below the copper surface." + _("Cutting depth (negative)\n" + "below the copper surface.") ) grid1.addWidget(cutzlabel, 0, 0) self.cutz_entry = LengthEntry() grid1.addWidget(self.cutz_entry, 0, 1) # Multidepth CheckBox - self.multidepth_cb = FCCheckBox(label='Multidepth') + self.multidepth_cb = FCCheckBox(label=_('Multidepth')) self.multidepth_cb.setToolTip( - "Multidepth usage: True or False." + _("Multidepth usage: True or False.") ) grid1.addWidget(self.multidepth_cb, 1, 0) # Depth/pass - dplabel = QtWidgets.QLabel('Depth/Pass:') + dplabel = QtWidgets.QLabel(_('Depth/Pass:')) dplabel.setToolTip( - "The depth to cut on each pass,\n" + _("The depth to cut on each pass,\n" "when multidepth is enabled.\n" "It has positive value although\n" "it is a fraction from the depth\n" - "which has negative value." + "which has negative value.") ) grid1.addWidget(dplabel, 2, 0) @@ -4281,74 +4332,74 @@ class GeometryOptPrefGroupUI(OptionsGroupUI): self.ois_multidepth = OptionalInputSection(self.multidepth_cb, [self.depthperpass_entry]) # Travel Z - travelzlabel = QtWidgets.QLabel('Travel Z:') + travelzlabel = QtWidgets.QLabel(_('Travel Z:')) travelzlabel.setToolTip( - "Height of the tool when\n" - "moving without cutting." + _("Height of the tool when\n" + "moving without cutting.") ) grid1.addWidget(travelzlabel, 3, 0) self.travelz_entry = LengthEntry() grid1.addWidget(self.travelz_entry, 3, 1) # Tool change: - toolchlabel = QtWidgets.QLabel("Tool change:") + toolchlabel = QtWidgets.QLabel(_("Tool change:")) toolchlabel.setToolTip( - "Include tool-change sequence\n" - "in G-Code (Pause for tool change)." + _("Include tool-change sequence\n" + "in G-Code (Pause for tool change).") ) self.toolchange_cb = FCCheckBox() grid1.addWidget(toolchlabel, 4, 0) grid1.addWidget(self.toolchange_cb, 4, 1) # Toolchange Z - toolchangezlabel = QtWidgets.QLabel('Toolchange Z:') + toolchangezlabel = QtWidgets.QLabel(_('Toolchange Z:')) toolchangezlabel.setToolTip( - "Toolchange Z position." + _("Toolchange Z position.") ) grid1.addWidget(toolchangezlabel, 5, 0) self.toolchangez_entry = LengthEntry() grid1.addWidget(self.toolchangez_entry, 5, 1) # Feedrate X-Y - frlabel = QtWidgets.QLabel('Feed Rate X-Y:') + frlabel = QtWidgets.QLabel(_('Feed Rate X-Y:')) frlabel.setToolTip( - "Cutting speed in the XY\n" - "plane in units per minute" + _("Cutting speed in the XY\n" + "plane in units per minute") ) grid1.addWidget(frlabel, 6, 0) self.cncfeedrate_entry = LengthEntry() grid1.addWidget(self.cncfeedrate_entry, 6, 1) # Feedrate Z (Plunge) - frz_label = QtWidgets.QLabel('Feed Rate Z:') + frz_label = QtWidgets.QLabel(_('Feed Rate Z:')) frz_label.setToolTip( - "Cutting speed in the XY\n" + _("Cutting speed in the XY\n" "plane in units per minute.\n" - "It is called also Plunge." + "It is called also Plunge.") ) grid1.addWidget(frz_label, 7, 0) self.cncplunge_entry = LengthEntry() grid1.addWidget(self.cncplunge_entry, 7, 1) # Spindle Speed - spdlabel = QtWidgets.QLabel('Spindle speed:') + spdlabel = QtWidgets.QLabel(_('Spindle speed:')) spdlabel.setToolTip( - "Speed of the spindle\n" - "in RPM (optional)" + _("Speed of the spindle\n" + "in RPM (optional)") ) grid1.addWidget(spdlabel, 8, 0) self.cncspindlespeed_entry = IntEntry(allow_empty=True) grid1.addWidget(self.cncspindlespeed_entry, 8, 1) # Dwell - self.dwell_cb = FCCheckBox(label='Dwell:') + self.dwell_cb = FCCheckBox(label=_('Dwell:')) self.dwell_cb.setToolTip( - "Pause to allow the spindle to reach its\n" - "speed before cutting." + _("Pause to allow the spindle to reach its\n" + "speed before cutting.") ) - dwelltime = QtWidgets.QLabel('Duration:') + dwelltime = QtWidgets.QLabel(_('Duration:')) dwelltime.setToolTip( - "Number of milliseconds for spindle to dwell." + _("Number of milliseconds for spindle to dwell.") ) self.dwelltime_entry = FCEntry() grid1.addWidget(self.dwell_cb, 9, 0) @@ -4358,10 +4409,10 @@ class GeometryOptPrefGroupUI(OptionsGroupUI): self.ois_dwell = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry]) # postprocessor selection - pp_label = QtWidgets.QLabel("Postprocessor:") + pp_label = QtWidgets.QLabel(_("Postprocessor:")) pp_label.setToolTip( - "The postprocessor file that dictates\n" - "Machine Code output." + _("The postprocessor file that dictates\n" + "Machine Code output.") ) grid1.addWidget(pp_label, 11, 0) self.pp_geometry_name_cb = FCComboBox() @@ -4376,15 +4427,15 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Geometry Advanced Options Preferences", parent=parent) super(GeometryAdvOptPrefGroupUI, self).__init__(self) - self.setTitle(str("Geometry Adv. Options")) + self.setTitle(str(_("Geometry Adv. Options"))) # ------------------------------ ## Advanced Options # ------------------------------ - self.cncjob_label = QtWidgets.QLabel('Advanced Options:') + self.cncjob_label = QtWidgets.QLabel(_('Advanced Options:')) self.cncjob_label.setToolTip( - "Parameters to create a CNC Job object\n" - "tracing the contours of a Geometry object." + _("Parameters to create a CNC Job object\n" + "tracing the contours of a Geometry object.") ) self.layout.addWidget(self.cncjob_label) @@ -4392,102 +4443,106 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid1) # Toolchange X,Y - toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') + toolchange_xy_label = QtWidgets.QLabel(_('Toolchange X,Y:')) toolchange_xy_label.setToolTip( - "Toolchange X,Y position." + _("Toolchange X,Y position.") ) grid1.addWidget(toolchange_xy_label, 1, 0) self.toolchangexy_entry = FCEntry() grid1.addWidget(self.toolchangexy_entry, 1, 1) # Start move Z - startzlabel = QtWidgets.QLabel('Start move Z:') + startzlabel = QtWidgets.QLabel(_('Start move Z:')) startzlabel.setToolTip( - "Height of the tool just after starting the work.\n" - "Delete the value if you don't need this feature." + _("Height of the tool just after starting the work.\n" + "Delete the value if you don't need this feature.") ) grid1.addWidget(startzlabel, 2, 0) self.gstartz_entry = FloatEntry() grid1.addWidget(self.gstartz_entry, 2, 1) # End move Z - endzlabel = QtWidgets.QLabel('End move Z:') + endzlabel = QtWidgets.QLabel(_('End move Z:')) endzlabel.setToolTip( - "Height of the tool after\n" - "the last move at the end of the job." + _("Height of the tool after\n" + "the last move at the end of the job.") ) grid1.addWidget(endzlabel, 3, 0) self.gendz_entry = LengthEntry() grid1.addWidget(self.gendz_entry, 3, 1) # Feedrate rapids - fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + fr_rapid_label = QtWidgets.QLabel(_('Feedrate Rapids:')) fr_rapid_label.setToolTip( - "Cutting speed in the XY\n" - "plane in units per minute" + _("Cutting speed in the XY plane\n" + "(in units per minute).\n" + "This is for the rapid move G00.\n" + "It is useful only for Marlin,\n" + "ignore for any other cases." + ) ) grid1.addWidget(fr_rapid_label, 4, 0) self.cncfeedrate_rapid_entry = LengthEntry() grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1) # End move extra cut - self.extracut_cb = FCCheckBox(label='Re-cut 1st pt.') + self.extracut_cb = FCCheckBox(label=_('Re-cut 1st pt.')) self.extracut_cb.setToolTip( - "In order to remove possible\n" + _("In order to remove possible\n" "copper leftovers where first cut\n" "meet with last cut, we generate an\n" - "extended cut over the first cut section." + "extended cut over the first cut section.") ) grid1.addWidget(self.extracut_cb, 5, 0) # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label = QtWidgets.QLabel(_("Probe Z depth:")) self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." + _("The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units.") ) grid1.addWidget(self.pdepth_label, 6, 0) self.pdepth_entry = FCEntry() grid1.addWidget(self.pdepth_entry, 6, 1) # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label = QtWidgets.QLabel(_("Feedrate Probe:")) self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." + _("The feedrate used while the probe is probing.") ) grid1.addWidget(self.feedrate_probe_label, 7, 0) self.feedrate_probe_entry = FCEntry() grid1.addWidget(self.feedrate_probe_entry, 7, 1) # Fast Move from Z Toolchange - fplungelabel = QtWidgets.QLabel('Fast Plunge:') + fplungelabel = QtWidgets.QLabel(_('Fast Plunge:')) fplungelabel.setToolTip( - "By checking this, the vertical move from\n" + _("By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" "meaning the fastest speed available.\n" - "WARNING: the move is done at Toolchange X,Y coords." + "WARNING: the move is done at Toolchange X,Y coords.") ) self.fplunge_cb = FCCheckBox() grid1.addWidget(fplungelabel, 8, 0) grid1.addWidget(self.fplunge_cb, 8, 1) # Size of trace segment on X axis - segx_label = QtWidgets.QLabel("Seg. X size:") + segx_label = QtWidgets.QLabel(_("Seg. X size:")) segx_label.setToolTip( - "The size of the trace segment on the X axis.\n" + _("The size of the trace segment on the X axis.\n" "Useful for auto-leveling.\n" - "A value of 0 means no segmentation on the X axis." + "A value of 0 means no segmentation on the X axis.") ) grid1.addWidget(segx_label, 9, 0) self.segx_entry = FCEntry() grid1.addWidget(self.segx_entry, 9, 1) # Size of trace segment on Y axis - segy_label = QtWidgets.QLabel("Seg. Y size:") + segy_label = QtWidgets.QLabel(_("Seg. Y size:")) segy_label.setToolTip( - "The size of the trace segment on the Y axis.\n" + _("The size of the trace segment on the Y axis.\n" "Useful for auto-leveling.\n" - "A value of 0 means no segmentation on the Y axis." + "A value of 0 means no segmentation on the Y axis.") ) grid1.addWidget(segy_label, 10, 0) self.segy_entry = FCEntry() @@ -4501,10 +4556,10 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "CNC Job General Preferences", parent=None) super(CNCJobGenPrefGroupUI, self).__init__(self) - self.setTitle(str("CNC Job General")) + self.setTitle(str(_("CNC Job General"))) ## Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.layout.addWidget(self.plot_options_label) grid0 = QtWidgets.QGridLayout() @@ -4514,25 +4569,25 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI): # Plot CB # self.plot_cb = QtWidgets.QCheckBox('Plot') - self.plot_cb = FCCheckBox('Plot Object') + self.plot_cb = FCCheckBox(_('Plot Object')) self.plot_cb.setToolTip( "Plot (show) this object." ) grid0.addWidget(self.plot_cb, 0, 0) # Plot Kind - self.cncplot_method_label = QtWidgets.QLabel("Plot kind:") + self.cncplot_method_label = QtWidgets.QLabel(_("Plot kind:")) self.cncplot_method_label.setToolTip( - "This selects the kind of geometries on the canvas to plot.\n" + _("This selects the kind of geometries on the canvas to plot.\n" "Those can be either of type 'Travel' which means the moves\n" "above the work piece or it can be of type 'Cut',\n" - "which means the moves that cut into the material." + "which means the moves that cut into the material.") ) self.cncplot_method_radio = RadioSet([ - {"label": "All", "value": "all"}, - {"label": "Travel", "value": "travel"}, - {"label": "Cut", "value": "cut"} + {"label": _("All"), "value": "all"}, + {"label": _("Travel"), "value": "travel"}, + {"label": _("Cut"), "value": "cut"} ], stretch=False) grid0.addWidget(self.cncplot_method_label, 1, 0) @@ -4540,40 +4595,40 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI): grid0.addWidget(QtWidgets.QLabel(''), 1, 2) # Number of circle steps for circular aperture linear approximation - self.steps_per_circle_label = QtWidgets.QLabel("Circle Steps:") + self.steps_per_circle_label = QtWidgets.QLabel(_("Circle Steps:")) self.steps_per_circle_label.setToolTip( - "The number of circle steps for GCode \n" - "circle and arc shapes linear approximation." + _("The number of circle steps for GCode \n" + "circle and arc shapes linear approximation.") ) grid0.addWidget(self.steps_per_circle_label, 2, 0) self.steps_per_circle_entry = IntEntry() grid0.addWidget(self.steps_per_circle_entry, 2, 1) # Tool dia for plot - tdlabel = QtWidgets.QLabel('Tool dia:') + tdlabel = QtWidgets.QLabel(_('Tool dia:')) tdlabel.setToolTip( - "Diameter of the tool to be\n" - "rendered in the plot." + _("Diameter of the tool to be\n" + "rendered in the plot.") ) grid0.addWidget(tdlabel, 3, 0) self.tooldia_entry = LengthEntry() grid0.addWidget(self.tooldia_entry, 3, 1) # Number of decimals to use in GCODE coordinates - cdeclabel = QtWidgets.QLabel('Coords dec.:') + cdeclabel = QtWidgets.QLabel(_('Coords dec.:')) cdeclabel.setToolTip( - "The number of decimals to be used for \n" - "the X, Y, Z coordinates in CNC code (GCODE, etc.)" + _("The number of decimals to be used for \n" + "the X, Y, Z coordinates in CNC code (GCODE, etc.)") ) grid0.addWidget(cdeclabel, 4, 0) self.coords_dec_entry = IntEntry() grid0.addWidget(self.coords_dec_entry, 4, 1) # Number of decimals to use in GCODE feedrate - frdeclabel = QtWidgets.QLabel('Feedrate dec.:') + frdeclabel = QtWidgets.QLabel(_('Feedrate dec.:')) frdeclabel.setToolTip( - "The number of decimals to be used for \n" - "the Feedrate parameter in CNC code (GCODE, etc.)" + _("The number of decimals to be used for \n" + "the Feedrate parameter in CNC code (GCODE, etc.)") ) grid0.addWidget(frdeclabel, 5, 0) self.fr_dec_entry = IntEntry() @@ -4587,21 +4642,21 @@ class CNCJobOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "CNC Job Options Preferences", parent=None) super(CNCJobOptPrefGroupUI, self).__init__(self) - self.setTitle(str("CNC Job Options")) + self.setTitle(str(_("CNC Job Options"))) ## Export G-Code - self.export_gcode_label = QtWidgets.QLabel("Export G-Code:") + self.export_gcode_label = QtWidgets.QLabel(_("Export G-Code:")) self.export_gcode_label.setToolTip( - "Export and save G-Code to\n" - "make this object to a file." + _("Export and save G-Code to\n" + "make this object to a file.") ) self.layout.addWidget(self.export_gcode_label) # Prepend to G-Code - prependlabel = QtWidgets.QLabel('Prepend to G-Code:') + prependlabel = QtWidgets.QLabel(_('Prepend to G-Code:')) prependlabel.setToolTip( - "Type here any G-Code commands you would\n" - "like to add at the beginning of the G-Code file." + _("Type here any G-Code commands you would\n" + "like to add at the beginning of the G-Code file.") ) self.layout.addWidget(prependlabel) @@ -4609,11 +4664,11 @@ class CNCJobOptPrefGroupUI(OptionsGroupUI): self.layout.addWidget(self.prepend_text) # Append text to G-Code - appendlabel = QtWidgets.QLabel('Append to G-Code:') + appendlabel = QtWidgets.QLabel(_('Append to G-Code:')) appendlabel.setToolTip( - "Type here any G-Code commands you would\n" + _("Type here any G-Code commands you would\n" "like to append to the generated file.\n" - "I.e.: M2 (End of program)" + "I.e.: M2 (End of program)") ) self.layout.addWidget(appendlabel) @@ -4628,23 +4683,23 @@ class CNCJobAdvOptPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "CNC Job Advanced Options Preferences", parent=None) super(CNCJobAdvOptPrefGroupUI, self).__init__(self) - self.setTitle(str("CNC Job Adv. Options")) + self.setTitle(str(_("CNC Job Adv. Options"))) ## Export G-Code - self.export_gcode_label = QtWidgets.QLabel("Export G-Code:") + self.export_gcode_label = QtWidgets.QLabel(_("Export G-Code:")) self.export_gcode_label.setToolTip( - "Export and save G-Code to\n" - "make this object to a file." + _("Export and save G-Code to\n" + "make this object to a file.") ) self.layout.addWidget(self.export_gcode_label) # Prepend to G-Code - toolchangelabel = QtWidgets.QLabel('Toolchange G-Code:') + toolchangelabel = QtWidgets.QLabel(_('Toolchange G-Code:')) toolchangelabel.setToolTip( - "Type here any G-Code commands you would\n" + _("Type here any G-Code commands you would\n" "like to be executed when Toolchange event is encountered.\n" "This will constitute a Custom Toolchange GCode,\n" - "or a Toolchange Macro." + "or a Toolchange Macro.") ) self.layout.addWidget(toolchangelabel) @@ -4655,10 +4710,10 @@ class CNCJobAdvOptPrefGroupUI(OptionsGroupUI): self.layout.addLayout(hlay) # Toolchange Replacement GCode - self.toolchange_cb = FCCheckBox(label='Use Toolchange Macro') + self.toolchange_cb = FCCheckBox(label=_('Use Toolchange Macro')) self.toolchange_cb.setToolTip( - "Check this box if you want to use\n" - "a Custom Toolchange GCode (macro)." + _("Check this box if you want to use\n" + "a Custom Toolchange GCode (macro).") ) hlay.addWidget(self.toolchange_cb) hlay.addStretch() @@ -4669,28 +4724,28 @@ class CNCJobAdvOptPrefGroupUI(OptionsGroupUI): # Variable list self.tc_variable_combo = FCComboBox() self.tc_variable_combo.setToolTip( - "A list of the FlatCAM variables that can be used\n" + _("A list of the FlatCAM variables that can be used\n" "in the Toolchange event.\n" - "They have to be surrounded by the '%' symbol" + "They have to be surrounded by the '%' symbol") ) hlay1.addWidget(self.tc_variable_combo) # Populate the Combo Box - variables = ['Parameters', 'tool', 'tooldia', 't_drills', 'x_toolchange', 'y_toolchange', 'z_toolchange', + variables = [_('Parameters'), 'tool', 'tooldia', 't_drills', 'x_toolchange', 'y_toolchange', 'z_toolchange', 'z_cut', 'z_move', 'z_depthpercut', 'spindlespeed', 'dwelltime'] self.tc_variable_combo.addItems(variables) - self.tc_variable_combo.setItemData(0, "FlatCAM CNC parameters", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(1, "tool = tool number", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(2, "tooldia = tool diameter", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(3, "t_drills = for Excellon, total number of drills", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(4, "x_toolchange = X coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(5, "y_toolchange = Y coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(6, "z_toolchange = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(7, "z_cut = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(8, "z_move = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(9, "z_depthpercut = the step value for multidepth cut", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(10, "spindlesspeed = the value for the spindle speed", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(11, "dwelltime = time to dwell to allow the spindle to reach it's set RPM", + self.tc_variable_combo.setItemData(0, _("FlatCAM CNC parameters"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(1, _("tool = tool number"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(2, _("tooldia = tool diameter"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(3, _("t_drills = for Excellon, total number of drills"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(4, _("x_toolchange = X coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(5, _("y_toolchange = Y coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(6, _("z_toolchange = Z coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(7, _("z_cut = Z depth for the cut"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(8, _("z_move = Z height for travel"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(9, _("z_depthpercut = the step value for multidepth cut"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(10, _("spindlesspeed = the value for the spindle speed"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(11, _("dwelltime = time to dwell to allow the spindle to reach it's set RPM"), Qt.ToolTipRole) hlay1.addStretch() @@ -4711,30 +4766,30 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "NCC Tool Options", parent=parent) super(ToolsNCCPrefGroupUI, self).__init__(self) - self.setTitle(str("NCC Tool Options")) + self.setTitle(str(_("NCC Tool Options"))) ## Clear non-copper regions - self.clearcopper_label = QtWidgets.QLabel("Parameters:") + self.clearcopper_label = QtWidgets.QLabel(_("Parameters:")) self.clearcopper_label.setToolTip( - "Create a Geometry object with\n" - "toolpaths to cut all non-copper regions." + _("Create a Geometry object with\n" + "toolpaths to cut all non-copper regions.") ) self.layout.addWidget(self.clearcopper_label) grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) - ncctdlabel = QtWidgets.QLabel('Tools dia:') + ncctdlabel = QtWidgets.QLabel(_('Tools dia:')) ncctdlabel.setToolTip( - "Diameters of the cutting tools, separated by ','" + _("Diameters of the cutting tools, separated by ','") ) grid0.addWidget(ncctdlabel, 0, 0) self.ncc_tool_dia_entry = FCEntry() grid0.addWidget(self.ncc_tool_dia_entry, 0, 1) - nccoverlabel = QtWidgets.QLabel('Overlap:') + nccoverlabel = QtWidgets.QLabel(_('Overlap:')) nccoverlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _( "How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" "A value here of 0.25 means 25% from the tool diameter found above.\n\n" "Adjust the value starting with lower values\n" @@ -4742,63 +4797,63 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "not cleared.\n" "Lower values = faster processing, faster execution on PCB.\n" "Higher values = slow processing and slow execution on CNC\n" - "due of too many paths." + "due of too many paths.") ) grid0.addWidget(nccoverlabel, 1, 0) self.ncc_overlap_entry = FloatEntry() grid0.addWidget(self.ncc_overlap_entry, 1, 1) - nccmarginlabel = QtWidgets.QLabel('Margin:') + nccmarginlabel = QtWidgets.QLabel(_('Margin:')) nccmarginlabel.setToolTip( - "Bounding box margin." + _("Bounding box margin.") ) grid0.addWidget(nccmarginlabel, 2, 0) self.ncc_margin_entry = FloatEntry() grid0.addWidget(self.ncc_margin_entry, 2, 1) # Method - methodlabel = QtWidgets.QLabel('Method:') + methodlabel = QtWidgets.QLabel(_('Method:')) methodlabel.setToolTip( - "Algorithm for non-copper clearing:
" + _("Algorithm for non-copper clearing:
" "Standard: Fixed step inwards.
" "Seed-based: Outwards from seed.
" - "Line-based: Parallel lines." + "Line-based: Parallel lines.") ) grid0.addWidget(methodlabel, 3, 0) self.ncc_method_radio = RadioSet([ - {"label": "Standard", "value": "standard"}, - {"label": "Seed-based", "value": "seed"}, - {"label": "Straight lines", "value": "lines"} + {"label": _("Standard"), "value": "standard"}, + {"label": _("Seed-based"), "value": "seed"}, + {"label": _("Straight lines"), "value": "lines"} ], orientation='vertical', stretch=False) grid0.addWidget(self.ncc_method_radio, 3, 1) # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel = QtWidgets.QLabel(_("Connect:")) pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." + _("Draw lines between resulting\n" + "segments to minimize tool lifts.") ) grid0.addWidget(pathconnectlabel, 4, 0) self.ncc_connect_cb = FCCheckBox() grid0.addWidget(self.ncc_connect_cb, 4, 1) - contourlabel = QtWidgets.QLabel("Contour:") + contourlabel = QtWidgets.QLabel(_("Contour:")) contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." + _( "Cut around the perimeter of the polygon\n" + "to trim rough edges.") ) grid0.addWidget(contourlabel, 5, 0) self.ncc_contour_cb = FCCheckBox() grid0.addWidget(self.ncc_contour_cb, 5, 1) - restlabel = QtWidgets.QLabel("Rest M.:") + restlabel = QtWidgets.QLabel(_("Rest M.:")) restlabel.setToolTip( - "If checked, use 'rest machining'.\n" + _("If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" "using the biggest tool and continue with the next tools,\n" "from bigger to smaller, to clear areas of copper that\n" "could not be cleared by previous tool.\n" - "If not checked, use the standard algorithm." + "If not checked, use the standard algorithm.") ) grid0.addWidget(restlabel, 6, 0) self.ncc_rest_cb = FCCheckBox() @@ -4812,50 +4867,50 @@ class ToolsCutoutPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Cutout Tool Options", parent=parent) super(ToolsCutoutPrefGroupUI, self).__init__(self) - self.setTitle(str("Cutout Tool Options")) + self.setTitle(str(_("Cutout Tool Options"))) ## Board cuttout - self.board_cutout_label = QtWidgets.QLabel("Parameters:") + self.board_cutout_label = QtWidgets.QLabel(_("Parameters:")) self.board_cutout_label.setToolTip( - "Create toolpaths to cut around\n" + _("Create toolpaths to cut around\n" "the PCB and separate it from\n" - "the original board." + "the original board.") ) self.layout.addWidget(self.board_cutout_label) grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) - tdclabel = QtWidgets.QLabel('Tool dia:') + tdclabel = QtWidgets.QLabel(_('Tool dia:')) tdclabel.setToolTip( - "Diameter of the cutting tool." + _( "Diameter of the cutting tool.") ) grid0.addWidget(tdclabel, 0, 0) self.cutout_tooldia_entry = LengthEntry() grid0.addWidget(self.cutout_tooldia_entry, 0, 1) - marginlabel = QtWidgets.QLabel('Margin:') + marginlabel = QtWidgets.QLabel(_('Margin:')) marginlabel.setToolTip( - "Distance from objects at which\n" - "to draw the cutout." + _("Distance from objects at which\n" + "to draw the cutout.") ) grid0.addWidget(marginlabel, 1, 0) self.cutout_margin_entry = LengthEntry() grid0.addWidget(self.cutout_margin_entry, 1, 1) - gaplabel = QtWidgets.QLabel('Gap size:') + gaplabel = QtWidgets.QLabel(_('Gap size:')) gaplabel.setToolTip( - "Size of the gaps in the toolpath\n" + _("Size of the gaps in the toolpath\n" "that will remain to hold the\n" - "board in place." + "board in place.") ) grid0.addWidget(gaplabel, 2, 0) self.cutout_gap_entry = LengthEntry() grid0.addWidget(self.cutout_gap_entry, 2, 1) - gaps_label = QtWidgets.QLabel('Gaps:') + gaps_label = QtWidgets.QLabel(_('Gaps:')) gaps_label.setToolTip( - "Number of bridge gaps used for the cutout.\n" + _("Number of bridge gaps used for the cutout.\n" "There can be maximum 8 bridges/gaps.\n" "The choices are:\n" "- lr - left + right\n" @@ -4863,7 +4918,7 @@ class ToolsCutoutPrefGroupUI(OptionsGroupUI): "- 4 - left + right +top + bottom\n" "- 2lr - 2*left + 2*right\n" "- 2tb - 2*top + 2*bottom\n" - "- 8 - 2*left + 2*right +2*top + 2*bottom" + "- 8 - 2*left + 2*right +2*top + 2*bottom") ) grid0.addWidget(gaps_label, 3, 0) self.gaps_combo = FCComboBox() @@ -4882,13 +4937,13 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "2sided Tool Options", parent=parent) super(Tools2sidedPrefGroupUI, self).__init__(self) - self.setTitle(str("2Sided Tool Options")) + self.setTitle(str(_("2Sided Tool Options"))) ## Board cuttout - self.dblsided_label = QtWidgets.QLabel("Parameters:") + self.dblsided_label = QtWidgets.QLabel(_("Parameters:")) self.dblsided_label.setToolTip( - "A tool to help in creating a double sided\n" - "PCB using alignment holes." + _("A tool to help in creating a double sided\n" + "PCB using alignment holes.") ) self.layout.addWidget(self.dblsided_label) @@ -4897,20 +4952,20 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI): ## Drill diameter for alignment holes self.drill_dia_entry = LengthEntry() - self.dd_label = QtWidgets.QLabel("Drill diam.:") + self.dd_label = QtWidgets.QLabel(_("Drill diam.:")) self.dd_label.setToolTip( - "Diameter of the drill for the " - "alignment holes." + _("Diameter of the drill for the " + "alignment holes.") ) grid0.addWidget(self.dd_label, 0, 0) grid0.addWidget(self.drill_dia_entry, 0, 1) ## Axis - self.mirror_axis_radio = RadioSet([{'label': 'X', 'value': 'X'}, - {'label': 'Y', 'value': 'Y'}]) - self.mirax_label = QtWidgets.QLabel("Mirror Axis:") + self.mirror_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'}, + {'label': _('Y'), 'value': 'Y'}]) + self.mirax_label = QtWidgets.QLabel(_("Mirror Axis:")) self.mirax_label.setToolTip( - "Mirror vertically (X) or horizontally (Y)." + _("Mirror vertically (X) or horizontally (Y).") ) # grid_lay.addRow("Mirror Axis:", self.mirror_axis) self.empty_lb1 = QtWidgets.QLabel("") @@ -4919,13 +4974,13 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.mirror_axis_radio, 2, 1) ## Axis Location - self.axis_location_radio = RadioSet([{'label': 'Point', 'value': 'point'}, - {'label': 'Box', 'value': 'box'}]) - self.axloc_label = QtWidgets.QLabel("Axis Ref:") + self.axis_location_radio = RadioSet([{'label': _('Point'), 'value': 'point'}, + {'label': _('Box'), 'value': 'box'}]) + self.axloc_label = QtWidgets.QLabel(_("Axis Ref:")) self.axloc_label.setToolTip( - "The axis should pass through a point or cut\n " + _("The axis should pass through a point or cut\n " "a specified box (in a Geometry object) in \n" - "the middle." + "the middle.") ) # grid_lay.addRow("Axis Location:", self.axis_location) grid0.addWidget(self.axloc_label, 3, 0) @@ -4939,17 +4994,17 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Paint Area Tool Options", parent=parent) super(ToolsPaintPrefGroupUI, self).__init__(self) - self.setTitle(str("Paint Tool Options")) + self.setTitle(str(_("Paint Tool Options"))) # ------------------------------ ## Paint area # ------------------------------ - self.paint_label = QtWidgets.QLabel('Parameters:') + self.paint_label = QtWidgets.QLabel(_('Parameters:')) self.paint_label.setToolTip( - "Creates tool paths to cover the\n" + _("Creates tool paths to cover the\n" "whole area of a polygon (remove\n" "all copper). You will be asked\n" - "to click on the desired polygon." + "to click on the desired polygon.") ) self.layout.addWidget(self.paint_label) @@ -4957,10 +5012,10 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid0) # Tool dia - ptdlabel = QtWidgets.QLabel('Tool dia:') + ptdlabel = QtWidgets.QLabel(_('Tool dia:')) ptdlabel.setToolTip( - "Diameter of the tool to\n" - "be used in the operation." + _("Diameter of the tool to\n" + "be used in the operation.") ) grid0.addWidget(ptdlabel, 0, 0) @@ -4968,70 +5023,70 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.painttooldia_entry, 0, 1) # Overlap - ovlabel = QtWidgets.QLabel('Overlap:') + ovlabel = QtWidgets.QLabel(_('Overlap:')) ovlabel.setToolTip( - "How much (fraction) of the tool\n" - "width to overlap each tool pass." + _("How much (fraction) of the tool\n" + "width to overlap each tool pass.") ) grid0.addWidget(ovlabel, 1, 0) self.paintoverlap_entry = LengthEntry() grid0.addWidget(self.paintoverlap_entry, 1, 1) # Margin - marginlabel = QtWidgets.QLabel('Margin:') + marginlabel = QtWidgets.QLabel(_('Margin:')) marginlabel.setToolTip( - "Distance by which to avoid\n" + _("Distance by which to avoid\n" "the edges of the polygon to\n" - "be painted." + "be painted.") ) grid0.addWidget(marginlabel, 2, 0) self.paintmargin_entry = LengthEntry() grid0.addWidget(self.paintmargin_entry, 2, 1) # Method - methodlabel = QtWidgets.QLabel('Method:') + methodlabel = QtWidgets.QLabel(_('Method:')) methodlabel.setToolTip( - "Algorithm to paint the polygon:
" + _("Algorithm to paint the polygon:
" "Standard: Fixed step inwards.
" - "Seed-based: Outwards from seed." + "Seed-based: Outwards from seed.") ) grid0.addWidget(methodlabel, 3, 0) self.paintmethod_combo = RadioSet([ - {"label": "Standard", "value": "standard"}, - {"label": "Seed-based", "value": "seed"}, - {"label": "Straight lines", "value": "lines"} + {"label": _("Standard"), "value": "standard"}, + {"label": _("Seed-based"), "value": "seed"}, + {"label": _("Straight lines"), "value": "lines"} ], orientation='vertical', stretch=False) grid0.addWidget(self.paintmethod_combo, 3, 1) # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel = QtWidgets.QLabel(_("Connect:")) pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." + _("Draw lines between resulting\n" + "segments to minimize tool lifts.") ) grid0.addWidget(pathconnectlabel, 4, 0) self.pathconnect_cb = FCCheckBox() grid0.addWidget(self.pathconnect_cb, 4, 1) # Paint contour - contourlabel = QtWidgets.QLabel("Contour:") + contourlabel = QtWidgets.QLabel(_("Contour:")) contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." + _("Cut around the perimeter of the polygon\n" + "to trim rough edges.") ) grid0.addWidget(contourlabel, 5, 0) self.contour_cb = FCCheckBox() grid0.addWidget(self.contour_cb, 5, 1) # Polygon selection - selectlabel = QtWidgets.QLabel('Selection:') + selectlabel = QtWidgets.QLabel(_('Selection:')) selectlabel.setToolTip( - "How to select the polygons to paint." + _("How to select the polygons to paint.") ) grid0.addWidget(selectlabel, 6, 0) self.selectmethod_combo = RadioSet([ - {"label": "Single", "value": "single"}, - {"label": "All", "value": "all"}, + {"label": _("Single"), "value": "single"}, + {"label": _("All"), "value": "all"}, # {"label": "Rectangle", "value": "rectangle"} ]) grid0.addWidget(self.selectmethod_combo, 6, 1) @@ -5044,54 +5099,55 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Cutout Tool Options", parent=parent) super(ToolsFilmPrefGroupUI, self).__init__(self) - self.setTitle(str("Film Tool Options")) + self.setTitle(str(_("Film Tool Options"))) ## Board cuttout - self.film_label = QtWidgets.QLabel("Parameters:") + self.film_label = QtWidgets.QLabel(_("Parameters:")) self.film_label.setToolTip( - "Create a PCB film from a Gerber or Geometry\n" + _("Create a PCB film from a Gerber or Geometry\n" "FlatCAM object.\n" - "The file is saved in SVG format." + "The file is saved in SVG format.") ) self.layout.addWidget(self.film_label) grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) - self.film_type_radio = RadioSet([{'label': 'Pos', 'value': 'pos'}, {'label': 'Neg', 'value': 'neg'}]) - ftypelbl = QtWidgets.QLabel('Film Type:') + self.film_type_radio = RadioSet([{'label': _('Pos'), 'value': 'pos'}, + {'label': _('Neg'), 'value': 'neg'}]) + ftypelbl = QtWidgets.QLabel(_('Film Type:')) ftypelbl.setToolTip( - "Generate a Positive black film or a Negative film.\n" + _("Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" "with black on a white canvas.\n" "Negative means that it will print the features\n" "with white on a black canvas.\n" - "The Film format is SVG." + "The Film format is SVG.") ) grid0.addWidget(ftypelbl, 0, 0) grid0.addWidget(self.film_type_radio, 0, 1) self.film_boundary_entry = FCEntry() - self.film_boundary_label = QtWidgets.QLabel("Border:") + self.film_boundary_label = QtWidgets.QLabel(_("Border:")) self.film_boundary_label.setToolTip( - "Specify a border around the object.\n" + _("Specify a border around the object.\n" "Only for negative film.\n" "It helps if we use as a Box Object the same \n" "object as in Film Object. It will create a thick\n" "black bar around the actual print allowing for a\n" "better delimitation of the outline features which are of\n" "white color like the rest and which may confound with the\n" - "surroundings if not for this border." + "surroundings if not for this border.") ) grid0.addWidget(self.film_boundary_label, 1, 0) grid0.addWidget(self.film_boundary_entry, 1, 1) self.film_scale_entry = FCEntry() - self.film_scale_label = QtWidgets.QLabel("Scale Stroke:") + self.film_scale_label = QtWidgets.QLabel(_("Scale Stroke:")) self.film_scale_label.setToolTip( - "Scale the line stroke thickness of each feature in the SVG file.\n" + _("Scale the line stroke thickness of each feature in the SVG file.\n" "It means that the line that envelope each SVG feature will be thicker or thinner,\n" - "therefore the fine features may be more affected by this parameter." + "therefore the fine features may be more affected by this parameter.") ) grid0.addWidget(self.film_scale_label, 2, 0) grid0.addWidget(self.film_scale_entry, 2, 1) @@ -5104,14 +5160,14 @@ class ToolsPanelizePrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Cutout Tool Options", parent=parent) super(ToolsPanelizePrefGroupUI, self).__init__(self) - self.setTitle(str("Panelize Tool Options")) + self.setTitle(str(_("Panelize Tool Options"))) ## Board cuttout - self.panelize_label = QtWidgets.QLabel("Parameters:") + self.panelize_label = QtWidgets.QLabel(_("Parameters:")) self.panelize_label.setToolTip( - "Create an object that contains an array of (x, y) elements,\n" + _("Create an object that contains an array of (x, y) elements,\n" "each element is a copy of the source object spaced\n" - "at a X distance, Y distance of each other." + "at a X distance, Y distance of each other.") ) self.layout.addWidget(self.panelize_label) @@ -5120,80 +5176,80 @@ class ToolsPanelizePrefGroupUI(OptionsGroupUI): ## Spacing Columns self.pspacing_columns = FCEntry() - self.spacing_columns_label = QtWidgets.QLabel("Spacing cols:") + self.spacing_columns_label = QtWidgets.QLabel(_("Spacing cols:")) self.spacing_columns_label.setToolTip( - "Spacing between columns of the desired panel.\n" - "In current units." + _("Spacing between columns of the desired panel.\n" + "In current units.") ) grid0.addWidget(self.spacing_columns_label, 0, 0) grid0.addWidget(self.pspacing_columns, 0, 1) ## Spacing Rows self.pspacing_rows = FCEntry() - self.spacing_rows_label = QtWidgets.QLabel("Spacing rows:") + self.spacing_rows_label = QtWidgets.QLabel(_("Spacing rows:")) self.spacing_rows_label.setToolTip( - "Spacing between rows of the desired panel.\n" - "In current units." + _("Spacing between rows of the desired panel.\n" + "In current units.") ) grid0.addWidget(self.spacing_rows_label, 1, 0) grid0.addWidget(self.pspacing_rows, 1, 1) ## Columns self.pcolumns = FCEntry() - self.columns_label = QtWidgets.QLabel("Columns:") + self.columns_label = QtWidgets.QLabel(_("Columns:")) self.columns_label.setToolTip( - "Number of columns of the desired panel" + _("Number of columns of the desired panel") ) grid0.addWidget(self.columns_label, 2, 0) grid0.addWidget(self.pcolumns, 2, 1) ## Rows self.prows = FCEntry() - self.rows_label = QtWidgets.QLabel("Rows:") + self.rows_label = QtWidgets.QLabel(_("Rows:")) self.rows_label.setToolTip( - "Number of rows of the desired panel" + _("Number of rows of the desired panel") ) grid0.addWidget(self.rows_label, 3, 0) grid0.addWidget(self.prows, 3, 1) ## Type of resulting Panel object - self.panel_type_radio = RadioSet([{'label': 'Gerber', 'value': 'gerber'}, - {'label': 'Geo', 'value': 'geometry'}]) - self.panel_type_label = QtWidgets.QLabel("Panel Type:") + self.panel_type_radio = RadioSet([{'label': _('Gerber'), 'value': 'gerber'}, + {'label': _('Geo'), 'value': 'geometry'}]) + self.panel_type_label = QtWidgets.QLabel(_("Panel Type:")) self.panel_type_label.setToolTip( - "Choose the type of object for the panel object:\n" + _( "Choose the type of object for the panel object:\n" "- Gerber\n" - "- Geometry" + "- Geometry") ) grid0.addWidget(self.panel_type_label, 4, 0) grid0.addWidget(self.panel_type_radio, 4, 1) ## Constrains - self.pconstrain_cb = FCCheckBox("Constrain within:") + self.pconstrain_cb = FCCheckBox(_("Constrain within:")) self.pconstrain_cb.setToolTip( - "Area define by DX and DY within to constrain the panel.\n" + _("Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" "Regardless of how many columns and rows are desired,\n" "the final panel will have as many columns and rows as\n" - "they fit completely within selected area." + "they fit completely within selected area.") ) grid0.addWidget(self.pconstrain_cb, 5, 0) self.px_width_entry = FCEntry() - self.x_width_lbl = QtWidgets.QLabel("Width (DX):") + self.x_width_lbl = QtWidgets.QLabel(_("Width (DX):")) self.x_width_lbl.setToolTip( - "The width (DX) within which the panel must fit.\n" - "In current units." + _("The width (DX) within which the panel must fit.\n" + "In current units.") ) grid0.addWidget(self.x_width_lbl, 6, 0) grid0.addWidget(self.px_width_entry, 6, 1) self.py_height_entry = FCEntry() - self.y_height_lbl = QtWidgets.QLabel("Height (DY):") + self.y_height_lbl = QtWidgets.QLabel(_("Height (DY):")) self.y_height_lbl.setToolTip( - "The height (DY)within which the panel must fit.\n" - "In current units." + _("The height (DY)within which the panel must fit.\n" + "In current units.") ) grid0.addWidget(self.y_height_lbl, 7, 0) grid0.addWidget(self.py_height_entry, 7, 1) @@ -5206,14 +5262,14 @@ class ToolsCalculatorsPrefGroupUI(OptionsGroupUI): # OptionsGroupUI.__init__(self, "Calculators Tool Options", parent=parent) super(ToolsCalculatorsPrefGroupUI, self).__init__(self) - self.setTitle(str("Calculators Tool Options")) + self.setTitle(str(_("Calculators Tool Options"))) ## V-shape Calculator Tool - self.vshape_tool_label = QtWidgets.QLabel("V-Shape Tool Calculator:") + self.vshape_tool_label = QtWidgets.QLabel(_("V-Shape Tool Calculator:")) self.vshape_tool_label.setToolTip( - "Calculate the tool diameter for a given V-shape tool,\n" + _("Calculate the tool diameter for a given V-shape tool,\n" "having the tip diameter, tip angle and\n" - "depth-of-cut as parameters." + "depth-of-cut as parameters.") ) self.layout.addWidget(self.vshape_tool_label) @@ -5222,39 +5278,39 @@ class ToolsCalculatorsPrefGroupUI(OptionsGroupUI): ## Tip Diameter self.tip_dia_entry = FCEntry() - self.tip_dia_label = QtWidgets.QLabel("Tip Diameter:") + self.tip_dia_label = QtWidgets.QLabel(_("Tip Diameter:")) self.tip_dia_label.setToolTip( - "This is the tool tip diameter.\n" - "It is specified by manufacturer." + _("This is the tool tip diameter.\n" + "It is specified by manufacturer.") ) grid0.addWidget(self.tip_dia_label, 0, 0) grid0.addWidget(self.tip_dia_entry, 0, 1) ## Tip angle self.tip_angle_entry = FCEntry() - self.tip_angle_label = QtWidgets.QLabel("Tip angle:") + self.tip_angle_label = QtWidgets.QLabel(_("Tip angle:")) self.tip_angle_label.setToolTip( - "This is the angle on the tip of the tool.\n" - "It is specified by manufacturer." + _("This is the angle on the tip of the tool.\n" + "It is specified by manufacturer.") ) grid0.addWidget(self.tip_angle_label, 1, 0) grid0.addWidget(self.tip_angle_entry, 1, 1) ## Depth-of-cut Cut Z self.cut_z_entry = FCEntry() - self.cut_z_label = QtWidgets.QLabel("Cut Z:") + self.cut_z_label = QtWidgets.QLabel(_("Cut Z:")) self.cut_z_label.setToolTip( - "This is depth to cut into material.\n" - "In the CNCJob object it is the CutZ parameter." + _("This is depth to cut into material.\n" + "In the CNCJob object it is the CutZ parameter.") ) grid0.addWidget(self.cut_z_label, 2, 0) grid0.addWidget(self.cut_z_entry, 2, 1) ## Electroplating Calculator Tool - self.plate_title_label = QtWidgets.QLabel("ElectroPlating Calculator:") + self.plate_title_label = QtWidgets.QLabel(_("ElectroPlating Calculator:")) self.plate_title_label.setToolTip( - "This calculator is useful for those who plate the via/pad/drill holes,\n" - "using a method like grahite ink or calcium hypophosphite ink or palladium chloride." + _("This calculator is useful for those who plate the via/pad/drill holes,\n" + "using a method like grahite ink or calcium hypophosphite ink or palladium chloride.") ) self.layout.addWidget(self.plate_title_label) @@ -5263,35 +5319,35 @@ class ToolsCalculatorsPrefGroupUI(OptionsGroupUI): ## PCB Length self.pcblength_entry = FCEntry() - self.pcblengthlabel = QtWidgets.QLabel("Board Length:") + self.pcblengthlabel = QtWidgets.QLabel(_("Board Length:")) - self.pcblengthlabel.setToolTip('This is the board length. In centimeters.') + self.pcblengthlabel.setToolTip(_('This is the board length. In centimeters.')) grid1.addWidget(self.pcblengthlabel, 0, 0) grid1.addWidget(self.pcblength_entry, 0, 1) ## PCB Width self.pcbwidth_entry = FCEntry() - self.pcbwidthlabel = QtWidgets.QLabel("Board Width:") + self.pcbwidthlabel = QtWidgets.QLabel(_("Board Width:")) - self.pcbwidthlabel.setToolTip('This is the board width.In centimeters.') + self.pcbwidthlabel.setToolTip(_('This is the board width.In centimeters.')) grid1.addWidget(self.pcbwidthlabel, 1, 0) grid1.addWidget(self.pcbwidth_entry, 1, 1) ## Current Density - self.cdensity_label = QtWidgets.QLabel("Current Density:") + self.cdensity_label = QtWidgets.QLabel(_("Current Density:")) self.cdensity_entry = FCEntry() - self.cdensity_label.setToolTip("Current density to pass through the board. \n" - "In Amps per Square Feet ASF.") + self.cdensity_label.setToolTip(_("Current density to pass through the board. \n" + "In Amps per Square Feet ASF.")) grid1.addWidget(self.cdensity_label, 2, 0) grid1.addWidget(self.cdensity_entry, 2, 1) ## PCB Copper Growth - self.growth_label = QtWidgets.QLabel("Copper Growth:") + self.growth_label = QtWidgets.QLabel(_("Copper Growth:")) self.growth_entry = FCEntry() - self.growth_label.setToolTip("How thick the copper growth is intended to be.\n" - "In microns.") + self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n" + "In microns.")) grid1.addWidget(self.growth_label, 3, 0) grid1.addWidget(self.growth_entry, 3, 1) @@ -5303,13 +5359,13 @@ class ToolsTransformPrefGroupUI(OptionsGroupUI): super(ToolsTransformPrefGroupUI, self).__init__(self) - self.setTitle(str("Transform Tool Options")) + self.setTitle(str(_("Transform Tool Options"))) ## Transformations - self.transform_label = QtWidgets.QLabel("Parameters:") + self.transform_label = QtWidgets.QLabel(_("Parameters:")) self.transform_label.setToolTip( - "Various transformations that can be applied\n" - "on a FlatCAM object." + _("Various transformations that can be applied\n" + "on a FlatCAM object.") ) self.layout.addWidget(self.transform_label) @@ -5318,89 +5374,89 @@ class ToolsTransformPrefGroupUI(OptionsGroupUI): ## Rotate Angle self.rotate_entry = FCEntry() - self.rotate_label = QtWidgets.QLabel("Rotate Angle:") + self.rotate_label = QtWidgets.QLabel(_("Rotate Angle:")) self.rotate_label.setToolTip( - "Angle for rotation. In degrees." + _("Angle for rotation. In degrees.") ) grid0.addWidget(self.rotate_label, 0, 0) grid0.addWidget(self.rotate_entry, 0, 1) ## Skew/Shear Angle on X axis self.skewx_entry = FCEntry() - self.skewx_label = QtWidgets.QLabel("Skew_X angle:") + self.skewx_label = QtWidgets.QLabel(_("Skew_X angle:")) self.skewx_label.setToolTip( - "Angle for Skew/Shear on X axis. In degrees." + _("Angle for Skew/Shear on X axis. In degrees.") ) grid0.addWidget(self.skewx_label, 1, 0) grid0.addWidget(self.skewx_entry, 1, 1) ## Skew/Shear Angle on Y axis self.skewy_entry = FCEntry() - self.skewy_label = QtWidgets.QLabel("Skew_Y angle:") + self.skewy_label = QtWidgets.QLabel(_("Skew_Y angle:")) self.skewy_label.setToolTip( - "Angle for Skew/Shear on Y axis. In degrees." + _("Angle for Skew/Shear on Y axis. In degrees.") ) grid0.addWidget(self.skewy_label, 2, 0) grid0.addWidget(self.skewy_entry, 2, 1) ## Scale factor on X axis self.scalex_entry = FCEntry() - self.scalex_label = QtWidgets.QLabel("Scale_X factor:") + self.scalex_label = QtWidgets.QLabel(_("Scale_X factor:")) self.scalex_label.setToolTip( - "Factor for scaling on X axis." + _("Factor for scaling on X axis.") ) grid0.addWidget(self.scalex_label, 3, 0) grid0.addWidget(self.scalex_entry, 3, 1) ## Scale factor on X axis self.scaley_entry = FCEntry() - self.scaley_label = QtWidgets.QLabel("Scale_Y factor:") + self.scaley_label = QtWidgets.QLabel(_("Scale_Y factor:")) self.scaley_label.setToolTip( - "Factor for scaling on Y axis." + _("Factor for scaling on Y axis.") ) grid0.addWidget(self.scaley_label, 4, 0) grid0.addWidget(self.scaley_entry, 4, 1) ## Link Scale factors - self.link_cb = FCCheckBox("Link") + self.link_cb = FCCheckBox(_("Link")) self.link_cb.setToolTip( - "Scale the selected object(s)\n" - "using the Scale_X factor for both axis." + _("Scale the selected object(s)\n" + "using the Scale_X factor for both axis.") ) grid0.addWidget(self.link_cb, 5, 0) ## Scale Reference - self.reference_cb = FCCheckBox("Scale Reference") + self.reference_cb = FCCheckBox(_("Scale Reference")) self.reference_cb.setToolTip( - "Scale the selected object(s)\n" + _("Scale the selected object(s)\n" "using the origin reference when checked,\n" "and the center of the biggest bounding box\n" - "of the selected objects when unchecked." + "of the selected objects when unchecked.") ) grid0.addWidget(self.reference_cb, 5, 1) ## Offset distance on X axis self.offx_entry = FCEntry() - self.offx_label = QtWidgets.QLabel("Offset_X val:") + self.offx_label = QtWidgets.QLabel(_("Offset_X val:")) self.offx_label.setToolTip( - "Distance to offset on X axis. In current units." + _( "Distance to offset on X axis. In current units.") ) grid0.addWidget(self.offx_label, 6, 0) grid0.addWidget(self.offx_entry, 6, 1) ## Offset distance on Y axis self.offy_entry = FCEntry() - self.offy_label = QtWidgets.QLabel("Offset_Y val:") + self.offy_label = QtWidgets.QLabel(_("Offset_Y val:")) self.offy_label.setToolTip( - "Distance to offset on Y axis. In current units." + _("Distance to offset on Y axis. In current units.") ) grid0.addWidget(self.offy_label, 7, 0) grid0.addWidget(self.offy_entry, 7, 1) ## Mirror (Flip) Reference Point - self.mirror_reference_cb = FCCheckBox("Mirror Reference") + self.mirror_reference_cb = FCCheckBox(_("Mirror Reference")) self.mirror_reference_cb.setToolTip( - "Flip the selected object(s)\n" + _("Flip the selected object(s)\n" "around the point in Point Entry Field.\n" "\n" "The point coordinates can be captured by\n" @@ -5408,14 +5464,14 @@ class ToolsTransformPrefGroupUI(OptionsGroupUI): "SHIFT key. \n" "Then click Add button to insert coordinates.\n" "Or enter the coords in format (x, y) in the\n" - "Point Entry field and click Flip on X(Y)") + "Point Entry field and click Flip on X(Y)")) grid0.addWidget(self.mirror_reference_cb, 8, 1) - self.flip_ref_label = QtWidgets.QLabel(" Mirror Ref. Point:") + self.flip_ref_label = QtWidgets.QLabel(_(" Mirror Ref. Point:")) self.flip_ref_label.setToolTip( - "Coordinates in format (x, y) used as reference for mirroring.\n" + _("Coordinates in format (x, y) used as reference for mirroring.\n" "The 'x' in (x, y) will be used when using Flip on X and\n" - "the 'y' in (x, y) will be used when using Flip on Y and" + "the 'y' in (x, y) will be used when using Flip on Y and") ) self.flip_ref_entry = EvalEntry2("(0, 0)") @@ -5430,13 +5486,13 @@ class ToolsSolderpastePrefGroupUI(OptionsGroupUI): super(ToolsSolderpastePrefGroupUI, self).__init__(self) - self.setTitle(str("SolderPaste Tool Options")) + self.setTitle(str(_("SolderPaste Tool Options"))) ## Solder Paste Dispensing - self.solderpastelabel = QtWidgets.QLabel("Parameters:") + self.solderpastelabel = QtWidgets.QLabel(_("Parameters:")) self.solderpastelabel.setToolTip( - "A tool to create GCode for dispensing\n" - "solder paste onto a PCB." + _("A tool to create GCode for dispensing\n" + "solder paste onto a PCB.") ) self.layout.addWidget(self.solderpastelabel) @@ -5444,18 +5500,18 @@ class ToolsSolderpastePrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid0) # Nozzle Tool Diameters - nozzletdlabel = QtWidgets.QLabel('Tools dia:') + nozzletdlabel = QtWidgets.QLabel(_('Tools dia:')) nozzletdlabel.setToolTip( - "Diameters of nozzle tools, separated by ','" + _("Diameters of nozzle tools, separated by ','") ) self.nozzle_tool_dia_entry = FCEntry() grid0.addWidget(nozzletdlabel, 0, 0) grid0.addWidget(self.nozzle_tool_dia_entry, 0, 1) # New Nozzle Tool Dia - self.addtool_entry_lbl = QtWidgets.QLabel('New Nozzle Dia:') + self.addtool_entry_lbl = QtWidgets.QLabel(_('New Nozzle Dia:')) self.addtool_entry_lbl.setToolTip( - "Diameter for the new Nozzle tool to add in the Tool Table" + _("Diameter for the new Nozzle tool to add in the Tool Table") ) self.addtool_entry = FCEntry() grid0.addWidget(self.addtool_entry_lbl, 1, 0) @@ -5463,132 +5519,132 @@ class ToolsSolderpastePrefGroupUI(OptionsGroupUI): # Z dispense start self.z_start_entry = FCEntry() - self.z_start_label = QtWidgets.QLabel("Z Dispense Start:") + self.z_start_label = QtWidgets.QLabel(_("Z Dispense Start:")) self.z_start_label.setToolTip( - "The height (Z) when solder paste dispensing starts." + _("The height (Z) when solder paste dispensing starts.") ) grid0.addWidget(self.z_start_label, 2, 0) grid0.addWidget(self.z_start_entry, 2, 1) # Z dispense self.z_dispense_entry = FCEntry() - self.z_dispense_label = QtWidgets.QLabel("Z Dispense:") + self.z_dispense_label = QtWidgets.QLabel(_("Z Dispense:")) self.z_dispense_label.setToolTip( - "The height (Z) when doing solder paste dispensing." + _("The height (Z) when doing solder paste dispensing.") ) grid0.addWidget(self.z_dispense_label, 3, 0) grid0.addWidget(self.z_dispense_entry, 3, 1) # Z dispense stop self.z_stop_entry = FCEntry() - self.z_stop_label = QtWidgets.QLabel("Z Dispense Stop:") + self.z_stop_label = QtWidgets.QLabel(_("Z Dispense Stop:")) self.z_stop_label.setToolTip( - "The height (Z) when solder paste dispensing stops." + _("The height (Z) when solder paste dispensing stops.") ) grid0.addWidget(self.z_stop_label, 4, 0) grid0.addWidget(self.z_stop_entry, 4, 1) # Z travel self.z_travel_entry = FCEntry() - self.z_travel_label = QtWidgets.QLabel("Z Travel:") + self.z_travel_label = QtWidgets.QLabel(_("Z Travel:")) self.z_travel_label.setToolTip( - "The height (Z) for travel between pads\n" - "(without dispensing solder paste)." + _("The height (Z) for travel between pads\n" + "(without dispensing solder paste).") ) grid0.addWidget(self.z_travel_label, 5, 0) grid0.addWidget(self.z_travel_entry, 5, 1) # Z toolchange location self.z_toolchange_entry = FCEntry() - self.z_toolchange_label = QtWidgets.QLabel("Z Toolchange:") + self.z_toolchange_label = QtWidgets.QLabel(_("Z Toolchange:")) self.z_toolchange_label.setToolTip( - "The height (Z) for tool (nozzle) change." + _("The height (Z) for tool (nozzle) change.") ) grid0.addWidget(self.z_toolchange_label, 6, 0) grid0.addWidget(self.z_toolchange_entry, 6, 1) # X,Y Toolchange location self.xy_toolchange_entry = FCEntry() - self.xy_toolchange_label = QtWidgets.QLabel("XY Toolchange:") + self.xy_toolchange_label = QtWidgets.QLabel(_("XY Toolchange:")) self.xy_toolchange_label.setToolTip( - "The X,Y location for tool (nozzle) change.\n" - "The format is (x, y) where x and y are real numbers." + _("The X,Y location for tool (nozzle) change.\n" + "The format is (x, y) where x and y are real numbers.") ) grid0.addWidget(self.xy_toolchange_label, 7, 0) grid0.addWidget(self.xy_toolchange_entry, 7, 1) # Feedrate X-Y self.frxy_entry = FCEntry() - self.frxy_label = QtWidgets.QLabel("Feedrate X-Y:") + self.frxy_label = QtWidgets.QLabel(_("Feedrate X-Y:")) self.frxy_label.setToolTip( - "Feedrate (speed) while moving on the X-Y plane." + _("Feedrate (speed) while moving on the X-Y plane.") ) grid0.addWidget(self.frxy_label, 8, 0) grid0.addWidget(self.frxy_entry, 8, 1) # Feedrate Z self.frz_entry = FCEntry() - self.frz_label = QtWidgets.QLabel("Feedrate Z:") + self.frz_label = QtWidgets.QLabel(_("Feedrate Z:")) self.frz_label.setToolTip( - "Feedrate (speed) while moving vertically\n" - "(on Z plane)." + _("Feedrate (speed) while moving vertically\n" + "(on Z plane).") ) grid0.addWidget(self.frz_label, 9, 0) grid0.addWidget(self.frz_entry, 9, 1) # Feedrate Z Dispense self.frz_dispense_entry = FCEntry() - self.frz_dispense_label = QtWidgets.QLabel("Feedrate Z Dispense:") + self.frz_dispense_label = QtWidgets.QLabel(_("Feedrate Z Dispense:")) self.frz_dispense_label.setToolTip( - "Feedrate (speed) while moving up vertically\n" - " to Dispense position (on Z plane)." + _("Feedrate (speed) while moving up vertically\n" + " to Dispense position (on Z plane).") ) grid0.addWidget(self.frz_dispense_label, 10, 0) grid0.addWidget(self.frz_dispense_entry, 10, 1) # Spindle Speed Forward self.speedfwd_entry = FCEntry() - self.speedfwd_label = QtWidgets.QLabel("Spindle Speed FWD:") + self.speedfwd_label = QtWidgets.QLabel(_("Spindle Speed FWD:")) self.speedfwd_label.setToolTip( - "The dispenser speed while pushing solder paste\n" - "through the dispenser nozzle." + _("The dispenser speed while pushing solder paste\n" + "through the dispenser nozzle.") ) grid0.addWidget(self.speedfwd_label, 11, 0) grid0.addWidget(self.speedfwd_entry, 11, 1) # Dwell Forward self.dwellfwd_entry = FCEntry() - self.dwellfwd_label = QtWidgets.QLabel("Dwell FWD:") + self.dwellfwd_label = QtWidgets.QLabel(_("Dwell FWD:")) self.dwellfwd_label.setToolTip( - "Pause after solder dispensing." + _("Pause after solder dispensing.") ) grid0.addWidget(self.dwellfwd_label, 12, 0) grid0.addWidget(self.dwellfwd_entry, 12, 1) # Spindle Speed Reverse self.speedrev_entry = FCEntry() - self.speedrev_label = QtWidgets.QLabel("Spindle Speed REV:") + self.speedrev_label = QtWidgets.QLabel(_("Spindle Speed REV:")) self.speedrev_label.setToolTip( - "The dispenser speed while retracting solder paste\n" - "through the dispenser nozzle." + _("The dispenser speed while retracting solder paste\n" + "through the dispenser nozzle.") ) grid0.addWidget(self.speedrev_label, 13, 0) grid0.addWidget(self.speedrev_entry, 13, 1) # Dwell Reverse self.dwellrev_entry = FCEntry() - self.dwellrev_label = QtWidgets.QLabel("Dwell REV:") + self.dwellrev_label = QtWidgets.QLabel(_("Dwell REV:")) self.dwellrev_label.setToolTip( - "Pause after solder paste dispenser retracted,\n" - "to allow pressure equilibrium." + _("Pause after solder paste dispenser retracted,\n" + "to allow pressure equilibrium.") ) grid0.addWidget(self.dwellrev_label, 14, 0) grid0.addWidget(self.dwellrev_entry, 14, 1) # Postprocessors - pp_label = QtWidgets.QLabel('PostProcessors:') + pp_label = QtWidgets.QLabel(_('PostProcessors:')) pp_label.setToolTip( - "Files that control the GCode generation." + _("Files that control the GCode generation.") ) self.pp_combo = FCComboBox() @@ -5618,13 +5674,13 @@ class FlatCAMActivityView(QtWidgets.QWidget): layout.addWidget(self.icon) self.text = QtWidgets.QLabel(self) - self.text.setText("Idle.") + self.text.setText(_("Idle.")) layout.addWidget(self.text) def set_idle(self): self.movie.stop() - self.text.setText("Idle.") + self.text.setText(_("Idle.")) def set_busy(self, msg): self.movie.start() @@ -5648,8 +5704,8 @@ class FlatCAMInfoBar(QtWidgets.QWidget): layout.addWidget(self.icon) self.text = QtWidgets.QLabel(self) - self.text.setText("Application started ...") - self.text.setToolTip("Hello!") + self.text.setText(_("Application started ...")) + self.text.setToolTip(_("Hello!")) layout.addWidget(self.text) diff --git a/GUIElements.py b/flatcamGUI/GUIElements.py similarity index 98% rename from GUIElements.py rename to flatcamGUI/GUIElements.py index 0a8ab9f4..b5408fbc 100644 --- a/GUIElements.py +++ b/flatcamGUI/GUIElements.py @@ -1,3 +1,16 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# Author: Juan Pablo Caram (c) # +# Date: 2/5/2014 # +# MIT Licence # +############################################################ + +############################################################ +# File Modified (major mod): Marius Adrian Stanciu # +# Date: 3/10/2019 # +############################################################ + from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtWidgets import QTextEdit, QCompleter, QAction diff --git a/ObjectUI.py b/flatcamGUI/ObjectUI.py similarity index 57% rename from ObjectUI.py rename to flatcamGUI/ObjectUI.py index 1c8f7835..a36b508d 100644 --- a/ObjectUI.py +++ b/flatcamGUI/ObjectUI.py @@ -1,9 +1,27 @@ -import sys +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# Author: Juan Pablo Caram (c) # +# Date: 2/5/2014 # +# MIT Licence # +############################################################ + +############################################################ +# File Modified (major mod): Marius Adrian Stanciu # +# Date: 3/10/2019 # +############################################################ + from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt -from GUIElements import FCEntry, FloatEntry, EvalEntry, FCCheckBox, FCTable, \ - LengthEntry, FCTextArea, IntEntry, RadioSet, OptionalInputSection, FCComboBox, FloatEntry2, EvalEntry2, FCButton -from camlib import Excellon +from flatcamGUI.GUIElements import * + +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext class ObjectUI(QtWidgets.QWidget): @@ -12,7 +30,7 @@ class ObjectUI(QtWidgets.QWidget): put UI elements in ObjectUI.custom_box (QtWidgets.QLayout). """ - def __init__(self, icon_file='share/flatcam_icon32.png', title='FlatCAM Object', parent=None): + def __init__(self, icon_file='share/flatcam_icon32.png', title=_('FlatCAM Object'), parent=None): QtWidgets.QWidget.__init__(self, parent=parent) layout = QtWidgets.QVBoxLayout() @@ -29,19 +47,21 @@ class ObjectUI(QtWidgets.QWidget): self.title_box.addWidget(self.icon, stretch=0) ## Title label - self.title_label = QtWidgets.QLabel("" + title + "") + self.title_label = QtWidgets.QLabel("%s" % title) self.title_label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.title_box.addWidget(self.title_label, stretch=1) ## App Level label self.level = QtWidgets.QLabel("") self.level.setToolTip( - "BASIC is suitable for a beginner. Many parameters\n" - "are hidden from the user in this mode.\n" - "ADVANCED mode will make available all parameters.\n\n" - "To change the application LEVEL, go to:\n" - "Edit -> Preferences -> General and check:\n" - "'APP. LEVEL' radio button." + _( + "BASIC is suitable for a beginner. Many parameters\n" + "are hidden from the user in this mode.\n" + "ADVANCED mode will make available all parameters.\n\n" + "To change the application LEVEL, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'APP. LEVEL' radio button." + ) ) self.level.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.title_box.addWidget(self.level) @@ -56,9 +76,9 @@ class ObjectUI(QtWidgets.QWidget): ########################### #### Scale #### - self.scale_label = QtWidgets.QLabel('Scale:') + self.scale_label = QtWidgets.QLabel(_('Scale:')) self.scale_label.setToolTip( - "Change the size of the object." + _("Change the size of the object.") ) layout.addWidget(self.scale_label) @@ -66,10 +86,10 @@ class ObjectUI(QtWidgets.QWidget): layout.addLayout(self.scale_grid) # Factor - faclabel = QtWidgets.QLabel('Factor:') + faclabel = QtWidgets.QLabel(_('Factor:')) faclabel.setToolTip( - "Factor by which to multiply\n" - "geometric features of this object." + _("Factor by which to multiply\n" + "geometric features of this object.") ) self.scale_grid.addWidget(faclabel, 0, 0) self.scale_entry = FloatEntry2() @@ -77,38 +97,38 @@ class ObjectUI(QtWidgets.QWidget): self.scale_grid.addWidget(self.scale_entry, 0, 1) # GO Button - self.scale_button = QtWidgets.QPushButton('Scale') + self.scale_button = QtWidgets.QPushButton(_('Scale')) self.scale_button.setToolTip( - "Perform scaling operation." + _("Perform scaling operation.") ) - self.scale_button.setFixedWidth(40) + self.scale_button.setFixedWidth(50) self.scale_grid.addWidget(self.scale_button, 0, 2) #### Offset #### - self.offset_label = QtWidgets.QLabel('Offset:') + self.offset_label = QtWidgets.QLabel(_('Offset:')) self.offset_label.setToolTip( - "Change the position of this object." + _("Change the position of this object.") ) layout.addWidget(self.offset_label) self.offset_grid = QtWidgets.QGridLayout() layout.addLayout(self.offset_grid) - self.offset_vectorlabel = QtWidgets.QLabel('Vector:') + self.offset_vectorlabel = QtWidgets.QLabel(_('Vector:')) self.offset_vectorlabel.setToolTip( - "Amount by which to move the object\n" - "in the x and y axes in (x, y) format." + _("Amount by which to move the object\n" + "in the x and y axes in (x, y) format.") ) self.offset_grid.addWidget(self.offset_vectorlabel, 0, 0) self.offsetvector_entry = EvalEntry2() self.offsetvector_entry.setText("(0.0, 0.0)") self.offset_grid.addWidget(self.offsetvector_entry, 0, 1) - self.offset_button = QtWidgets.QPushButton('Offset') + self.offset_button = QtWidgets.QPushButton(_('Offset')) self.offset_button.setToolTip( - "Perform the offset operation." + _("Perform the offset operation.") ) - self.offset_button.setFixedWidth(40) + self.offset_button.setFixedWidth(50) self.offset_grid.addWidget(self.offset_button, 0, 2) layout.addStretch() @@ -120,46 +140,46 @@ class GerberObjectUI(ObjectUI): """ def __init__(self, parent=None): - ObjectUI.__init__(self, title='Gerber Object', parent=parent) + ObjectUI.__init__(self, title=_('Gerber Object'), parent=parent) # Plot options grid0 = QtWidgets.QGridLayout() grid0.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.custom_box.addLayout(grid0) - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.plot_options_label.setFixedWidth(90) grid0.addWidget(self.plot_options_label, 0, 0) # Solid CB - self.solid_cb = FCCheckBox(label='Solid ') + self.solid_cb = FCCheckBox(label=_('Solid ')) self.solid_cb.setToolTip( - "Solid color polygons." + _("Solid color polygons.") ) self.solid_cb.setFixedWidth(50) grid0.addWidget(self.solid_cb, 0, 1) # Multicolored CB - self.multicolored_cb = FCCheckBox(label='M-Color ') + self.multicolored_cb = FCCheckBox(label=_('M-Color ')) self.multicolored_cb.setToolTip( - "Draw polygons in different colors." + _("Draw polygons in different colors.") ) self.multicolored_cb.setFixedWidth(55) grid0.addWidget(self.multicolored_cb, 0, 2) # Plot CB - self.plot_cb = FCCheckBox('Plot') + self.plot_cb = FCCheckBox(_('Plot')) self.plot_cb.setToolTip( - "Plot (show) this object." + _("Plot (show) this object.") ) - self.plot_cb.setFixedWidth(55) + self.plot_cb.setFixedWidth(59) grid0.addWidget(self.plot_cb, 0, 3) ## Object name self.name_hlay = QtWidgets.QHBoxLayout() self.custom_box.addLayout(self.name_hlay) - name_label = QtWidgets.QLabel("Name:") + name_label = QtWidgets.QLabel(_("Name:")) self.name_entry = FCEntry() self.name_entry.setFocusPolicy(QtCore.Qt.StrongFocus) self.name_hlay.addWidget(name_label) @@ -169,9 +189,9 @@ class GerberObjectUI(ObjectUI): self.custom_box.addLayout(hlay_plot) #### Gerber Apertures #### - self.apertures_table_label = QtWidgets.QLabel('Apertures:') + self.apertures_table_label = QtWidgets.QLabel(_('Apertures:')) self.apertures_table_label.setToolTip( - "Apertures Table for the Gerber Object." + _("Apertures Table for the Gerber Object.") ) self.apertures_table_label.setFixedWidth(90) @@ -180,9 +200,9 @@ class GerberObjectUI(ObjectUI): # Aperture Table Visibility CB self.aperture_table_visibility_cb = FCCheckBox() self.aperture_table_visibility_cb.setToolTip( - "Toggle the display of the Gerber Apertures Table.\n" + _("Toggle the display of the Gerber Apertures Table.\n" "When unchecked, it will delete all mark shapes\n" - "that are drawn on canvas." + "that are drawn on canvas.") ) # self.aperture_table_visibility_cb.setLayoutDirection(QtCore.Qt.RightToLeft) @@ -191,11 +211,11 @@ class GerberObjectUI(ObjectUI): hlay_plot.addStretch() # Aperture Mark all CB - self.mark_all_cb = FCCheckBox('Mark All') + self.mark_all_cb = FCCheckBox(_('Mark All')) self.mark_all_cb.setToolTip( - "When checked it will display all the apertures.\n" + _("When checked it will display all the apertures.\n" "When unchecked, it will delete all mark shapes\n" - "that are drawn on canvas." + "that are drawn on canvas.") ) self.mark_all_cb.setLayoutDirection(QtCore.Qt.RightToLeft) @@ -205,23 +225,23 @@ class GerberObjectUI(ObjectUI): self.custom_box.addWidget(self.apertures_table) self.apertures_table.setColumnCount(6) - self.apertures_table.setHorizontalHeaderLabels(['#', 'Code', 'Type', 'Size', 'Dim', 'M']) + self.apertures_table.setHorizontalHeaderLabels(['#', _('Code'), _('Type'), _('Size'), _('Dim'), 'M']) self.apertures_table.setSortingEnabled(False) self.apertures_table.horizontalHeaderItem(0).setToolTip( - "Index") + _("Index")) self.apertures_table.horizontalHeaderItem(1).setToolTip( - "Aperture Code") + _("Aperture Code")) self.apertures_table.horizontalHeaderItem(2).setToolTip( - "Type of aperture: circular, rectangle, macros etc") + _("Type of aperture: circular, rectangle, macros etc")) self.apertures_table.horizontalHeaderItem(4).setToolTip( - "Aperture Size:") + _("Aperture Size:")) self.apertures_table.horizontalHeaderItem(4).setToolTip( - "Aperture Dimensions:\n" + _("Aperture Dimensions:\n" " - (width, height) for R, O type.\n" - " - (dia, nVertices) for P type") + " - (dia, nVertices) for P type")) self.apertures_table.horizontalHeaderItem(5).setToolTip( - "Mark the aperture instances on canvas.") + _("Mark the aperture instances on canvas.")) # self.apertures_table.setColumnHidden(5, True) #### Aperture Scale #### @@ -229,11 +249,11 @@ class GerberObjectUI(ObjectUI): self.custom_box.addLayout(self.transform_aperture_grid) # Scale Aperture Factor - self.scale_aperture_label = QtWidgets.QLabel('Scale Factor:') + self.scale_aperture_label = QtWidgets.QLabel(_('Scale Factor:')) self.scale_aperture_label.setToolTip( - "Change the size of the selected apertures.\n" + _("Change the size of the selected apertures.\n" "Factor by which to multiply\n" - "geometric features of this object." + "geometric features of this object.") ) self.scale_aperture_label.setFixedWidth(90) self.transform_aperture_grid.addWidget(self.scale_aperture_label, 0, 0) @@ -242,19 +262,19 @@ class GerberObjectUI(ObjectUI): self.transform_aperture_grid.addWidget(self.scale_aperture_entry, 0, 1) # Scale Button - self.scale_aperture_button = QtWidgets.QPushButton('Scale') + self.scale_aperture_button = QtWidgets.QPushButton(_('Scale')) self.scale_aperture_button.setToolTip( - "Perform scaling operation on the selected apertures." + _("Perform scaling operation on the selected apertures.") ) self.scale_aperture_button.setFixedWidth(50) self.transform_aperture_grid.addWidget(self.scale_aperture_button, 0, 2) # Buffer Aperture Factor - self.buffer_aperture_label = QtWidgets.QLabel('Buffer Factor:') + self.buffer_aperture_label = QtWidgets.QLabel(_('Buffer Factor:')) self.buffer_aperture_label.setToolTip( - "Change the size of the selected apertures.\n" + _("Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" - "geometric features of this object." + "geometric features of this object.") ) self.buffer_aperture_label.setFixedWidth(90) self.transform_aperture_grid.addWidget(self.buffer_aperture_label, 1, 0) @@ -263,9 +283,9 @@ class GerberObjectUI(ObjectUI): self.transform_aperture_grid.addWidget(self.buffer_aperture_entry, 1, 1) # Buffer Button - self.buffer_aperture_button = QtWidgets.QPushButton('Buffer') + self.buffer_aperture_button = QtWidgets.QPushButton(_('Buffer')) self.buffer_aperture_button.setToolTip( - "Perform buffer operation on the selected apertures." + _("Perform buffer operation on the selected apertures.") ) self.buffer_aperture_button.setFixedWidth(50) self.transform_aperture_grid.addWidget(self.buffer_aperture_button, 1, 2) @@ -273,18 +293,18 @@ class GerberObjectUI(ObjectUI): new_hlay = QtWidgets.QHBoxLayout() self.custom_box.addLayout(new_hlay) - self.new_grb_label = QtWidgets.QLabel("Generate new Gerber Object:") + self.new_grb_label = QtWidgets.QLabel(_("Generate new Gerber Object:")) self.new_grb_label.setToolTip( - "Will generate a new Gerber object from the changed apertures." + _("Will generate a new Gerber object from the changed apertures.") ) new_hlay.addWidget(self.new_grb_label) new_hlay.addStretch() - self.new_grb_button = FCButton('Go') + self.new_grb_button = FCButton(_('Go')) self.new_grb_button.setToolTip( - "Will generate a new Gerber object from the changed apertures.\n" - "This new object can then be isolated etc.") + _("Will generate a new Gerber object from the changed apertures.\n" + "This new object can then be isolated etc.")) self.new_grb_button.setFixedWidth(50) new_hlay.addWidget(self.new_grb_button) @@ -299,43 +319,43 @@ class GerberObjectUI(ObjectUI): self.buffer_aperture_button.setVisible(False) # Isolation Routing - self.isolation_routing_label = QtWidgets.QLabel("Isolation Routing:") + self.isolation_routing_label = QtWidgets.QLabel(_("Isolation Routing:")) self.isolation_routing_label.setToolTip( - "Create a Geometry object with\n" - "toolpaths to cut outside polygons." + _("Create a Geometry object with\n" + "toolpaths to cut outside polygons.") ) self.custom_box.addWidget(self.isolation_routing_label) grid1 = QtWidgets.QGridLayout() self.custom_box.addLayout(grid1) - tdlabel = QtWidgets.QLabel('Tool dia:') + tdlabel = QtWidgets.QLabel(_('Tool dia:')) tdlabel.setToolTip( - "Diameter of the cutting tool.\n" + _("Diameter of the cutting tool.\n" "If you want to have an isolation path\n" "inside the actual shape of the Gerber\n" "feature, use a negative value for\n" - "this parameter." + "this parameter.") ) tdlabel.setFixedWidth(90) grid1.addWidget(tdlabel, 0, 0) self.iso_tool_dia_entry = LengthEntry() grid1.addWidget(self.iso_tool_dia_entry, 0, 1) - passlabel = QtWidgets.QLabel('Passes:') + passlabel = QtWidgets.QLabel(_('Passes:')) passlabel.setToolTip( - "Width of the isolation gap in\n" - "number (integer) of tool widths." + _("Width of the isolation gap in\n" + "number (integer) of tool widths.") ) passlabel.setFixedWidth(90) grid1.addWidget(passlabel, 1, 0) self.iso_width_entry = IntEntry() grid1.addWidget(self.iso_width_entry, 1, 1) - overlabel = QtWidgets.QLabel('Pass overlap:') + overlabel = QtWidgets.QLabel(_('Pass overlap:')) overlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _("How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" - "A value here of 0.25 means an overlap of 25% from the tool diameter found above." + "A value here of 0.25 means an overlap of 25%% from the tool diameter found above.") ) overlabel.setFixedWidth(90) grid1.addWidget(overlabel, 2, 0) @@ -343,37 +363,37 @@ class GerberObjectUI(ObjectUI): grid1.addWidget(self.iso_overlap_entry, 2, 1) # Milling Type Radio Button - self.milling_type_label = QtWidgets.QLabel('Milling Type:') + self.milling_type_label = QtWidgets.QLabel(_('Milling Type:')) self.milling_type_label.setToolTip( - "Milling type:\n" + _("Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" - "- conventional / useful when there is no backlash compensation" + "- conventional / useful when there is no backlash compensation") ) grid1.addWidget(self.milling_type_label, 3, 0) - self.milling_type_radio = RadioSet([{'label': 'Climb', 'value': 'cl'}, - {'label': 'Conv.', 'value': 'cv'}]) + self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'}, + {'label': _('Conv.'), 'value': 'cv'}]) grid1.addWidget(self.milling_type_radio, 3, 1) # combine all passes CB - self.combine_passes_cb = FCCheckBox(label='Combine') + self.combine_passes_cb = FCCheckBox(label=_('Combine')) self.combine_passes_cb.setToolTip( - "Combine all passes into one object" + _("Combine all passes into one object") ) grid1.addWidget(self.combine_passes_cb, 4, 0) # generate follow - self.follow_cb = FCCheckBox(label='"Follow"') + self.follow_cb = FCCheckBox(label=_('"Follow"')) self.follow_cb.setToolTip( - "Generate a 'Follow' geometry.\n" + _( "Generate a 'Follow' geometry.\n" "This means that it will cut through\n" - "the middle of the trace." + "the middle of the trace.") ) grid1.addWidget(self.follow_cb, 4, 1) - self.gen_iso_label = QtWidgets.QLabel("Generate Isolation Geometry:") + self.gen_iso_label = QtWidgets.QLabel(_("Generate Isolation Geometry:")) self.gen_iso_label.setToolTip( - "Create a Geometry object with toolpaths to cut \n" + _("Create a Geometry object with toolpaths to cut \n" "isolation outside, inside or on both sides of the\n" "object. For a Gerber object outside means outside\n" "of the Gerber feature and inside means inside of\n" @@ -381,38 +401,42 @@ class GerberObjectUI(ObjectUI): "that only if the Gerber feature has openings inside, they\n" "will be isolated. If what is wanted is to cut isolation\n" "inside the actual Gerber feature, use a negative tool\n" - "diameter above." + "diameter above.") ) self.custom_box.addWidget(self.gen_iso_label) hlay_1 = QtWidgets.QHBoxLayout() self.custom_box.addLayout(hlay_1) - self.generate_iso_button = QtWidgets.QPushButton('FULL Geo') + self.padding_area_label = QtWidgets.QLabel('') + self.padding_area_label.setFixedWidth(90) + hlay_1.addWidget(self.padding_area_label) + + self.generate_iso_button = QtWidgets.QPushButton(_('FULL Geo')) self.generate_iso_button.setToolTip( - "Create the Geometry Object\n" + _("Create the Geometry Object\n" "for isolation routing. It contains both\n" - "the interiors and exteriors geometry." + "the interiors and exteriors geometry.") ) self.generate_iso_button.setFixedWidth(90) - hlay_1.addWidget(self.generate_iso_button) + hlay_1.addWidget(self.generate_iso_button, alignment=Qt.AlignLeft) # hlay_1.addStretch() - self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo') + self.generate_ext_iso_button = QtWidgets.QPushButton(_('Ext Geo')) self.generate_ext_iso_button.setToolTip( - "Create the Geometry Object\n" + _("Create the Geometry Object\n" "for isolation routing containing\n" - "only the exteriors geometry." + "only the exteriors geometry.") ) # self.generate_ext_iso_button.setFixedWidth(100) hlay_1.addWidget(self.generate_ext_iso_button) - self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo') + self.generate_int_iso_button = QtWidgets.QPushButton(_('Int Geo')) self.generate_int_iso_button.setToolTip( - "Create the Geometry Object\n" + _("Create the Geometry Object\n" "for isolation routing containing\n" - "only the interiors geometry." + "only the interiors geometry.") ) # self.generate_ext_iso_button.setFixedWidth(90) hlay_1.addWidget(self.generate_int_iso_button) @@ -422,49 +446,51 @@ class GerberObjectUI(ObjectUI): self.ois_iso = OptionalInputSection(self.follow_cb, [self.generate_int_iso_button, self.generate_ext_iso_button], logic=False) + + grid2 = QtWidgets.QGridLayout() self.custom_box.addLayout(grid2) ## Clear non-copper regions - self.clearcopper_label = QtWidgets.QLabel("Clear N-copper:") + self.clearcopper_label = QtWidgets.QLabel(_("Clear N-copper:")) self.clearcopper_label.setToolTip( - "Create a Geometry object with\n" - "toolpaths to cut all non-copper regions." + _("Create a Geometry object with\n" + "toolpaths to cut all non-copper regions.") ) self.clearcopper_label.setFixedWidth(90) grid2.addWidget(self.clearcopper_label, 0, 0) - self.generate_ncc_button = QtWidgets.QPushButton('NCC Tool') + self.generate_ncc_button = QtWidgets.QPushButton(_('NCC Tool')) self.generate_ncc_button.setToolTip( - "Create the Geometry Object\n" - "for non-copper routing." + _("Create the Geometry Object\n" + "for non-copper routing.") ) grid2.addWidget(self.generate_ncc_button, 0, 1) ## Board cutout - self.board_cutout_label = QtWidgets.QLabel("Board cutout:") + self.board_cutout_label = QtWidgets.QLabel(_("Board cutout:")) self.board_cutout_label.setToolTip( - "Create toolpaths to cut around\n" + _("Create toolpaths to cut around\n" "the PCB and separate it from\n" - "the original board." + "the original board.") ) grid2.addWidget(self.board_cutout_label, 1, 0) - self.generate_cutout_button = QtWidgets.QPushButton('Cutout Tool') + self.generate_cutout_button = QtWidgets.QPushButton(_('Cutout Tool')) self.generate_cutout_button.setToolTip( - "Generate the geometry for\n" - "the board cutout." + _("Generate the geometry for\n" + "the board cutout.") ) grid2.addWidget(self.generate_cutout_button, 1, 1) ## Non-copper regions - self.noncopper_label = QtWidgets.QLabel("Non-copper regions:") + self.noncopper_label = QtWidgets.QLabel(_("Non-copper regions:")) self.noncopper_label.setToolTip( - "Create polygons covering the\n" + _("Create polygons covering the\n" "areas without copper on the PCB.\n" "Equivalent to the inverse of this\n" "object. Can be used to remove all\n" - "copper from a specified region." + "copper from a specified region.") ) self.custom_box.addWidget(self.noncopper_label) @@ -472,12 +498,12 @@ class GerberObjectUI(ObjectUI): self.custom_box.addLayout(grid4) # Margin - bmlabel = QtWidgets.QLabel('Boundary Margin:') + bmlabel = QtWidgets.QLabel(_('Boundary Margin:')) bmlabel.setToolTip( - "Specify the edge of the PCB\n" + _("Specify the edge of the PCB\n" "by drawing a box around all\n" "objects with this minimum\n" - "distance." + "distance.") ) bmlabel.setFixedWidth(90) grid4.addWidget(bmlabel, 0, 0) @@ -485,50 +511,50 @@ class GerberObjectUI(ObjectUI): grid4.addWidget(self.noncopper_margin_entry, 0, 1) # Rounded corners - self.noncopper_rounded_cb = FCCheckBox(label="Rounded Geo") + self.noncopper_rounded_cb = FCCheckBox(label=_("Rounded Geo")) self.noncopper_rounded_cb.setToolTip( - "Resulting geometry will have rounded corners." + _("Resulting geometry will have rounded corners.") ) self.noncopper_rounded_cb.setFixedWidth(90) grid4.addWidget(self.noncopper_rounded_cb, 1, 0) - self.generate_noncopper_button = QtWidgets.QPushButton('Generate Geo') + self.generate_noncopper_button = QtWidgets.QPushButton(_('Generate Geo')) grid4.addWidget(self.generate_noncopper_button, 1, 1) ## Bounding box - self.boundingbox_label = QtWidgets.QLabel('Bounding Box:') + self.boundingbox_label = QtWidgets.QLabel(_('Bounding Box:')) self.boundingbox_label.setToolTip( - "Create a geometry surrounding the Gerber object.\n" - "Square shape." + _("Create a geometry surrounding the Gerber object.\n" + "Square shape.") ) self.custom_box.addWidget(self.boundingbox_label) grid5 = QtWidgets.QGridLayout() self.custom_box.addLayout(grid5) - bbmargin = QtWidgets.QLabel('Boundary Margin:') + bbmargin = QtWidgets.QLabel(_('Boundary Margin:')) bbmargin.setToolTip( - "Distance of the edges of the box\n" - "to the nearest polygon." + _("Distance of the edges of the box\n" + "to the nearest polygon.") ) bbmargin.setFixedWidth(90) grid5.addWidget(bbmargin, 0, 0) self.bbmargin_entry = LengthEntry() grid5.addWidget(self.bbmargin_entry, 0, 1) - self.bbrounded_cb = FCCheckBox(label="Rounded Geo") + self.bbrounded_cb = FCCheckBox(label=_("Rounded Geo")) self.bbrounded_cb.setToolTip( - "If the bounding box is \n" + _("If the bounding box is \n" "to have rounded corners\n" "their radius is equal to\n" - "the margin." + "the margin.") ) self.bbrounded_cb.setFixedWidth(90) grid5.addWidget(self.bbrounded_cb, 1, 0) - self.generate_bb_button = QtWidgets.QPushButton('Generate Geo') + self.generate_bb_button = QtWidgets.QPushButton(_('Generate Geo')) self.generate_bb_button.setToolTip( - "Generate the Geometry object." + _("Generate the Geometry object.") ) grid5.addWidget(self.generate_bb_button, 1, 1) @@ -539,7 +565,7 @@ class ExcellonObjectUI(ObjectUI): """ def __init__(self, parent=None): - ObjectUI.__init__(self, title='Excellon Object', + ObjectUI.__init__(self, title=_('Excellon Object'), icon_file='share/drill32.png', parent=parent) @@ -547,10 +573,10 @@ class ExcellonObjectUI(ObjectUI): hlay_plot = QtWidgets.QHBoxLayout() self.custom_box.addLayout(hlay_plot) - self.plot_options_label = QtWidgets.QLabel("Plot Options:") - self.solid_cb = FCCheckBox(label='Solid') + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) + self.solid_cb = FCCheckBox(label=_('Solid')) self.solid_cb.setToolTip( - "Solid circles." + _("Solid circles.") ) hlay_plot.addWidget(self.plot_options_label) hlay_plot.addStretch() @@ -559,7 +585,7 @@ class ExcellonObjectUI(ObjectUI): ## Object name self.name_hlay = QtWidgets.QHBoxLayout() self.custom_box.addLayout(self.name_hlay) - name_label = QtWidgets.QLabel("Name:") + name_label = QtWidgets.QLabel(_("Name:")) self.name_entry = FCEntry() self.name_entry.setFocusPolicy(QtCore.Qt.StrongFocus) self.name_hlay.addWidget(name_label) @@ -578,17 +604,17 @@ class ExcellonObjectUI(ObjectUI): self.tools_box.addLayout(hlay_plot) #### Tools Drills #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel(_('Tools Table')) self.tools_table_label.setToolTip( - "Tools in this Excellon object\n" - "when are used for drilling." + _("Tools in this Excellon object\n" + "when are used for drilling.") ) hlay_plot.addWidget(self.tools_table_label) # Plot CB - self.plot_cb = FCCheckBox('Plot Object') + self.plot_cb = FCCheckBox(_('Plot Object')) self.plot_cb.setToolTip( - "Plot (show) this object." + _("Plot (show) this object.") ) self.plot_cb.setLayoutDirection(QtCore.Qt.RightToLeft) hlay_plot.addStretch() @@ -598,37 +624,38 @@ class ExcellonObjectUI(ObjectUI): self.tools_box.addWidget(self.tools_table) self.tools_table.setColumnCount(6) - self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', 'Drills', 'Slots', 'Offset Z', 'P']) + self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), _('Drills'), _('Slots'), + _('Offset Z'), 'P']) self.tools_table.setSortingEnabled(False) self.tools_table.horizontalHeaderItem(0).setToolTip( - "This is the Tool Number.\n" + _("This is the Tool Number.\n" "When ToolChange is checked, on toolchange event this value\n" - "will be showed as a T1, T2 ... Tn in the Machine Code.") + "will be showed as a T1, T2 ... Tn in the Machine Code.")) self.tools_table.horizontalHeaderItem(1).setToolTip( - "Tool Diameter. It's value (in current FlatCAM units) \n" - "is the cut width into the material.") + _("Tool Diameter. It's value (in current FlatCAM units) \n" + "is the cut width into the material.")) self.tools_table.horizontalHeaderItem(2).setToolTip( - "The number of Drill holes. Holes that are drilled with\n" - "a drill bit.") + _("The number of Drill holes. Holes that are drilled with\n" + "a drill bit.")) self.tools_table.horizontalHeaderItem(3).setToolTip( - "The number of Slot holes. Holes that are created by\n" - "milling them with an endmill bit.") + _("The number of Slot holes. Holes that are created by\n" + "milling them with an endmill bit.")) self.tools_table.horizontalHeaderItem(4).setToolTip( - "Some drill bits (the larger ones) need to drill deeper\n" + _("Some drill bits (the larger ones) need to drill deeper\n" "to create the desired exit hole diameter due of the tip shape.\n" - "The value here can compensate the Cut Z parameter.") + "The value here can compensate the Cut Z parameter.")) self.tools_table.horizontalHeaderItem(5).setToolTip( - "Toggle display of the drills for the current tool.") + _("Toggle display of the drills for the current tool.")) self.empty_label = QtWidgets.QLabel('') self.tools_box.addWidget(self.empty_label) #### Create CNC Job #### - self.cncjob_label = QtWidgets.QLabel('Create CNC Job') + self.cncjob_label = QtWidgets.QLabel(_('Create CNC Job')) self.cncjob_label.setToolTip( - "Create a CNC Job object\n" - "for this drill object." + _("Create a CNC Job object\n" + "for this drill object.") ) self.tools_box.addWidget(self.cncjob_label) @@ -636,38 +663,38 @@ class ExcellonObjectUI(ObjectUI): self.tools_box.addLayout(grid1) # Cut Z - cutzlabel = QtWidgets.QLabel('Cut Z:') + cutzlabel = QtWidgets.QLabel(_('Cut Z:')) cutzlabel.setToolTip( - "Drill depth (negative)\n" - "below the copper surface." + _("Drill depth (negative)\n" + "below the copper surface.") ) grid1.addWidget(cutzlabel, 0, 0) self.cutz_entry = LengthEntry() grid1.addWidget(self.cutz_entry, 0, 1) # Travel Z (z_move) - travelzlabel = QtWidgets.QLabel('Travel Z:') + travelzlabel = QtWidgets.QLabel(_('Travel Z:')) travelzlabel.setToolTip( - "Tool height when travelling\n" - "across the XY plane." + _("Tool height when travelling\n" + "across the XY plane.") ) grid1.addWidget(travelzlabel, 1, 0) self.travelz_entry = LengthEntry() grid1.addWidget(self.travelz_entry, 1, 1) # Tool change: - self.toolchange_cb = FCCheckBox("Tool change") + self.toolchange_cb = FCCheckBox(_("Tool change")) self.toolchange_cb.setToolTip( - "Include tool-change sequence\n" - "in G-Code (Pause for tool change)." + _("Include tool-change sequence\n" + "in G-Code (Pause for tool change).") ) grid1.addWidget(self.toolchange_cb, 2, 0) # Tool change Z: - toolchzlabel = QtWidgets.QLabel("Tool change Z:") + toolchzlabel = QtWidgets.QLabel(_("Tool change Z:")) toolchzlabel.setToolTip( - "Z-axis position (height) for\n" - "tool change." + _("Z-axis position (height) for\n" + "tool change.") ) grid1.addWidget(toolchzlabel, 3, 0) self.toolchangez_entry = LengthEntry() @@ -675,66 +702,69 @@ class ExcellonObjectUI(ObjectUI): self.ois_tcz_e = OptionalInputSection(self.toolchange_cb, [self.toolchangez_entry]) # Start move Z: - self.estartz_label = QtWidgets.QLabel("Start move Z:") + self.estartz_label = QtWidgets.QLabel(_("Start move Z:")) self.estartz_label.setToolTip( - "Tool height just before starting the work.\n" - "Delete the value if you don't need this feature." + _("Tool height just before starting the work.\n" + "Delete the value if you don't need this feature.") ) grid1.addWidget(self.estartz_label, 4, 0) self.estartz_entry = FloatEntry() grid1.addWidget(self.estartz_entry, 4, 1) # End move Z: - self.eendz_label = QtWidgets.QLabel("End move Z:") + self.eendz_label = QtWidgets.QLabel(_("End move Z:")) self.eendz_label.setToolTip( - "Z-axis position (height) for\n" - "the last move." + _("Z-axis position (height) for\n" + "the last move.") ) grid1.addWidget(self.eendz_label, 5, 0) self.eendz_entry = LengthEntry() grid1.addWidget(self.eendz_entry, 5, 1) # Excellon Feedrate - frlabel = QtWidgets.QLabel('Feedrate (Plunge):') + frlabel = QtWidgets.QLabel(_('Feedrate (Plunge):')) frlabel.setToolTip( - "Tool speed while drilling\n" + _("Tool speed while drilling\n" "(in units per minute).\n" - "This is for linear move G01." + "This is for linear move G01.") ) grid1.addWidget(frlabel, 6, 0) self.feedrate_entry = LengthEntry() grid1.addWidget(self.feedrate_entry, 6, 1) # Excellon Rapid Feedrate - self.feedrate_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + self.feedrate_rapid_label = QtWidgets.QLabel(_('Feedrate Rapids:')) self.feedrate_rapid_label.setToolTip( - "Tool speed while drilling\n" - "(in units per minute).\n" - "This is for the rapid move G00." + _("Tool speed while drilling\n" + "(in units per minute).\n" + "This is for the rapid move G00.\n" + "It is useful only for Marlin,\n" + "ignore for any other cases." + ) ) grid1.addWidget(self.feedrate_rapid_label, 7, 0) self.feedrate_rapid_entry = LengthEntry() grid1.addWidget(self.feedrate_rapid_entry, 7, 1) # Spindlespeed - spdlabel = QtWidgets.QLabel('Spindle speed:') + spdlabel = QtWidgets.QLabel(_('Spindle speed:')) spdlabel.setToolTip( - "Speed of the spindle\n" - "in RPM (optional)" + _("Speed of the spindle\n" + "in RPM (optional)") ) grid1.addWidget(spdlabel, 8, 0) self.spindlespeed_entry = IntEntry(allow_empty=True) grid1.addWidget(self.spindlespeed_entry, 8, 1) # Dwell - self.dwell_cb = FCCheckBox('Dwell:') + self.dwell_cb = FCCheckBox(_('Dwell:')) self.dwell_cb.setToolTip( - "Pause to allow the spindle to reach its\n" - "speed before cutting." + _("Pause to allow the spindle to reach its\n" + "speed before cutting.") ) self.dwelltime_entry = FCEntry() self.dwelltime_entry.setToolTip( - "Number of milliseconds for spindle to dwell." + _("Number of milliseconds for spindle to dwell.") ) grid1.addWidget(self.dwell_cb, 9, 0) grid1.addWidget(self.dwelltime_entry, 9, 1) @@ -742,10 +772,10 @@ class ExcellonObjectUI(ObjectUI): self.ois_dwell = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry]) # postprocessor selection - pp_excellon_label = QtWidgets.QLabel("Postprocessor:") + pp_excellon_label = QtWidgets.QLabel(_("Postprocessor:")) pp_excellon_label.setToolTip( - "The json file that dictates\n" - "gcode output." + _("The json file that dictates\n" + "gcode output.") ) self.pp_excellon_name_cb = FCComboBox() self.pp_excellon_name_cb.setFocusPolicy(QtCore.Qt.StrongFocus) @@ -753,10 +783,10 @@ class ExcellonObjectUI(ObjectUI): grid1.addWidget(self.pp_excellon_name_cb, 10, 1) # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label = QtWidgets.QLabel(_("Probe Z depth:")) self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." + _("The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units.") ) grid1.addWidget(self.pdepth_label, 11, 0) self.pdepth_entry = FCEntry() @@ -765,9 +795,9 @@ class ExcellonObjectUI(ObjectUI): self.pdepth_entry.setVisible(False) # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label = QtWidgets.QLabel(_("Feedrate Probe:")) self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." + _("The feedrate used while the probe is probing.") ) grid1.addWidget(self.feedrate_probe_label, 12, 0) self.feedrate_probe_entry = FCEntry() @@ -776,23 +806,23 @@ class ExcellonObjectUI(ObjectUI): self.feedrate_probe_entry.setVisible(False) choose_tools_label = QtWidgets.QLabel( - "Select from the Tools Table above\n" - "the tools you want to include." + _("Select from the Tools Table above\n" + "the tools you want to include.") ) self.tools_box.addWidget(choose_tools_label) #### Choose what to use for Gcode creation: Drills, Slots or Both gcode_box = QtWidgets.QFormLayout() - gcode_type_label = QtWidgets.QLabel('Type: ') + gcode_type_label = QtWidgets.QLabel(_('Type: ')) gcode_type_label.setToolTip( - "Choose what to use for GCode generation:\n" + _("Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" "When choosing 'Slots' or 'Both', slots will be\n" - "converted to a series of drills." + "converted to a series of drills.") ) - self.excellon_gcode_type_radio = RadioSet([{'label': 'Drills', 'value': 'drills'}, - {'label': 'Slots', 'value': 'slots'}, - {'label': 'Both', 'value': 'both'}]) + self.excellon_gcode_type_radio = RadioSet([{'label': _('Drills'), 'value': 'drills'}, + {'label': _('Slots'), 'value': 'slots'}, + {'label': _('Both'), 'value': 'both'}]) gcode_box.addRow(gcode_type_label, self.excellon_gcode_type_radio) self.tools_box.addLayout(gcode_box) @@ -800,54 +830,54 @@ class ExcellonObjectUI(ObjectUI): self.excellon_gcode_type_radio.setVisible(False) gcode_type_label.hide() - self.generate_cnc_button = QtWidgets.QPushButton('Create GCode') + self.generate_cnc_button = QtWidgets.QPushButton(_('Create GCode')) self.generate_cnc_button.setToolTip( - "Generate the CNC Job." + _("Generate the CNC Job.") ) self.tools_box.addWidget(self.generate_cnc_button) #### Milling Holes Drills#### - self.mill_hole_label = QtWidgets.QLabel('Mill Holes') + self.mill_hole_label = QtWidgets.QLabel(_('Mill Holes')) self.mill_hole_label.setToolTip( - "Create Geometry for milling holes." + _("Create Geometry for milling holes.") ) self.tools_box.addWidget(self.mill_hole_label) self.choose_tools_label2 = QtWidgets.QLabel( - "Select from the Tools Table above\n" - " the hole dias that are to be milled." + _("Select from the Tools Table above\n" + " the hole dias that are to be milled.") ) self.tools_box.addWidget(self.choose_tools_label2) grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) - self.tdlabel = QtWidgets.QLabel('Drills Tool dia:') + self.tdlabel = QtWidgets.QLabel(_('Drills Tool dia:')) self.tdlabel.setToolTip( - "Diameter of the cutting tool." + _("Diameter of the cutting tool.") ) grid2.addWidget(self.tdlabel, 0, 0) self.tooldia_entry = LengthEntry() grid2.addWidget(self.tooldia_entry, 0, 1) - self.generate_milling_button = QtWidgets.QPushButton('Mill Drills Geo') + self.generate_milling_button = QtWidgets.QPushButton(_('Mill Drills Geo')) self.generate_milling_button.setToolTip( - "Create the Geometry Object\n" - "for milling DRILLS toolpaths." + _("Create the Geometry Object\n" + "for milling DRILLS toolpaths.") ) grid2.addWidget(self.generate_milling_button, 0, 2) grid3 = QtWidgets.QGridLayout() self.custom_box.addLayout(grid3) - self.stdlabel = QtWidgets.QLabel('Slots Tool dia:') + self.stdlabel = QtWidgets.QLabel(_('Slots Tool dia:')) self.stdlabel.setToolTip( - "Diameter of the cutting tool." + _("Diameter of the cutting tool.") ) grid3.addWidget(self.stdlabel, 0, 0) self.slot_tooldia_entry = LengthEntry() grid3.addWidget(self.slot_tooldia_entry, 0, 1) - self.generate_milling_slots_button = QtWidgets.QPushButton('Mill Slots Geo') + self.generate_milling_slots_button = QtWidgets.QPushButton(_('Mill Slots Geo')) self.generate_milling_slots_button.setToolTip( - "Create the Geometry Object\n" - "for milling SLOTS toolpaths." + _("Create the Geometry Object\n" + "for milling SLOTS toolpaths.") ) grid3.addWidget(self.generate_milling_slots_button, 0, 2) @@ -864,16 +894,17 @@ class GeometryObjectUI(ObjectUI): """ def __init__(self, parent=None): - super(GeometryObjectUI, self).__init__(title='Geometry Object', icon_file='share/geometry32.png', parent=parent) + super(GeometryObjectUI, self).__init__(title=_('Geometry Object'), + icon_file='share/geometry32.png', parent=parent) # Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.custom_box.addWidget(self.plot_options_label) ## Object name self.name_hlay = QtWidgets.QHBoxLayout() self.custom_box.addLayout(self.name_hlay) - name_label = QtWidgets.QLabel("Name:") + name_label = QtWidgets.QLabel(_("Name:")) self.name_entry = FCEntry() self.name_entry.setFocusPolicy(QtCore.Qt.StrongFocus) self.name_hlay.addWidget(name_label) @@ -892,9 +923,9 @@ class GeometryObjectUI(ObjectUI): self.geo_tools_box.addLayout(hlay_plot) #### Tools #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel(_('Tools Table')) self.tools_table_label.setToolTip( - "Tools in this Geometry object used for cutting.\n" + _("Tools in this Geometry object used for cutting.\n" "The 'Offset' entry will set an offset for the cut.\n" "'Offset' can be inside, outside, on path (none) and custom.\n" "'Type' entry is only informative and it allow to know the \n" @@ -905,15 +936,15 @@ class GeometryObjectUI(ObjectUI): "When V-shaped is selected the 'Type' entry is automatically \n" "set to Isolation, the CutZ parameter in the UI form is\n" "grayed out and Cut Z is automatically calculated from the newly \n" - "showed UI form entries named V-Tip Dia and V-Tip Angle." + "showed UI form entries named V-Tip Dia and V-Tip Angle.") ) hlay_plot.addWidget(self.tools_table_label) # Plot CB # self.plot_cb = QtWidgets.QCheckBox('Plot') - self.plot_cb = FCCheckBox('Plot Object') + self.plot_cb = FCCheckBox(_('Plot Object')) self.plot_cb.setToolTip( - "Plot (show) this object." + _("Plot (show) this object.") ) self.plot_cb.setLayoutDirection(QtCore.Qt.RightToLeft) hlay_plot.addStretch() @@ -925,44 +956,56 @@ class GeometryObjectUI(ObjectUI): self.geo_tools_table.setColumnCount(7) self.geo_tools_table.setColumnWidth(0, 20) - self.geo_tools_table.setHorizontalHeaderLabels(['#', 'Dia', 'Offset', 'Type', 'TT', '', 'P']) + self.geo_tools_table.setHorizontalHeaderLabels(['#', _('Dia'), _('Offset'), _('Type'), _('TT'), '', 'P']) self.geo_tools_table.setColumnHidden(5, True) # stylesheet = "::section{Background-color:rgb(239,239,245)}" # self.geo_tools_table.horizontalHeader().setStyleSheet(stylesheet) self.geo_tools_table.horizontalHeaderItem(0).setToolTip( - "This is the Tool Number.\n" - "When ToolChange is checked, on toolchange event this value\n" - "will be showed as a T1, T2 ... Tn") + _( + "This is the Tool Number.\n" + "When ToolChange is checked, on toolchange event this value\n" + "will be showed as a T1, T2 ... Tn") + ) self.geo_tools_table.horizontalHeaderItem(1).setToolTip( - "Tool Diameter. It's value (in current FlatCAM units) \n" - "is the cut width into the material.") + _( + "Tool Diameter. It's value (in current FlatCAM units) \n" + "is the cut width into the material." + )) self.geo_tools_table.horizontalHeaderItem(2).setToolTip( - "The value for the Offset can be:\n" - "- Path -> There is no offset, the tool cut will be done through the geometry line.\n" - "- In(side) -> The tool cut will follow the geometry inside. It will create a 'pocket'.\n" - "- Out(side) -> The tool cut will follow the geometry line on the outside.") + _( + "The value for the Offset can be:\n" + "- Path -> There is no offset, the tool cut will be done through the geometry line.\n" + "- In(side) -> The tool cut will follow the geometry inside. It will create a 'pocket'.\n" + "- Out(side) -> The tool cut will follow the geometry line on the outside." + )) self.geo_tools_table.horizontalHeaderItem(3).setToolTip( - "The (Operation) Type has only informative value. Usually the UI form values \n" - "are choosed based on the operation type and this will serve as a reminder.\n" - "Can be 'Roughing', 'Finishing' or 'Isolation'.\n" - "For Roughing we may choose a lower Feedrate and multiDepth cut.\n" - "For Finishing we may choose a higher Feedrate, without multiDepth.\n" - "For Isolation we need a lower Feedrate as it use a milling bit with a fine tip.") + _( + "The (Operation) Type has only informative value. Usually the UI form values \n" + "are choosed based on the operation type and this will serve as a reminder.\n" + "Can be 'Roughing', 'Finishing' or 'Isolation'.\n" + "For Roughing we may choose a lower Feedrate and multiDepth cut.\n" + "For Finishing we may choose a higher Feedrate, without multiDepth.\n" + "For Isolation we need a lower Feedrate as it use a milling bit with a fine tip." + )) self.geo_tools_table.horizontalHeaderItem(4).setToolTip( - "The Tool Type (TT) can be:\n" - "- Circular with 1 ... 4 teeth -> it is informative only. Being circular the cut width in material\n" - "is exactly the tool diameter.\n" - "- Ball -> informative only and make reference to the Ball type endmill.\n" - "- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable two additional UI form\n" - "fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such\n" - "as the cut width into material will be equal with the value in the Tool Diameter column of this table.\n" - "Choosing the V-Shape Tool Type automatically will select the Operation Type as Isolation.") + _( + "The Tool Type (TT) can be:\n" + "- Circular with 1 ... 4 teeth -> it is informative only. Being circular the cut width in material\n" + "is exactly the tool diameter.\n" + "- Ball -> informative only and make reference to the Ball type endmill.\n" + "- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable two additional UI form\n" + "fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such\n" + "as the cut width into material will be equal with the value in the Tool Diameter column of this table.\n" + "Choosing the V-Shape Tool Type automatically will select the Operation Type as Isolation." + )) self.geo_tools_table.horizontalHeaderItem(6).setToolTip( - "Plot column. It is visible only for MultiGeo geometries, meaning geometries that holds the geometry\n" - "data into the tools. For those geometries, deleting the tool will delete the geometry data also,\n" - "so be WARNED. From the checkboxes on each row it can be enabled/disabled the plot on canvas\n" - "for the corresponding tool.") + _( + "Plot column. It is visible only for MultiGeo geometries, meaning geometries that holds the geometry\n" + "data into the tools. For those geometries, deleting the tool will delete the geometry data also,\n" + "so be WARNED. From the checkboxes on each row it can be enabled/disabled the plot on canvas\n" + "for the corresponding tool." + )) # self.geo_tools_table.setSortingEnabled(False) # self.geo_tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) @@ -971,12 +1014,14 @@ class GeometryObjectUI(ObjectUI): self.grid1 = QtWidgets.QGridLayout() self.geo_tools_box.addLayout(self.grid1) - self.tool_offset_lbl = QtWidgets.QLabel('Tool Offset:') + self.tool_offset_lbl = QtWidgets.QLabel(_('Tool Offset:')) self.tool_offset_lbl.setToolTip( - "The value to offset the cut when \n" - "the Offset type selected is 'Offset'.\n" - "The value can be positive for 'outside'\n" - "cut and negative for 'inside' cut." + _( + "The value to offset the cut when \n" + "the Offset type selected is 'Offset'.\n" + "The value can be positive for 'outside'\n" + "cut and negative for 'inside' cut." + ) ) self.grid1.addWidget(self.tool_offset_lbl, 0, 0) self.tool_offset_entry = FloatEntry() @@ -995,9 +1040,11 @@ class GeometryObjectUI(ObjectUI): # self.addtool_label.setToolTip( # "Add/Copy/Delete a tool to the tool list." # ) - self.addtool_entry_lbl = QtWidgets.QLabel('Tool Dia:') + self.addtool_entry_lbl = QtWidgets.QLabel(_('Tool Dia:')) self.addtool_entry_lbl.setToolTip( - "Diameter for the new tool" + _( + "Diameter for the new tool" + ) ) self.addtool_entry = FCEntry() @@ -1009,22 +1056,28 @@ class GeometryObjectUI(ObjectUI): grid2 = QtWidgets.QGridLayout() self.geo_tools_box.addLayout(grid2) - self.addtool_btn = QtWidgets.QPushButton('Add') + self.addtool_btn = QtWidgets.QPushButton(_('Add')) self.addtool_btn.setToolTip( - "Add a new tool to the Tool Table\n" - "with the diameter specified above." + _( + "Add a new tool to the Tool Table\n" + "with the diameter specified above." + ) ) - self.copytool_btn = QtWidgets.QPushButton('Copy') + self.copytool_btn = QtWidgets.QPushButton(_('Copy')) self.copytool_btn.setToolTip( - "Copy a selection of tools in the Tool Table\n" - "by first selecting a row in the Tool Table." + _( + "Copy a selection of tools in the Tool Table\n" + "by first selecting a row in the Tool Table." + ) ) - self.deltool_btn = QtWidgets.QPushButton('Delete') + self.deltool_btn = QtWidgets.QPushButton(_('Delete')) self.deltool_btn.setToolTip( - "Delete a selection of tools in the Tool Table\n" - "by first selecting a row in the Tool Table." + _( + "Delete a selection of tools in the Tool Table\n" + "by first selecting a row in the Tool Table." + ) ) grid2.addWidget(self.addtool_btn, 0, 0) @@ -1038,10 +1091,12 @@ class GeometryObjectUI(ObjectUI): # Create CNC Job #----------------------------------- #### Tools Data #### - self.tool_data_label = QtWidgets.QLabel('Tool Data') + self.tool_data_label = QtWidgets.QLabel(_('Tool Data')) self.tool_data_label.setToolTip( - "The data used for creating GCode.\n" - "Each tool store it's own set of such data." + _( + "The data used for creating GCode.\n" + "Each tool store it's own set of such data." + ) ) self.geo_tools_box.addWidget(self.tool_data_label) @@ -1049,59 +1104,71 @@ class GeometryObjectUI(ObjectUI): self.geo_tools_box.addLayout(self.grid3) # Tip Dia - self.tipdialabel = QtWidgets.QLabel('V-Tip Dia:') + self.tipdialabel = QtWidgets.QLabel(_('V-Tip Dia:')) self.tipdialabel.setToolTip( - "The tip diameter for V-Shape Tool" + _( + "The tip diameter for V-Shape Tool" + ) ) self.grid3.addWidget(self.tipdialabel, 1, 0) self.tipdia_entry = LengthEntry() self.grid3.addWidget(self.tipdia_entry, 1, 1) # Tip Angle - self.tipanglelabel = QtWidgets.QLabel('V-Tip Angle:') + self.tipanglelabel = QtWidgets.QLabel(_('V-Tip Angle:')) self.tipanglelabel.setToolTip( - "The tip angle for V-Shape Tool.\n" - "In degree." + _( + "The tip angle for V-Shape Tool.\n" + "In degree." + ) ) self.grid3.addWidget(self.tipanglelabel, 2, 0) self.tipangle_entry = LengthEntry() self.grid3.addWidget(self.tipangle_entry, 2, 1) # Cut Z - cutzlabel = QtWidgets.QLabel('Cut Z:') + cutzlabel = QtWidgets.QLabel(_('Cut Z:')) cutzlabel.setToolTip( - "Cutting depth (negative)\n" - "below the copper surface." + _( + "Cutting depth (negative)\n" + "below the copper surface." + ) ) self.grid3.addWidget(cutzlabel, 3, 0) self.cutz_entry = LengthEntry() self.grid3.addWidget(self.cutz_entry, 3, 1) # Multi-pass - self.mpass_cb = FCCheckBox("Multi-Depth:") + self.mpass_cb = FCCheckBox(_("Multi-Depth:")) self.mpass_cb.setToolTip( - "Use multiple passes to limit\n" - "the cut depth in each pass. Will\n" - "cut multiple times until Cut Z is\n" - "reached.\n" - "To the right, input the depth of \n" - "each pass (positive value)." + _( + "Use multiple passes to limit\n" + "the cut depth in each pass. Will\n" + "cut multiple times until Cut Z is\n" + "reached.\n" + "To the right, input the depth of \n" + "each pass (positive value)." + ) ) self.grid3.addWidget(self.mpass_cb, 4, 0) self.maxdepth_entry = LengthEntry() self.maxdepth_entry.setToolTip( - "Depth of each pass (positive)." + _( + "Depth of each pass (positive)." + ) ) self.grid3.addWidget(self.maxdepth_entry, 4, 1) self.ois_mpass_geo = OptionalInputSection(self.mpass_cb, [self.maxdepth_entry]) # Travel Z - travelzlabel = QtWidgets.QLabel('Travel Z:') + travelzlabel = QtWidgets.QLabel(_('Travel Z:')) travelzlabel.setToolTip( - "Height of the tool when\n" - "moving without cutting." + _( + "Height of the tool when\n" + "moving without cutting." + ) ) self.grid3.addWidget(travelzlabel, 5, 0) self.travelz_entry = LengthEntry() @@ -1109,15 +1176,19 @@ class GeometryObjectUI(ObjectUI): # Tool change: - self.toolchzlabel = QtWidgets.QLabel("Tool change Z:") + self.toolchzlabel = QtWidgets.QLabel(_("Tool change Z:")) self.toolchzlabel.setToolTip( - "Z-axis position (height) for\n" - "tool change." + _( + "Z-axis position (height) for\n" + "tool change." + ) ) - self.toolchangeg_cb = FCCheckBox("Tool change") + self.toolchangeg_cb = FCCheckBox(_("Tool change")) self.toolchangeg_cb.setToolTip( - "Include tool-change sequence\n" - "in the Machine Code (Pause for tool change)." + _( + "Include tool-change sequence\n" + "in the Machine Code (Pause for tool change)." + ) ) self.toolchangez_entry = LengthEntry() @@ -1138,76 +1209,95 @@ class GeometryObjectUI(ObjectUI): # self.grid3.addWidget(self.gstartz_entry, 8, 1) # The Z value for the end move - self.endzlabel = QtWidgets.QLabel('End move Z:') + self.endzlabel = QtWidgets.QLabel(_('End move Z:')) self.endzlabel.setToolTip( - "This is the height (Z) at which the CNC\n" - "will go as the last move." + _( + "This is the height (Z) at which the CNC\n" + "will go as the last move." + ) ) self.grid3.addWidget(self.endzlabel, 9, 0) self.gendz_entry = LengthEntry() self.grid3.addWidget(self.gendz_entry, 9, 1) # Feedrate X-Y - frlabel = QtWidgets.QLabel('Feed Rate X-Y:') + frlabel = QtWidgets.QLabel(_('Feed Rate X-Y:')) frlabel.setToolTip( - "Cutting speed in the XY\n" - "plane in units per minute" + _( + "Cutting speed in the XY\n" + "plane in units per minute" + ) ) self.grid3.addWidget(frlabel, 10, 0) self.cncfeedrate_entry = LengthEntry() self.grid3.addWidget(self.cncfeedrate_entry, 10, 1) # Feedrate Z (Plunge) - frzlabel = QtWidgets.QLabel('Feed Rate Z (Plunge):') + frzlabel = QtWidgets.QLabel(_('Feed Rate Z (Plunge):')) frzlabel.setToolTip( - "Cutting speed in the Z\n" - "plane in units per minute" + _( + "Cutting speed in the Z\n" + "plane in units per minute" + ) ) self.grid3.addWidget(frzlabel, 11, 0) self.cncplunge_entry = LengthEntry() self.grid3.addWidget(self.cncplunge_entry, 11, 1) # Feedrate rapids - self.fr_rapidlabel = QtWidgets.QLabel('Feed Rate Rapids:') + self.fr_rapidlabel = QtWidgets.QLabel(_('Feed Rate Rapids:')) self.fr_rapidlabel.setToolTip( - "Cutting speed in the XY\n" - "plane in units per minute\n" - "for the rapid movements" + _( + "Cutting speed in the XY\n" + "plane in units per minute\n" + "(in units per minute).\n" + "This is for the rapid move G00.\n" + "It is useful only for Marlin,\n" + "ignore for any other cases." + ) ) self.grid3.addWidget(self.fr_rapidlabel, 12, 0) self.cncfeedrate_rapid_entry = LengthEntry() self.grid3.addWidget(self.cncfeedrate_rapid_entry, 12, 1) # Cut over 1st point in path - self.extracut_cb = FCCheckBox('Cut over 1st pt') + self.extracut_cb = FCCheckBox(_('Cut over 1st pt')) self.extracut_cb.setToolTip( - "In order to remove possible\n" - "copper leftovers where first cut\n" - "meet with last cut, we generate an\n" - "extended cut over the first cut section." + _( + "In order to remove possible\n" + "copper leftovers where first cut\n" + "meet with last cut, we generate an\n" + "extended cut over the first cut section." + ) ) self.grid3.addWidget(self.extracut_cb, 13, 0) # Spindlespeed - spdlabel = QtWidgets.QLabel('Spindle speed:') + spdlabel = QtWidgets.QLabel(_('Spindle speed:')) spdlabel.setToolTip( - "Speed of the spindle in RPM (optional).\n" - "If LASER postprocessor is used,\n" - "this value is the power of laser." + _( + "Speed of the spindle in RPM (optional).\n" + "If LASER postprocessor is used,\n" + "this value is the power of laser." + ) ) self.grid3.addWidget(spdlabel, 14, 0) self.cncspindlespeed_entry = IntEntry(allow_empty=True) self.grid3.addWidget(self.cncspindlespeed_entry, 14, 1) # Dwell - self.dwell_cb = FCCheckBox('Dwell:') + self.dwell_cb = FCCheckBox(_('Dwell:')) self.dwell_cb.setToolTip( - "Pause to allow the spindle to reach its\n" - "speed before cutting." + _( + "Pause to allow the spindle to reach its\n" + "speed before cutting." + ) ) self.dwelltime_entry = FCEntry() self.dwelltime_entry.setToolTip( - "Number of milliseconds for spindle to dwell." + _( + "Number of milliseconds for spindle to dwell." + ) ) self.grid3.addWidget(self.dwell_cb, 15, 0) self.grid3.addWidget(self.dwelltime_entry, 15, 1) @@ -1215,10 +1305,12 @@ class GeometryObjectUI(ObjectUI): self.ois_dwell_geo = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry]) # postprocessor selection - pp_label = QtWidgets.QLabel("PostProcessor:") + pp_label = QtWidgets.QLabel(_("PostProcessor:")) pp_label.setToolTip( - "The Postprocessor file that dictates\n" - "the Machine Code (like GCode, RML, HPGL) output." + _( + "The Postprocessor file that dictates\n" + "the Machine Code (like GCode, RML, HPGL) output." + ) ) self.grid3.addWidget(pp_label, 16, 0) self.pp_geometry_name_cb = FCComboBox() @@ -1226,10 +1318,12 @@ class GeometryObjectUI(ObjectUI): self.grid3.addWidget(self.pp_geometry_name_cb, 16, 1) # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label = QtWidgets.QLabel(_("Probe Z depth:")) self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." + _( + "The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units." + ) ) self.grid3.addWidget(self.pdepth_label, 17, 0) self.pdepth_entry = FCEntry() @@ -1238,9 +1332,11 @@ class GeometryObjectUI(ObjectUI): self.pdepth_entry.setVisible(False) # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label = QtWidgets.QLabel(_("Feedrate Probe:")) self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." + _( + "The feedrate used while the probe is probing." + ) ) self.grid3.addWidget(self.feedrate_probe_label, 18, 0) self.feedrate_probe_entry = FCEntry() @@ -1249,34 +1345,42 @@ class GeometryObjectUI(ObjectUI): self.feedrate_probe_entry.setVisible(False) warning_lbl = QtWidgets.QLabel( - "Add at least one tool in the tool-table.\n" - "Click the header to select all, or Ctrl + LMB\n" - "for custom selection of tools.") + _( + "Add at least one tool in the tool-table.\n" + "Click the header to select all, or Ctrl + LMB\n" + "for custom selection of tools." + )) self.grid3.addWidget(warning_lbl, 19, 0, 1, 2) # Button - self.generate_cnc_button = QtWidgets.QPushButton('Generate') + self.generate_cnc_button = QtWidgets.QPushButton(_('Generate')) self.generate_cnc_button.setToolTip( - "Generate the CNC Job object." + _( + "Generate the CNC Job object." + ) ) self.geo_tools_box.addWidget(self.generate_cnc_button) #------------------------------ # Paint area #------------------------------ - self.paint_label = QtWidgets.QLabel('Paint Area:') + self.paint_label = QtWidgets.QLabel(_('Paint Area:')) self.paint_label.setToolTip( - "Creates tool paths to cover the\n" - "whole area of a polygon (remove\n" - "all copper). You will be asked\n" - "to click on the desired polygon." + _( + "Creates tool paths to cover the\n" + "whole area of a polygon (remove\n" + "all copper). You will be asked\n" + "to click on the desired polygon." + ) ) self.geo_tools_box.addWidget(self.paint_label) # GO Button - self.paint_tool_button = QtWidgets.QPushButton('Paint Tool') + self.paint_tool_button = QtWidgets.QPushButton(_('Paint Tool')) self.paint_tool_button.setToolTip( - "Launch Paint Tool in Tools Tab." + _( + "Launch Paint Tool in Tools Tab." + ) ) self.geo_tools_box.addWidget(self.paint_tool_button) @@ -1292,7 +1396,7 @@ class CNCObjectUI(ObjectUI): be placed in ``self.custom_box`` to preserve the layout. """ - ObjectUI.__init__(self, title='CNC Job Object', icon_file='share/cnc32.png', parent=parent) + ObjectUI.__init__(self, title=_('CNC Job Object'), icon_file='share/cnc32.png', parent=parent) # Scale and offset ans skew are not available for CNCJob objects. # Hiding from the GUI. @@ -1308,41 +1412,47 @@ class CNCObjectUI(ObjectUI): self.offset_button.hide() ## Plot options - self.plot_options_label = QtWidgets.QLabel("Plot Options:") + self.plot_options_label = QtWidgets.QLabel(_("Plot Options:")) self.custom_box.addWidget(self.plot_options_label) - self.cncplot_method_label = QtWidgets.QLabel("Plot kind:") + self.cncplot_method_label = QtWidgets.QLabel(_("Plot kind:")) self.cncplot_method_label.setToolTip( - "This selects the kind of geometries on the canvas to plot.\n" - "Those can be either of type 'Travel' which means the moves\n" - "above the work piece or it can be of type 'Cut',\n" - "which means the moves that cut into the material." + _( + "This selects the kind of geometries on the canvas to plot.\n" + "Those can be either of type 'Travel' which means the moves\n" + "above the work piece or it can be of type 'Cut',\n" + "which means the moves that cut into the material." + ) ) self.cncplot_method_combo = RadioSet([ - {"label": "All", "value": "all"}, - {"label": "Travel", "value": "travel"}, - {"label": "Cut", "value": "cut"} + {"label": _("All"), "value": "all"}, + {"label": _("Travel"), "value": "travel"}, + {"label": _("Cut"), "value": "cut"} ], stretch=False) ## Object name self.name_hlay = QtWidgets.QHBoxLayout() self.custom_box.addLayout(self.name_hlay) - name_label = QtWidgets.QLabel("Name:") + name_label = QtWidgets.QLabel(_("Name:")) self.name_entry = FCEntry() self.name_entry.setFocusPolicy(QtCore.Qt.StrongFocus) self.name_hlay.addWidget(name_label) self.name_hlay.addWidget(self.name_entry) - self.t_distance_label = QtWidgets.QLabel("Travelled dist.:") + self.t_distance_label = QtWidgets.QLabel(_("Travelled dist.:")) self.t_distance_label.setToolTip( - "This is the total travelled distance on X-Y plane.\n" - "In current units." + _( + "This is the total travelled distance on X-Y plane.\n" + "In current units." + ) ) self.t_distance_entry = FCEntry() self.t_distance_entry.setToolTip( - "This is the total travelled distance on X-Y plane.\n" - "In current units." + _( + "This is the total travelled distance on X-Y plane.\n" + "In current units." + ) ) self.units_label = QtWidgets.QLabel() @@ -1368,25 +1478,29 @@ class CNCObjectUI(ObjectUI): self.custom_box.addLayout(hlay) # CNC Tools Table for plot - self.cnc_tools_table_label = QtWidgets.QLabel('CNC Tools Table') + self.cnc_tools_table_label = QtWidgets.QLabel(_('CNC Tools Table')) self.cnc_tools_table_label.setToolTip( - "Tools in this CNCJob object used for cutting.\n" - "The tool diameter is used for plotting on canvas.\n" - "The 'Offset' entry will set an offset for the cut.\n" - "'Offset' can be inside, outside, on path (none) and custom.\n" - "'Type' entry is only informative and it allow to know the \n" - "intent of using the current tool. \n" - "It can be Rough(ing), Finish(ing) or Iso(lation).\n" - "The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" - "ball(B), or V-Shaped(V)." + _( + "Tools in this CNCJob object used for cutting.\n" + "The tool diameter is used for plotting on canvas.\n" + "The 'Offset' entry will set an offset for the cut.\n" + "'Offset' can be inside, outside, on path (none) and custom.\n" + "'Type' entry is only informative and it allow to know the \n" + "intent of using the current tool. \n" + "It can be Rough(ing), Finish(ing) or Iso(lation).\n" + "The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" + "ball(B), or V-Shaped(V)." + ) ) hlay.addWidget(self.cnc_tools_table_label) # Plot CB # self.plot_cb = QtWidgets.QCheckBox('Plot') - self.plot_cb = FCCheckBox('Plot Object') + self.plot_cb = FCCheckBox(_('Plot Object')) self.plot_cb.setToolTip( - "Plot (show) this object." + _( + "Plot (show) this object." + ) ) self.plot_cb.setLayoutDirection(QtCore.Qt.RightToLeft) hlay.addStretch() @@ -1400,33 +1514,36 @@ class CNCObjectUI(ObjectUI): # self.cnc_tools_table.setColumnHidden(3, True) self.cnc_tools_table.setColumnCount(7) self.cnc_tools_table.setColumnWidth(0, 20) - self.cnc_tools_table.setHorizontalHeaderLabels(['#', 'Dia', 'Offset', 'Type', 'TT', '', 'P']) + self.cnc_tools_table.setHorizontalHeaderLabels(['#', _('Dia'), _('Offset'), _('Type'), _('TT'), '', + _('P')]) self.cnc_tools_table.setColumnHidden(5, True) # stylesheet = "::section{Background-color:rgb(239,239,245)}" # self.cnc_tools_table.horizontalHeader().setStyleSheet(stylesheet) # Update plot button - self.updateplot_button = QtWidgets.QPushButton('Update Plot') + self.updateplot_button = QtWidgets.QPushButton(_('Update Plot')) self.updateplot_button.setToolTip( - "Update the plot." + _("Update the plot.") ) self.custom_box.addWidget(self.updateplot_button) ################## ## Export G-Code ################## - self.export_gcode_label = QtWidgets.QLabel("Export CNC Code:") + self.export_gcode_label = QtWidgets.QLabel(_("Export CNC Code:")) self.export_gcode_label.setToolTip( - "Export and save G-Code to\n" - "make this object to a file." + _("Export and save G-Code to\n" + "make this object to a file.") ) self.custom_box.addWidget(self.export_gcode_label) # Prepend text to GCode - prependlabel = QtWidgets.QLabel('Prepend to CNC Code:') + prependlabel = QtWidgets.QLabel(_('Prepend to CNC Code:')) prependlabel.setToolTip( - "Type here any G-Code commands you would\n" - "like to add to the beginning of the generated file." + _( + "Type here any G-Code commands you would\n" + "like to add to the beginning of the generated file." + ) ) self.custom_box.addWidget(prependlabel) @@ -1434,11 +1551,13 @@ class CNCObjectUI(ObjectUI): self.custom_box.addWidget(self.prepend_text) # Append text to GCode - appendlabel = QtWidgets.QLabel('Append to CNC Code') + appendlabel = QtWidgets.QLabel(_('Append to CNC Code')) appendlabel.setToolTip( - "Type here any G-Code commands you would\n" - "like to append to the generated file.\n" - "I.e.: M2 (End of program)" + _( + "Type here any G-Code commands you would\n" + "like to append to the generated file.\n" + "I.e.: M2 (End of program)" + ) ) self.custom_box.addWidget(appendlabel) @@ -1453,16 +1572,18 @@ class CNCObjectUI(ObjectUI): self.cnc_frame.setLayout(self.cnc_box) # Toolchange Custom G-Code - self.toolchangelabel = QtWidgets.QLabel('Toolchange G-Code:') + self.toolchangelabel = QtWidgets.QLabel(_('Toolchange G-Code:')) self.toolchangelabel.setToolTip( - "Type here any G-Code commands you would\n" - "like to be executed when Toolchange event is encountered.\n" - "This will constitute a Custom Toolchange GCode,\n" - "or a Toolchange Macro.\n" - "The FlatCAM variables are surrounded by '%' symbol.\n\n" - "WARNING: it can be used only with a postprocessor file\n" - "that has 'toolchange_custom' in it's name and this is built\n" - "having as template the 'Toolchange Custom' posprocessor file." + _( + "Type here any G-Code commands you would\n" + "like to be executed when Toolchange event is encountered.\n" + "This will constitute a Custom Toolchange GCode,\n" + "or a Toolchange Macro.\n" + "The FlatCAM variables are surrounded by '%' symbol.\n\n" + "WARNING: it can be used only with a postprocessor file\n" + "that has 'toolchange_custom' in it's name and this is built\n" + "having as template the 'Toolchange Custom' posprocessor file." + ) ) self.cnc_box.addWidget(self.toolchangelabel) @@ -1473,10 +1594,12 @@ class CNCObjectUI(ObjectUI): self.cnc_box.addLayout(cnclay) # Toolchange Replacement Enable - self.toolchange_cb = FCCheckBox(label='Use Toolchange Macro') + self.toolchange_cb = FCCheckBox(label=_('Use Toolchange Macro')) self.toolchange_cb.setToolTip( - "Check this box if you want to use\n" - "a Custom Toolchange GCode (macro)." + _( + "Check this box if you want to use\n" + "a Custom Toolchange GCode (macro)." + ) ) cnclay.addWidget(self.toolchange_cb) @@ -1489,28 +1612,30 @@ class CNCObjectUI(ObjectUI): # Variable list self.tc_variable_combo = FCComboBox() self.tc_variable_combo.setToolTip( - "A list of the FlatCAM variables that can be used\n" - "in the Toolchange event.\n" - "They have to be surrounded by the '%' symbol" + _( + "A list of the FlatCAM variables that can be used\n" + "in the Toolchange event.\n" + "They have to be surrounded by the '%' symbol" + ) ) cnclay1.addWidget(self.tc_variable_combo) # Populate the Combo Box - variables = ['Parameters', 'tool', 'tooldia', 't_drills', 'x_toolchange', 'y_toolchange', 'z_toolchange', + variables = [_('Parameters'), 'tool', 'tooldia', 't_drills', 'x_toolchange', 'y_toolchange', 'z_toolchange', 'z_cut', 'z_move', 'z_depthpercut', 'spindlespeed', 'dwelltime'] self.tc_variable_combo.addItems(variables) - self.tc_variable_combo.setItemData(0, "FlatCAM CNC parameters", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(1, "tool = tool number", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(2, "tooldia = tool diameter", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(3, "t_drills = for Excellon, total number of drills", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(4, "x_toolchange = X coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(5, "y_toolchange = Y coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(6, "z_toolchange = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(7, "z_cut = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(8, "z_move = Z coord for Toolchange", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(9, "z_depthpercut = the step value for multidepth cut", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(10, "spindlesspeed = the value for the spindle speed", Qt.ToolTipRole) - self.tc_variable_combo.setItemData(11, "dwelltime = time to dwell to allow the spindle to reach it's set RPM", + self.tc_variable_combo.setItemData(0, _("FlatCAM CNC parameters"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(1, _("tool = tool number"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(2, _("tooldia = tool diameter"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(3, _("t_drills = for Excellon, total number of drills"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(4, _("x_toolchange = X coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(5, _("y_toolchange = Y coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(6, _("z_toolchange = Z coord for Toolchange"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(7, _("z_cut = depth where to cut"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(8, _("z_move = height where to travel"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(9, _("z_depthpercut = the step value for multidepth cut"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(10, _("spindlesspeed = the value for the spindle speed"), Qt.ToolTipRole) + self.tc_variable_combo.setItemData(11, _("dwelltime = time to dwell to allow the spindle to reach it's set RPM"), Qt.ToolTipRole) cnclay1.addStretch() @@ -1524,21 +1649,25 @@ class CNCObjectUI(ObjectUI): # cnclay1.addWidget(self.tc_insert_buton) h_lay = QtWidgets.QHBoxLayout() - h_lay.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + h_lay.setAlignment(QtCore.Qt.AlignVCenter) self.custom_box.addLayout(h_lay) # Edit GCode Button - self.modify_gcode_button = QtWidgets.QPushButton('View CNC Code') + self.modify_gcode_button = QtWidgets.QPushButton(_('View CNC Code')) self.modify_gcode_button.setToolTip( - "Opens TAB to view/modify/print G-Code\n" - "file." + _( + "Opens TAB to view/modify/print G-Code\n" + "file." + ) ) # GO Button - self.export_gcode_button = QtWidgets.QPushButton('Save CNC Code') + self.export_gcode_button = QtWidgets.QPushButton(_('Save CNC Code')) self.export_gcode_button.setToolTip( - "Opens dialog to save G-Code\n" - "file." + _( + "Opens dialog to save G-Code\n" + "file." + ) ) h_lay.addWidget(self.modify_gcode_button) diff --git a/PlotCanvas.py b/flatcamGUI/PlotCanvas.py similarity index 98% rename from PlotCanvas.py rename to flatcamGUI/PlotCanvas.py index 67305a43..374a1d65 100644 --- a/PlotCanvas.py +++ b/flatcamGUI/PlotCanvas.py @@ -9,12 +9,11 @@ from PyQt5 import QtCore import logging -from VisPyCanvas import VisPyCanvas -from VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor +from flatcamGUI.VisPyCanvas import VisPyCanvas, time +from flatcamGUI.VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor from vispy.scene.visuals import InfiniteLine, Line import numpy as np from vispy.geometry import Rect -import time log = logging.getLogger('base') diff --git a/VisPyCanvas.py b/flatcamGUI/VisPyCanvas.py similarity index 92% rename from VisPyCanvas.py rename to flatcamGUI/VisPyCanvas.py index a2d5b2c7..92a5ba01 100644 --- a/VisPyCanvas.py +++ b/flatcamGUI/VisPyCanvas.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Dennis Hayrullin # +# Date: 2/5/2016 # +# MIT Licence # +############################################################ + import numpy as np from PyQt5.QtGui import QPalette import vispy.scene as scene diff --git a/VisPyPatches.py b/flatcamGUI/VisPyPatches.py similarity index 91% rename from VisPyPatches.py rename to flatcamGUI/VisPyPatches.py index 452ced3b..dc4593a5 100644 --- a/VisPyPatches.py +++ b/flatcamGUI/VisPyPatches.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Dennis Hayrullin # +# Date: 2/5/2016 # +# MIT Licence # +############################################################ + from vispy.visuals import markers, LineVisual, InfiniteLineVisual from vispy.visuals.axis import Ticker, _get_ticks_talbot from vispy.scene.widgets import Grid diff --git a/VisPyTesselators.py b/flatcamGUI/VisPyTesselators.py similarity index 86% rename from VisPyTesselators.py rename to flatcamGUI/VisPyTesselators.py index edaf032b..4645fc38 100644 --- a/VisPyTesselators.py +++ b/flatcamGUI/VisPyTesselators.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Dennis Hayrullin # +# Date: 2/5/2016 # +# MIT Licence # +############################################################ + from OpenGL import GLU diff --git a/VisPyVisuals.py b/flatcamGUI/VisPyVisuals.py similarity index 97% rename from VisPyVisuals.py rename to flatcamGUI/VisPyVisuals.py index 35ed5e91..63f436bb 100644 --- a/VisPyVisuals.py +++ b/flatcamGUI/VisPyVisuals.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Dennis Hayrullin # +# Date: 2/5/2016 # +# MIT Licence # +############################################################ + from vispy.visuals import CompoundVisual, LineVisual, MeshVisual, TextVisual, MarkersVisual from vispy.scene.visuals import VisualNode, generate_docstring, visuals from vispy.gloo import set_state @@ -5,7 +13,7 @@ from vispy.color import Color from shapely.geometry import Polygon, LineString, LinearRing import threading import numpy as np -from VisPyTesselators import GLUTess +from flatcamGUI.VisPyTesselators import GLUTess class FlatCAMLineVisual(LineVisual): diff --git a/flatcamGUI/__init__.py b/flatcamGUI/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ParseDXF.py b/flatcamParsers/ParseDXF.py similarity index 96% rename from ParseDXF.py rename to flatcamParsers/ParseDXF.py index 92634660..327a4d9b 100644 --- a/ParseDXF.py +++ b/flatcamParsers/ParseDXF.py @@ -1,18 +1,18 @@ -import re -import itertools -import math -import ezdxf +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ -from shapely.geometry import LinearRing, LineString, Point, Polygon -from shapely.affinity import translate, rotate, scale, skew, affine_transform -import numpy +from shapely.geometry import LineString import logging log = logging.getLogger('base2') -import FlatCAMApp -from ParseFont import * -from ParseDXF_Spline import * +from flatcamParsers.ParseFont import * +from flatcamParsers.ParseDXF_Spline import * def distance(pt1, pt2): diff --git a/ParseDXF_Spline.py b/flatcamParsers/ParseDXF_Spline.py similarity index 98% rename from ParseDXF_Spline.py rename to flatcamParsers/ParseDXF_Spline.py index 09c4eba4..b3cb2110 100644 --- a/ParseDXF_Spline.py +++ b/flatcamParsers/ParseDXF_Spline.py @@ -2,6 +2,13 @@ # Vasilis Vlachoudis # Date: 20-Oct-2015 +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File modified: Marius Adrian Stanciu # +# Date: 3/10/2019 # +############################################################ + import math import sys diff --git a/ParseFont.py b/flatcamParsers/ParseFont.py similarity index 96% rename from ParseFont.py rename to flatcamParsers/ParseFont.py index 554ca03b..a6f89d4f 100644 --- a/ParseFont.py +++ b/flatcamParsers/ParseFont.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + ######################################################################### ### Borrowed code from 'https://github.com/gddc/ttfquery/blob/master/ ### ### and made it work with Python 3 ############# diff --git a/ParseSVG.py b/flatcamParsers/ParseSVG.py similarity index 98% rename from ParseSVG.py rename to flatcamParsers/ParseSVG.py index c2ad5010..14237a65 100644 --- a/ParseSVG.py +++ b/flatcamParsers/ParseSVG.py @@ -20,17 +20,13 @@ ############################################################ # import xml.etree.ElementTree as ET -from lxml import etree as ET -import re -import itertools -from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path +from svg.path import Line, Arc, CubicBezier, QuadraticBezier, parse_path from svg.path.path import Move -from shapely.geometry import LinearRing, LineString, Point, Polygon -from shapely.affinity import translate, rotate, scale, skew, affine_transform +from shapely.geometry import LineString +from shapely.affinity import skew, affine_transform import numpy as np -import logging -from ParseFont import * +from flatcamParsers.ParseFont import * log = logging.getLogger('base2') diff --git a/flatcamParsers/__init__.py b/flatcamParsers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/flatcamTools/ToolCalculators.py b/flatcamTools/ToolCalculators.py index ee64019e..0ea49b8d 100644 --- a/flatcamTools/ToolCalculators.py +++ b/flatcamTools/ToolCalculators.py @@ -1,16 +1,30 @@ -from PyQt5 import QtGui -from GUIElements import FCEntry +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from FlatCAMObj import * import math +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class ToolCalculator(FlatCAMTool): - toolName = "Calculators" - v_shapeName = "V-Shape Tool Calculator" - unitsName = "Units Calculator" - eplateName = "ElectroPlating Calculator" + toolName = _("Calculators") + v_shapeName = _("V-Shape Tool Calculator") + unitsName = _("Units Calculator") + eplateName = _("ElectroPlating Calculator") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -51,12 +65,12 @@ class ToolCalculator(FlatCAMTool): self.inch_entry = FCEntry() # self.inch_entry.setFixedWidth(70) self.inch_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.inch_entry.setToolTip("Here you enter the value to be converted from INCH to MM") + self.inch_entry.setToolTip(_("Here you enter the value to be converted from INCH to MM")) self.mm_entry = FCEntry() # self.mm_entry.setFixedWidth(130) self.mm_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.mm_entry.setToolTip("Here you enter the value to be converted from MM to INCH") + self.mm_entry.setToolTip(_("Here you enter the value to be converted from MM to INCH")) grid_units_layout.addWidget(self.mm_entry, 1, 0) grid_units_layout.addWidget(self.inch_entry, 1, 1) @@ -77,34 +91,34 @@ class ToolCalculator(FlatCAMTool): form_layout = QtWidgets.QFormLayout() self.layout.addLayout(form_layout) - self.tipDia_label = QtWidgets.QLabel("Tip Diameter:") + self.tipDia_label = QtWidgets.QLabel(_("Tip Diameter:")) self.tipDia_entry = FCEntry() # self.tipDia_entry.setFixedWidth(70) self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.tipDia_label.setToolTip('This is the diameter of the tool tip.\n' - 'The manufacturer specifies it.') + self.tipDia_label.setToolTip(_('This is the diameter of the tool tip.\n' + 'The manufacturer specifies it.')) - self.tipAngle_label = QtWidgets.QLabel("Tip Angle:") + self.tipAngle_label = QtWidgets.QLabel(_("Tip Angle:")) self.tipAngle_entry = FCEntry() # self.tipAngle_entry.setFixedWidth(70) self.tipAngle_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.tipAngle_label.setToolTip("This is the angle of the tip of the tool.\n" - "It is specified by manufacturer.") + self.tipAngle_label.setToolTip(_("This is the angle of the tip of the tool.\n" + "It is specified by manufacturer.")) - self.cutDepth_label = QtWidgets.QLabel("Cut Z:") + self.cutDepth_label = QtWidgets.QLabel(_("Cut Z:")) self.cutDepth_entry = FCEntry() # self.cutDepth_entry.setFixedWidth(70) self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.cutDepth_label.setToolTip("This is the depth to cut into the material.\n" - "In the CNCJob is the CutZ parameter.") + self.cutDepth_label.setToolTip(_("This is the depth to cut into the material.\n" + "In the CNCJob is the CutZ parameter.")) - self.effectiveToolDia_label = QtWidgets.QLabel("Tool Diameter:") + self.effectiveToolDia_label = QtWidgets.QLabel(_("Tool Diameter:")) self.effectiveToolDia_entry = FCEntry() # self.effectiveToolDia_entry.setFixedWidth(70) self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.effectiveToolDia_label.setToolTip("This is the tool diameter to be entered into\n" + self.effectiveToolDia_label.setToolTip(_("This is the tool diameter to be entered into\n" "FlatCAM Gerber section.\n" - "In the CNCJob section it is called >Tool dia<.") + "In the CNCJob section it is called >Tool dia<.")) # self.effectiveToolDia_entry.setEnabled(False) @@ -114,11 +128,11 @@ class ToolCalculator(FlatCAMTool): form_layout.addRow(self.effectiveToolDia_label, self.effectiveToolDia_entry) ## Buttons - self.calculate_vshape_button = QtWidgets.QPushButton("Calculate") + self.calculate_vshape_button = QtWidgets.QPushButton(_("Calculate")) # self.calculate_button.setFixedWidth(70) self.calculate_vshape_button.setToolTip( - "Calculate either the Cut Z or the effective tool diameter,\n " - "depending on which is desired and which is known. " + _("Calculate either the Cut Z or the effective tool diameter,\n " + "depending on which is desired and which is known. ") ) self.empty_label = QtWidgets.QLabel(" ") @@ -135,8 +149,8 @@ class ToolCalculator(FlatCAMTool): ## Title of the ElectroPlating Tools Calculator plate_title_label = QtWidgets.QLabel("%s" % self.eplateName) plate_title_label.setToolTip( - "This calculator is useful for those who plate the via/pad/drill holes,\n" - "using a method like grahite ink or calcium hypophosphite ink or palladium chloride." + _("This calculator is useful for those who plate the via/pad/drill holes,\n" + "using a method like grahite ink or calcium hypophosphite ink or palladium chloride.") ) self.layout.addWidget(plate_title_label) @@ -144,49 +158,49 @@ class ToolCalculator(FlatCAMTool): plate_form_layout = QtWidgets.QFormLayout() self.layout.addLayout(plate_form_layout) - self.pcblengthlabel = QtWidgets.QLabel("Board Length:") + self.pcblengthlabel = QtWidgets.QLabel(_("Board Length:")) self.pcblength_entry = FCEntry() # self.pcblengthlabel.setFixedWidth(70) self.pcblength_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.pcblengthlabel.setToolTip('This is the board length. In centimeters.') + self.pcblengthlabel.setToolTip(_('This is the board length. In centimeters.')) - self.pcbwidthlabel = QtWidgets.QLabel("Board Width:") + self.pcbwidthlabel = QtWidgets.QLabel(_("Board Width:")) self.pcbwidth_entry = FCEntry() # self.pcbwidthlabel.setFixedWidth(70) self.pcbwidth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.pcbwidthlabel.setToolTip('This is the board width.In centimeters.') + self.pcbwidthlabel.setToolTip(_('This is the board width.In centimeters.')) - self.cdensity_label = QtWidgets.QLabel("Current Density:") + self.cdensity_label = QtWidgets.QLabel(_("Current Density:")) self.cdensity_entry = FCEntry() # self.cdensity_entry.setFixedWidth(70) self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.cdensity_label.setToolTip("Current density to pass through the board. \n" - "In Amps per Square Feet ASF.") + self.cdensity_label.setToolTip(_("Current density to pass through the board. \n" + "In Amps per Square Feet ASF.")) - self.growth_label = QtWidgets.QLabel("Copper Growth:") + self.growth_label = QtWidgets.QLabel(_("Copper Growth:")) self.growth_entry = FCEntry() # self.growth_entry.setFixedWidth(70) self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.growth_label.setToolTip("How thick the copper growth is intended to be.\n" - "In microns.") + self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n" + "In microns.")) # self.growth_entry.setEnabled(False) - self.cvaluelabel = QtWidgets.QLabel("Current Value:") + self.cvaluelabel = QtWidgets.QLabel(_("Current Value:")) self.cvalue_entry = FCEntry() # self.cvaluelabel.setFixedWidth(70) self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.cvaluelabel.setToolTip('This is the current intensity value\n' - 'to be set on the Power Supply. In Amps.') + self.cvaluelabel.setToolTip(_('This is the current intensity value\n' + 'to be set on the Power Supply. In Amps.')) self.cvalue_entry.setDisabled(True) - self.timelabel = QtWidgets.QLabel("Time:") + self.timelabel = QtWidgets.QLabel(_("Time:")) self.time_entry = FCEntry() # self.timelabel.setFixedWidth(70) self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.timelabel.setToolTip('This is the calculated time required for the procedure.\n' - 'In minutes.') + self.timelabel.setToolTip(_('This is the calculated time required for the procedure.\n' + 'In minutes.')) self.time_entry.setDisabled(True) plate_form_layout.addRow(self.pcblengthlabel, self.pcblength_entry) @@ -197,11 +211,11 @@ class ToolCalculator(FlatCAMTool): plate_form_layout.addRow(self.timelabel, self.time_entry) ## Buttons - self.calculate_plate_button = QtWidgets.QPushButton("Calculate") + self.calculate_plate_button = QtWidgets.QPushButton(_("Calculate")) # self.calculate_button.setFixedWidth(70) self.calculate_plate_button.setToolTip( - "Calculate the current intensity value and the procedure time,\n " - "depending on the parameters above" + _("Calculate the current intensity value and the procedure time,\n " + "depending on the parameters above") ) self.empty_label_2 = QtWidgets.QLabel(" ") @@ -221,21 +235,25 @@ class ToolCalculator(FlatCAMTool): self.calculate_plate_button.clicked.connect(self.on_calculate_eplate) - - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolCalculators()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) + self.set_tool_ui() self.app.ui.notebook.setTabText(2, "Calc. Tool") @@ -286,8 +304,8 @@ class ToolCalculator(FlatCAMTool): try: tip_diameter = float(self.tipDia_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: @@ -297,8 +315,8 @@ class ToolCalculator(FlatCAMTool): try: half_tip_angle = float(self.tipAngle_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return half_tip_angle /= 2 @@ -309,8 +327,8 @@ class ToolCalculator(FlatCAMTool): try: cut_depth = float(self.cutDepth_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return tool_diameter = tip_diameter + (2 * cut_depth * math.tan(math.radians(half_tip_angle))) @@ -324,8 +342,8 @@ class ToolCalculator(FlatCAMTool): try: mm_val = float(self.mm_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return self.inch_entry.set_value('%.6f' % (mm_val / 25.4)) @@ -337,8 +355,8 @@ class ToolCalculator(FlatCAMTool): try: inch_val = float(self.inch_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return self.mm_entry.set_value('%.6f' % (inch_val * 25.4)) @@ -351,8 +369,8 @@ class ToolCalculator(FlatCAMTool): try: length = float(self.pcblength_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: @@ -362,8 +380,8 @@ class ToolCalculator(FlatCAMTool): try: width = float(self.pcbwidth_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: @@ -373,8 +391,8 @@ class ToolCalculator(FlatCAMTool): try: density = float(self.cdensity_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: @@ -384,8 +402,8 @@ class ToolCalculator(FlatCAMTool): try: copper = float(self.growth_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return calculated_current = (length * width * density) * 0.0021527820833419 diff --git a/flatcamTools/ToolCutOut.py b/flatcamTools/ToolCutOut.py index 69cd7311..f379eb39 100644 --- a/flatcamTools/ToolCutOut.py +++ b/flatcamTools/ToolCutOut.py @@ -3,10 +3,18 @@ from ObjectCollection import * from FlatCAMApp import * from shapely.geometry import box +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class CutOut(FlatCAMTool): - toolName = "Cutout PCB" + toolName = _("Cutout PCB") gapFinished = pyqtSignal() def __init__(self, app): @@ -42,12 +50,12 @@ class CutOut(FlatCAMTool): # self.type_obj_combo.setItemIcon(1, QtGui.QIcon("share/drill16.png")) self.type_obj_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png")) - self.type_obj_combo_label = QtWidgets.QLabel("Obj Type:") + self.type_obj_combo_label = QtWidgets.QLabel(_("Obj Type:")) self.type_obj_combo_label.setToolTip( - "Specify the type of object to be cutout.\n" + _("Specify the type of object to be cutout.\n" "It can be of type: Gerber or Geometry.\n" "What is selected here will dictate the kind\n" - "of objects that will populate the 'Object' combobox." + "of objects that will populate the 'Object' combobox.") ) self.type_obj_combo_label.setFixedWidth(60) form_layout.addRow(self.type_obj_combo_label, self.type_obj_combo) @@ -58,39 +66,39 @@ class CutOut(FlatCAMTool): self.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.obj_combo.setCurrentIndex(1) - self.object_label = QtWidgets.QLabel("Object:") + self.object_label = QtWidgets.QLabel(_("Object:")) self.object_label.setToolTip( - "Object to be cutout. " + _("Object to be cutout. ") ) form_layout.addRow(self.object_label, self.obj_combo) # Tool Diameter self.dia = FCEntry() - self.dia_label = QtWidgets.QLabel("Tool Dia:") + self.dia_label = QtWidgets.QLabel(_("Tool Dia:")) self.dia_label.setToolTip( - "Diameter of the tool used to cutout\n" - "the PCB shape out of the surrounding material." + _( "Diameter of the tool used to cutout\n" + "the PCB shape out of the surrounding material.") ) form_layout.addRow(self.dia_label, self.dia) # Margin self.margin = FCEntry() - self.margin_label = QtWidgets.QLabel("Margin:") + self.margin_label = QtWidgets.QLabel(_("Margin:")) self.margin_label.setToolTip( - "Margin over bounds. A positive value here\n" + _( "Margin over bounds. A positive value here\n" "will make the cutout of the PCB further from\n" - "the actual PCB border" + "the actual PCB border") ) form_layout.addRow(self.margin_label, self.margin) # Gapsize self.gapsize = FCEntry() - self.gapsize_label = QtWidgets.QLabel("Gap size:") + self.gapsize_label = QtWidgets.QLabel(_("Gap size:")) self.gapsize_label.setToolTip( - "The size of the bridge gaps in the cutout\n" + _( "The size of the bridge gaps in the cutout\n" "used to keep the board connected to\n" "the surrounding material (the one \n" - "from which the PCB is cutout)." + "from which the PCB is cutout).") ) form_layout.addRow(self.gapsize_label, self.gapsize) @@ -103,9 +111,9 @@ class CutOut(FlatCAMTool): # 8 - 2*left + 2*right +2*top + 2*bottom ## Title2 - title_param_label = QtWidgets.QLabel("A. Automatic Bridge Gaps") + title_param_label = QtWidgets.QLabel("%s" % _('A. Automatic Bridge Gaps')) title_param_label.setToolTip( - "This section handle creation of automatic bridge gaps." + _("This section handle creation of automatic bridge gaps.") ) self.layout.addWidget(title_param_label) @@ -114,9 +122,9 @@ class CutOut(FlatCAMTool): self.layout.addLayout(form_layout_2) # Gaps - gaps_label = QtWidgets.QLabel('Gaps:') + gaps_label = QtWidgets.QLabel(_('Gaps:')) gaps_label.setToolTip( - "Number of gaps used for the Automatic cutout.\n" + _("Number of gaps used for the Automatic cutout.\n" "There can be maximum 8 bridges/gaps.\n" "The choices are:\n" "- lr - left + right\n" @@ -124,7 +132,7 @@ class CutOut(FlatCAMTool): "- 4 - left + right +top + bottom\n" "- 2lr - 2*left + 2*right\n" "- 2tb - 2*top + 2*bottom\n" - "- 8 - 2*left + 2*right +2*top + 2*bottom" + "- 8 - 2*left + 2*right +2*top + 2*bottom") ) gaps_label.setFixedWidth(60) @@ -139,50 +147,50 @@ class CutOut(FlatCAMTool): hlay = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay) - title_ff_label = QtWidgets.QLabel("FreeForm:") + title_ff_label = QtWidgets.QLabel("%s" % _('FreeForm:')) title_ff_label.setToolTip( - "The cutout shape can be of ny shape.\n" - "Useful when the PCB has a non-rectangular shape." + _("The cutout shape can be of ny shape.\n" + "Useful when the PCB has a non-rectangular shape.") ) hlay.addWidget(title_ff_label) hlay.addStretch() - self.ff_cutout_object_btn = QtWidgets.QPushButton("Generate Geo") + self.ff_cutout_object_btn = QtWidgets.QPushButton(_("Generate Geo")) self.ff_cutout_object_btn.setToolTip( - "Cutout the selected object.\n" + _("Cutout the selected object.\n" "The cutout shape can be of any shape.\n" - "Useful when the PCB has a non-rectangular shape." + "Useful when the PCB has a non-rectangular shape.") ) hlay.addWidget(self.ff_cutout_object_btn) hlay2 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay2) - title_rct_label = QtWidgets.QLabel("Rectangular:") + title_rct_label = QtWidgets.QLabel("%s" % _('Rectangular:')) title_rct_label.setToolTip( - "The resulting cutout shape is\n" + _("The resulting cutout shape is\n" "always a rectangle shape and it will be\n" - "the bounding box of the Object." + "the bounding box of the Object.") ) hlay2.addWidget(title_rct_label) hlay2.addStretch() - self.rect_cutout_object_btn = QtWidgets.QPushButton("Generate Geo") + self.rect_cutout_object_btn = QtWidgets.QPushButton(_("Generate Geo")) self.rect_cutout_object_btn.setToolTip( - "Cutout the selected object.\n" + _("Cutout the selected object.\n" "The resulting cutout shape is\n" "always a rectangle shape and it will be\n" - "the bounding box of the Object." + "the bounding box of the Object.") ) hlay2.addWidget(self.rect_cutout_object_btn) ## Title5 - title_manual_label = QtWidgets.QLabel("B. Manual Bridge Gaps") + title_manual_label = QtWidgets.QLabel("%s" % _('B. Manual Bridge Gaps')) title_manual_label.setToolTip( - "This section handle creation of manual bridge gaps.\n" + _("This section handle creation of manual bridge gaps.\n" "This is done by mouse clicking on the perimeter of the\n" - "Geometry object that is used as a cutout object. " + "Geometry object that is used as a cutout object. ") ) self.layout.addWidget(title_manual_label) @@ -196,9 +204,9 @@ class CutOut(FlatCAMTool): self.man_object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex())) self.man_object_combo.setCurrentIndex(1) - self.man_object_label = QtWidgets.QLabel("Geo Obj:") + self.man_object_label = QtWidgets.QLabel(_("Geo Obj:")) self.man_object_label.setToolTip( - "Geometry object used to create the manual cutout." + _("Geometry object used to create the manual cutout.") ) self.man_object_label.setFixedWidth(60) # e_lab_0 = QtWidgets.QLabel('') @@ -209,44 +217,44 @@ class CutOut(FlatCAMTool): hlay3 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay3) - self.man_geo_label = QtWidgets.QLabel("Manual Geo:") + self.man_geo_label = QtWidgets.QLabel(_("Manual Geo:")) self.man_geo_label.setToolTip( - "If the object to be cutout is a Gerber\n" + _("If the object to be cutout is a Gerber\n" "first create a Geometry that surrounds it,\n" "to be used as the cutout, if one doesn't exist yet.\n" - "Select the source Gerber file in the top object combobox." + "Select the source Gerber file in the top object combobox.") ) hlay3.addWidget(self.man_geo_label) hlay3.addStretch() - self.man_geo_creation_btn = QtWidgets.QPushButton("Generate Geo") + self.man_geo_creation_btn = QtWidgets.QPushButton(_("Generate Geo")) self.man_geo_creation_btn.setToolTip( - "If the object to be cutout is a Gerber\n" + _("If the object to be cutout is a Gerber\n" "first create a Geometry that surrounds it,\n" "to be used as the cutout, if one doesn't exist yet.\n" - "Select the source Gerber file in the top object combobox." + "Select the source Gerber file in the top object combobox.") ) hlay3.addWidget(self.man_geo_creation_btn) hlay4 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay4) - self.man_bridge_gaps_label = QtWidgets.QLabel("Manual Add Bridge Gaps:") + self.man_bridge_gaps_label = QtWidgets.QLabel(_("Manual Add Bridge Gaps:")) self.man_bridge_gaps_label.setToolTip( - "Use the left mouse button (LMB) click\n" + _("Use the left mouse button (LMB) click\n" "to create a bridge gap to separate the PCB from\n" - "the surrounding material." + "the surrounding material.") ) hlay4.addWidget(self.man_bridge_gaps_label) hlay4.addStretch() - self.man_gaps_creation_btn = QtWidgets.QPushButton("Generate Gap") + self.man_gaps_creation_btn = QtWidgets.QPushButton(_("Generate Gap")) self.man_gaps_creation_btn.setToolTip( - "Use the left mouse button (LMB) click\n" + _("Use the left mouse button (LMB) click\n" "to create a bridge gap to separate the PCB from\n" "the surrounding material.\n" "The LMB click has to be done on the perimeter of\n" - "the Geometry object used as a cutout geometry." + "the Geometry object used as a cutout geometry.") ) hlay4.addWidget(self.man_gaps_creation_btn) @@ -258,23 +266,36 @@ class CutOut(FlatCAMTool): # true if we want to repeat the gap without clicking again on the button self.repeat_gap = False + ## Signals + self.ff_cutout_object_btn.clicked.connect(self.on_freeform_cutout) + self.rect_cutout_object_btn.clicked.connect(self.on_rectangular_cutout) + + self.type_obj_combo.currentIndexChanged.connect(self.on_type_obj_index_changed) + self.man_geo_creation_btn.clicked.connect(self.on_manual_geo) + self.man_gaps_creation_btn.clicked.connect(self.on_manual_gap_click) + def on_type_obj_index_changed(self, index): obj_type = self.type_obj_combo.currentIndex() self.obj_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex())) self.obj_combo.setCurrentIndex(0) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolCutOut()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + FlatCAMTool.run(self) self.set_tool_ui() @@ -291,14 +312,6 @@ class CutOut(FlatCAMTool): self.gapsize.set_value(float(self.app.defaults["tools_cutoutgapsize"])) self.gaps.set_value(4) - ## Signals - self.ff_cutout_object_btn.clicked.connect(self.on_freeform_cutout) - self.rect_cutout_object_btn.clicked.connect(self.on_rectangular_cutout) - - self.type_obj_combo.currentIndexChanged.connect(self.on_type_obj_index_changed) - self.man_geo_creation_btn.clicked.connect(self.on_manual_geo) - self.man_gaps_creation_btn.clicked.connect(self.on_manual_gap_click) - self.gapFinished.connect(self.on_gap_finished) def on_freeform_cutout(self): @@ -313,11 +326,11 @@ class CutOut(FlatCAMTool): try: cutout_obj = self.app.collection.get_by_name(str(name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % name) return "Could not retrieve object: %s" % name if cutout_obj is None: - self.app.inform.emit("[ERROR_NOTCL]There is no object selected for Cutout.\nSelect one and try again.") + self.app.inform.emit(_("[ERROR_NOTCL]There is no object selected for Cutout.\nSelect one and try again.")) return try: @@ -327,13 +340,13 @@ class CutOut(FlatCAMTool): try: dia = float(self.dia.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return if 0 in {dia}: - self.app.inform.emit("[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer.") + self.app.inform.emit(_("[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer.")) return "Tool Diameter is zero value. Change it to a positive integer." try: @@ -343,8 +356,8 @@ class CutOut(FlatCAMTool): try: margin = float(self.margin.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Margin value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. " + "Add it and retry.")) return try: @@ -354,25 +367,25 @@ class CutOut(FlatCAMTool): try: gapsize = float(self.gapsize.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Gap size value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. " + "Add it and retry.")) return try: gaps = self.gaps.get_value() except TypeError: - self.app.inform.emit("[WARNING_NOTCL] Number of gaps value is missing. Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Number of gaps value is missing. Add it and retry.")) return if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']: - self.app.inform.emit("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. " - "Fill in a correct value and retry. ") + self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. " + "Fill in a correct value and retry. ")) return if cutout_obj.multigeo is True: - self.app.inform.emit("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" + self.app.inform.emit(_("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" "Optionally, this Multi-geo Geometry can be converted to Single-geo Geometry,\n" - "and after that perform Cutout.") + "and after that perform Cutout.")) return # Get min and max data for each object as we just cut rectangles across X or Y @@ -436,7 +449,7 @@ class CutOut(FlatCAMTool): ymax + gapsize) cutout_obj.plot() - self.app.inform.emit("[success] Any form CutOut operation finished.") + self.app.inform.emit(_("[success] Any form CutOut operation finished.")) self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) self.app.should_we_save = True @@ -452,11 +465,11 @@ class CutOut(FlatCAMTool): try: cutout_obj = self.app.collection.get_by_name(str(name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % name) return "Could not retrieve object: %s" % name if cutout_obj is None: - self.app.inform.emit("[ERROR_NOTCL]Object not found: %s" % cutout_obj) + self.app.inform.emit(_("[ERROR_NOTCL]Object not found: %s") % cutout_obj) try: dia = float(self.dia.get_value()) @@ -465,12 +478,12 @@ class CutOut(FlatCAMTool): try: dia = float(self.dia.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return if 0 in {dia}: - self.app.inform.emit("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.") + self.app.inform.emit(_("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.")) return "Tool Diameter is zero value. Change it to a positive integer." try: @@ -480,8 +493,8 @@ class CutOut(FlatCAMTool): try: margin = float(self.margin.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Margin value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. " + "Add it and retry.")) return try: @@ -491,25 +504,25 @@ class CutOut(FlatCAMTool): try: gapsize = float(self.gapsize.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Gap size value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. " + "Add it and retry.")) return try: gaps = self.gaps.get_value() except TypeError: - self.app.inform.emit("[WARNING_NOTCL] Number of gaps value is missing. Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Number of gaps value is missing. Add it and retry.")) return if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']: - self.app.inform.emit("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. " - "Fill in a correct value and retry. ") + self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. " + "Fill in a correct value and retry. ")) return if cutout_obj.multigeo is True: - self.app.inform.emit("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" + self.app.inform.emit(_("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" "Optionally, this Multi-geo Geometry can be converted to Single-geo Geometry,\n" - "and after that perform Cutout.") + "and after that perform Cutout.")) return # Get min and max data for each object as we just cut rectangles across X or Y @@ -570,12 +583,12 @@ class CutOut(FlatCAMTool): ymax + gapsize) cutout_obj.plot() - self.app.inform.emit("[success] Any form CutOut operation finished.") + self.app.inform.emit(_("[success] Any form CutOut operation finished.")) self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) self.app.should_we_save = True def on_manual_gap_click(self): - self.app.inform.emit("Click on the selected geometry object perimeter to create a bridge gap ...") + self.app.inform.emit(_("Click on the selected geometry object perimeter to create a bridge gap ...")) self.app.geo_editor.tool_shape.enabled = True try: @@ -585,12 +598,12 @@ class CutOut(FlatCAMTool): try: self.cutting_dia = float(self.dia.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return if 0 in {self.cutting_dia}: - self.app.inform.emit("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.") + self.app.inform.emit(_("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.")) return "Tool Diameter is zero value. Change it to a positive integer." try: @@ -600,8 +613,8 @@ class CutOut(FlatCAMTool): try: self.cutting_gapsize = float(self.gapsize.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Gap size value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. " + "Add it and retry.")) return self.app.plotcanvas.vis_disconnect('key_press', self.app.ui.keyPressEvent) @@ -616,7 +629,7 @@ class CutOut(FlatCAMTool): def doit(self, event): # do paint single only for left mouse clicks if event.button == 1: - self.app.inform.emit("Making manual bridge gap...") + self.app.inform.emit(_("Making manual bridge gap...")) pos = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos) self.on_manual_cutout(click_pos=pos) @@ -639,11 +652,11 @@ class CutOut(FlatCAMTool): try: cutout_obj = self.app.collection.get_by_name(str(name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve Geoemtry object: %s" % name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve Geoemtry object: %s") % name) return "Could not retrieve object: %s" % name if cutout_obj is None: - self.app.inform.emit("[ERROR_NOTCL]Geometry object for manual cutout not found: %s" % cutout_obj) + self.app.inform.emit(_("[ERROR_NOTCL]Geometry object for manual cutout not found: %s") % cutout_obj) return # use the snapped position as reference @@ -653,7 +666,7 @@ class CutOut(FlatCAMTool): cutout_obj.subtract_polygon(cut_poly) cutout_obj.plot() - self.app.inform.emit("[success] Added manual Bridge Gap.") + self.app.inform.emit(_("[success] Added manual Bridge Gap.")) self.app.should_we_save = True @@ -670,17 +683,17 @@ class CutOut(FlatCAMTool): try: cutout_obj = self.app.collection.get_by_name(str(name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve Gerber object: %s" % name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve Gerber object: %s") % name) return "Could not retrieve object: %s" % name if cutout_obj is None: - self.app.inform.emit("[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" - "Select one and try again.") + self.app.inform.emit(_("[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" + "Select one and try again.")) return if not isinstance(cutout_obj, FlatCAMGerber): - self.app.inform.emit("[ERROR_NOTCL]The selected object has to be of Gerber type.\n" - "Select a Gerber file and try again.") + self.app.inform.emit(_("[ERROR_NOTCL]The selected object has to be of Gerber type.\n" + "Select a Gerber file and try again.")) return try: @@ -690,12 +703,12 @@ class CutOut(FlatCAMTool): try: dia = float(self.dia.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return if 0 in {dia}: - self.app.inform.emit("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.") + self.app.inform.emit(_("[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer.")) return "Tool Diameter is zero value. Change it to a positive integer." try: @@ -705,8 +718,8 @@ class CutOut(FlatCAMTool): try: margin = float(self.margin.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Margin value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. " + "Add it and retry.")) return def geo_init(geo_obj, app_obj): diff --git a/flatcamTools/ToolDblSided.py b/flatcamTools/ToolDblSided.py index 68410df6..8088349f 100644 --- a/flatcamTools/ToolDblSided.py +++ b/flatcamTools/ToolDblSided.py @@ -1,15 +1,21 @@ -from PyQt5 import QtGui -from GUIElements import RadioSet, EvalEntry, LengthEntry from FlatCAMTool import FlatCAMTool from FlatCAMObj import * from shapely.geometry import Point from shapely import affinity from PyQt5 import QtCore +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class DblSidedTool(FlatCAMTool): - toolName = "2-Sided PCB" + toolName = _("2-Sided PCB") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -43,18 +49,18 @@ class DblSidedTool(FlatCAMTool): "Gerber to be mirrored." ) - self.mirror_gerber_button = QtWidgets.QPushButton("Mirror") + self.mirror_gerber_button = QtWidgets.QPushButton(_("Mirror")) self.mirror_gerber_button.setToolTip( - "Mirrors (flips) the specified object around \n" + _("Mirrors (flips) the specified object around \n" "the specified axis. Does not create a new \n" - "object, but modifies it." + "object, but modifies it.") ) - self.mirror_gerber_button.setFixedWidth(40) + self.mirror_gerber_button.setFixedWidth(60) # grid_lay.addRow("Bottom Layer:", self.object_combo) grid_lay.addWidget(self.botlay_label, 0, 0) - grid_lay.addWidget(self.gerber_object_combo, 1, 0, 1, 2) - grid_lay.addWidget(self.mirror_gerber_button, 1, 3) + grid_lay.addWidget(self.gerber_object_combo, 1, 0) + grid_lay.addWidget(self.mirror_gerber_button, 1, 1) ## Excellon Object to mirror self.exc_object_combo = QtWidgets.QComboBox() @@ -64,21 +70,21 @@ class DblSidedTool(FlatCAMTool): self.excobj_label = QtWidgets.QLabel("EXCELLON:") self.excobj_label.setToolTip( - "Excellon Object to be mirrored." + _("Excellon Object to be mirrored.") ) - self.mirror_exc_button = QtWidgets.QPushButton("Mirror") + self.mirror_exc_button = QtWidgets.QPushButton(_("Mirror")) self.mirror_exc_button.setToolTip( - "Mirrors (flips) the specified object around \n" + _("Mirrors (flips) the specified object around \n" "the specified axis. Does not create a new \n" - "object, but modifies it." + "object, but modifies it.") ) - self.mirror_exc_button.setFixedWidth(40) + self.mirror_exc_button.setFixedWidth(60) # grid_lay.addRow("Bottom Layer:", self.object_combo) grid_lay.addWidget(self.excobj_label, 2, 0) - grid_lay.addWidget(self.exc_object_combo, 3, 0, 1, 2) - grid_lay.addWidget(self.mirror_exc_button, 3, 3) + grid_lay.addWidget(self.exc_object_combo, 3, 0) + grid_lay.addWidget(self.mirror_exc_button, 3, 1) ## Geometry Object to mirror self.geo_object_combo = QtWidgets.QComboBox() @@ -88,73 +94,81 @@ class DblSidedTool(FlatCAMTool): self.geoobj_label = QtWidgets.QLabel("GEOMETRY:") self.geoobj_label.setToolTip( - "Geometry Obj to be mirrored." + _("Geometry Obj to be mirrored.") ) - self.mirror_geo_button = QtWidgets.QPushButton("Mirror") + self.mirror_geo_button = QtWidgets.QPushButton(_("Mirror")) self.mirror_geo_button.setToolTip( - "Mirrors (flips) the specified object around \n" + _("Mirrors (flips) the specified object around \n" "the specified axis. Does not create a new \n" - "object, but modifies it." + "object, but modifies it.") ) - self.mirror_geo_button.setFixedWidth(40) + self.mirror_geo_button.setFixedWidth(60) # grid_lay.addRow("Bottom Layer:", self.object_combo) grid_lay.addWidget(self.geoobj_label, 4, 0) - grid_lay.addWidget(self.geo_object_combo, 5, 0, 1, 2) - grid_lay.addWidget(self.mirror_geo_button, 5, 3) + grid_lay.addWidget(self.geo_object_combo, 5, 0) + grid_lay.addWidget(self.mirror_geo_button, 5, 1) + + ## Grid Layout + grid_lay1 = QtWidgets.QGridLayout() + self.layout.addLayout(grid_lay1) ## Axis self.mirror_axis = RadioSet([{'label': 'X', 'value': 'X'}, {'label': 'Y', 'value': 'Y'}]) - self.mirax_label = QtWidgets.QLabel("Mirror Axis:") + self.mirax_label = QtWidgets.QLabel(_("Mirror Axis:")) self.mirax_label.setToolTip( - "Mirror vertically (X) or horizontally (Y)." + _("Mirror vertically (X) or horizontally (Y).") ) # grid_lay.addRow("Mirror Axis:", self.mirror_axis) self.empty_lb1 = QtWidgets.QLabel("") - grid_lay.addWidget(self.empty_lb1, 6, 0) - grid_lay.addWidget(self.mirax_label, 7, 0) - grid_lay.addWidget(self.mirror_axis, 7, 1) + grid_lay1.addWidget(self.empty_lb1, 6, 0) + grid_lay1.addWidget(self.mirax_label, 7, 0) + grid_lay1.addWidget(self.mirror_axis, 7, 1) ## Axis Location self.axis_location = RadioSet([{'label': 'Point', 'value': 'point'}, {'label': 'Box', 'value': 'box'}]) - self.axloc_label = QtWidgets.QLabel("Axis Ref:") + self.axloc_label = QtWidgets.QLabel(_("Axis Ref:")) self.axloc_label.setToolTip( - "The axis should pass through a point or cut\n " + _("The axis should pass through a point or cut\n " "a specified box (in a FlatCAM object) through \n" - "the center." + "the center.") ) # grid_lay.addRow("Axis Location:", self.axis_location) - grid_lay.addWidget(self.axloc_label, 8, 0) - grid_lay.addWidget(self.axis_location, 8, 1) + grid_lay1.addWidget(self.axloc_label, 8, 0) + grid_lay1.addWidget(self.axis_location, 8, 1) self.empty_lb2 = QtWidgets.QLabel("") - grid_lay.addWidget(self.empty_lb2, 9, 0) + grid_lay1.addWidget(self.empty_lb2, 9, 0) + + ## Grid Layout + grid_lay2 = QtWidgets.QGridLayout() + self.layout.addLayout(grid_lay2) ## Point/Box self.point_box_container = QtWidgets.QVBoxLayout() - self.pb_label = QtWidgets.QLabel("Point/Box Reference:") + self.pb_label = QtWidgets.QLabel("%s" % _('Point/Box Reference:')) self.pb_label.setToolTip( - "If 'Point' is selected above it store the coordinates (x, y) through which\n" + _("If 'Point' is selected above it store the coordinates (x, y) through which\n" "the mirroring axis passes.\n" "If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or Geo).\n" - "Through the center of this object pass the mirroring axis selected above." + "Through the center of this object pass the mirroring axis selected above.") ) - self.add_point_button = QtWidgets.QPushButton("Add") + self.add_point_button = QtWidgets.QPushButton(_("Add")) self.add_point_button.setToolTip( - "Add the coordinates in format (x, y) through which the mirroring axis \n " + _("Add the coordinates in format (x, y) through which the mirroring axis \n " "selected in 'MIRROR AXIS' pass.\n" "The (x, y) coordinates are captured by pressing SHIFT key\n" - "and left mouse button click on canvas or you can enter the coords manually." + "and left mouse button click on canvas or you can enter the coords manually.") ) - self.add_point_button.setFixedWidth(40) + self.add_point_button.setFixedWidth(60) - grid_lay.addWidget(self.pb_label, 10, 0) - grid_lay.addLayout(self.point_box_container, 11, 0, 1, 3) - grid_lay.addWidget(self.add_point_button, 11, 3) + grid_lay2.addWidget(self.pb_label, 10, 0) + grid_lay2.addLayout(self.point_box_container, 11, 0) + grid_lay2.addWidget(self.add_point_button, 11, 1) self.point_entry = EvalEntry() @@ -165,9 +179,9 @@ class DblSidedTool(FlatCAMTool): self.box_combo.setCurrentIndex(1) self.box_combo_type = QtWidgets.QComboBox() - self.box_combo_type.addItem("Gerber Reference Box Object") - self.box_combo_type.addItem("Excellon Reference Box Object") - self.box_combo_type.addItem("Geometry Reference Box Object") + self.box_combo_type.addItem(_("Gerber Reference Box Object")) + self.box_combo_type.addItem(_("Excellon Reference Box Object")) + self.box_combo_type.addItem(_("Geometry Reference Box Object")) self.point_box_container.addWidget(self.box_combo_type) self.point_box_container.addWidget(self.box_combo) @@ -176,70 +190,74 @@ class DblSidedTool(FlatCAMTool): ## Alignment holes - self.ah_label = QtWidgets.QLabel("Alignment Drill Coordinates:") + self.ah_label = QtWidgets.QLabel("" % _('Alignment Drill Coordinates:')) self.ah_label.setToolTip( - "Alignment holes (x1, y1), (x2, y2), ... " + _( "Alignment holes (x1, y1), (x2, y2), ... " "on one side of the mirror axis. For each set of (x, y) coordinates\n" "entered here, a pair of drills will be created:\n\n" "- one drill at the coordinates from the field\n" - "- one drill in mirror position over the axis selected above in the 'Mirror Axis'." + "- one drill in mirror position over the axis selected above in the 'Mirror Axis'.") ) self.layout.addWidget(self.ah_label) - grid_lay1 = QtWidgets.QGridLayout() - self.layout.addLayout(grid_lay1) + grid_lay3 = QtWidgets.QGridLayout() + self.layout.addLayout(grid_lay3) self.alignment_holes = EvalEntry() - self.add_drill_point_button = QtWidgets.QPushButton("Add") + self.add_drill_point_button = QtWidgets.QPushButton(_("Add")) self.add_drill_point_button.setToolTip( - "Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" + _("Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" "on one side of the mirror axis.\n\n" "The coordinates set can be obtained:\n" "- press SHIFT key and left mouse clicking on canvas. Then click Add.\n" "- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the field.\n" "- press SHIFT key and left mouse clicking on canvas. Then RMB click in the field and click Paste.\n" - "- by entering the coords manually in the format: (x1, y1), (x2, y2), ..." + "- by entering the coords manually in the format: (x1, y1), (x2, y2), ...") ) - self.add_drill_point_button.setFixedWidth(40) + self.add_drill_point_button.setFixedWidth(60) - grid_lay1.addWidget(self.alignment_holes, 0, 0, 1, 2) - grid_lay1.addWidget(self.add_drill_point_button, 0, 3) + grid_lay3.addWidget(self.alignment_holes, 0, 0) + grid_lay3.addWidget(self.add_drill_point_button, 0, 1) ## Drill diameter for alignment holes - self.dt_label = QtWidgets.QLabel("Alignment Drill Diameter:") + self.dt_label = QtWidgets.QLabel("%s:" % _('Alignment Drill Diameter')) self.dt_label.setToolTip( - "Diameter of the drill for the " - "alignment holes." + _("Diameter of the drill for the " + "alignment holes.") ) self.layout.addWidget(self.dt_label) - grid_lay2 = QtWidgets.QGridLayout() - self.layout.addLayout(grid_lay2) + hlay = QtWidgets.QHBoxLayout() + self.layout.addLayout(hlay) self.drill_dia = FCEntry() - self.dd_label = QtWidgets.QLabel("Drill diam.:") + self.dd_label = QtWidgets.QLabel(_("Drill diam.:")) self.dd_label.setToolTip( - "Diameter of the drill for the " - "alignment holes." + _("Diameter of the drill for the " + "alignment holes.") ) - grid_lay2.addWidget(self.dd_label, 0, 0) - grid_lay2.addWidget(self.drill_dia, 0, 1) + hlay.addWidget(self.dd_label) + hlay.addWidget(self.drill_dia) + + hlay2 = QtWidgets.QHBoxLayout() + self.layout.addLayout(hlay2) ## Buttons - self.create_alignment_hole_button = QtWidgets.QPushButton("Create Excellon Object") + self.create_alignment_hole_button = QtWidgets.QPushButton(_("Create Excellon Object")) self.create_alignment_hole_button.setToolTip( - "Creates an Excellon Object containing the\n" + _("Creates an Excellon Object containing the\n" "specified alignment holes and their mirror\n" "images.") - # self.create_alignment_hole_button.setFixedWidth(40) - grid_lay2.addWidget(self.create_alignment_hole_button, 1,0, 1, 2) + ) + hlay2.addWidget(self.create_alignment_hole_button) - self.reset_button = QtWidgets.QPushButton("Reset") + self.reset_button = QtWidgets.QPushButton(_("Reset")) self.reset_button.setToolTip( - "Resets all the fields.") - self.reset_button.setFixedWidth(40) - grid_lay2.addWidget(self.reset_button, 1, 2) + _("Resets all the fields.") + ) + self.reset_button.setFixedWidth(60) + hlay2.addWidget(self.reset_button) self.layout.addStretch() @@ -261,23 +279,27 @@ class DblSidedTool(FlatCAMTool): def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+D', **kwargs) - def run(self): + def run(self, toggle=True): self.app.report_usage("Tool2Sided()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "2-Sided Tool") + self.app.ui.notebook.setTabText(2, _("2-Sided Tool")) def set_tool_ui(self): self.reset_fields() @@ -302,8 +324,8 @@ class DblSidedTool(FlatCAMTool): try: px, py = self.point_entry.get_value() except TypeError: - self.app.inform.emit("[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates " - "are missing. Add them and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates " + "are missing. Add them and retry.")) return else: selection_index = self.box_combo.currentIndex() @@ -321,7 +343,7 @@ class DblSidedTool(FlatCAMTool): bb_obj = model_index.internalPointer().obj except AttributeError: self.app.inform.emit( - "[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry.") + _("[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry.")) return xmin, ymin, xmax, ymax = bb_obj.bounds() @@ -338,19 +360,19 @@ class DblSidedTool(FlatCAMTool): dia = float(self.drill_dia.get_value().replace(',', '.')) self.drill_dia.set_value(dia) except ValueError: - self.app.inform.emit("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " - "Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. " + "Add it and retry.")) return if dia is '': - self.app.inform.emit("[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry.") + self.app.inform.emit(_("[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry.")) return tools = {"1": {"C": dia}} # holes = self.alignment_holes.get_value() holes = eval('[{}]'.format(self.alignment_holes.text())) if not holes: - self.app.inform.emit("[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them and retry.") + self.app.inform.emit(_("[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them and retry.")) return drills = [] @@ -372,7 +394,7 @@ class DblSidedTool(FlatCAMTool): self.app.new_object("excellon", "Alignment Drills", obj_init) self.drill_values = '' - self.app.inform.emit("[success] Excellon object with alignment drills created...") + self.app.inform.emit(_("[success] Excellon object with alignment drills created...")) def on_mirror_gerber(self): selection_index = self.gerber_object_combo.currentIndex() @@ -381,11 +403,11 @@ class DblSidedTool(FlatCAMTool): try: fcobj = model_index.internalPointer().obj except Exception as e: - self.app.inform.emit("[WARNING_NOTCL] There is no Gerber object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Gerber object loaded ...")) return if not isinstance(fcobj, FlatCAMGerber): - self.app.inform.emit("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.") + self.app.inform.emit(_("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.")) return axis = self.mirror_axis.get_value() @@ -395,8 +417,8 @@ class DblSidedTool(FlatCAMTool): try: px, py = self.point_entry.get_value() except TypeError: - self.app.inform.emit("[WARNING_NOTCL] 'Point' coordinates missing. " - "Using Origin (0, 0) as mirroring reference.") + self.app.inform.emit(_("[WARNING_NOTCL] 'Point' coordinates missing. " + "Using Origin (0, 0) as mirroring reference.")) px, py = (0, 0) else: @@ -405,7 +427,7 @@ class DblSidedTool(FlatCAMTool): try: bb_obj = model_index_box.internalPointer().obj except Exception as e: - self.app.inform.emit("[WARNING_NOTCL] There is no Box object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Box object loaded ...")) return xmin, ymin, xmax, ymax = bb_obj.bounds() @@ -415,7 +437,7 @@ class DblSidedTool(FlatCAMTool): fcobj.mirror(axis, [px, py]) self.app.object_changed.emit(fcobj) fcobj.plot() - self.app.inform.emit("[success] Gerber %s was mirrored..." % str(fcobj.options['name'])) + self.app.inform.emit(_("[success] Gerber %s was mirrored...") % str(fcobj.options['name'])) def on_mirror_exc(self): selection_index = self.exc_object_combo.currentIndex() @@ -424,11 +446,11 @@ class DblSidedTool(FlatCAMTool): try: fcobj = model_index.internalPointer().obj except Exception as e: - self.app.inform.emit("[WARNING_NOTCL] There is no Excellon object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Excellon object loaded ...")) return if not isinstance(fcobj, FlatCAMExcellon): - self.app.inform.emit("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.") + self.app.inform.emit(_("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.")) return axis = self.mirror_axis.get_value() @@ -439,8 +461,8 @@ class DblSidedTool(FlatCAMTool): px, py = self.point_entry.get_value() except Exception as e: log.debug("DblSidedTool.on_mirror_geo() --> %s" % str(e)) - self.app.inform.emit("[WARNING_NOTCL] There are no Point coordinates in the Point field. " - "Add coords and try again ...") + self.app.inform.emit(_("[WARNING_NOTCL] There are no Point coordinates in the Point field. " + "Add coords and try again ...")) return else: selection_index_box = self.box_combo.currentIndex() @@ -449,7 +471,7 @@ class DblSidedTool(FlatCAMTool): bb_obj = model_index_box.internalPointer().obj except Exception as e: log.debug("DblSidedTool.on_mirror_geo() --> %s" % str(e)) - self.app.inform.emit("[WARNING_NOTCL] There is no Box object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Box object loaded ...")) return xmin, ymin, xmax, ymax = bb_obj.bounds() @@ -459,7 +481,7 @@ class DblSidedTool(FlatCAMTool): fcobj.mirror(axis, [px, py]) self.app.object_changed.emit(fcobj) fcobj.plot() - self.app.inform.emit("[success] Excellon %s was mirrored..." % str(fcobj.options['name'])) + self.app.inform.emit(_("[success] Excellon %s was mirrored...") % str(fcobj.options['name'])) def on_mirror_geo(self): selection_index = self.geo_object_combo.currentIndex() @@ -468,11 +490,11 @@ class DblSidedTool(FlatCAMTool): try: fcobj = model_index.internalPointer().obj except Exception as e: - self.app.inform.emit("[WARNING_NOTCL] There is no Geometry object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Geometry object loaded ...")) return if not isinstance(fcobj, FlatCAMGeometry): - self.app.inform.emit("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.") + self.app.inform.emit(_("[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored.")) return axis = self.mirror_axis.get_value() @@ -486,7 +508,7 @@ class DblSidedTool(FlatCAMTool): try: bb_obj = model_index_box.internalPointer().obj except Exception as e: - self.app.inform.emit("[WARNING_NOTCL] There is no Box object loaded ...") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Box object loaded ...")) return xmin, ymin, xmax, ymax = bb_obj.bounds() @@ -496,7 +518,7 @@ class DblSidedTool(FlatCAMTool): fcobj.mirror(axis, [px, py]) self.app.object_changed.emit(fcobj) fcobj.plot() - self.app.inform.emit("[success] Geometry %s was mirrored..." % str(fcobj.options['name'])) + self.app.inform.emit(_("[success] Geometry %s was mirrored...") % str(fcobj.options['name'])) def on_point_add(self): val = self.app.defaults["global_point_clipboard_format"] % (self.app.pos[0], self.app.pos[1]) diff --git a/flatcamTools/ToolFilm.py b/flatcamTools/ToolFilm.py index 760c45a8..51463da1 100644 --- a/flatcamTools/ToolFilm.py +++ b/flatcamTools/ToolFilm.py @@ -1,12 +1,28 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool -from GUIElements import RadioSet, FCEntry +from flatcamGUI.GUIElements import RadioSet, FCEntry from PyQt5 import QtGui, QtCore, QtWidgets +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class Film(FlatCAMTool): - toolName = "Film PCB" + toolName = _("Film PCB") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -37,12 +53,12 @@ class Film(FlatCAMTool): self.tf_type_obj_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png")) self.tf_type_obj_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png")) - self.tf_type_obj_combo_label = QtWidgets.QLabel("Object Type:") + self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:")) self.tf_type_obj_combo_label.setToolTip( - "Specify the type of object for which to create the film.\n" + _("Specify the type of object for which to create the film.\n" "The object can be of type: Gerber or Geometry.\n" "The selection here decide the type of objects that will be\n" - "in the Film Object combobox." + "in the Film Object combobox.") ) tf_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo) @@ -52,9 +68,9 @@ class Film(FlatCAMTool): self.tf_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.tf_object_combo.setCurrentIndex(1) - self.tf_object_label = QtWidgets.QLabel("Film Object:") + self.tf_object_label = QtWidgets.QLabel(_("Film Object:")) self.tf_object_label.setToolTip( - "Object for which to create the film." + _("Object for which to create the film.") ) tf_form_layout.addRow(self.tf_object_label, self.tf_object_combo) @@ -70,12 +86,12 @@ class Film(FlatCAMTool): self.tf_type_box_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png")) self.tf_type_box_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png")) - self.tf_type_box_combo_label = QtWidgets.QLabel("Box Type:") + self.tf_type_box_combo_label = QtWidgets.QLabel(_("Box Type:")) self.tf_type_box_combo_label.setToolTip( - "Specify the type of object to be used as an container for\n" + _("Specify the type of object to be used as an container for\n" "film creation. It can be: Gerber or Geometry type." "The selection here decide the type of objects that will be\n" - "in the Box Object combobox." + "in the Box Object combobox.") ) tf_form_layout.addRow(self.tf_type_box_combo_label, self.tf_type_box_combo) @@ -85,50 +101,51 @@ class Film(FlatCAMTool): self.tf_box_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.tf_box_combo.setCurrentIndex(1) - self.tf_box_combo_label = QtWidgets.QLabel("Box Object:") + self.tf_box_combo_label = QtWidgets.QLabel(_("Box Object:")) self.tf_box_combo_label.setToolTip( - "The actual object that is used a container for the\n " + _("The actual object that is used a container for the\n " "selected object for which we create the film.\n" "Usually it is the PCB outline but it can be also the\n" "same object for which the film is created.") + ) tf_form_layout.addRow(self.tf_box_combo_label, self.tf_box_combo) # Film Type self.film_type = RadioSet([{'label': 'Positive', 'value': 'pos'}, {'label': 'Negative', 'value': 'neg'}]) - self.film_type_label = QtWidgets.QLabel("Film Type:") + self.film_type_label = QtWidgets.QLabel(_("Film Type:")) self.film_type_label.setToolTip( - "Generate a Positive black film or a Negative film.\n" + _("Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" "with black on a white canvas.\n" "Negative means that it will print the features\n" "with white on a black canvas.\n" - "The Film format is SVG." + "The Film format is SVG.") ) tf_form_layout.addRow(self.film_type_label, self.film_type) # Boundary for negative film generation self.boundary_entry = FCEntry() - self.boundary_label = QtWidgets.QLabel("Border:") + self.boundary_label = QtWidgets.QLabel(_("Border:")) self.boundary_label.setToolTip( - "Specify a border around the object.\n" + _("Specify a border around the object.\n" "Only for negative film.\n" "It helps if we use as a Box Object the same \n" "object as in Film Object. It will create a thick\n" "black bar around the actual print allowing for a\n" "better delimitation of the outline features which are of\n" "white color like the rest and which may confound with the\n" - "surroundings if not for this border." + "surroundings if not for this border.") ) tf_form_layout.addRow(self.boundary_label, self.boundary_entry) self.film_scale_entry = FCEntry() - self.film_scale_label = QtWidgets.QLabel("Scale Stroke:") + self.film_scale_label = QtWidgets.QLabel(_("Scale Stroke:")) self.film_scale_label.setToolTip( - "Scale the line stroke thickness of each feature in the SVG file.\n" + _("Scale the line stroke thickness of each feature in the SVG file.\n" "It means that the line that envelope each SVG feature will be thicker or thinner,\n" - "therefore the fine features may be more affected by this parameter." + "therefore the fine features may be more affected by this parameter.") ) tf_form_layout.addRow(self.film_scale_label, self.film_scale_entry) @@ -137,12 +154,12 @@ class Film(FlatCAMTool): self.layout.addLayout(hlay) hlay.addStretch() - self.film_object_button = QtWidgets.QPushButton("Save Film") + self.film_object_button = QtWidgets.QPushButton(_("Save Film")) self.film_object_button.setToolTip( - "Create a Film for the selected object, within\n" + _("Create a Film for the selected object, within\n" "the specified box. Does not create a new \n " "FlatCAM object, but directly save it in SVG format\n" - "which can be opened with Inkscape." + "which can be opened with Inkscape.") ) hlay.addWidget(self.film_object_button) @@ -163,23 +180,28 @@ class Film(FlatCAMTool): self.tf_box_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex())) self.tf_box_combo.setCurrentIndex(0) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolFilm()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) + self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "Film Tool") + self.app.ui.notebook.setTabText(2, _("Film Tool")) def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+L', **kwargs) @@ -190,7 +212,7 @@ class Film(FlatCAMTool): f_type = self.app.defaults["tools_film_type"] if self.app.defaults["tools_film_type"] else 'neg' self.film_type.set_value(str(f_type)) - b_entry = self.app.defaults[ "tools_film_boundary"] if self.app.defaults[ "tools_film_boundary"] else 0.0 + b_entry = self.app.defaults["tools_film_boundary"] if self.app.defaults["tools_film_boundary"] else 0.0 self.boundary_entry.set_value(float(b_entry)) scale_stroke_width = self.app.defaults["tools_film_scale"] if self.app.defaults["tools_film_scale"] else 0.0 @@ -200,13 +222,13 @@ class Film(FlatCAMTool): try: name = self.tf_object_combo.currentText() except: - self.app.inform.emit("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry.") + self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry.")) return try: boxname = self.tf_box_combo.currentText() except: - self.app.inform.emit("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry.") + self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry.")) return try: @@ -216,51 +238,51 @@ class Film(FlatCAMTool): try: border = float(self.boundary_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: scale_stroke_width = int(self.film_scale_entry.get_value()) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return if border is None: border = 0 - self.app.inform.emit("Generating Film ...") + self.app.inform.emit(_("Generating Film ...")) if self.film_type.get_value() == "pos": try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export SVG positive", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export SVG positive"), directory=self.app.get_last_save_folder() + '/' + name, filter="*.svg") except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export SVG positive") + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export SVG positive")) filename = str(filename) if str(filename) == "": - self.app.inform.emit("[WARNING_NOTCL]Export SVG positive cancelled.") + self.app.inform.emit(_("[WARNING_NOTCL]Export SVG positive cancelled.")) return else: self.app.export_svg_black(name, boxname, filename, scale_factor=scale_stroke_width) else: try: - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export SVG negative", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export SVG negative"), directory=self.app.get_last_save_folder() + '/' + name, filter="*.svg") except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export SVG negative") + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export SVG negative")) filename = str(filename) if str(filename) == "": - self.app.inform.emit("[WARNING_NOTCL]Export SVG negative cancelled.") + self.app.inform.emit(_("[WARNING_NOTCL]Export SVG negative cancelled.")) return else: self.app.export_svg_negative(name, boxname, filename, border, scale_factor=scale_stroke_width) diff --git a/flatcamTools/ToolImage.py b/flatcamTools/ToolImage.py index 50c53e6e..c1f38dae 100644 --- a/flatcamTools/ToolImage.py +++ b/flatcamTools/ToolImage.py @@ -1,18 +1,34 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool -from GUIElements import RadioSet, FloatEntry, FCComboBox, IntEntry -from PyQt5 import QtGui, QtCore, QtWidgets +from flatcamGUI.GUIElements import RadioSet, FCComboBox, IntEntry +from PyQt5 import QtGui, QtWidgets + +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext class ToolImage(FlatCAMTool): - toolName = "Image as Object" + toolName = _("Image as Object") def __init__(self, app): FlatCAMTool.__init__(self, app) # Title - title_label = QtWidgets.QLabel("%s" % 'Image to PCB') + title_label = QtWidgets.QLabel("%s" % _('Image to PCB')) title_label.setStyleSheet(""" QLabel { @@ -34,26 +50,26 @@ class ToolImage(FlatCAMTool): self.tf_type_obj_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png")) self.tf_type_obj_combo.setItemIcon(1, QtGui.QIcon("share/geometry16.png")) - self.tf_type_obj_combo_label = QtWidgets.QLabel("Object Type:") + self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:")) self.tf_type_obj_combo_label.setToolTip( - "Specify the type of object to create from the image.\n" - "It can be of type: Gerber or Geometry." + _( "Specify the type of object to create from the image.\n" + "It can be of type: Gerber or Geometry.") ) ti_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo) # DPI value of the imported image self.dpi_entry = IntEntry() - self.dpi_label = QtWidgets.QLabel("DPI value:") + self.dpi_label = QtWidgets.QLabel(_("DPI value:")) self.dpi_label.setToolTip( - "Specify a DPI value for the image." + _( "Specify a DPI value for the image.") ) ti_form_layout.addRow(self.dpi_label, self.dpi_entry) self.emty_lbl = QtWidgets.QLabel("") self.layout.addWidget(self.emty_lbl) - self.detail_label = QtWidgets.QLabel("Level of detail:") + self.detail_label = QtWidgets.QLabel("%s:" % _('Level of detail')) self.layout.addWidget(self.detail_label) ti2_form_layout = QtWidgets.QFormLayout() @@ -62,56 +78,56 @@ class ToolImage(FlatCAMTool): # Type of image interpretation self.image_type = RadioSet([{'label': 'B/W', 'value': 'black'}, {'label': 'Color', 'value': 'color'}]) - self.image_type_label = QtWidgets.QLabel("Image type:") + self.image_type_label = QtWidgets.QLabel("%s:" % _('Image type')) self.image_type_label.setToolTip( - "Choose a method for the image interpretation.\n" - "B/W means a black & white image. Color means a colored image." + _("Choose a method for the image interpretation.\n" + "B/W means a black & white image. Color means a colored image.") ) ti2_form_layout.addRow(self.image_type_label, self.image_type) # Mask value of the imported image when image monochrome self.mask_bw_entry = IntEntry() - self.mask_bw_label = QtWidgets.QLabel("Mask value B/W:") + self.mask_bw_label = QtWidgets.QLabel("%s B/W:" % _('Mask value')) self.mask_bw_label.setToolTip( - "Mask for monochrome image.\n" + _("Mask for monochrome image.\n" "Takes values between [0 ... 255].\n" "Decides the level of details to include\n" "in the resulting geometry.\n" "0 means no detail and 255 means everything \n" - "(which is totally black)." + "(which is totally black).") ) ti2_form_layout.addRow(self.mask_bw_label, self.mask_bw_entry) # Mask value of the imported image for RED color when image color self.mask_r_entry = IntEntry() - self.mask_r_label = QtWidgets.QLabel("Mask value R:") + self.mask_r_label = QtWidgets.QLabel("%s R:" % _('Mask value')) self.mask_r_label.setToolTip( - "Mask for RED color.\n" + _("Mask for RED color.\n" "Takes values between [0 ... 255].\n" "Decides the level of details to include\n" - "in the resulting geometry." + "in the resulting geometry.") ) ti2_form_layout.addRow(self.mask_r_label, self.mask_r_entry) # Mask value of the imported image for GREEN color when image color self.mask_g_entry = IntEntry() - self.mask_g_label = QtWidgets.QLabel("Mask value G:") + self.mask_g_label = QtWidgets.QLabel("%s G:" % _('Mask value')) self.mask_g_label.setToolTip( - "Mask for GREEN color.\n" + _("Mask for GREEN color.\n" "Takes values between [0 ... 255].\n" "Decides the level of details to include\n" - "in the resulting geometry." + "in the resulting geometry.") ) ti2_form_layout.addRow(self.mask_g_label, self.mask_g_entry) # Mask value of the imported image for BLUE color when image color self.mask_b_entry = IntEntry() - self.mask_b_label = QtWidgets.QLabel("Mask value B:") + self.mask_b_label = QtWidgets.QLabel("%s B:" % _('Mask value')) self.mask_b_label.setToolTip( - "Mask for BLUE color.\n" + _("Mask for BLUE color.\n" "Takes values between [0 ... 255].\n" "Decides the level of details to include\n" - "in the resulting geometry." + "in the resulting geometry.") ) ti2_form_layout.addRow(self.mask_b_label, self.mask_b_entry) @@ -120,9 +136,9 @@ class ToolImage(FlatCAMTool): self.layout.addLayout(hlay) hlay.addStretch() - self.import_button = QtWidgets.QPushButton("Import image") + self.import_button = QtWidgets.QPushButton(_("Import image")) self.import_button.setToolTip( - "Open a image of raster type and then import it in FlatCAM." + _("Open a image of raster type and then import it in FlatCAM.") ) hlay.addWidget(self.import_button) @@ -131,23 +147,27 @@ class ToolImage(FlatCAMTool): ## Signals self.import_button.clicked.connect(self.on_file_importimage) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolImage()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "Image Tool") + self.app.ui.notebook.setTabText(2, _("Image Tool")) def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, **kwargs) @@ -177,10 +197,10 @@ class ToolImage(FlatCAMTool): "Jpeg File (*.JPG);;" \ "All Files (*.*)" try: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Import IMAGE", + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"), directory=self.app.get_last_folder(), filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Import IMAGE", filter=filter) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"), filter=filter) filename = str(filename) type = self.tf_type_obj_combo.get_value().lower() @@ -190,7 +210,7 @@ class ToolImage(FlatCAMTool): self.mask_b_entry.get_value()] if filename == "": - self.app.inform.emit("Open cancelled.") + self.app.inform.emit(_("Open cancelled.")) else: self.app.worker_task.emit({'fcn': self.app.import_image, 'params': [filename, type, dpi, mode, mask]}) diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index 54eb3c1f..6c6c25d5 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -1,13 +1,29 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from FlatCAMObj import * -from VisPyVisuals import * +from flatcamGUI.VisPyVisuals import * -from copy import copy from math import sqrt +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + + class Measurement(FlatCAMTool): - toolName = "Measurement" + toolName = _("Measurement") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -28,51 +44,51 @@ class Measurement(FlatCAMTool): form_layout_child_2 = QtWidgets.QFormLayout() form_layout_child_3 = QtWidgets.QFormLayout() - self.start_label = QtWidgets.QLabel("Start Coords:") - self.start_label.setToolTip("This is measuring Start point coordinates.") + self.start_label = QtWidgets.QLabel("%s %s:" % (_('Start'), _('Coords'))) + self.start_label.setToolTip(_("This is measuring Start point coordinates.")) - self.stop_label = QtWidgets.QLabel("Stop Coords:") - self.stop_label.setToolTip("This is the measuring Stop point coordinates.") + self.stop_label = QtWidgets.QLabel("%s %s:" % (_('Stop'), _('Coords'))) + self.stop_label.setToolTip(_("This is the measuring Stop point coordinates.")) self.distance_x_label = QtWidgets.QLabel("Dx:") - self.distance_x_label.setToolTip("This is the distance measured over the X axis.") + self.distance_x_label.setToolTip(_("This is the distance measured over the X axis.")) self.distance_y_label = QtWidgets.QLabel("Dy:") - self.distance_y_label.setToolTip("This is the distance measured over the Y axis.") + self.distance_y_label.setToolTip(_("This is the distance measured over the Y axis.")) - self.total_distance_label = QtWidgets.QLabel("DISTANCE:") - self.total_distance_label.setToolTip("This is the point to point Euclidian distance.") + self.total_distance_label = QtWidgets.QLabel("%s:" % _('DISTANCE')) + self.total_distance_label.setToolTip(_("This is the point to point Euclidian distance.")) self.units_entry_1 = FCEntry() - self.units_entry_1.setToolTip("Those are the units in which the distance is measured.") + self.units_entry_1.setToolTip(_("Those are the units in which the distance is measured.")) self.units_entry_1.setDisabled(True) self.units_entry_1.setFocusPolicy(QtCore.Qt.NoFocus) self.units_entry_1.setFrame(False) self.units_entry_1.setFixedWidth(30) self.units_entry_2 = FCEntry() - self.units_entry_2.setToolTip("Those are the units in which the distance is measured.") + self.units_entry_2.setToolTip(_("Those are the units in which the distance is measured.")) self.units_entry_2.setDisabled(True) self.units_entry_2.setFocusPolicy(QtCore.Qt.NoFocus) self.units_entry_2.setFrame(False) self.units_entry_2.setFixedWidth(30) self.units_entry_3 = FCEntry() - self.units_entry_3.setToolTip("Those are the units in which the distance is measured.") + self.units_entry_3.setToolTip(_("Those are the units in which the distance is measured.")) self.units_entry_3.setDisabled(True) self.units_entry_3.setFocusPolicy(QtCore.Qt.NoFocus) self.units_entry_3.setFrame(False) self.units_entry_3.setFixedWidth(30) self.units_entry_4 = FCEntry() - self.units_entry_4.setToolTip("Those are the units in which the distance is measured.") + self.units_entry_4.setToolTip(_("Those are the units in which the distance is measured.")) self.units_entry_4.setDisabled(True) self.units_entry_4.setFocusPolicy(QtCore.Qt.NoFocus) self.units_entry_4.setFrame(False) self.units_entry_4.setFixedWidth(30) self.units_entry_5 = FCEntry() - self.units_entry_5.setToolTip("Those are the units in which the distance is measured.") + self.units_entry_5.setToolTip(_("Those are the units in which the distance is measured.")) self.units_entry_5.setDisabled(True) self.units_entry_5.setFocusPolicy(QtCore.Qt.NoFocus) self.units_entry_5.setFrame(False) @@ -80,32 +96,32 @@ class Measurement(FlatCAMTool): self.start_entry = FCEntry() self.start_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.start_entry.setToolTip("This is measuring Start point coordinates.") + self.start_entry.setToolTip(_("This is measuring Start point coordinates.")) self.start_entry.setFixedWidth(100) self.stop_entry = FCEntry() self.stop_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.stop_entry.setToolTip("This is the measuring Stop point coordinates.") + self.stop_entry.setToolTip(_("This is the measuring Stop point coordinates.")) self.stop_entry.setFixedWidth(100) self.distance_x_entry = FCEntry() self.distance_x_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.distance_x_entry.setToolTip("This is the distance measured over the X axis.") + self.distance_x_entry.setToolTip(_("This is the distance measured over the X axis.")) self.distance_x_entry.setFixedWidth(100) self.distance_y_entry = FCEntry() self.distance_y_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.distance_y_entry.setToolTip("This is the distance measured over the Y axis.") + self.distance_y_entry.setToolTip(_("This is the distance measured over the Y axis.")) self.distance_y_entry.setFixedWidth(100) self.total_distance_entry = FCEntry() self.total_distance_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - self.total_distance_entry.setToolTip("This is the point to point Euclidian distance.") + self.total_distance_entry.setToolTip(_("This is the point to point Euclidian distance.")) self.total_distance_entry.setFixedWidth(100) - self.measure_btn = QtWidgets.QPushButton("Measure") + self.measure_btn = QtWidgets.QPushButton(_("Measure")) self.measure_btn.setFixedWidth(70) self.layout.addWidget(self.measure_btn) @@ -149,17 +165,22 @@ class Measurement(FlatCAMTool): # VisPy visuals self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1) - self.measure_btn.clicked.connect(self.toggle) + self.measure_btn.clicked.connect(self.toggle_f) - def run(self): + def run(self, toggle=False): self.app.report_usage("ToolMeasurement()") if self.app.tool_tab_locked is True: return - self.toggle() + + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + + self.toggle_f() self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "Meas. Tool") + self.app.ui.notebook.setTabText(2, _("Meas. Tool")) def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs) @@ -176,11 +197,12 @@ class Measurement(FlatCAMTool): self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() self.show() - def toggle(self): + def toggle_f(self): # the self.active var is doing the 'toggle' if self.active is True: # DISABLE the Measuring TOOL self.active = False + # disconnect the mouse/key events from functions of measurement tool self.app.plotcanvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) self.app.plotcanvas.vis_disconnect('mouse_press', self.on_click_meas) @@ -202,6 +224,7 @@ class Measurement(FlatCAMTool): self.app.exc_editor.canvas.vis_connect('key_press', self.app.exc_editor.on_canvas_key) self.app.exc_editor.canvas.vis_connect('mouse_release', self.app.exc_editor.on_canvas_click_release) + self.app.call_source = 'measurement' self.clicked_meas = 0 self.app.command_active = None # delete the measuring line @@ -250,7 +273,7 @@ class Measurement(FlatCAMTool): self.units_entry_4.set_value(str(self.units)) self.units_entry_5.set_value(str(self.units)) - self.app.inform.emit("MEASURING: Click on the Start point ...") + self.app.inform.emit(_("MEASURING: Click on the Start point ...")) def on_key_release_meas(self, event): if event.key == 'escape': @@ -279,7 +302,7 @@ class Measurement(FlatCAMTool): pos = pos_canvas[0], pos_canvas[1] self.point1 = pos self.start_entry.set_value("(%.4f, %.4f)" % pos) - self.app.inform.emit("MEASURING: Click on the Destination point ...") + self.app.inform.emit(_("MEASURING: Click on the Destination point ...")) if self.clicked_meas == 1: try: @@ -300,15 +323,15 @@ class Measurement(FlatCAMTool): self.stop_entry.set_value("(%.4f, %.4f)" % pos) - self.app.inform.emit("MEASURING: Result D(x) = %.4f | D(y) = %.4f | Distance = %.4f" % - (abs(dx), abs(dy), abs(d))) + self.app.inform.emit(_("MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}").format( + d_x='%4f' % abs(dx), d_y='%4f' % abs(dy), d_z='%4f' % abs(d))) self.distance_x_entry.set_value('%.4f' % abs(dx)) self.distance_y_entry.set_value('%.4f' % abs(dy)) self.total_distance_entry.set_value('%.4f' % abs(d)) self.clicked_meas = 0 - self.toggle() + self.toggle_f() # delete the measuring line self.delete_shape() diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py index 50c145b9..f45ffda7 100644 --- a/flatcamTools/ToolMove.py +++ b/flatcamTools/ToolMove.py @@ -1,14 +1,29 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from FlatCAMObj import * -from VisPyVisuals import * +from flatcamGUI.VisPyVisuals import * -from io import StringIO from copy import copy +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class ToolMove(FlatCAMTool): - toolName = "Move" + toolName = _("Move") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -33,14 +48,14 @@ class ToolMove(FlatCAMTool): def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='M', **kwargs) - def run(self): + def run(self, toggle): self.app.report_usage("ToolMove()") if self.app.tool_tab_locked is True: return self.toggle() - def toggle(self): + def toggle(self, toggle=False): if self.isVisible(): self.setVisible(False) @@ -63,14 +78,14 @@ class ToolMove(FlatCAMTool): self.app.command_active = "Move" if self.app.collection.get_selected(): - self.app.inform.emit("MOVE: Click on the Start point ...") + self.app.inform.emit(_("MOVE: Click on the Start point ...")) # draw the selection box self.draw_sel_bbox() else: self.setVisible(False) # signal that there is no command active self.app.command_active = None - self.app.inform.emit("[WARNING_NOTCL]MOVE action cancelled. No object(s) to move.") + self.app.inform.emit(_("[WARNING_NOTCL] MOVE action cancelled. No object(s) to move.")) def on_left_click(self, event): # mouse click will be accepted only if the left button is clicked @@ -92,7 +107,7 @@ class ToolMove(FlatCAMTool): else: self.point2 = copy(self.point1) self.point1 = pos - self.app.inform.emit("MOVE: Click on the Destination point ...") + self.app.inform.emit(_("MOVE: Click on the Destination point ...")) if self.clicked_move == 1: try: @@ -110,14 +125,14 @@ class ToolMove(FlatCAMTool): dx = pos[0] - self.point1[0] dy = pos[1] - self.point1[1] - proc = self.app.proc_container.new("Moving ...") + proc = self.app.proc_container.new(_("Moving ...")) def job_move(app_obj): obj_list = self.app.collection.get_selected() try: if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object(s) selected.") + self.app.inform.emit(_("[WARNING_NOTCL] No object(s) selected.")) return "fail" else: for sel_obj in obj_list: @@ -140,13 +155,13 @@ class ToolMove(FlatCAMTool): # self.app.collection.set_active(sel_obj.options['name']) except Exception as e: proc.done() - self.app.inform.emit('[ERROR_NOTCL] ' - 'ToolMove.on_left_click() --> %s' % str(e)) + self.app.inform.emit(_('[ERROR_NOTCL] ' + 'ToolMove.on_left_click() --> %s') % str(e)) return "fail" proc.done() # delete the selection bounding box self.delete_shape() - self.app.inform.emit('[success]%s object was moved ...' % + self.app.inform.emit(_('[success]%s object was moved ...') % str(sel_obj.kind).capitalize()) self.app.worker_task.emit({'fcn': job_move, 'params': [self]}) @@ -156,8 +171,8 @@ class ToolMove(FlatCAMTool): return except TypeError: - self.app.inform.emit('[ERROR_NOTCL] ' - 'ToolMove.on_left_click() --> Error when mouse left click.') + self.app.inform.emit(_('[ERROR_NOTCL] ' + 'ToolMove.on_left_click() --> Error when mouse left click.')) return self.clicked_move = 1 @@ -184,7 +199,7 @@ class ToolMove(FlatCAMTool): def on_key_press(self, event): if event.key == 'escape': # abort the move action - self.app.inform.emit("[WARNING_NOTCL]Move action cancelled.") + self.app.inform.emit(_("[WARNING_NOTCL]Move action cancelled.")) self.toggle() return @@ -196,7 +211,7 @@ class ToolMove(FlatCAMTool): obj_list = self.app.collection.get_selected() if not obj_list: - self.app.inform.emit("[WARNING_NOTCL]Object(s) not selected") + self.app.inform.emit(_("[WARNING_NOTCL]Object(s) not selected")) self.toggle() else: # if we have an object selected then we can safely activate the mouse events diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index 6ddbd465..07fd534e 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -1,12 +1,28 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Modified by: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from copy import copy,deepcopy from ObjectCollection import * import time +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class NonCopperClear(FlatCAMTool, Gerber): - toolName = "Non-Copper Clearing" + toolName = _("Non-Copper Clearing") def __init__(self, app): self.app = app @@ -44,7 +60,7 @@ class NonCopperClear(FlatCAMTool, Gerber): self.object_label = QtWidgets.QLabel("Gerber:") self.object_label.setToolTip( - "Gerber object to be cleared of excess copper. " + _("Gerber object to be cleared of excess copper. ") ) e_lab_0 = QtWidgets.QLabel('') @@ -52,10 +68,10 @@ class NonCopperClear(FlatCAMTool, Gerber): form_layout.addRow(e_lab_0) #### Tools #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel('%s' % _('Tools Table')) self.tools_table_label.setToolTip( - "Tools pool from which the algorithm\n" - "will pick the ones used for copper clearing." + _("Tools pool from which the algorithm\n" + "will pick the ones used for copper clearing.") ) self.tools_box.addWidget(self.tools_table_label) @@ -63,25 +79,25 @@ class NonCopperClear(FlatCAMTool, Gerber): self.tools_box.addWidget(self.tools_table) self.tools_table.setColumnCount(4) - self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', 'TT', '']) + self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), 'TT', '']) self.tools_table.setColumnHidden(3, True) self.tools_table.setSortingEnabled(False) # self.tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tools_table.horizontalHeaderItem(0).setToolTip( - "This is the Tool Number.\n" + _("This is the Tool Number.\n" "Non copper clearing will start with the tool with the biggest \n" "diameter, continuing until there are no more tools.\n" "Only tools that create NCC clearing geometry will still be present\n" "in the resulting geometry. This is because with some tools\n" - "this function will not be able to create painting geometry." + "this function will not be able to create painting geometry.") ) self.tools_table.horizontalHeaderItem(1).setToolTip( - "Tool Diameter. It's value (in current FlatCAM units) \n" - "is the cut width into the material.") + _("Tool Diameter. It's value (in current FlatCAM units) \n" + "is the cut width into the material.")) self.tools_table.horizontalHeaderItem(2).setToolTip( - "The Tool Type (TT) can be:
" + _("The Tool Type (TT) can be:
" "- Circular with 1 ... 4 teeth -> it is informative only. Being circular,
" "the cut width in material is exactly the tool diameter.
" "- Ball -> informative only and make reference to the Ball type endmill.
" @@ -91,7 +107,7 @@ class NonCopperClear(FlatCAMTool, Gerber): "as the cut width into material will be equal with the value in the Tool Diameter " "column of this table.
" "Choosing the V-Shape Tool Type automatically will select the Operation Type " - "in the resulting geometry as Isolation.") + "in the resulting geometry as Isolation.")) self.empty_label = QtWidgets.QLabel('') self.tools_box.addWidget(self.empty_label) @@ -100,9 +116,9 @@ class NonCopperClear(FlatCAMTool, Gerber): hlay = QtWidgets.QHBoxLayout() self.tools_box.addLayout(hlay) - self.addtool_entry_lbl = QtWidgets.QLabel('Tool Dia:') + self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia')) self.addtool_entry_lbl.setToolTip( - "Diameter for the new tool to add in the Tool Table" + _("Diameter for the new tool to add in the Tool Table") ) self.addtool_entry = FCEntry() @@ -114,10 +130,10 @@ class NonCopperClear(FlatCAMTool, Gerber): grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) - self.addtool_btn = QtWidgets.QPushButton('Add') + self.addtool_btn = QtWidgets.QPushButton(_('Add')) self.addtool_btn.setToolTip( - "Add a new tool to the Tool Table\n" - "with the diameter specified above." + _("Add a new tool to the Tool Table\n" + "with the diameter specified above.") ) # self.copytool_btn = QtWidgets.QPushButton('Copy') @@ -126,10 +142,10 @@ class NonCopperClear(FlatCAMTool, Gerber): # "by first selecting a row in the Tool Table." # ) - self.deltool_btn = QtWidgets.QPushButton('Delete') + self.deltool_btn = QtWidgets.QPushButton(_('Delete')) self.deltool_btn.setToolTip( - "Delete a selection of tools in the Tool Table\n" - "by first selecting a row(s) in the Tool Table." + _("Delete a selection of tools in the Tool Table\n" + "by first selecting a row(s) in the Tool Table.") ) grid2.addWidget(self.addtool_btn, 0, 0) @@ -145,9 +161,9 @@ class NonCopperClear(FlatCAMTool, Gerber): e_lab_1 = QtWidgets.QLabel('') grid3.addWidget(e_lab_1, 0, 0) - nccoverlabel = QtWidgets.QLabel('Overlap:') + nccoverlabel = QtWidgets.QLabel(_('Overlap:')) nccoverlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _("How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" "A value here of 0.25 means 25% from the tool diameter found above.\n\n" "Adjust the value starting with lower values\n" @@ -155,27 +171,27 @@ class NonCopperClear(FlatCAMTool, Gerber): "not cleared.\n" "Lower values = faster processing, faster execution on PCB.\n" "Higher values = slow processing and slow execution on CNC\n" - "due of too many paths." + "due of too many paths.") ) grid3.addWidget(nccoverlabel, 1, 0) self.ncc_overlap_entry = FCEntry() grid3.addWidget(self.ncc_overlap_entry, 1, 1) - nccmarginlabel = QtWidgets.QLabel('Margin:') + nccmarginlabel = QtWidgets.QLabel(_('Margin:')) nccmarginlabel.setToolTip( - "Bounding box margin." + _("Bounding box margin.") ) grid3.addWidget(nccmarginlabel, 2, 0) self.ncc_margin_entry = FCEntry() grid3.addWidget(self.ncc_margin_entry, 2, 1) # Method - methodlabel = QtWidgets.QLabel('Method:') + methodlabel = QtWidgets.QLabel(_('Method:')) methodlabel.setToolTip( - "Algorithm for non-copper clearing:
" + _("Algorithm for non-copper clearing:
" "Standard: Fixed step inwards.
" "Seed-based: Outwards from seed.
" - "Line-based: Parallel lines." + "Line-based: Parallel lines.") ) grid3.addWidget(methodlabel, 3, 0) self.ncc_method_radio = RadioSet([ @@ -186,42 +202,42 @@ class NonCopperClear(FlatCAMTool, Gerber): grid3.addWidget(self.ncc_method_radio, 3, 1) # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel = QtWidgets.QLabel(_("Connect:")) pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." + _("Draw lines between resulting\n" + "segments to minimize tool lifts.") ) grid3.addWidget(pathconnectlabel, 4, 0) self.ncc_connect_cb = FCCheckBox() grid3.addWidget(self.ncc_connect_cb, 4, 1) - contourlabel = QtWidgets.QLabel("Contour:") + contourlabel = QtWidgets.QLabel(_("Contour:")) contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." + _("Cut around the perimeter of the polygon\n" + "to trim rough edges.") ) grid3.addWidget(contourlabel, 5, 0) self.ncc_contour_cb = FCCheckBox() grid3.addWidget(self.ncc_contour_cb, 5, 1) - restlabel = QtWidgets.QLabel("Rest M.:") + restlabel = QtWidgets.QLabel(_("Rest M.:")) restlabel.setToolTip( - "If checked, use 'rest machining'.\n" + _("If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" "using the biggest tool and continue with the next tools,\n" "from bigger to smaller, to clear areas of copper that\n" "could not be cleared by previous tool, until there is\n" "no more copper to clear or there are no more tools.\n" - "If not checked, use the standard algorithm." + "If not checked, use the standard algorithm.") ) grid3.addWidget(restlabel, 6, 0) self.ncc_rest_cb = FCCheckBox() grid3.addWidget(self.ncc_rest_cb, 6, 1) - self.generate_ncc_button = QtWidgets.QPushButton('Generate Geometry') + self.generate_ncc_button = QtWidgets.QPushButton(_('Generate Geometry')) self.generate_ncc_button.setToolTip( - "Create the Geometry Object\n" - "for non-copper routing." + _("Create the Geometry Object\n" + "for non-copper routing.") ) self.tools_box.addWidget(self.generate_ncc_button) @@ -243,24 +259,28 @@ class NonCopperClear(FlatCAMTool, Gerber): def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+N', **kwargs) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolNonCopperClear()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() self.build_ui() - self.app.ui.notebook.setTabText(2, "NCC Tool") + self.app.ui.notebook.setTabText(2, _("NCC Tool")) def set_tool_ui(self): self.tools_frame.show() @@ -455,16 +475,16 @@ class NonCopperClear(FlatCAMTool, Gerber): try: tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return if tool_dia is None: self.build_ui() - self.app.inform.emit("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.") + self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.")) return if tool_dia == 0: - self.app.inform.emit("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return # construct a list of all 'tooluid' in the self.tools @@ -488,12 +508,12 @@ class NonCopperClear(FlatCAMTool, Gerber): if float('%.4f' % tool_dia) in tool_dias: if muted is None: - self.app.inform.emit("[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table.")) self.tools_table.itemChanged.connect(self.on_tool_edit) return else: if muted is None: - self.app.inform.emit("[success] New tool added to Tool Table.") + self.app.inform.emit(_("[success] New tool added to Tool Table.")) self.ncc_tools.update({ int(self.tooluid): { 'tooldia': float('%.4f' % tool_dia), @@ -526,8 +546,8 @@ class NonCopperClear(FlatCAMTool, Gerber): try: new_tool_dia = float(self.tools_table.item(row, 1).text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " + "use a number.")) return tooluid = int(self.tools_table.item(row, 3).text()) @@ -535,7 +555,7 @@ class NonCopperClear(FlatCAMTool, Gerber): # identify the tool that was edited and get it's tooluid if new_tool_dia not in tool_dias: self.ncc_tools[tooluid]['tooldia'] = new_tool_dia - self.app.inform.emit("[success] Tool from Tool Table was edited.") + self.app.inform.emit(_("[success] Tool from Tool Table was edited.")) self.build_ui() return else: @@ -546,7 +566,7 @@ class NonCopperClear(FlatCAMTool, Gerber): break restore_dia_item = self.tools_table.item(row, 1) restore_dia_item.setText(str(old_tool_dia)) - self.app.inform.emit("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.")) self.build_ui() def on_tool_delete(self, rows_to_delete=None, all=None): @@ -585,12 +605,12 @@ class NonCopperClear(FlatCAMTool, Gerber): self.ncc_tools.pop(t, None) except AttributeError: - self.app.inform.emit("[WARNING_NOTCL]Delete failed. Select a tool to delete.") + self.app.inform.emit(_("[WARNING_NOTCL]Delete failed. Select a tool to delete.")) return except Exception as e: log.debug(str(e)) - self.app.inform.emit("[success] Tool(s) deleted from Tool Table.") + self.app.inform.emit(_("[success] Tool(s) deleted from Tool Table.")) self.build_ui() def on_ncc(self): @@ -602,8 +622,8 @@ class NonCopperClear(FlatCAMTool, Gerber): try: over = float(self.ncc_overlap_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return over = over if over else self.app.defaults["tools_nccoverlap"] @@ -614,8 +634,8 @@ class NonCopperClear(FlatCAMTool, Gerber): try: margin = float(self.ncc_margin_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return margin = margin if margin else self.app.defaults["tools_nccmargin"] @@ -636,14 +656,14 @@ class NonCopperClear(FlatCAMTool, Gerber): try: self.ncc_obj = self.app.collection.get_by_name(self.obj_name) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % self.obj_name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % self.obj_name) return "Could not retrieve object: %s" % self.obj_name # Prepare non-copper polygons try: bounding_box = self.ncc_obj.solid_geometry.envelope.buffer(distance=margin, join_style=JOIN_STYLE.mitre) except AttributeError: - self.app.inform.emit("[ERROR_NOTCL]No Gerber file available.") + self.app.inform.emit(_("[ERROR_NOTCL]No Gerber file available.")) return # calculate the empty area by subtracting the solid_geometry from the object bounding box geometry @@ -681,7 +701,7 @@ class NonCopperClear(FlatCAMTool, Gerber): sorted_tools.sort(reverse=True) # Do job in background - proc = self.app.proc_container.new("Clearing Non-Copper areas.") + proc = self.app.proc_container.new(_("Clearing Non-Copper areas.")) def initialize(geo_obj, app_obj): assert isinstance(geo_obj, FlatCAMGeometry), \ @@ -699,7 +719,7 @@ class NonCopperClear(FlatCAMTool, Gerber): current_uid = int(1) for tool in sorted_tools: - self.app.inform.emit('[success] Non-Copper Clearing with ToolDia = %s started.' % str(tool)) + self.app.inform.emit(_('[success] Non-Copper Clearing with ToolDia = %s started.') % str(tool)) cleared_geo[:] = [] # Get remaining tools offset @@ -768,22 +788,22 @@ class NonCopperClear(FlatCAMTool, Gerber): app_obj.new_object("geometry", name, initialize) except Exception as e: proc.done() - self.app.inform.emit('[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s' % str(e)) + self.app.inform.emit(_('[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s') % str(e)) return proc.done() if app_obj.poly_not_cleared is False: - self.app.inform.emit('[success] NCC Tool finished.') + self.app.inform.emit(_('[success] NCC Tool finished.')) else: - self.app.inform.emit('[WARNING_NOTCL] NCC Tool finished but some PCB features could not be cleared. ' - 'Check the result.') + self.app.inform.emit(_('[WARNING_NOTCL] NCC Tool finished but some PCB features could not be cleared. ' + 'Check the result.')) # reset the variable for next use app_obj.poly_not_cleared = False # focus on Selected Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab) self.tools_frame.hide() - self.app.ui.notebook.setTabText(2, "Tools") + self.app.ui.notebook.setTabText(2, _("Tools")) # Promise object with the new name self.app.collection.promise(name) @@ -803,7 +823,7 @@ class NonCopperClear(FlatCAMTool, Gerber): sorted_tools.sort(reverse=True) # Do job in background - proc = self.app.proc_container.new("Clearing Non-Copper areas.") + proc = self.app.proc_container.new(_("Clearing Non-Copper areas.")) def initialize_rm(geo_obj, app_obj): assert isinstance(geo_obj, FlatCAMGeometry), \ @@ -821,7 +841,7 @@ class NonCopperClear(FlatCAMTool, Gerber): # Generate area for each tool while sorted_tools: tool = sorted_tools.pop(0) - self.app.inform.emit('[success] Non-Copper Rest Clearing with ToolDia = %s started.' % str(tool)) + self.app.inform.emit(_('[success] Non-Copper Rest Clearing with ToolDia = %s started.') % str(tool)) tool_used = tool - 1e-12 cleared_geo[:] = [] @@ -919,7 +939,7 @@ class NonCopperClear(FlatCAMTool, Gerber): app_obj.new_object("geometry", name, initialize_rm) except Exception as e: proc.done() - self.app.inform.emit('[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s' % str(e)) + self.app.inform.emit(_('[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s') % str(e)) return if app_obj.poly_not_cleared is True: @@ -927,8 +947,8 @@ class NonCopperClear(FlatCAMTool, Gerber): # focus on Selected Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab) else: - self.app.inform.emit('[ERROR_NOTCL] NCC Tool finished but could not clear the object ' - 'with current settings.') + self.app.inform.emit(_('[ERROR_NOTCL] NCC Tool finished but could not clear the object ' + 'with current settings.')) # focus on Project Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) proc.done() diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py index 04427edf..353ec9d6 100644 --- a/flatcamTools/ToolPaint.py +++ b/flatcamTools/ToolPaint.py @@ -1,11 +1,27 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Modified: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from copy import copy,deepcopy from ObjectCollection import * +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class ToolPaint(FlatCAMTool, Gerber): - toolName = "Paint Area" + toolName = _("Paint Area") def __init__(self, app): self.app = app @@ -41,19 +57,19 @@ class ToolPaint(FlatCAMTool, Gerber): self.object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex())) self.object_combo.setCurrentIndex(1) - self.object_label = QtWidgets.QLabel("Geometry:") + self.object_label = QtWidgets.QLabel(_("Geometry:")) self.object_label.setToolTip( - "Geometry object to be painted. " + _("Geometry object to be painted. ") ) e_lab_0 = QtWidgets.QLabel('') form_layout.addRow(self.object_label, self.object_combo) form_layout.addRow(e_lab_0) #### Tools #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel('%s' % _('Tools Table')) self.tools_table_label.setToolTip( - "Tools pool from which the algorithm\n" - "will pick the ones used for painting." + _("Tools pool from which the algorithm\n" + "will pick the ones used for painting.") ) self.tools_box.addWidget(self.tools_table_label) @@ -61,25 +77,25 @@ class ToolPaint(FlatCAMTool, Gerber): self.tools_box.addWidget(self.tools_table) self.tools_table.setColumnCount(4) - self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', 'TT', '']) + self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), 'TT', '']) self.tools_table.setColumnHidden(3, True) # self.tools_table.setSortingEnabled(False) # self.tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tools_table.horizontalHeaderItem(0).setToolTip( - "This is the Tool Number.\n" + _("This is the Tool Number.\n" "Painting will start with the tool with the biggest diameter,\n" "continuing until there are no more tools.\n" "Only tools that create painting geometry will still be present\n" "in the resulting geometry. This is because with some tools\n" - "this function will not be able to create painting geometry." + "this function will not be able to create painting geometry.") ) self.tools_table.horizontalHeaderItem(1).setToolTip( - "Tool Diameter. It's value (in current FlatCAM units) \n" - "is the cut width into the material.") + _("Tool Diameter. It's value (in current FlatCAM units) \n" + "is the cut width into the material.")) self.tools_table.horizontalHeaderItem(2).setToolTip( - "The Tool Type (TT) can be:
" + _("The Tool Type (TT) can be:
" "- Circular with 1 ... 4 teeth -> it is informative only. Being circular,
" "the cut width in material is exactly the tool diameter.
" "- Ball -> informative only and make reference to the Ball type endmill.
" @@ -89,7 +105,7 @@ class ToolPaint(FlatCAMTool, Gerber): "as the cut width into material will be equal with the value in the Tool Diameter " "column of this table.
" "Choosing the V-Shape Tool Type automatically will select the Operation Type " - "in the resulting geometry as Isolation.") + "in the resulting geometry as Isolation.")) self.empty_label = QtWidgets.QLabel('') self.tools_box.addWidget(self.empty_label) @@ -98,9 +114,9 @@ class ToolPaint(FlatCAMTool, Gerber): hlay = QtWidgets.QHBoxLayout() self.tools_box.addLayout(hlay) - self.addtool_entry_lbl = QtWidgets.QLabel('Tool Dia:') + self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia')) self.addtool_entry_lbl.setToolTip( - "Diameter for the new tool." + _("Diameter for the new tool.") ) self.addtool_entry = FCEntry() @@ -112,10 +128,10 @@ class ToolPaint(FlatCAMTool, Gerber): grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) - self.addtool_btn = QtWidgets.QPushButton('Add') + self.addtool_btn = QtWidgets.QPushButton(_('Add')) self.addtool_btn.setToolTip( - "Add a new tool to the Tool Table\n" - "with the diameter specified above." + _("Add a new tool to the Tool Table\n" + "with the diameter specified above.") ) # self.copytool_btn = QtWidgets.QPushButton('Copy') @@ -124,10 +140,10 @@ class ToolPaint(FlatCAMTool, Gerber): # "by first selecting a row in the Tool Table." # ) - self.deltool_btn = QtWidgets.QPushButton('Delete') + self.deltool_btn = QtWidgets.QPushButton(_('Delete')) self.deltool_btn.setToolTip( - "Delete a selection of tools in the Tool Table\n" - "by first selecting a row(s) in the Tool Table." + _("Delete a selection of tools in the Tool Table\n" + "by first selecting a row(s) in the Tool Table.") ) grid2.addWidget(self.addtool_btn, 0, 0) @@ -141,9 +157,9 @@ class ToolPaint(FlatCAMTool, Gerber): self.tools_box.addLayout(grid3) # Overlap - ovlabel = QtWidgets.QLabel('Overlap:') + ovlabel = QtWidgets.QLabel(_('Overlap:')) ovlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" + _("How much (fraction) of the tool width to overlap each tool pass.\n" "Example:\n" "A value here of 0.25 means 25% from the tool diameter found above.\n\n" "Adjust the value starting with lower values\n" @@ -151,30 +167,30 @@ class ToolPaint(FlatCAMTool, Gerber): "not painted.\n" "Lower values = faster processing, faster execution on PCB.\n" "Higher values = slow processing and slow execution on CNC\n" - "due of too many paths." + "due of too many paths.") ) grid3.addWidget(ovlabel, 1, 0) self.paintoverlap_entry = FCEntry() grid3.addWidget(self.paintoverlap_entry, 1, 1) # Margin - marginlabel = QtWidgets.QLabel('Margin:') + marginlabel = QtWidgets.QLabel(_('Margin:')) marginlabel.setToolTip( - "Distance by which to avoid\n" + _("Distance by which to avoid\n" "the edges of the polygon to\n" - "be painted." + "be painted.") ) grid3.addWidget(marginlabel, 2, 0) self.paintmargin_entry = FCEntry() grid3.addWidget(self.paintmargin_entry, 2, 1) # Method - methodlabel = QtWidgets.QLabel('Method:') + methodlabel = QtWidgets.QLabel(_('Method:')) methodlabel.setToolTip( - "Algorithm for non-copper clearing:
" + _("Algorithm for non-copper clearing:
" "Standard: Fixed step inwards.
" "Seed-based: Outwards from seed.
" - "Line-based: Parallel lines." + "Line-based: Parallel lines.") ) grid3.addWidget(methodlabel, 3, 0) self.paintmethod_combo = RadioSet([ @@ -185,45 +201,45 @@ class ToolPaint(FlatCAMTool, Gerber): grid3.addWidget(self.paintmethod_combo, 3, 1) # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel = QtWidgets.QLabel(_("Connect:")) pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." + _("Draw lines between resulting\n" + "segments to minimize tool lifts.") ) grid3.addWidget(pathconnectlabel, 4, 0) self.pathconnect_cb = FCCheckBox() grid3.addWidget(self.pathconnect_cb, 4, 1) - contourlabel = QtWidgets.QLabel("Contour:") + contourlabel = QtWidgets.QLabel(_("Contour:")) contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." + _("Cut around the perimeter of the polygon\n" + "to trim rough edges.") ) grid3.addWidget(contourlabel, 5, 0) self.paintcontour_cb = FCCheckBox() grid3.addWidget(self.paintcontour_cb, 5, 1) - restlabel = QtWidgets.QLabel("Rest M.:") + restlabel = QtWidgets.QLabel(_("Rest M.:")) restlabel.setToolTip( - "If checked, use 'rest machining'.\n" + _("If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" "using the biggest tool and continue with the next tools,\n" "from bigger to smaller, to clear areas of copper that\n" "could not be cleared by previous tool, until there is\n" "no more copper to clear or there are no more tools.\n\n" - "If not checked, use the standard algorithm." + "If not checked, use the standard algorithm.") ) grid3.addWidget(restlabel, 6, 0) self.rest_cb = FCCheckBox() grid3.addWidget(self.rest_cb, 6, 1) # Polygon selection - selectlabel = QtWidgets.QLabel('Selection:') + selectlabel = QtWidgets.QLabel(_('Selection:')) selectlabel.setToolTip( - "How to select the polygons to paint.
" + _("How to select the polygons to paint.
" "Options:
" "- Single: left mouse click on the polygon to be painted.
" - "- All: paint all polygons." + "- All: paint all polygons.") ) grid3.addWidget(selectlabel, 7, 0) # grid3 = QtWidgets.QGridLayout() @@ -235,13 +251,13 @@ class ToolPaint(FlatCAMTool, Gerber): grid3.addWidget(self.selectmethod_combo, 7, 1) # GO Button - self.generate_paint_button = QtWidgets.QPushButton('Create Paint Geometry') + self.generate_paint_button = QtWidgets.QPushButton(_('Create Paint Geometry')) self.generate_paint_button.setToolTip( - "After clicking here, click inside
" + _("After clicking here, click inside
" "the polygon you wish to be painted if Single is selected.
" "If All is selected then the Paint will start after click.
" "A new Geometry object with the tool
" - "paths will be created." + "paths will be created.") ) self.tools_box.addWidget(self.generate_paint_button) @@ -301,23 +317,27 @@ class ToolPaint(FlatCAMTool, Gerber): def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+P', **kwargs) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolPaint()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "Paint Tool") + self.app.ui.notebook.setTabText(2, _("Paint Tool")) def on_radio_selection(self): if self.selectmethod_combo.get_value() == 'single': @@ -514,13 +534,13 @@ class ToolPaint(FlatCAMTool, Gerber): try: tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return if tool_dia is None: self.build_ui() - self.app.inform.emit("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.") + self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.")) return # construct a list of all 'tooluid' in the self.tools @@ -544,12 +564,12 @@ class ToolPaint(FlatCAMTool, Gerber): if float('%.4f' % tool_dia) in tool_dias: if muted is None: - self.app.inform.emit("[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table.")) self.tools_table.itemChanged.connect(self.on_tool_edit) return else: if muted is None: - self.app.inform.emit("[success] New tool added to Tool Table.") + self.app.inform.emit(_("[success] New tool added to Tool Table.")) self.paint_tools.update({ int(self.tooluid): { 'tooldia': float('%.4f' % tool_dia), @@ -584,15 +604,15 @@ class ToolPaint(FlatCAMTool, Gerber): try: new_tool_dia = float(self.tools_table.item(row, 1).text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return tooluid = int(self.tools_table.item(row, 3).text()) # identify the tool that was edited and get it's tooluid if new_tool_dia not in tool_dias: self.paint_tools[tooluid]['tooldia'] = new_tool_dia - self.app.inform.emit("[success] Tool from Tool Table was edited.") + self.app.inform.emit(_("[success] Tool from Tool Table was edited.")) self.build_ui() return else: @@ -603,7 +623,7 @@ class ToolPaint(FlatCAMTool, Gerber): break restore_dia_item = self.tools_table.item(row, 1) restore_dia_item.setText(str(old_tool_dia)) - self.app.inform.emit("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.")) self.build_ui() # def on_tool_copy(self, all=None): @@ -700,18 +720,19 @@ class ToolPaint(FlatCAMTool, Gerber): self.paint_tools.pop(t, None) except AttributeError: - self.app.inform.emit("[WARNING_NOTCL]Delete failed. Select a tool to delete.") + self.app.inform.emit(_("[WARNING_NOTCL]Delete failed. Select a tool to delete.")) return except Exception as e: log.debug(str(e)) - self.app.inform.emit("[success] Tool(s) deleted from Tool Table.") + self.app.inform.emit(_("[success] Tool(s) deleted from Tool Table.")) self.build_ui() def on_paint_button_click(self): - self.app.report_usage("geometry_on_paint_button") + self.app.report_usage(_("geometry_on_paint_button")) + self.app.call_source = 'paint' - self.app.inform.emit("[WARNING_NOTCL]Click inside the desired polygon.") + self.app.inform.emit(_("[WARNING_NOTCL]Click inside the desired polygon.")) try: overlap = float(self.paintoverlap_entry.get_value()) except ValueError: @@ -719,8 +740,8 @@ class ToolPaint(FlatCAMTool, Gerber): try: overlap = float(self.paintoverlap_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return connect = self.pathconnect_cb.get_value() @@ -733,17 +754,17 @@ class ToolPaint(FlatCAMTool, Gerber): try: self.paint_obj = self.app.collection.get_by_name(str(self.obj_name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % self.obj_name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % self.obj_name) return if self.paint_obj is None: - self.app.inform.emit("[ERROR_NOTCL]Object not found: %s" % self.paint_obj) + self.app.inform.emit(_("[ERROR_NOTCL]Object not found: %s") % self.paint_obj) return # test if the Geometry Object is multigeo and return Fail if True because # for now Paint don't work on MultiGeo if self.paint_obj.multigeo is True: - self.app.inform.emit("[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ...") + self.app.inform.emit(_("[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ...")) return 'Fail' o_name = '%s_multitool_paint' % (self.obj_name) @@ -756,7 +777,7 @@ class ToolPaint(FlatCAMTool, Gerber): contour=contour) if select_method == "single": - self.app.inform.emit("[WARNING_NOTCL]Click inside the desired polygon.") + self.app.inform.emit(_("[WARNING_NOTCL]Click inside the desired polygon.")) # use the first tool in the tool table; get the diameter tooldia = float('%.4f' % float(self.tools_table.item(0, 1).text())) @@ -765,7 +786,7 @@ class ToolPaint(FlatCAMTool, Gerber): def doit(event): # do paint single only for left mouse clicks if event.button == 1: - self.app.inform.emit("Painting polygon...") + self.app.inform.emit(_("Painting polygon...")) self.app.plotcanvas.vis_disconnect('mouse_press', doit) pos = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos) self.paint_poly(self.paint_obj, @@ -799,7 +820,6 @@ class ToolPaint(FlatCAMTool, Gerber): # Which polygon. # poly = find_polygon(self.solid_geometry, inside_pt) - poly = obj.find_polygon(inside_pt) paint_method = self.paintmethod_combo.get_value() @@ -810,17 +830,17 @@ class ToolPaint(FlatCAMTool, Gerber): try: paint_margin = float(self.paintmargin_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return # No polygon? if poly is None: self.app.log.warning('No polygon found.') - self.app.inform.emit('[WARNING] No polygon found.') + self.app.inform.emit(_('[WARNING] No polygon found.')) return - proc = self.app.proc_container.new("Painting polygon.") + proc = self.app.proc_container.new(_("Painting polygon.")) name = outname if outname else self.obj_name + "_paint" @@ -862,13 +882,13 @@ class ToolPaint(FlatCAMTool, Gerber): geo_obj.solid_geometry += list(cp.get_objects()) return cp else: - self.app.inform.emit('[ERROR_NOTCL] Geometry could not be painted completely') + self.app.inform.emit(_('[ERROR_NOTCL] Geometry could not be painted completely')) return None geo_obj.solid_geometry = [] try: - a, b, c, d = poly.bounds() + a, b, c, d = poly.bounds geo_obj.options['xmin'] = a geo_obj.options['ymin'] = b geo_obj.options['xmax'] = c @@ -888,8 +908,8 @@ class ToolPaint(FlatCAMTool, Gerber): except Exception as e: log.debug("Could not Paint the polygons. %s" % str(e)) self.app.inform.emit( - "[ERROR] Could not do Paint. Try a different combination of parameters. " - "Or a different strategy of paint\n%s" % str(e)) + _("[ERROR] Could not do Paint. Try a different combination of parameters. " + "Or a different strategy of paint\n%s") % str(e)) return if cp is not None: @@ -930,13 +950,13 @@ class ToolPaint(FlatCAMTool, Gerber): app_obj.new_object("geometry", name, gen_paintarea) except Exception as e: proc.done() - self.app.inform.emit('[ERROR_NOTCL] PaintTool.paint_poly() --> %s' % str(e)) + self.app.inform.emit(_('[ERROR_NOTCL] PaintTool.paint_poly() --> %s') % str(e)) return proc.done() # focus on Selected Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab) - self.app.inform.emit("Polygon Paint started ...") + self.app.inform.emit(_("Polygon Paint started ...")) # Promise object with the new name self.app.collection.promise(name) @@ -965,11 +985,11 @@ class ToolPaint(FlatCAMTool, Gerber): try: paint_margin = float(self.paintmargin_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return - proc = self.app.proc_container.new("Painting polygon.") + proc = self.app.proc_container.new(_("Painting polygon...")) name = outname if outname else self.obj_name + "_paint" over = overlap conn = connect @@ -1084,8 +1104,8 @@ class ToolPaint(FlatCAMTool, Gerber): except Exception as e: log.debug("Could not Paint the polygons. %s" % str(e)) self.app.inform.emit( - "[ERROR] Could not do Paint All. Try a different combination of parameters. " - "Or a different Method of paint\n%s" % str(e)) + _("[ERROR] Could not do Paint All. Try a different combination of parameters. " + "Or a different Method of paint\n%s") % str(e)) return # add the solid_geometry to the current too in self.paint_tools dictionary and then reset the @@ -1108,16 +1128,16 @@ class ToolPaint(FlatCAMTool, Gerber): if geo_obj.tools[tooluid]['solid_geometry']: has_solid_geo += 1 if has_solid_geo == 0: - self.app.inform.emit("[ERROR] There is no Painting Geometry in the file.\n" + self.app.inform.emit(_("[ERROR] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted geometry.\n" - "Change the painting parameters and try again.") + "Change the painting parameters and try again.")) return # Experimental... # print("Indexing...", end=' ') # geo_obj.make_index() - self.app.inform.emit("[success] Paint All Done.") + self.app.inform.emit(_("[success] Paint All Done.")) # Initializes the new geometry object def gen_paintarea_rest_machining(geo_obj, app_obj): @@ -1173,8 +1193,8 @@ class ToolPaint(FlatCAMTool, Gerber): except Exception as e: log.debug("Could not Paint the polygons. %s" % str(e)) self.app.inform.emit( - "[ERROR] Could not do Paint All. Try a different combination of parameters. " - "Or a different Method of paint\n%s" % str(e)) + _("[ERROR] Could not do Paint All. Try a different combination of parameters. " + "Or a different Method of paint\n%s") % str(e)) return # find the tooluid associated with the current tool_dia so we know where to add the tool solid_geometry @@ -1203,16 +1223,16 @@ class ToolPaint(FlatCAMTool, Gerber): if geo_obj.tools[tooluid]['solid_geometry']: has_solid_geo += 1 if has_solid_geo == 0: - self.app.inform.emit("[ERROR_NOTCL] There is no Painting Geometry in the file.\n" + self.app.inform.emit(_("[ERROR_NOTCL] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted geometry.\n" - "Change the painting parameters and try again.") + "Change the painting parameters and try again.")) return # Experimental... # print("Indexing...", end=' ') # geo_obj.make_index() - self.app.inform.emit("[success] Paint All with Rest-Machining Done.") + self.app.inform.emit(_("[success] Paint All with Rest-Machining done.")) def job_thread(app_obj): try: @@ -1228,7 +1248,7 @@ class ToolPaint(FlatCAMTool, Gerber): # focus on Selected Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab) - self.app.inform.emit("Polygon Paint started ...") + self.app.inform.emit(_("Polygon Paint started ...")) # Promise object with the new name self.app.collection.promise(name) diff --git a/flatcamTools/ToolPanelize.py b/flatcamTools/ToolPanelize.py index 9daa3502..2d2cf3ea 100644 --- a/flatcamTools/ToolPanelize.py +++ b/flatcamTools/ToolPanelize.py @@ -1,12 +1,28 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from copy import copy, deepcopy from ObjectCollection import * import time +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class Panelize(FlatCAMTool): - toolName = "Panelize PCB" + toolName = _("Panelize PCB") def __init__(self, app): super(Panelize, self).__init__(self) @@ -37,12 +53,12 @@ class Panelize(FlatCAMTool): self.type_obj_combo.setItemIcon(1, QtGui.QIcon("share/drill16.png")) self.type_obj_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png")) - self.type_obj_combo_label = QtWidgets.QLabel("Object Type:") + self.type_obj_combo_label = QtWidgets.QLabel(_("Object Type:")) self.type_obj_combo_label.setToolTip( - "Specify the type of object to be panelized\n" + _("Specify the type of object to be panelized\n" "It can be of type: Gerber, Excellon or Geometry.\n" "The selection here decide the type of objects that will be\n" - "in the Object combobox." + "in the Object combobox.") ) form_layout.addRow(self.type_obj_combo_label, self.type_obj_combo) @@ -52,10 +68,10 @@ class Panelize(FlatCAMTool): self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.object_combo.setCurrentIndex(1) - self.object_label = QtWidgets.QLabel("Object:") + self.object_label = QtWidgets.QLabel(_("Object:")) self.object_label.setToolTip( - "Object to be panelized. This means that it will\n" - "be duplicated in an array of rows and columns." + _("Object to be panelized. This means that it will\n" + "be duplicated in an array of rows and columns.") ) form_layout.addRow(self.object_label, self.object_combo) @@ -70,12 +86,12 @@ class Panelize(FlatCAMTool): self.type_box_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png")) self.type_box_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png")) - self.type_box_combo_label = QtWidgets.QLabel("Box Type:") + self.type_box_combo_label = QtWidgets.QLabel(_("Box Type:")) self.type_box_combo_label.setToolTip( - "Specify the type of object to be used as an container for\n" + _("Specify the type of object to be used as an container for\n" "panelization. It can be: Gerber or Geometry type.\n" "The selection here decide the type of objects that will be\n" - "in the Box Object combobox." + "in the Box Object combobox.") ) form_layout.addRow(self.type_box_combo_label, self.type_box_combo) @@ -85,83 +101,83 @@ class Panelize(FlatCAMTool): self.box_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.box_combo.setCurrentIndex(1) - self.box_combo_label = QtWidgets.QLabel("Box Object:") + self.box_combo_label = QtWidgets.QLabel(_("Box Object:")) self.box_combo_label.setToolTip( - "The actual object that is used a container for the\n " - "selected object that is to be panelized." + _("The actual object that is used a container for the\n " + "selected object that is to be panelized.") ) form_layout.addRow(self.box_combo_label, self.box_combo) ## Spacing Columns self.spacing_columns = FCEntry() - self.spacing_columns_label = QtWidgets.QLabel("Spacing cols:") + self.spacing_columns_label = QtWidgets.QLabel(_("Spacing cols:")) self.spacing_columns_label.setToolTip( - "Spacing between columns of the desired panel.\n" - "In current units." + _("Spacing between columns of the desired panel.\n" + "In current units.") ) form_layout.addRow(self.spacing_columns_label, self.spacing_columns) ## Spacing Rows self.spacing_rows = FCEntry() - self.spacing_rows_label = QtWidgets.QLabel("Spacing rows:") + self.spacing_rows_label = QtWidgets.QLabel(_("Spacing rows:")) self.spacing_rows_label.setToolTip( - "Spacing between rows of the desired panel.\n" - "In current units." + _("Spacing between rows of the desired panel.\n" + "In current units.") ) form_layout.addRow(self.spacing_rows_label, self.spacing_rows) ## Columns self.columns = FCEntry() - self.columns_label = QtWidgets.QLabel("Columns:") + self.columns_label = QtWidgets.QLabel(_("Columns:")) self.columns_label.setToolTip( - "Number of columns of the desired panel" + _("Number of columns of the desired panel") ) form_layout.addRow(self.columns_label, self.columns) ## Rows self.rows = FCEntry() - self.rows_label = QtWidgets.QLabel("Rows:") + self.rows_label = QtWidgets.QLabel(_("Rows:")) self.rows_label.setToolTip( - "Number of rows of the desired panel" + _("Number of rows of the desired panel") ) form_layout.addRow(self.rows_label, self.rows) ## Type of resulting Panel object self.panel_type_radio = RadioSet([{'label': 'Gerber', 'value': 'gerber'}, {'label': 'Geometry', 'value': 'geometry'}]) - self.panel_type_label = QtWidgets.QLabel("Panel Type:") + self.panel_type_label = QtWidgets.QLabel(_("Panel Type:")) self.panel_type_label.setToolTip( - "Choose the type of object for the panel object:\n" + _("Choose the type of object for the panel object:\n" "- Geometry\n" - "- Gerber" + "- Gerber") ) form_layout.addRow(self.panel_type_label) form_layout.addRow(self.panel_type_radio) ## Constrains - self.constrain_cb = FCCheckBox("Constrain panel within:") + self.constrain_cb = FCCheckBox(_("Constrain panel within:")) self.constrain_cb.setToolTip( - "Area define by DX and DY within to constrain the panel.\n" + _("Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" "Regardless of how many columns and rows are desired,\n" "the final panel will have as many columns and rows as\n" - "they fit completely within selected area." + "they fit completely within selected area.") ) form_layout.addRow(self.constrain_cb) self.x_width_entry = FCEntry() - self.x_width_lbl = QtWidgets.QLabel("Width (DX):") + self.x_width_lbl = QtWidgets.QLabel(_("Width (DX):")) self.x_width_lbl.setToolTip( - "The width (DX) within which the panel must fit.\n" - "In current units." + _("The width (DX) within which the panel must fit.\n" + "In current units.") ) form_layout.addRow(self.x_width_lbl, self.x_width_entry) self.y_height_entry = FCEntry() - self.y_height_lbl = QtWidgets.QLabel("Height (DY):") + self.y_height_lbl = QtWidgets.QLabel(_("Height (DY):")) self.y_height_lbl.setToolTip( - "The height (DY)within which the panel must fit.\n" - "In current units." + _("The height (DY)within which the panel must fit.\n" + "In current units.") ) form_layout.addRow(self.y_height_lbl, self.y_height_entry) @@ -173,11 +189,11 @@ class Panelize(FlatCAMTool): self.layout.addLayout(hlay_2) hlay_2.addStretch() - self.panelize_object_button = QtWidgets.QPushButton("Panelize Object") + self.panelize_object_button = QtWidgets.QPushButton(_("Panelize Object")) self.panelize_object_button.setToolTip( - "Panelize the specified object around the specified box.\n" + _("Panelize the specified object around the specified box.\n" "In other words it creates multiple copies of the source object,\n" - "arranged in a 2D array of rows and columns." + "arranged in a 2D array of rows and columns.") ) hlay_2.addWidget(self.panelize_object_button) @@ -197,18 +213,22 @@ class Panelize(FlatCAMTool): # flag to signal the constrain was activated self.constrain_flag = False - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolPanelize()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() @@ -270,13 +290,13 @@ class Panelize(FlatCAMTool): try: obj = self.app.collection.get_by_name(str(name)) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % name) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % name) return "Could not retrieve object: %s" % name panel_obj = obj if panel_obj is None: - self.app.inform.emit("[ERROR_NOTCL]Object not found: %s" % panel_obj) + self.app.inform.emit(_("[ERROR_NOTCL]Object not found: %s") % panel_obj) return "Object not found: %s" % panel_obj boxname = self.box_combo.currentText() @@ -284,11 +304,11 @@ class Panelize(FlatCAMTool): try: box = self.app.collection.get_by_name(boxname) except: - self.app.inform.emit("[ERROR_NOTCL]Could not retrieve object: %s" % boxname) + self.app.inform.emit(_("[ERROR_NOTCL]Could not retrieve object: %s") % boxname) return "Could not retrieve object: %s" % boxname if box is None: - self.app.inform.emit("[WARNING]No object Box. Using instead %s" % panel_obj) + self.app.inform.emit(_("[WARNING]No object Box. Using instead %s") % panel_obj) box = panel_obj self.outname = name + '_panelized' @@ -300,8 +320,8 @@ class Panelize(FlatCAMTool): try: spacing_columns = float(self.spacing_columns.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return spacing_columns = spacing_columns if spacing_columns is not None else 0 @@ -312,8 +332,8 @@ class Panelize(FlatCAMTool): try: spacing_rows = float(self.spacing_rows.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return spacing_rows = spacing_rows if spacing_rows is not None else 0 @@ -325,8 +345,8 @@ class Panelize(FlatCAMTool): rows = float(self.rows.get_value().replace(',', '.')) rows = int(rows) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return rows = rows if rows is not None else 1 @@ -338,8 +358,8 @@ class Panelize(FlatCAMTool): columns = float(self.columns.get_value().replace(',', '.')) columns = int(columns) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return columns = columns if columns is not None else 1 @@ -350,8 +370,8 @@ class Panelize(FlatCAMTool): try: constrain_dx = float(self.x_width_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return try: @@ -361,15 +381,15 @@ class Panelize(FlatCAMTool): try: constrain_dy = float(self.y_height_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return panel_type = str(self.panel_type_radio.get_value()) if 0 in {columns, rows}: - self.app.inform.emit("[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive integer.") + self.app.inform.emit(_("[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive integer.")) return "Columns or Rows are zero value. Change them to a positive integer." xmin, ymin, xmax, ymax = box.bounds() @@ -392,88 +412,9 @@ class Panelize(FlatCAMTool): rows -= 1 panel_lengthy = ((ymax - ymin) * rows) + (spacing_rows * (rows - 1)) - # def clean_temp(): - # # deselect all to avoid delete selected object when run delete from shell - # self.app.collection.set_all_inactive() - # - # for del_obj in self.objs: - # self.app.collection.set_active(del_obj.options['name']) - # self.app.on_delete() - # - # self.objs[:] = [] - - # def panelize(): - # if panel_obj is not None: - # self.app.inform.emit("Generating panel ... Please wait.") - # - # self.app.progress.emit(10) - # - # if isinstance(panel_obj, FlatCAMExcellon): - # currenty = 0.0 - # self.app.progress.emit(0) - # - # def initialize_local_excellon(obj_init, app): - # obj_init.tools = panel_obj.tools - # # drills are offset, so they need to be deep copied - # obj_init.drills = deepcopy(panel_obj.drills) - # obj_init.offset([float(currentx), float(currenty)]) - # obj_init.create_geometry() - # self.objs.append(obj_init) - # - # self.app.progress.emit(0) - # for row in range(rows): - # currentx = 0.0 - # for col in range(columns): - # local_outname = self.outname + ".tmp." + str(col) + "." + str(row) - # self.app.new_object("excellon", local_outname, initialize_local_excellon, plot=False, - # autoselected=False) - # currentx += lenghtx - # currenty += lenghty - # else: - # currenty = 0 - # self.app.progress.emit(0) - # - # def initialize_local_geometry(obj_init, app): - # obj_init.solid_geometry = panel_obj.solid_geometry - # obj_init.offset([float(currentx), float(currenty)]) - # self.objs.append(obj_init) - # - # self.app.progress.emit(0) - # for row in range(rows): - # currentx = 0 - # - # for col in range(columns): - # local_outname = self.outname + ".tmp." + str(col) + "." + str(row) - # self.app.new_object("geometry", local_outname, initialize_local_geometry, plot=False, - # autoselected=False) - # currentx += lenghtx - # currenty += lenghty - # - # def job_init_geometry(obj_fin, app_obj): - # FlatCAMGeometry.merge(self.objs, obj_fin) - # - # def job_init_excellon(obj_fin, app_obj): - # # merge expects tools to exist in the target object - # obj_fin.tools = panel_obj.tools.copy() - # FlatCAMExcellon.merge(self.objs, obj_fin) - # - # if isinstance(panel_obj, FlatCAMExcellon): - # self.app.progress.emit(50) - # self.app.new_object("excellon", self.outname, job_init_excellon, plot=True, autoselected=True) - # else: - # self.app.progress.emit(50) - # self.app.new_object("geometry", self.outname, job_init_geometry, plot=True, autoselected=True) - # - # else: - # self.app.inform.emit("[ERROR_NOTCL] Obj is None") - # return "ERROR: Obj is None" - - # panelize() - # clean_temp() - def panelize_2(): if panel_obj is not None: - self.app.inform.emit("Generating panel ... Please wait.") + self.app.inform.emit(_("Generating panel ... Please wait.")) self.app.progress.emit(0) @@ -576,18 +517,18 @@ class Panelize(FlatCAMTool): plot=True, autoselected=True) if self.constrain_flag is False: - self.app.inform.emit("[success]Panel done...") + self.app.inform.emit(_("[success]Panel done...")) else: self.constrain_flag = False - self.app.inform.emit("[WARNING] Too big for the constrain area. Final panel has %s columns and %s rows" % - (columns, rows)) + self.app.inform.emit(_("[WARNING] Too big for the constrain area. Final panel has {col} columns and {row} rows").format( + col=columns, row=rows)) - proc = self.app.proc_container.new("Generating panel ... Please wait.") + proc = self.app.proc_container.new(_("Generating panel ... Please wait.")) def job_thread(app_obj): try: panelize_2() - self.app.inform.emit("[success]Panel created successfully.") + self.app.inform.emit(_("[success]Panel created successfully.")) except Exception as e: proc.done() log.debug(str(e)) diff --git a/flatcamTools/ToolProperties.py b/flatcamTools/ToolProperties.py index 37f31ec4..0cf54c5e 100644 --- a/flatcamTools/ToolProperties.py +++ b/flatcamTools/ToolProperties.py @@ -1,12 +1,28 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt from FlatCAMTool import FlatCAMTool from FlatCAMObj import * +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class Properties(FlatCAMTool): - toolName = "Properties" + toolName = _("Properties") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -48,24 +64,29 @@ class Properties(FlatCAMTool): self.vlay.addWidget(self.treeWidget) self.vlay.setStretch(0,0) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolProperties()") if self.app.tool_tab_locked is True: return - self.set_tool_ui() - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) + self.set_tool_ui() + self.properties() def install(self, icon=None, separator=None, **kwargs): @@ -79,15 +100,15 @@ class Properties(FlatCAMTool): def properties(self): obj_list = self.app.collection.get_selected() if not obj_list: - self.app.inform.emit("[ERROR_NOTCL] Properties Tool was not displayed. No object selected.") - self.app.ui.notebook.setTabText(2, "Tools") + self.app.inform.emit(_("[ERROR_NOTCL] Properties Tool was not displayed. No object selected.")) + self.app.ui.notebook.setTabText(2, _("Tools")) self.properties_frame.hide() self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) return for obj in obj_list: self.addItems(obj) - self.app.inform.emit("[success] Object Properties are displayed.") - self.app.ui.notebook.setTabText(2, "Properties Tool") + self.app.inform.emit(_("[success] Object Properties are displayed.")) + self.app.ui.notebook.setTabText(2, _("Properties Tool")) def addItems(self, obj): parent = self.treeWidget.invisibleRootItem() @@ -150,8 +171,14 @@ class Properties(FlatCAMTool): self.addChild(options, [str(option), str(obj.options[option])], True) if obj.kind.lower() == 'gerber': + temp_ap = {} for ap in obj.apertures: - self.addChild(apertures, [str(ap), str(obj.apertures[ap])], True) + temp_ap.clear() + temp_ap = deepcopy(obj.apertures[ap]) + if obj.apertures[ap]['solid_geometry']: + elems = len(obj.apertures[ap]['solid_geometry']) + temp_ap['solid_geometry'] = '%s Polygons' % str(elems) + self.addChild(apertures, [str(ap), str(temp_ap)], True) elif obj.kind.lower() == 'excellon': for tool, value in obj.tools.items(): self.addChild(tools, [str(tool), str(value['C'])], True) diff --git a/flatcamTools/ToolShell.py b/flatcamTools/ToolShell.py index c7785e7b..7032ab81 100644 --- a/flatcamTools/ToolShell.py +++ b/flatcamTools/ToolShell.py @@ -10,9 +10,17 @@ from PyQt5.QtCore import Qt from PyQt5.QtGui import QTextCursor from PyQt5.QtWidgets import QVBoxLayout, QWidget -from GUIElements import _BrowserTextEdit, _ExpandableTextEdit +from flatcamGUI.GUIElements import _BrowserTextEdit, _ExpandableTextEdit import html +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class TermWidget(QWidget): """ @@ -58,9 +66,9 @@ class TermWidget(QWidget): self._edit.setTextColor(Qt.white) self._edit.setTextBackgroundColor(Qt.darkGreen) if detail is None: - self._edit.setPlainText("...proccessing...") + self._edit.setPlainText(_("...proccessing...")) else: - self._edit.setPlainText("...proccessing... [%s]" % detail) + self._edit.setPlainText(_("...proccessing... [%s]") % detail) self._edit.setDisabled(True) self._edit.setFocus() diff --git a/flatcamTools/ToolSolderPaste.py b/flatcamTools/ToolSolderPaste.py index 17581a2a..92732f3e 100644 --- a/flatcamTools/ToolSolderPaste.py +++ b/flatcamTools/ToolSolderPaste.py @@ -1,8 +1,16 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from FlatCAMCommon import LoudDict -from GUIElements import FCComboBox, FCEntry, FCTable +from flatcamGUI.GUIElements import FCComboBox, FCEntry, FCTable from FlatCAMApp import log -from camlib import distance, CNCjob +from camlib import distance from FlatCAMObj import FlatCAMCNCjob from PyQt5 import QtGui, QtCore, QtWidgets @@ -10,16 +18,23 @@ from PyQt5.QtCore import Qt from copy import deepcopy from datetime import datetime -from shapely.geometry import MultiPolygon, Polygon, LineString -from shapely.geometry.base import BaseGeometry +from shapely.geometry import Polygon, LineString from shapely.ops import cascaded_union import traceback from io import StringIO +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class SolderPaste(FlatCAMTool): - toolName = "Solder Paste Tool" + toolName = _("Solder Paste Tool") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -47,15 +62,15 @@ class SolderPaste(FlatCAMTool): self.object_label = QtWidgets.QLabel("Gerber: ") self.object_label.setToolTip( - "Gerber Solder paste object. " + _("Gerber Solder paste object. ") ) obj_form_layout.addRow(self.object_label, self.obj_combo) #### Tools #### - self.tools_table_label = QtWidgets.QLabel('Tools Table') + self.tools_table_label = QtWidgets.QLabel('%s' % _('Tools Table')) self.tools_table_label.setToolTip( - "Tools pool from which the algorithm\n" - "will pick the ones used for dispensing solder paste." + _("Tools pool from which the algorithm\n" + "will pick the ones used for dispensing solder paste.") ) self.layout.addWidget(self.tools_table_label) @@ -63,29 +78,29 @@ class SolderPaste(FlatCAMTool): self.layout.addWidget(self.tools_table) self.tools_table.setColumnCount(3) - self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', '']) + self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), '']) self.tools_table.setColumnHidden(2, True) self.tools_table.setSortingEnabled(False) # self.tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tools_table.horizontalHeaderItem(0).setToolTip( - "This is the Tool Number.\n" + _("This is the Tool Number.\n" "The solder dispensing will start with the tool with the biggest \n" "diameter, continuing until there are no more Nozzle tools.\n" "If there are no longer tools but there are still pads not covered\n " - "with solder paste, the app will issue a warning message box." + "with solder paste, the app will issue a warning message box.") ) self.tools_table.horizontalHeaderItem(1).setToolTip( - "Nozzle tool Diameter. It's value (in current FlatCAM units)\n" - "is the width of the solder paste dispensed.") + _( "Nozzle tool Diameter. It's value (in current FlatCAM units)\n" + "is the width of the solder paste dispensed.")) #### Add a new Tool #### hlay_tools = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay_tools) - self.addtool_entry_lbl = QtWidgets.QLabel('New Nozzle Tool:') + self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('New Nozzle Tool')) self.addtool_entry_lbl.setToolTip( - "Diameter for the new Nozzle tool to add in the Tool Table" + _("Diameter for the new Nozzle tool to add in the Tool Table") ) self.addtool_entry = FCEntry() @@ -97,21 +112,21 @@ class SolderPaste(FlatCAMTool): grid0 = QtWidgets.QGridLayout() self.layout.addLayout(grid0) - self.addtool_btn = QtWidgets.QPushButton('Add') + self.addtool_btn = QtWidgets.QPushButton(_('Add')) self.addtool_btn.setToolTip( - "Add a new nozzle tool to the Tool Table\n" - "with the diameter specified above." + _("Add a new nozzle tool to the Tool Table\n" + "with the diameter specified above.") ) - self.deltool_btn = QtWidgets.QPushButton('Delete') + self.deltool_btn = QtWidgets.QPushButton(_('Delete')) self.deltool_btn.setToolTip( - "Delete a selection of tools in the Tool Table\n" - "by first selecting a row(s) in the Tool Table." + _( "Delete a selection of tools in the Tool Table\n" + "by first selecting a row(s) in the Tool Table.") ) - self.soldergeo_btn = QtWidgets.QPushButton("Generate Geo") + self.soldergeo_btn = QtWidgets.QPushButton(_("Generate Geo")) self.soldergeo_btn.setToolTip( - "Generate solder paste dispensing geometry." + _("Generate solder paste dispensing geometry.") ) grid0.addWidget(self.addtool_btn, 0, 0) @@ -124,13 +139,13 @@ class SolderPaste(FlatCAMTool): grid0_1 = QtWidgets.QGridLayout() self.layout.addLayout(grid0_1) - step1_lbl = QtWidgets.QLabel("STEP 1:") + step1_lbl = QtWidgets.QLabel("%s:" % _('STEP 1')) step1_lbl.setToolTip( - "First step is to select a number of nozzle tools for usage\n" - "and then optionally modify the GCode parameters bellow." + _("First step is to select a number of nozzle tools for usage\n" + "and then optionally modify the GCode parameters bellow.") ) - step1_description_lbl = QtWidgets.QLabel("Select tools.\n" - "Modify parameters.") + step1_description_lbl = QtWidgets.QLabel(_("Select tools.\n" + "Modify parameters.")) grid0_1.addWidget(step1_lbl, 0, 0, alignment=Qt.AlignTop) grid0_1.addWidget(step1_description_lbl, 0, 2, alignment=Qt.AlignBottom) @@ -148,120 +163,120 @@ class SolderPaste(FlatCAMTool): # Z dispense start self.z_start_entry = FCEntry() - self.z_start_label = QtWidgets.QLabel("Z Dispense Start:") + self.z_start_label = QtWidgets.QLabel(_("Z Dispense Start:")) self.z_start_label.setToolTip( - "The height (Z) when solder paste dispensing starts." + _("The height (Z) when solder paste dispensing starts.") ) self.gcode_form_layout.addRow(self.z_start_label, self.z_start_entry) # Z dispense self.z_dispense_entry = FCEntry() - self.z_dispense_label = QtWidgets.QLabel("Z Dispense:") + self.z_dispense_label = QtWidgets.QLabel(_("Z Dispense:")) self.z_dispense_label.setToolTip( - "The height (Z) when doing solder paste dispensing." + _("The height (Z) when doing solder paste dispensing.") ) self.gcode_form_layout.addRow(self.z_dispense_label, self.z_dispense_entry) # Z dispense stop self.z_stop_entry = FCEntry() - self.z_stop_label = QtWidgets.QLabel("Z Dispense Stop:") + self.z_stop_label = QtWidgets.QLabel(_("Z Dispense Stop:")) self.z_stop_label.setToolTip( - "The height (Z) when solder paste dispensing stops." + _("The height (Z) when solder paste dispensing stops.") ) self.gcode_form_layout.addRow(self.z_stop_label, self.z_stop_entry) # Z travel self.z_travel_entry = FCEntry() - self.z_travel_label = QtWidgets.QLabel("Z Travel:") + self.z_travel_label = QtWidgets.QLabel(_("Z Travel:")) self.z_travel_label.setToolTip( - "The height (Z) for travel between pads\n" - "(without dispensing solder paste)." + _( "The height (Z) for travel between pads\n" + "(without dispensing solder paste).") ) self.gcode_form_layout.addRow(self.z_travel_label, self.z_travel_entry) # Z toolchange location self.z_toolchange_entry = FCEntry() - self.z_toolchange_label = QtWidgets.QLabel("Z Toolchange:") + self.z_toolchange_label = QtWidgets.QLabel(_("Z Toolchange:")) self.z_toolchange_label.setToolTip( - "The height (Z) for tool (nozzle) change." + _( "The height (Z) for tool (nozzle) change.") ) self.gcode_form_layout.addRow(self.z_toolchange_label, self.z_toolchange_entry) # X,Y Toolchange location self.xy_toolchange_entry = FCEntry() - self.xy_toolchange_label = QtWidgets.QLabel("XY Toolchange:") + self.xy_toolchange_label = QtWidgets.QLabel(_("XY Toolchange:")) self.xy_toolchange_label.setToolTip( - "The X,Y location for tool (nozzle) change.\n" - "The format is (x, y) where x and y are real numbers." + _("The X,Y location for tool (nozzle) change.\n" + "The format is (x, y) where x and y are real numbers.") ) self.gcode_form_layout.addRow(self.xy_toolchange_label, self.xy_toolchange_entry) # Feedrate X-Y self.frxy_entry = FCEntry() - self.frxy_label = QtWidgets.QLabel("Feedrate X-Y:") + self.frxy_label = QtWidgets.QLabel(_("Feedrate X-Y:")) self.frxy_label.setToolTip( - "Feedrate (speed) while moving on the X-Y plane." + _( "Feedrate (speed) while moving on the X-Y plane.") ) self.gcode_form_layout.addRow(self.frxy_label, self.frxy_entry) # Feedrate Z self.frz_entry = FCEntry() - self.frz_label = QtWidgets.QLabel("Feedrate Z:") + self.frz_label = QtWidgets.QLabel(_("Feedrate Z:")) self.frz_label.setToolTip( - "Feedrate (speed) while moving vertically\n" - "(on Z plane)." + _("Feedrate (speed) while moving vertically\n" + "(on Z plane).") ) self.gcode_form_layout.addRow(self.frz_label, self.frz_entry) # Feedrate Z Dispense self.frz_dispense_entry = FCEntry() - self.frz_dispense_label = QtWidgets.QLabel("Feedrate Z Dispense:") + self.frz_dispense_label = QtWidgets.QLabel(_("Feedrate Z Dispense:")) self.frz_dispense_label.setToolTip( - "Feedrate (speed) while moving up vertically\n" - " to Dispense position (on Z plane)." + _( "Feedrate (speed) while moving up vertically\n" + " to Dispense position (on Z plane).") ) self.gcode_form_layout.addRow(self.frz_dispense_label, self.frz_dispense_entry) # Spindle Speed Forward self.speedfwd_entry = FCEntry() - self.speedfwd_label = QtWidgets.QLabel("Spindle Speed FWD:") + self.speedfwd_label = QtWidgets.QLabel(_("Spindle Speed FWD:")) self.speedfwd_label.setToolTip( - "The dispenser speed while pushing solder paste\n" - "through the dispenser nozzle." + _( "The dispenser speed while pushing solder paste\n" + "through the dispenser nozzle.") ) self.gcode_form_layout.addRow(self.speedfwd_label, self.speedfwd_entry) # Dwell Forward self.dwellfwd_entry = FCEntry() - self.dwellfwd_label = QtWidgets.QLabel("Dwell FWD:") + self.dwellfwd_label = QtWidgets.QLabel(_("Dwell FWD:")) self.dwellfwd_label.setToolTip( - "Pause after solder dispensing." + _("Pause after solder dispensing.") ) self.gcode_form_layout.addRow(self.dwellfwd_label, self.dwellfwd_entry) # Spindle Speed Reverse self.speedrev_entry = FCEntry() - self.speedrev_label = QtWidgets.QLabel("Spindle Speed REV:") + self.speedrev_label = QtWidgets.QLabel(_("Spindle Speed REV:")) self.speedrev_label.setToolTip( - "The dispenser speed while retracting solder paste\n" - "through the dispenser nozzle." + _( "The dispenser speed while retracting solder paste\n" + "through the dispenser nozzle.") ) self.gcode_form_layout.addRow(self.speedrev_label, self.speedrev_entry) # Dwell Reverse self.dwellrev_entry = FCEntry() - self.dwellrev_label = QtWidgets.QLabel("Dwell REV:") + self.dwellrev_label = QtWidgets.QLabel(_("Dwell REV:")) self.dwellrev_label.setToolTip( - "Pause after solder paste dispenser retracted,\n" - "to allow pressure equilibrium." + _("Pause after solder paste dispenser retracted,\n" + "to allow pressure equilibrium.") ) self.gcode_form_layout.addRow(self.dwellrev_label, self.dwellrev_entry) # Postprocessors - pp_label = QtWidgets.QLabel('PostProcessors:') + pp_label = QtWidgets.QLabel(_('PostProcessors:')) pp_label.setToolTip( - "Files that control the GCode generation." + _("Files that control the GCode generation.") ) self.pp_combo = FCComboBox() @@ -272,10 +287,10 @@ class SolderPaste(FlatCAMTool): grid1 = QtWidgets.QGridLayout() self.gcode_box.addLayout(grid1) - self.solder_gcode_btn = QtWidgets.QPushButton("Generate GCode") + self.solder_gcode_btn = QtWidgets.QPushButton(_("Generate GCode")) self.solder_gcode_btn.setToolTip( - "Generate GCode for Solder Paste dispensing\n" - "on PCB pads." + _( "Generate GCode for Solder Paste dispensing\n" + "on PCB pads.") ) self.generation_frame = QtWidgets.QFrame() @@ -290,10 +305,10 @@ class SolderPaste(FlatCAMTool): grid2 = QtWidgets.QGridLayout() self.generation_box.addLayout(grid2) - step2_lbl = QtWidgets.QLabel("STEP 2:") + step2_lbl = QtWidgets.QLabel("%s" % _('STEP 2:')) step2_lbl.setToolTip( - "Second step is to create a solder paste dispensing\n" - "geometry out of an Solder Paste Mask Gerber file." + _("Second step is to create a solder paste dispensing\n" + "geometry out of an Solder Paste Mask Gerber file.") ) grid2.addWidget(step2_lbl, 0, 0) grid2.addWidget(self.soldergeo_btn, 0, 2) @@ -308,24 +323,24 @@ class SolderPaste(FlatCAMTool): self.geo_obj_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex())) self.geo_obj_combo.setCurrentIndex(1) - self.geo_object_label = QtWidgets.QLabel("Geo Result:") + self.geo_object_label = QtWidgets.QLabel(_("Geo Result:")) self.geo_object_label.setToolTip( - "Geometry Solder Paste object.\n" + _( "Geometry Solder Paste object.\n" "The name of the object has to end in:\n" - "'_solderpaste' as a protection." + "'_solderpaste' as a protection.") ) geo_form_layout.addRow(self.geo_object_label, self.geo_obj_combo) grid3 = QtWidgets.QGridLayout() self.generation_box.addLayout(grid3) - step3_lbl = QtWidgets.QLabel("STEP 3:") + step3_lbl = QtWidgets.QLabel("%s" % _('STEP 3:')) step3_lbl.setToolTip( - "Third step is to select a solder paste dispensing geometry,\n" + _( "Third step is to select a solder paste dispensing geometry,\n" "and then generate a CNCJob object.\n\n" "REMEMBER: if you want to create a CNCJob with new parameters,\n" "first you need to generate a geometry with those new params,\n" - "and only after that you can generate an updated CNCJob." + "and only after that you can generate an updated CNCJob.") ) grid3.addWidget(step3_lbl, 0, 0) @@ -341,34 +356,34 @@ class SolderPaste(FlatCAMTool): self.cnc_obj_combo.setRootModelIndex(self.app.collection.index(3, 0, QtCore.QModelIndex())) self.cnc_obj_combo.setCurrentIndex(1) - self.cnc_object_label = QtWidgets.QLabel("CNC Result:") + self.cnc_object_label = QtWidgets.QLabel(_("CNC Result:")) self.cnc_object_label.setToolTip( - "CNCJob Solder paste object.\n" + _( "CNCJob Solder paste object.\n" "In order to enable the GCode save section,\n" "the name of the object has to end in:\n" - "'_solderpaste' as a protection." + "'_solderpaste' as a protection.") ) cnc_form_layout.addRow(self.cnc_object_label, self.cnc_obj_combo) grid4 = QtWidgets.QGridLayout() self.generation_box.addLayout(grid4) - self.solder_gcode_view_btn = QtWidgets.QPushButton("View GCode") + self.solder_gcode_view_btn = QtWidgets.QPushButton(_("View GCode")) self.solder_gcode_view_btn.setToolTip( - "View the generated GCode for Solder Paste dispensing\n" - "on PCB pads." + _("View the generated GCode for Solder Paste dispensing\n" + "on PCB pads.") ) - self.solder_gcode_save_btn = QtWidgets.QPushButton("Save GCode") + self.solder_gcode_save_btn = QtWidgets.QPushButton(_("Save GCode")) self.solder_gcode_save_btn.setToolTip( - "Save the generated GCode for Solder Paste dispensing\n" - "on PCB pads, to a file." + _( "Save the generated GCode for Solder Paste dispensing\n" + "on PCB pads, to a file.") ) - step4_lbl = QtWidgets.QLabel("STEP 4:") + step4_lbl = QtWidgets.QLabel("%s" % _('STEP 4:')) step4_lbl.setToolTip( - "Fourth step (and last) is to select a CNCJob made from \n" - "a solder paste dispensing geometry, and then view/save it's GCode." + _( "Fourth step (and last) is to select a CNCJob made from \n" + "a solder paste dispensing geometry, and then view/save it's GCode.") ) grid4.addWidget(step4_lbl, 0, 0) @@ -395,7 +410,7 @@ class SolderPaste(FlatCAMTool): self.flat_geometry = [] # action to be added in the combobox context menu - self.combo_context_del_action = QtWidgets.QAction(QtGui.QIcon('share/trash16.png'), "Delete Object") + self.combo_context_del_action = QtWidgets.QAction(QtGui.QIcon('share/trash16.png'), _("Delete Object")) ## Signals self.combo_context_del_action.triggered.connect(self.on_delete_object) @@ -411,18 +426,22 @@ class SolderPaste(FlatCAMTool): self.app.object_status_changed.connect(self.update_comboboxes) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolSolderPaste()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) FlatCAMTool.run(self) self.set_tool_ui() @@ -456,9 +475,9 @@ class SolderPaste(FlatCAMTool): self.tools_table.setupContextMenu() self.tools_table.addContextMenu( - "Add", lambda: self.on_tool_add(dia=None, muted=None), icon=QtGui.QIcon("share/plus16.png")) + _("Add"), lambda: self.on_tool_add(dia=None, muted=None), icon=QtGui.QIcon("share/plus16.png")) self.tools_table.addContextMenu( - "Delete", lambda: + _("Delete"), lambda: self.on_tool_delete(rows_to_delete=None, all=None), icon=QtGui.QIcon("share/delete32.png")) try: @@ -733,16 +752,16 @@ class SolderPaste(FlatCAMTool): try: tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return if tool_dia is None: self.build_ui() - self.app.inform.emit("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.") + self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.")) return if tool_dia == 0: - self.app.inform.emit("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.")) return # construct a list of all 'tooluid' in the self.tooltable_tools @@ -766,12 +785,12 @@ class SolderPaste(FlatCAMTool): if float('%.4f' % tool_dia) in tool_dias: if muted is None: - self.app.inform.emit("[WARNING_NOTCL]Adding Nozzle tool cancelled. Tool already in Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table.")) self.tools_table.itemChanged.connect(self.on_tool_edit) return else: if muted is None: - self.app.inform.emit("[success] New Nozzle tool added to Tool Table.") + self.app.inform.emit(_("[success] New Nozzle tool added to Tool Table.")) self.tooltable_tools.update({ int(self.tooluid): { 'tooldia': float('%.4f' % tool_dia), @@ -804,8 +823,8 @@ class SolderPaste(FlatCAMTool): try: new_tool_dia = float(self.tools_table.item(row, 1).text().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered, " + "use a number.")) return tooluid = int(self.tools_table.item(row, 2).text()) @@ -813,7 +832,7 @@ class SolderPaste(FlatCAMTool): # identify the tool that was edited and get it's tooluid if new_tool_dia not in tool_dias: self.tooltable_tools[tooluid]['tooldia'] = new_tool_dia - self.app.inform.emit("[success] Nozzle tool from Tool Table was edited.") + self.app.inform.emit(_("[success] Nozzle tool from Tool Table was edited.")) self.build_ui() return else: @@ -824,7 +843,7 @@ class SolderPaste(FlatCAMTool): break restore_dia_item = self.tools_table.item(row, 1) restore_dia_item.setText(str(old_tool_dia)) - self.app.inform.emit("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.") + self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table.")) self.build_ui() def on_tool_delete(self, rows_to_delete=None, all=None): @@ -869,12 +888,12 @@ class SolderPaste(FlatCAMTool): self.tooltable_tools.pop(t, None) except AttributeError: - self.app.inform.emit("[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete.") + self.app.inform.emit(_("[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete.")) return except Exception as e: log.debug(str(e)) - self.app.inform.emit("[success] Nozzle tool(s) deleted from Tool Table.") + self.app.inform.emit(_("[success] Nozzle tool(s) deleted from Tool Table.")) self.build_ui() def on_rmb_combo(self, pos, combo): @@ -929,7 +948,7 @@ class SolderPaste(FlatCAMTool): """ name = self.obj_combo.currentText() if name == '': - self.app.inform.emit("[WARNING_NOTCL] No SolderPaste mask Gerber object loaded.") + self.app.inform.emit(_("[WARNING_NOTCL] No SolderPaste mask Gerber object loaded.")) return obj = self.app.collection.get_by_name(name) @@ -946,7 +965,7 @@ class SolderPaste(FlatCAMTool): :param work_object: the source Gerber object from which the geometry is created :return: a Geometry type object """ - proc = self.app.proc_container.new("Creating Solder Paste dispensing geometry.") + proc = self.app.proc_container.new(_("Creating Solder Paste dispensing geometry.")) obj = work_object # Sort tools in descending order @@ -958,7 +977,7 @@ class SolderPaste(FlatCAMTool): sorted_tools.sort(reverse=True) if not sorted_tools: - self.app.inform.emit("[WARNING_NOTCL] No Nozzle tools in the tool table.") + self.app.inform.emit(_("[WARNING_NOTCL] No Nozzle tools in the tool table.")) return 'fail' def flatten(geometry=None, reset=True, pathonly=False): @@ -1084,17 +1103,17 @@ class SolderPaste(FlatCAMTool): if not geo_obj.tools[tooluid_key]['solid_geometry']: a += 1 if a == len(geo_obj.tools): - self.app.inform.emit('[ERROR_NOTCL]Cancelled. Empty file, it has no geometry...') + self.app.inform.emit(_('[ERROR_NOTCL] Cancelled. Empty file, it has no geometry...')) return 'fail' - app_obj.inform.emit("[success] Solder Paste geometry generated successfully...") + app_obj.inform.emit(_("[success] Solder Paste geometry generated successfully...")) return # if we still have geometry not processed at the end of the tools then we failed # some or all the pads are not covered with solder paste if work_geo: - app_obj.inform.emit("[WARNING_NOTCL] Some or all pads have no solder " - "due of inadequate nozzle diameters...") + app_obj.inform.emit(_("[WARNING_NOTCL] Some or all pads have no solder " + "due of inadequate nozzle diameters...")) return 'fail' if use_thread: @@ -1107,7 +1126,7 @@ class SolderPaste(FlatCAMTool): return proc.done() - self.app.inform.emit("Generating Solder Paste dispensing geometry...") + self.app.inform.emit(_("Generating Solder Paste dispensing geometry...")) # Promise object with the new name self.app.collection.promise(name) @@ -1127,11 +1146,11 @@ class SolderPaste(FlatCAMTool): obj = self.app.collection.get_by_name(name) if name == '': - self.app.inform.emit("[WARNING_NOTCL]There is no Geometry object available.") + self.app.inform.emit(_("[WARNING_NOTCL] There is no Geometry object available.")) return 'fail' if obj.special_group != 'solder_paste_tool': - self.app.inform.emit("[WARNING_NOTCL]This Geometry can't be processed. NOT a solder_paste_tool geometry.") + self.app.inform.emit(_("[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool geometry.")) return 'fail' a = 0 @@ -1139,7 +1158,7 @@ class SolderPaste(FlatCAMTool): if obj.tools[tooluid_key]['solid_geometry'] is None: a += 1 if a == len(obj.tools): - self.app.inform.emit('[ERROR_NOTCL]Cancelled. Empty file, it has no geometry...') + self.app.inform.emit(_('[ERROR_NOTCL] Cancelled. Empty file, it has no geometry...')) return 'fail' # use the name of the first tool selected in self.geo_tools_table which has the diameter passed as tool_dia @@ -1236,7 +1255,7 @@ class SolderPaste(FlatCAMTool): def job_thread(app_obj): with self.app.proc_container.new("Generating CNC Code"): if app_obj.new_object("cncjob", name, job_init) != 'fail': - app_obj.inform.emit("[success]ToolSolderPaste CNCjob created: %s" % name) + app_obj.inform.emit(_("[success] ToolSolderPaste CNCjob created: %s") % name) app_obj.progress.emit(100) # Create a promise with the name @@ -1268,12 +1287,12 @@ class SolderPaste(FlatCAMTool): try: if obj.special_group != 'solder_paste_tool': - self.app.inform.emit("[WARNING_NOTCL]This CNCJob object can't be processed. " - "NOT a solder_paste_tool CNCJob object.") + self.app.inform.emit(_("[WARNING_NOTCL] This CNCJob object can't be processed. " + "NOT a solder_paste_tool CNCJob object.")) return except AttributeError: - self.app.inform.emit("[WARNING_NOTCL]This CNCJob object can't be processed. " - "NOT a solder_paste_tool CNCJob object.") + self.app.inform.emit(_("[WARNING_NOTCL] This CNCJob object can't be processed. " + "NOT a solder_paste_tool CNCJob object.")) return gcode = '(G-CODE GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s)\n' % \ @@ -1295,7 +1314,7 @@ class SolderPaste(FlatCAMTool): try: lines = StringIO(gcode) except: - self.app.inform.emit("[ERROR_NOTCL] No Gcode in the object...") + self.app.inform.emit(_("[ERROR_NOTCL] No Gcode in the object...")) return try: @@ -1304,7 +1323,7 @@ class SolderPaste(FlatCAMTool): self.app.ui.code_editor.append(proc_line) except Exception as e: log.debug('ToolSolderPaste.on_view_gcode() -->%s' % str(e)) - self.app.inform.emit('[ERROR]ToolSolderPaste.on_view_gcode() -->%s' % str(e)) + self.app.inform.emit(_('[ERROR] ToolSolderPaste.on_view_gcode() -->%s') % str(e)) return self.app.ui.code_editor.moveCursor(QtGui.QTextCursor.Start) @@ -1323,8 +1342,8 @@ class SolderPaste(FlatCAMTool): obj = self.app.collection.get_by_name(name) if obj.special_group != 'solder_paste_tool': - self.app.inform.emit("[WARNING_NOTCL]This CNCJob object can't be processed. " - "NOT a solder_paste_tool CNCJob object.") + self.app.inform.emit(_("[WARNING_NOTCL] This CNCJob object can't be processed. " + "NOT a solder_paste_tool CNCJob object.")) return _filter_ = "G-Code Files (*.nc);;G-Code Files (*.txt);;G-Code Files (*.tap);;G-Code Files (*.cnc);;" \ @@ -1332,16 +1351,16 @@ class SolderPaste(FlatCAMTool): try: dir_file_to_save = self.app.get_last_save_folder() + '/' + str(name) - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export GCode ...", + filename, _f = QtWidgets.QFileDialog.getSaveFileName( + caption=_("Export GCode ..."), directory=dir_file_to_save, filter=_filter_ ) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Machine Code ...", filter=_filter_) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export Machine Code ..."), filter=_filter_) if filename == '': - self.app.inform.emit("[WARNING_NOTCL]Export Machine Code cancelled ...") + self.app.inform.emit(_("[WARNING_NOTCL] Export Machine Code cancelled ...")) return gcode = '(G-CODE GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s)\n' % \ @@ -1367,11 +1386,11 @@ class SolderPaste(FlatCAMTool): for line in lines: f.write(line) except FileNotFoundError: - self.app.inform.emit("[WARNING_NOTCL] No such file or directory") + self.app.inform.emit(_("[WARNING_NOTCL] No such file or directory")) return self.app.file_saved.emit("gcode", filename) - self.app.inform.emit("[success] Solder paste dispenser GCode file saved to: %s" % filename) + self.app.inform.emit(_("[success] Solder paste dispenser GCode file saved to: %s") % filename) def reset_fields(self): self.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) diff --git a/flatcamTools/ToolTransform.py b/flatcamTools/ToolTransform.py index 0f6e71da..25e5eae5 100644 --- a/flatcamTools/ToolTransform.py +++ b/flatcamTools/ToolTransform.py @@ -1,18 +1,31 @@ -from PyQt5 import QtGui, QtCore, QtWidgets -from PyQt5.QtCore import Qt -from GUIElements import FCEntry, FCButton, OptionalInputSection +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMTool import FlatCAMTool from FlatCAMObj import * +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + class ToolTransform(FlatCAMTool): - toolName = "Object Transform" - rotateName = "Rotate" - skewName = "Skew/Shear" - scaleName = "Scale" - flipName = "Mirror (Flip)" - offsetName = "Offset" + toolName = _("Object Transform") + rotateName = _("Rotate") + skewName = _("Skew/Shear") + scaleName = _("Scale") + flipName = _("Mirror (Flip)") + offsetName = _("Offset") def __init__(self, app): FlatCAMTool.__init__(self, app) @@ -31,7 +44,7 @@ class ToolTransform(FlatCAMTool): self.transform_lay.addWidget(title_label) self.empty_label = QtWidgets.QLabel("") - self.empty_label.setFixedWidth(50) + self.empty_label.setFixedWidth(70) self.empty_label1 = QtWidgets.QLabel("") self.empty_label1.setFixedWidth(70) @@ -52,27 +65,27 @@ class ToolTransform(FlatCAMTool): self.transform_lay.addLayout(form_layout) form_child = QtWidgets.QHBoxLayout() - self.rotate_label = QtWidgets.QLabel("Angle:") + self.rotate_label = QtWidgets.QLabel(_("Angle:")) self.rotate_label.setToolTip( - "Angle for Rotation action, in degrees.\n" + _("Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" "Positive numbers for CW motion.\n" - "Negative numbers for CCW motion." + "Negative numbers for CCW motion.") ) - self.rotate_label.setFixedWidth(50) + self.rotate_label.setFixedWidth(70) self.rotate_entry = FCEntry() - # self.rotate_entry.setFixedWidth(60) + # self.rotate_entry.setFixedWidth(70) self.rotate_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.rotate_button = FCButton() - self.rotate_button.set_value("Rotate") + self.rotate_button.set_value(_("Rotate")) self.rotate_button.setToolTip( - "Rotate the selected object(s).\n" + _("Rotate the selected object(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected objects." + "the bounding box for all selected objects.") ) - self.rotate_button.setFixedWidth(60) + self.rotate_button.setFixedWidth(90) form_child.addWidget(self.rotate_entry) form_child.addWidget(self.rotate_button) @@ -91,41 +104,41 @@ class ToolTransform(FlatCAMTool): form1_child_1 = QtWidgets.QHBoxLayout() form1_child_2 = QtWidgets.QHBoxLayout() - self.skewx_label = QtWidgets.QLabel("Angle X:") + self.skewx_label = QtWidgets.QLabel(_("Angle X:")) self.skewx_label.setToolTip( - "Angle for Skew action, in degrees.\n" - "Float number between -360 and 359." + _("Angle for Skew action, in degrees.\n" + "Float number between -360 and 359.") ) - self.skewx_label.setFixedWidth(50) + self.skewx_label.setFixedWidth(70) self.skewx_entry = FCEntry() self.skewx_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.skewx_entry.setFixedWidth(60) + # self.skewx_entry.setFixedWidth(70) self.skewx_button = FCButton() - self.skewx_button.set_value("Skew X") + self.skewx_button.set_value(_("Skew X")) self.skewx_button.setToolTip( - "Skew/shear the selected object(s).\n" + _("Skew/shear the selected object(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected objects.") - self.skewx_button.setFixedWidth(60) + "the bounding box for all selected objects.")) + self.skewx_button.setFixedWidth(90) - self.skewy_label = QtWidgets.QLabel("Angle Y:") + self.skewy_label = QtWidgets.QLabel(_("Angle Y:")) self.skewy_label.setToolTip( - "Angle for Skew action, in degrees.\n" - "Float number between -360 and 359." + _("Angle for Skew action, in degrees.\n" + "Float number between -360 and 359.") ) - self.skewy_label.setFixedWidth(50) + self.skewy_label.setFixedWidth(70) self.skewy_entry = FCEntry() self.skewy_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.skewy_entry.setFixedWidth(60) + # self.skewy_entry.setFixedWidth(70) self.skewy_button = FCButton() - self.skewy_button.set_value("Skew Y") + self.skewy_button.set_value(_("Skew Y")) self.skewy_button.setToolTip( - "Skew/shear the selected object(s).\n" + _("Skew/shear the selected object(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected objects.") - self.skewy_button.setFixedWidth(60) + "the bounding box for all selected objects.")) + self.skewy_button.setFixedWidth(90) form1_child_1.addWidget(self.skewx_entry) form1_child_1.addWidget(self.skewx_button) @@ -148,56 +161,56 @@ class ToolTransform(FlatCAMTool): form2_child_1 = QtWidgets.QHBoxLayout() form2_child_2 = QtWidgets.QHBoxLayout() - self.scalex_label = QtWidgets.QLabel("Factor X:") + self.scalex_label = QtWidgets.QLabel(_("Factor X:")) self.scalex_label.setToolTip( - "Factor for Scale action over X axis." + _("Factor for Scale action over X axis.") ) - self.scalex_label.setFixedWidth(50) + self.scalex_label.setFixedWidth(70) self.scalex_entry = FCEntry() self.scalex_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.scalex_entry.setFixedWidth(60) + # self.scalex_entry.setFixedWidth(70) self.scalex_button = FCButton() - self.scalex_button.set_value("Scale X") + self.scalex_button.set_value(_("Scale X")) self.scalex_button.setToolTip( - "Scale the selected object(s).\n" + _("Scale the selected object(s).\n" "The point of reference depends on \n" - "the Scale reference checkbox state.") - self.scalex_button.setFixedWidth(60) + "the Scale reference checkbox state.")) + self.scalex_button.setFixedWidth(90) - self.scaley_label = QtWidgets.QLabel("Factor Y:") + self.scaley_label = QtWidgets.QLabel(_("Factor Y:")) self.scaley_label.setToolTip( - "Factor for Scale action over Y axis." + _("Factor for Scale action over Y axis.") ) - self.scaley_label.setFixedWidth(50) + self.scaley_label.setFixedWidth(70) self.scaley_entry = FCEntry() self.scaley_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.scaley_entry.setFixedWidth(60) + # self.scaley_entry.setFixedWidth(70) self.scaley_button = FCButton() - self.scaley_button.set_value("Scale Y") + self.scaley_button.set_value(_("Scale Y")) self.scaley_button.setToolTip( - "Scale the selected object(s).\n" + _("Scale the selected object(s).\n" "The point of reference depends on \n" - "the Scale reference checkbox state.") - self.scaley_button.setFixedWidth(60) + "the Scale reference checkbox state.")) + self.scaley_button.setFixedWidth(90) self.scale_link_cb = FCCheckBox() self.scale_link_cb.set_value(True) - self.scale_link_cb.setText("Link") + self.scale_link_cb.setText(_("Link")) self.scale_link_cb.setToolTip( - "Scale the selected object(s)\n" - "using the Scale Factor X for both axis.") - self.scale_link_cb.setFixedWidth(50) + _("Scale the selected object(s)\n" + "using the Scale Factor X for both axis.")) + self.scale_link_cb.setFixedWidth(70) self.scale_zero_ref_cb = FCCheckBox() self.scale_zero_ref_cb.set_value(True) - self.scale_zero_ref_cb.setText("Scale Reference") + self.scale_zero_ref_cb.setText(_("Scale Reference")) self.scale_zero_ref_cb.setToolTip( - "Scale the selected object(s)\n" + _("Scale the selected object(s)\n" "using the origin reference when checked,\n" "and the center of the biggest bounding box\n" - "of the selected objects when unchecked.") + "of the selected objects when unchecked.")) form2_child_1.addWidget(self.scalex_entry) form2_child_1.addWidget(self.scalex_button) @@ -222,39 +235,39 @@ class ToolTransform(FlatCAMTool): form3_child_1 = QtWidgets.QHBoxLayout() form3_child_2 = QtWidgets.QHBoxLayout() - self.offx_label = QtWidgets.QLabel("Value X:") + self.offx_label = QtWidgets.QLabel(_("Value X:")) self.offx_label.setToolTip( - "Value for Offset action on X axis." + _("Value for Offset action on X axis.") ) - self.offx_label.setFixedWidth(50) + self.offx_label.setFixedWidth(70) self.offx_entry = FCEntry() self.offx_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.offx_entry.setFixedWidth(60) + # self.offx_entry.setFixedWidth(70) self.offx_button = FCButton() - self.offx_button.set_value("Offset X") + self.offx_button.set_value(_("Offset X")) self.offx_button.setToolTip( - "Offset the selected object(s).\n" + _("Offset the selected object(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected objects.\n") - self.offx_button.setFixedWidth(60) + "the bounding box for all selected objects.\n")) + self.offx_button.setFixedWidth(90) - self.offy_label = QtWidgets.QLabel("Value Y:") + self.offy_label = QtWidgets.QLabel(_("Value Y:")) self.offy_label.setToolTip( - "Value for Offset action on Y axis." + _("Value for Offset action on Y axis.") ) - self.offy_label.setFixedWidth(50) + self.offy_label.setFixedWidth(70) self.offy_entry = FCEntry() self.offy_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.offy_entry.setFixedWidth(60) + # self.offy_entry.setFixedWidth(70) self.offy_button = FCButton() - self.offy_button.set_value("Offset Y") + self.offy_button.set_value(_("Offset Y")) self.offy_button.setToolTip( - "Offset the selected object(s).\n" + _("Offset the selected object(s).\n" "The point of reference is the middle of\n" - "the bounding box for all selected objects.\n") - self.offy_button.setFixedWidth(60) + "the bounding box for all selected objects.\n")) + self.offy_button.setFixedWidth(90) form3_child_1.addWidget(self.offx_entry) form3_child_1.addWidget(self.offx_button) @@ -279,26 +292,26 @@ class ToolTransform(FlatCAMTool): form4_child_1 = QtWidgets.QHBoxLayout() self.flipx_button = FCButton() - self.flipx_button.set_value("Flip on X") + self.flipx_button.set_value(_("Flip on X")) self.flipx_button.setToolTip( - "Flip the selected object(s) over the X axis.\n" - "Does not create a new object.\n " + _("Flip the selected object(s) over the X axis.\n" + "Does not create a new object.\n ") ) - self.flipx_button.setFixedWidth(60) + self.flipx_button.setFixedWidth(100) self.flipy_button = FCButton() - self.flipy_button.set_value("Flip on Y") + self.flipy_button.set_value(_("Flip on Y")) self.flipy_button.setToolTip( - "Flip the selected object(s) over the X axis.\n" - "Does not create a new object.\n " + _("Flip the selected object(s) over the X axis.\n" + "Does not create a new object.\n ") ) - self.flipy_button.setFixedWidth(60) + self.flipy_button.setFixedWidth(90) self.flip_ref_cb = FCCheckBox() self.flip_ref_cb.set_value(True) - self.flip_ref_cb.setText("Ref Pt") + self.flip_ref_cb.setText(_("Ref Pt")) self.flip_ref_cb.setToolTip( - "Flip the selected object(s)\n" + _("Flip the selected object(s)\n" "around the point in Point Entry Field.\n" "\n" "The point coordinates can be captured by\n" @@ -306,27 +319,27 @@ class ToolTransform(FlatCAMTool): "SHIFT key. \n" "Then click Add button to insert coordinates.\n" "Or enter the coords in format (x, y) in the\n" - "Point Entry field and click Flip on X(Y)") - self.flip_ref_cb.setFixedWidth(50) + "Point Entry field and click Flip on X(Y)")) + self.flip_ref_cb.setFixedWidth(70) - self.flip_ref_label = QtWidgets.QLabel("Point:") + self.flip_ref_label = QtWidgets.QLabel(_("Point:")) self.flip_ref_label.setToolTip( - "Coordinates in format (x, y) used as reference for mirroring.\n" + _("Coordinates in format (x, y) used as reference for mirroring.\n" "The 'x' in (x, y) will be used when using Flip on X and\n" - "the 'y' in (x, y) will be used when using Flip on Y and" + "the 'y' in (x, y) will be used when using Flip on Y and") ) - self.flip_ref_label.setFixedWidth(50) + self.flip_ref_label.setFixedWidth(70) self.flip_ref_entry = EvalEntry2("(0, 0)") self.flip_ref_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) - # self.flip_ref_entry.setFixedWidth(60) + # self.flip_ref_entry.setFixedWidth(70) self.flip_ref_button = FCButton() - self.flip_ref_button.set_value("Add") + self.flip_ref_button.set_value(_("Add")) self.flip_ref_button.setToolTip( - "The point coordinates can be captured by\n" + _("The point coordinates can be captured by\n" "left click on canvas together with pressing\n" - "SHIFT key. Then click Add button to insert.") - self.flip_ref_button.setFixedWidth(60) + "SHIFT key. Then click Add button to insert.")) + self.flip_ref_button.setFixedWidth(90) form4_child_hlay.addStretch() form4_child_hlay.addWidget(self.flipx_button) @@ -362,26 +375,30 @@ class ToolTransform(FlatCAMTool): self.offx_entry.returnPressed.connect(self.on_offx) self.offy_entry.returnPressed.connect(self.on_offy) - def run(self): + def run(self, toggle=True): self.app.report_usage("ToolTransform()") - # if the splitter is hidden, display it, else hide it but only if the current widget is the same - if self.app.ui.splitter.sizes()[0] == 0: - self.app.ui.splitter.setSizes([1, 1]) + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass else: - try: - if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - self.app.ui.splitter.setSizes([0, 1]) - except AttributeError: - pass - + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + FlatCAMTool.run(self) self.set_tool_ui() - self.app.ui.notebook.setTabText(2, "Transform Tool") + self.app.ui.notebook.setTabText(2, _("Transform Tool")) def install(self, icon=None, separator=None, **kwargs): - FlatCAMTool.install(self, icon, separator, shortcut='ALT+T', **kwargs) + FlatCAMTool.install(self, icon, separator, shortcut='ALT+R', **kwargs) def set_tool_ui(self): ## Initialize form @@ -448,8 +465,8 @@ class ToolTransform(FlatCAMTool): try: value = float(self.rotate_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Rotate, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Rotate, " + "use a number.")) return self.app.worker_task.emit({'fcn': self.on_rotate_action, 'params': [value]}) @@ -482,8 +499,8 @@ class ToolTransform(FlatCAMTool): try: value = float(self.skewx_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Skew X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Skew X, " + "use a number.")) return # self.on_skew("X", value) @@ -500,8 +517,8 @@ class ToolTransform(FlatCAMTool): try: value = float(self.skewy_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Skew Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Skew Y, " + "use a number.")) return # self.on_skew("Y", value) @@ -518,8 +535,8 @@ class ToolTransform(FlatCAMTool): try: xvalue = float(self.scalex_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Scale X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Scale X, " + "use a number.")) return # scaling to zero has no sense so we remove it, because scaling with 1 does nothing @@ -552,8 +569,8 @@ class ToolTransform(FlatCAMTool): try: yvalue = float(self.scaley_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Scale Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Scale Y, " + "use a number.")) return # scaling to zero has no sense so we remove it, because scaling with 1 does nothing @@ -581,8 +598,8 @@ class ToolTransform(FlatCAMTool): try: value = float(self.offx_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Offset X, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Offset X, " + "use a number.")) return # self.on_offset("X", value) @@ -599,8 +616,8 @@ class ToolTransform(FlatCAMTool): try: value = float(self.offy_entry.get_value().replace(',', '.')) except ValueError: - self.app.inform.emit("[ERROR_NOTCL]Wrong value format entered for Offset Y, " - "use a number.") + self.app.inform.emit(_("[ERROR_NOTCL]Wrong value format entered for Offset Y, " + "use a number.")) return # self.on_offset("Y", value) @@ -617,10 +634,10 @@ class ToolTransform(FlatCAMTool): ymaxlist = [] if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object selected. Please Select an object to rotate!") + self.app.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an object to rotate!")) return else: - with self.app.proc_container.new("Appying Rotate"): + with self.app.proc_container.new(_("Appying Rotate")): try: # first get a bounding box to fit all for obj in obj_list: @@ -645,7 +662,7 @@ class ToolTransform(FlatCAMTool): px = 0.5 * (xminimal + xmaximal) py = 0.5 * (yminimal + ymaximal) if isinstance(sel_obj, FlatCAMCNCjob): - self.app.inform.emit("CNCJob objects can't be rotated.") + self.app.inform.emit(_("CNCJob objects can't be rotated.")) else: sel_obj.rotate(-num, point=(px, py)) sel_obj.plot() @@ -654,11 +671,11 @@ class ToolTransform(FlatCAMTool): # add information to the object that it was changed and how much sel_obj.options['rotate'] = num - self.app.inform.emit('[success]Rotate done ...') + self.app.inform.emit(_('[success]Rotate done ...')) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, rotation movement was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, rotation movement was not executed.") % str(e)) return def on_flip(self, axis): @@ -669,10 +686,10 @@ class ToolTransform(FlatCAMTool): ymaxlist = [] if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object selected. Please Select an object to flip!") + self.app.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an object to flip!")) return else: - with self.app.proc_container.new("Applying Flip"): + with self.app.proc_container.new(_("Applying Flip")): try: # get mirroring coords from the point entry if self.flip_ref_cb.isChecked(): @@ -704,7 +721,7 @@ class ToolTransform(FlatCAMTool): # execute mirroring for obj in obj_list: if isinstance(obj, FlatCAMCNCjob): - self.app.inform.emit("CNCJob objects can't be mirrored/flipped.") + self.app.inform.emit(_("CNCJob objects can't be mirrored/flipped.")) else: if axis is 'X': obj.mirror('X', (px, py)) @@ -715,7 +732,7 @@ class ToolTransform(FlatCAMTool): else: obj.options['mirror_y'] = True obj.plot() - self.app.inform.emit('[success]Flip on the Y axis done ...') + self.app.inform.emit(_('[success]Flip on the Y axis done ...')) elif axis is 'Y': obj.mirror('Y', (px, py)) # add information to the object that it was changed and how much @@ -725,12 +742,12 @@ class ToolTransform(FlatCAMTool): else: obj.options['mirror_x'] = True obj.plot() - self.app.inform.emit('[success]Flip on the X axis done ...') + self.app.inform.emit(_('[success]Flip on the X axis done ...')) self.app.object_changed.emit(obj) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Flip action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e)) return def on_skew(self, axis, num): @@ -739,10 +756,10 @@ class ToolTransform(FlatCAMTool): yminlist = [] if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!") + self.app.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!")) return else: - with self.app.proc_container.new("Applying Skew"): + with self.app.proc_container.new(_("Applying Skew")): try: # first get a bounding box to fit all for obj in obj_list: @@ -761,7 +778,7 @@ class ToolTransform(FlatCAMTool): for obj in obj_list: if isinstance(obj, FlatCAMCNCjob): - self.app.inform.emit("CNCJob objects can't be skewed.") + self.app.inform.emit(_("CNCJob objects can't be skewed.")) else: if axis is 'X': obj.skew(num, 0, point=(xminimal, yminimal)) @@ -773,11 +790,11 @@ class ToolTransform(FlatCAMTool): obj.options['skew_y'] = num obj.plot() self.app.object_changed.emit(obj) - self.app.inform.emit('[success]Skew on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success]Skew on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Skew action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Skew action was not executed.") % str(e)) return def on_scale(self, axis, xfactor, yfactor, point=None): @@ -788,10 +805,10 @@ class ToolTransform(FlatCAMTool): ymaxlist = [] if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object selected. Please Select an object to scale!") + self.app.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an object to scale!")) return else: - with self.app.proc_container.new("Applying Scale"): + with self.app.proc_container.new(_("Applying Scale")): try: # first get a bounding box to fit all for obj in obj_list: @@ -821,7 +838,7 @@ class ToolTransform(FlatCAMTool): for obj in obj_list: if isinstance(obj, FlatCAMCNCjob): - self.app.inform.emit("CNCJob objects can't be scaled.") + self.app.inform.emit(_("CNCJob objects can't be scaled.")) else: obj.scale(xfactor, yfactor, point=(px, py)) # add information to the object that it was changed and how much @@ -829,10 +846,10 @@ class ToolTransform(FlatCAMTool): obj.options['scale_y'] = yfactor obj.plot() self.app.object_changed.emit(obj) - self.app.inform.emit('[success]Scale on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success] Scale on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Scale action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Scale action was not executed.") % str(e)) return def on_offset(self, axis, num): @@ -841,10 +858,10 @@ class ToolTransform(FlatCAMTool): yminlist = [] if not obj_list: - self.app.inform.emit("[WARNING_NOTCL] No object selected. Please Select an object to offset!") + self.app.inform.emit(_("[WARNING_NOTCL] No object selected. Please Select an object to offset!")) return else: - with self.app.proc_container.new("Applying Offset"): + with self.app.proc_container.new(_("Applying Offset")): try: # first get a bounding box to fit all for obj in obj_list: @@ -862,7 +879,7 @@ class ToolTransform(FlatCAMTool): for obj in obj_list: if isinstance(obj, FlatCAMCNCjob): - self.app.inform.emit("CNCJob objects can't be offseted.") + self.app.inform.emit(_("CNCJob objects can't be offseted.")) else: if axis is 'X': obj.offset((num, 0)) @@ -874,11 +891,11 @@ class ToolTransform(FlatCAMTool): obj.options['offset_y'] = num obj.plot() self.app.object_changed.emit(obj) - self.app.inform.emit('[success]Offset on the %s axis done ...' % str(axis)) + self.app.inform.emit(_('[success]Offset on the %s axis done ...') % str(axis)) self.app.progress.emit(100) except Exception as e: - self.app.inform.emit("[ERROR_NOTCL] Due of %s, Offset action was not executed." % str(e)) + self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Offset action was not executed.") % str(e)) return -# end of file \ No newline at end of file +# end of file diff --git a/locale/en/LC_MESSAGES/en.mo b/locale/en/LC_MESSAGES/en.mo new file mode 100644 index 00000000..717a1835 Binary files /dev/null and b/locale/en/LC_MESSAGES/en.mo differ diff --git a/locale/en/LC_MESSAGES/en.po b/locale/en/LC_MESSAGES/en.po new file mode 100644 index 00000000..e55dc66d --- /dev/null +++ b/locale/en/LC_MESSAGES/en.po @@ -0,0 +1,10244 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2019-03-17 23:12+0200\n" +"PO-Revision-Date: 2019-03-17 23:13+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Basepath: ../../..\n" +"Last-Translator: \n" +"Language: en\n" +"X-Poedit-SearchPath-0: .\n" + +#: FlatCAMApp.py:844 +msgid "[ERROR] Could not find the Language files. The App strings are missing." +msgstr "" +"[ERROR] Could not find the Language files. The App strings are missing." + +#: FlatCAMApp.py:1672 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +msgid "Open cancelled." +msgstr "Open cancelled." + +#: FlatCAMApp.py:1686 +msgid "Open Config file failed." +msgstr "Open Config file failed." + +#: FlatCAMApp.py:1871 +msgid "" +"[WARNING_NOTCL] Editing a MultiGeo Geometry is not possible for the moment." +msgstr "" +"[WARNING_NOTCL] Editing a MultiGeo Geometry is not possible for the moment." + +#: FlatCAMApp.py:1892 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to edit." +msgstr "[WARNING_NOTCL]Select a Geometry or Excellon Object to edit." + +#: FlatCAMApp.py:1903 +msgid "[WARNING_NOTCL]Editor is activated ..." +msgstr "[WARNING_NOTCL]Editor is activated ..." + +#: FlatCAMApp.py:1942 +msgid "[WARNING] Object empty after edit." +msgstr "[WARNING] Object empty after edit." + +#: FlatCAMApp.py:1951 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to update." +msgstr "[WARNING_NOTCL]Select a Geometry or Excellon Object to update." + +#: FlatCAMApp.py:1964 +#, python-format +msgid "[selected] %s is updated, returning to App..." +msgstr "[selected] %s is updated, returning to App..." + +#: FlatCAMApp.py:2287 +msgid "[ERROR] Could not load defaults file." +msgstr "[ERROR] Could not load defaults file." + +#: FlatCAMApp.py:2299 +msgid "[ERROR] Failed to parse defaults file." +msgstr "[ERROR] Failed to parse defaults file." + +#: FlatCAMApp.py:2320 FlatCAMApp.py:2323 +msgid "Import FlatCAM Preferences" +msgstr "Import FlatCAM Preferences" + +#: FlatCAMApp.py:2328 +msgid "[WARNING_NOTCL]FlatCAM preferences import cancelled." +msgstr "[WARNING_NOTCL]FlatCAM preferences import cancelled." + +#: FlatCAMApp.py:2336 FlatCAMApp.py:2810 +msgid "[ERROR_NOTCL] Could not load defaults file." +msgstr "[ERROR_NOTCL] Could not load defaults file." + +#: FlatCAMApp.py:2344 FlatCAMApp.py:2819 +msgid "[ERROR_NOTCL] Failed to parse defaults file." +msgstr "[ERROR_NOTCL] Failed to parse defaults file." + +#: FlatCAMApp.py:2347 +#, python-format +msgid "[success]Imported Defaults from %s" +msgstr "[success]Imported Defaults from %s" + +#: FlatCAMApp.py:2357 FlatCAMApp.py:2361 +msgid "Export FlatCAM Preferences" +msgstr "Export FlatCAM Preferences" + +#: FlatCAMApp.py:2367 +msgid "[WARNING_NOTCL]FlatCAM preferences export cancelled." +msgstr "[WARNING_NOTCL]FlatCAM preferences export cancelled." + +#: FlatCAMApp.py:2383 +msgid "[ERROR_NOTCL]Could not load defaults file." +msgstr "[ERROR_NOTCL]Could not load defaults file." + +#: FlatCAMApp.py:2402 FlatCAMApp.py:2833 +msgid "[ERROR_NOTCL] Failed to write defaults to file." +msgstr "[ERROR_NOTCL] Failed to write defaults to file." + +#: FlatCAMApp.py:2454 +msgid "[ERROR_NOTCL]Failed to open recent files file for writing." +msgstr "[ERROR_NOTCL]Failed to open recent files file for writing." + +#: FlatCAMApp.py:2539 camlib.py:4229 +msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" +msgstr "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" + +#: FlatCAMApp.py:2540 +#, python-brace-format +msgid "" +"Object ({kind}) failed because: {error} \n" +"\n" +msgstr "" +"Object ({kind}) failed because: {error} \n" +"\n" + +#: FlatCAMApp.py:2560 +msgid "Converting units to " +msgstr "Converting units to " + +#: FlatCAMApp.py:2618 FlatCAMApp.py:2621 FlatCAMApp.py:2624 FlatCAMApp.py:2627 +#, python-brace-format +msgid "" +"[selected]{kind} created/selected: {name}" +msgstr "" +"[selected]{kind} created/selected: {name}" + +#: FlatCAMApp.py:2865 +msgid "[success]Defaults saved." +msgstr "[success]Defaults saved." + +#: FlatCAMApp.py:2886 +msgid "[ERROR_NOTCL] Could not load factory defaults file." +msgstr "[ERROR_NOTCL] Could not load factory defaults file." + +#: FlatCAMApp.py:2895 +msgid "[ERROR_NOTCL] Failed to parse factory defaults file." +msgstr "[ERROR_NOTCL] Failed to parse factory defaults file." + +#: FlatCAMApp.py:2909 +msgid "[ERROR_NOTCL] Failed to write factory defaults to file." +msgstr "[ERROR_NOTCL] Failed to write factory defaults to file." + +#: FlatCAMApp.py:2913 +msgid "Factory defaults saved." +msgstr "Factory defaults saved." + +#: FlatCAMApp.py:2918 +msgid "" +"There are files/objects modified in FlatCAM. \n" +"Do you want to Save the project?" +msgstr "" +"There are files/objects modified in FlatCAM. \n" +"Do you want to Save the project?" + +#: FlatCAMApp.py:2921 FlatCAMApp.py:5190 +msgid "Save changes" +msgstr "Save changes" + +#: FlatCAMApp.py:2981 +msgid "" +"[ERROR] Failed join. The Geometry objects are of different types.\n" +"At least one is MultiGeo type and the other is SingleGeo type. A possibility " +"is to convert from one to another and retry joining \n" +"but in the case of converting from MultiGeo to SingleGeo, informations may " +"be lost and the result may not be what was expected. \n" +"Check the generated GCODE." +msgstr "" +"[ERROR] Failed join. The Geometry objects are of different types.\n" +"At least one is MultiGeo type and the other is SingleGeo type. A possibility " +"is to convert from one to another and retry joining \n" +"but in the case of converting from MultiGeo to SingleGeo, informations may " +"be lost and the result may not be what was expected. \n" +"Check the generated GCODE." + +#: FlatCAMApp.py:3022 +msgid "[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects." +msgstr "[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects." + +#: FlatCAMApp.py:3044 +msgid "[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects." +msgstr "[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects." + +#: FlatCAMApp.py:3059 FlatCAMApp.py:3084 +msgid "[ERROR_NOTCL]Failed. Select a Geometry Object and try again." +msgstr "[ERROR_NOTCL]Failed. Select a Geometry Object and try again." + +#: FlatCAMApp.py:3063 FlatCAMApp.py:3088 +#, python-format +msgid "[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" +msgstr "[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" + +#: FlatCAMApp.py:3076 +msgid "[success] A Geometry object was converted to MultiGeo type." +msgstr "[success] A Geometry object was converted to MultiGeo type." + +#: FlatCAMApp.py:3102 +msgid "[success] A Geometry object was converted to SingleGeo type." +msgstr "[success] A Geometry object was converted to SingleGeo type." + +#: FlatCAMApp.py:3286 +#, python-format +msgid "[success]Converted units to %s" +msgstr "[success]Converted units to %s" + +#: FlatCAMApp.py:3297 +msgid "[WARNING_NOTCL]Units conversion cancelled." +msgstr "[WARNING_NOTCL]Units conversion cancelled." + +#: FlatCAMApp.py:3862 +msgid "Open file" +msgstr "Open file" + +#: FlatCAMApp.py:3913 FlatCAMApp.py:3918 +msgid "Export G-Code ..." +msgstr "Export G-Code ..." + +#: FlatCAMApp.py:3921 +msgid "[WARNING_NOTCL]Export Code cancelled." +msgstr "[WARNING_NOTCL]Export Code cancelled." + +#: FlatCAMApp.py:3931 +msgid "[WARNING] No such file or directory" +msgstr "[WARNING] No such file or directory" + +#: FlatCAMApp.py:3938 +#, python-format +msgid "Saved to: %s" +msgstr "Saved to: %s" + +#: FlatCAMApp.py:4001 FlatCAMApp.py:4033 FlatCAMApp.py:4044 FlatCAMApp.py:4055 +#: flatcamTools/ToolNonCopperClear.py:487 flatcamTools/ToolSolderPaste.py:764 +msgid "" +"[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " +"format." +msgstr "" +"[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " +"format." + +#: FlatCAMApp.py:4006 FlatCAMApp.py:4038 FlatCAMApp.py:4049 FlatCAMApp.py:4060 +#: flatcamGUI/FlatCAMGUI.py:2484 +msgid "[WARNING_NOTCL] Adding Tool cancelled ..." +msgstr "[WARNING_NOTCL] Adding Tool cancelled ..." + +#: FlatCAMApp.py:4009 +msgid "" +"Adding Tool works only when Advanced is checked.\n" +"Go to Preferences -> General - Show Advanced Options." +msgstr "" +"Adding Tool works only when Advanced is checked.\n" +"Go to Preferences -> General - Show Advanced Options." + +#: FlatCAMApp.py:4114 +msgid "Object(s) deleted ..." +msgstr "Object(s) deleted ..." + +#: FlatCAMApp.py:4118 +msgid "Failed. No object(s) selected..." +msgstr "Failed. No object(s) selected..." + +#: FlatCAMApp.py:4120 +msgid "Save the work in Editor and try again ..." +msgstr "Save the work in Editor and try again ..." + +#: FlatCAMApp.py:4133 +msgid "Click to set the origin ..." +msgstr "Click to set the origin ..." + +#: FlatCAMApp.py:4145 +msgid "Jump to ..." +msgstr "Jump to ..." + +#: FlatCAMApp.py:4146 +msgid "Enter the coordinates in format X,Y:" +msgstr "Enter the coordinates in format X,Y:" + +#: FlatCAMApp.py:4153 +msgid "Wrong coordinates. Enter coordinates in format: X,Y" +msgstr "Wrong coordinates. Enter coordinates in format: X,Y" + +#: FlatCAMApp.py:4168 +msgid "Done." +msgstr "Done." + +#: FlatCAMApp.py:4300 +msgid "[success] Origin set ..." +msgstr "[success] Origin set ..." + +#: FlatCAMApp.py:4318 +msgid "Preferences" +msgstr "Preferences" + +#: FlatCAMApp.py:4338 +msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." +msgstr "[WARNING_NOTCL] No object selected to Flip on Y axis." + +#: FlatCAMApp.py:4363 +msgid "[success] Flip on Y axis done." +msgstr "[success] Flip on Y axis done." + +#: FlatCAMApp.py:4365 FlatCAMApp.py:4405 FlatCAMEditor.py:1340 +#: flatcamTools/ToolTransform.py:750 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." +msgstr "[ERROR_NOTCL] Due of %s, Flip action was not executed." + +#: FlatCAMApp.py:4378 +msgid "[WARNING_NOTCL] No object selected to Flip on X axis." +msgstr "[WARNING_NOTCL] No object selected to Flip on X axis." + +#: FlatCAMApp.py:4403 +msgid "[success] Flip on X axis done." +msgstr "[success] Flip on X axis done." + +#: FlatCAMApp.py:4418 +msgid "[WARNING_NOTCL] No object selected to Rotate." +msgstr "[WARNING_NOTCL] No object selected to Rotate." + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Transform" +msgstr "Transform" + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Enter the Angle value:" +msgstr "Enter the Angle value:" + +#: FlatCAMApp.py:4451 +msgid "[success] Rotation done." +msgstr "[success] Rotation done." + +#: FlatCAMApp.py:4453 FlatCAMEditor.py:1283 flatcamTools/ToolTransform.py:678 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." +msgstr "[ERROR_NOTCL] Due of %s, rotation movement was not executed." + +#: FlatCAMApp.py:4464 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." +msgstr "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." + +#: FlatCAMApp.py:4485 +msgid "[success] Skew on X axis done." +msgstr "[success] Skew on X axis done." + +#: FlatCAMApp.py:4495 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." +msgstr "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." + +#: FlatCAMApp.py:4516 +msgid "[success] Skew on Y axis done." +msgstr "[success] Skew on Y axis done." + +#: FlatCAMApp.py:4612 FlatCAMApp.py:4639 +msgid "" +"[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " +"format." +msgstr "" +"[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " +"format." + +#: FlatCAMApp.py:4618 +msgid "[success] New Grid added ..." +msgstr "[success] New Grid added ..." + +#: FlatCAMApp.py:4621 +msgid "[WARNING_NOTCL] Grid already exists ..." +msgstr "[WARNING_NOTCL] Grid already exists ..." + +#: FlatCAMApp.py:4624 +msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." +msgstr "[WARNING_NOTCL] Adding New Grid cancelled ..." + +#: FlatCAMApp.py:4646 +msgid "[ERROR_NOTCL] Grid Value does not exist ..." +msgstr "[ERROR_NOTCL] Grid Value does not exist ..." + +#: FlatCAMApp.py:4649 +msgid "[success] Grid Value deleted ..." +msgstr "[success] Grid Value deleted ..." + +#: FlatCAMApp.py:4652 +msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." +msgstr "[WARNING_NOTCL] Delete Grid value cancelled ..." + +#: FlatCAMApp.py:4691 +msgid "[WARNING_NOTCL]No object selected to copy it's name" +msgstr "[WARNING_NOTCL]No object selected to copy it's name" + +#: FlatCAMApp.py:4695 +msgid "Name copied on clipboard ..." +msgstr "Name copied on clipboard ..." + +#: FlatCAMApp.py:4990 FlatCAMApp.py:4993 FlatCAMApp.py:4996 FlatCAMApp.py:4999 +#: FlatCAMApp.py:5013 FlatCAMApp.py:5016 FlatCAMApp.py:5019 FlatCAMApp.py:5022 +#: FlatCAMApp.py:5061 FlatCAMApp.py:5064 FlatCAMApp.py:5067 FlatCAMApp.py:5070 +#: ObjectCollection.py:696 ObjectCollection.py:699 ObjectCollection.py:702 +#: ObjectCollection.py:705 +#, python-brace-format +msgid "[selected]{name} selected" +msgstr "[selected]{name} selected" + +#: FlatCAMApp.py:5187 +msgid "" +"There are files/objects opened in FlatCAM.\n" +"Creating a New project will delete them.\n" +"Do you want to Save the project?" +msgstr "" +"There are files/objects opened in FlatCAM.\n" +"Creating a New project will delete them.\n" +"Do you want to Save the project?" + +#: FlatCAMApp.py:5205 +msgid "[success] New Project created..." +msgstr "[success] New Project created..." + +#: FlatCAMApp.py:5286 +msgid "" +"[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." +msgstr "" +"[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." + +#: FlatCAMApp.py:5293 +msgid "" +"[WARNING_NOTCL] There is no selected object for which to see it's source " +"file code." +msgstr "" +"[WARNING_NOTCL] There is no selected object for which to see it's source " +"file code." + +#: FlatCAMApp.py:5297 FlatCAMApp.py:6728 FlatCAMObj.py:5398 +msgid "Code Editor" +msgstr "Code Editor" + +#: FlatCAMApp.py:5310 +#, python-format +msgid "[ERROR]App.on_view_source() -->%s" +msgstr "[ERROR]App.on_view_source() -->%s" + +#: FlatCAMApp.py:5348 FlatCAMApp.py:5351 flatcamGUI/FlatCAMGUI.py:541 +#: flatcamGUI/FlatCAMGUI.py:1590 +msgid "Open Gerber" +msgstr "Open Gerber" + +#: FlatCAMApp.py:5356 +msgid "[WARNING_NOTCL] Open Gerber cancelled." +msgstr "[WARNING_NOTCL] Open Gerber cancelled." + +#: FlatCAMApp.py:5377 FlatCAMApp.py:5380 flatcamGUI/FlatCAMGUI.py:542 +#: flatcamGUI/FlatCAMGUI.py:1591 +msgid "Open Excellon" +msgstr "Open Excellon" + +#: FlatCAMApp.py:5385 +msgid "[WARNING_NOTCL]Open Excellon cancelled." +msgstr "[WARNING_NOTCL]Open Excellon cancelled." + +#: FlatCAMApp.py:5407 FlatCAMApp.py:5410 +msgid "Open G-Code" +msgstr "Open G-Code" + +#: FlatCAMApp.py:5415 +msgid "[WARNING_NOTCL]Open G-Code cancelled." +msgstr "[WARNING_NOTCL]Open G-Code cancelled." + +#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 +msgid "Open Project" +msgstr "Open Project" + +#: FlatCAMApp.py:5444 +msgid "[WARNING_NOTCL]Open Project cancelled." +msgstr "[WARNING_NOTCL]Open Project cancelled." + +#: FlatCAMApp.py:5463 FlatCAMApp.py:5466 +msgid "Open Configuration File" +msgstr "Open Configuration File" + +#: FlatCAMApp.py:5470 +msgid "[WARNING_NOTCL]Open Config cancelled." +msgstr "[WARNING_NOTCL]Open Config cancelled." + +#: FlatCAMApp.py:5485 FlatCAMApp.py:5682 FlatCAMApp.py:7588 FlatCAMApp.py:7608 +#: FlatCAMApp.py:7629 FlatCAMApp.py:7651 +msgid "[WARNING_NOTCL] No object selected." +msgstr "[WARNING_NOTCL] No object selected." + +#: FlatCAMApp.py:5486 FlatCAMApp.py:5683 +msgid "Please Select a Geometry object to export" +msgstr "Please Select a Geometry object to export" + +#: FlatCAMApp.py:5497 +msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." +msgstr "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." + +#: FlatCAMApp.py:5510 FlatCAMApp.py:5514 +msgid "Export SVG" +msgstr "Export SVG" + +#: FlatCAMApp.py:5519 +msgid "[WARNING_NOTCL]Export SVG cancelled." +msgstr "[WARNING_NOTCL]Export SVG cancelled." + +#: FlatCAMApp.py:5533 +msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" +msgstr "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" + +#: FlatCAMApp.py:5539 FlatCAMApp.py:5543 +msgid "Export PNG Image" +msgstr "Export PNG Image" + +#: FlatCAMApp.py:5548 +msgid "Export PNG cancelled." +msgstr "Export PNG cancelled." + +#: FlatCAMApp.py:5565 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." +msgstr "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." + +#: FlatCAMApp.py:5570 +msgid "" +"[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." +msgstr "" +"[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." + +#: FlatCAMApp.py:5582 +msgid "Save Gerber source file" +msgstr "Save Gerber source file" + +#: FlatCAMApp.py:5587 +msgid "[WARNING_NOTCL] Save Gerber source file cancelled." +msgstr "[WARNING_NOTCL] Save Gerber source file cancelled." + +#: FlatCAMApp.py:5604 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Excellon object to " +"export." +msgstr "" +"[WARNING_NOTCL] No object selected. Please select an Excellon object to " +"export." + +#: FlatCAMApp.py:5609 FlatCAMApp.py:5648 +msgid "" +"[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." +msgstr "" +"[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." + +#: FlatCAMApp.py:5617 FlatCAMApp.py:5621 +msgid "Save Excellon source file" +msgstr "Save Excellon source file" + +#: FlatCAMApp.py:5626 +msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." +msgstr "[WARNING_NOTCL] Saving Excellon source file cancelled." + +#: FlatCAMApp.py:5643 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an Excellon object to " +"export." +msgstr "" +"[WARNING_NOTCL] No object selected. Please Select an Excellon object to " +"export." + +#: FlatCAMApp.py:5656 FlatCAMApp.py:5660 +msgid "Export Excellon" +msgstr "Export Excellon" + +#: FlatCAMApp.py:5665 +msgid "[WARNING_NOTCL]Export Excellon cancelled." +msgstr "[WARNING_NOTCL]Export Excellon cancelled." + +#: FlatCAMApp.py:5693 +msgid "[ERROR_NOTCL] Only Geometry objects can be used." +msgstr "[ERROR_NOTCL] Only Geometry objects can be used." + +#: FlatCAMApp.py:5706 FlatCAMApp.py:5710 +msgid "Export DXF" +msgstr "Export DXF" + +#: FlatCAMApp.py:5715 +msgid "[WARNING_NOTCL] Export DXF cancelled." +msgstr "[WARNING_NOTCL] Export DXF cancelled." + +#: FlatCAMApp.py:5733 FlatCAMApp.py:5736 +msgid "Import SVG" +msgstr "Import SVG" + +#: FlatCAMApp.py:5744 +msgid "[WARNING_NOTCL] Open SVG cancelled." +msgstr "[WARNING_NOTCL] Open SVG cancelled." + +#: FlatCAMApp.py:5763 FlatCAMApp.py:5766 +msgid "Import DXF" +msgstr "Import DXF" + +#: FlatCAMApp.py:5774 +msgid "[WARNING_NOTCL]Open DXF cancelled." +msgstr "[WARNING_NOTCL]Open DXF cancelled." + +#: FlatCAMApp.py:5792 FlatCAMApp.py:5795 +msgid "Open TCL script" +msgstr "Open TCL script" + +#: FlatCAMApp.py:5803 +msgid "[WARNING_NOTCL]Open TCL script cancelled." +msgstr "[WARNING_NOTCL]Open TCL script cancelled." + +#: FlatCAMApp.py:5851 FlatCAMApp.py:5855 +msgid "Save Project As ..." +msgstr "Save Project As ..." + +#: FlatCAMApp.py:5852 +#, python-brace-format +msgid "{l_save}/Project_{date}" +msgstr "{l_save}/Project_{date}" + +#: FlatCAMApp.py:5860 +msgid "[WARNING_NOTCL] Save Project cancelled." +msgstr "[WARNING_NOTCL] Save Project cancelled." + +#: FlatCAMApp.py:5905 +msgid "Exporting SVG" +msgstr "Exporting SVG" + +#: FlatCAMApp.py:5938 FlatCAMApp.py:6043 FlatCAMApp.py:6157 +#, python-format +msgid "[success] SVG file exported to %s" +msgstr "[success] SVG file exported to %s" + +#: FlatCAMApp.py:5969 FlatCAMApp.py:6089 +#, python-format +msgid "[WARNING_NOTCL]No object Box. Using instead %s" +msgstr "[WARNING_NOTCL]No object Box. Using instead %s" + +#: FlatCAMApp.py:6046 FlatCAMApp.py:6160 +msgid "Generating Film ... Please wait." +msgstr "Generating Film ... Please wait." + +#: FlatCAMApp.py:6307 +#, python-format +msgid "[success] Excellon file exported to %s" +msgstr "[success] Excellon file exported to %s" + +#: FlatCAMApp.py:6314 +msgid "Exporting Excellon" +msgstr "Exporting Excellon" + +#: FlatCAMApp.py:6319 FlatCAMApp.py:6326 +msgid "[ERROR_NOTCL] Could not export Excellon file." +msgstr "[ERROR_NOTCL] Could not export Excellon file." + +#: FlatCAMApp.py:6365 +#, python-format +msgid "[success] DXF file exported to %s" +msgstr "[success] DXF file exported to %s" + +#: FlatCAMApp.py:6371 +msgid "Exporting DXF" +msgstr "Exporting DXF" + +#: FlatCAMApp.py:6376 FlatCAMApp.py:6383 +msgid "[[WARNING_NOTCL]] Could not export DXF file." +msgstr "[[WARNING_NOTCL]] Could not export DXF file." + +#: FlatCAMApp.py:6403 FlatCAMApp.py:6445 FlatCAMApp.py:6486 +msgid "" +"[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " +"Gerber are supported" +msgstr "" +"[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " +"Gerber are supported" + +#: FlatCAMApp.py:6413 +msgid "Importing SVG" +msgstr "Importing SVG" + +#: FlatCAMApp.py:6424 FlatCAMApp.py:6466 FlatCAMApp.py:6506 FlatCAMApp.py:6582 +#: FlatCAMApp.py:6649 FlatCAMApp.py:6714 +#, python-format +msgid "[success] Opened: %s" +msgstr "[success] Opened: %s" + +#: FlatCAMApp.py:6455 +msgid "Importing DXF" +msgstr "Importing DXF" + +#: FlatCAMApp.py:6494 +msgid "Importing Image" +msgstr "Importing Image" + +#: FlatCAMApp.py:6535 FlatCAMApp.py:6537 +#, python-format +msgid "[ERROR_NOTCL] Failed to open file: %s" +msgstr "[ERROR_NOTCL] Failed to open file: %s" + +#: FlatCAMApp.py:6540 +#, python-brace-format +msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" +msgstr "[ERROR_NOTCL] Failed to parse file: {name}. {error}" + +#: FlatCAMApp.py:6546 FlatCAMEditor.py:5802 FlatCAMObj.py:4104 +msgid "[ERROR] An internal error has ocurred. See shell.\n" +msgstr "[ERROR] An internal error has ocurred. See shell.\n" + +#: FlatCAMApp.py:6555 +msgid "" +"[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." +msgstr "" +"[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." + +#: FlatCAMApp.py:6563 +msgid "Opening Gerber" +msgstr "Opening Gerber" + +#: FlatCAMApp.py:6573 +msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." +msgstr "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." + +#: FlatCAMApp.py:6608 +msgid "[ERROR_NOTCL] This is not Excellon file." +msgstr "[ERROR_NOTCL] This is not Excellon file." + +#: FlatCAMApp.py:6611 +#, python-format +msgid "[ERROR_NOTCL] Cannot open file: %s" +msgstr "[ERROR_NOTCL] Cannot open file: %s" + +#: FlatCAMApp.py:6616 +msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" +msgstr "[ERROR_NOTCL] An internal error has occurred. See shell.\n" + +#: FlatCAMApp.py:6632 +#, python-format +msgid "[ERROR_NOTCL] No geometry found in file: %s" +msgstr "[ERROR_NOTCL] No geometry found in file: %s" + +#: FlatCAMApp.py:6635 +msgid "Opening Excellon." +msgstr "Opening Excellon." + +#: FlatCAMApp.py:6642 +msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." +msgstr "" +"[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." + +#: FlatCAMApp.py:6681 +#, python-format +msgid "[ERROR_NOTCL] Failed to open %s" +msgstr "[ERROR_NOTCL] Failed to open %s" + +#: FlatCAMApp.py:6691 +msgid "[ERROR_NOTCL] This is not GCODE" +msgstr "[ERROR_NOTCL] This is not GCODE" + +#: FlatCAMApp.py:6697 +msgid "Opening G-Code." +msgstr "Opening G-Code." + +#: FlatCAMApp.py:6705 +msgid "" +"[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n" +" Attempting to create a FlatCAM CNCJob Object from G-Code file failed during " +"processing" +msgstr "" +"[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n" +" Attempting to create a FlatCAM CNCJob Object from G-Code file failed during " +"processing" + +#: FlatCAMApp.py:6745 +#, python-format +msgid "[ERROR_NOTCL] Failed to open config file: %s" +msgstr "[ERROR_NOTCL] Failed to open config file: %s" + +#: FlatCAMApp.py:6770 FlatCAMApp.py:6787 +#, python-format +msgid "[ERROR_NOTCL] Failed to open project file: %s" +msgstr "[ERROR_NOTCL] Failed to open project file: %s" + +#: FlatCAMApp.py:6777 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse project file: %s" +msgstr "[ERROR_NOTCL] Failed to parse project file: %s" + +#: FlatCAMApp.py:6813 +#, python-format +msgid "[success] Project loaded from: %s" +msgstr "[success] Project loaded from: %s" + +#: FlatCAMApp.py:6943 +msgid "Available commands:\n" +msgstr "Available commands:\n" + +#: FlatCAMApp.py:6945 +msgid "" +"\n" +"\n" +"Type help for usage.\n" +" Example: help open_gerber" +msgstr "" +"\n" +"\n" +"Type help for usage.\n" +" Example: help open_gerber" + +#: FlatCAMApp.py:7093 +msgid "Shows list of commands." +msgstr "Shows list of commands." + +#: FlatCAMApp.py:7146 +msgid "[ERROR_NOTCL] Failed to load recent item list." +msgstr "[ERROR_NOTCL] Failed to load recent item list." + +#: FlatCAMApp.py:7153 +msgid "[ERROR_NOTCL] Failed to parse recent item list." +msgstr "[ERROR_NOTCL] Failed to parse recent item list." + +#: FlatCAMApp.py:7214 flatcamGUI/FlatCAMGUI.py:856 +msgid "Shortcut Key List" +msgstr "Shortcut Key List" + +#: FlatCAMApp.py:7221 +msgid "" +"\n" +"

Selected Tab - Choose an Item from " +"Project Tab

\n" +"\n" +"

Details:
\n" +"The normal flow when working in FlatCAM is the following:

\n" +"\n" +"
    \n" +"\t
  1. Loat/Import a Gerber, Excellon, Gcode, " +"DXF, Raster Image or SVG file into FlatCAM using either the menu's, " +"toolbars, key shortcuts or even dragging and dropping the files on the GUI." +"
    \n" +"\t
    \n" +"\tYou can also load a FlatCAM project by double clicking on " +"the project file, drag & drop of the file into the FLATCAM GUI or " +"through the menu/toolbar links offered within the app.

    \n" +"\t 
  2. \n" +"\t
  3. Once an object is available in the " +"Project Tab, by selecting it and then focusing on SELECTED TAB (more simpler is to double click the object name in the Project Tab), " +"SELECTED TAB will be updated with the object properties " +"according to it's kind: Gerber, Excellon, Geometry or CNCJob object.
    \n" +"\t
    \n" +"\tIf the selection of the object is done on the canvas by single click " +"instead, and the SELECTED TAB is in focus, again the object " +"properties will be displayed into the Selected Tab. Alternatively, double " +"clicking on the object on the canvas will bring the SELECTED TAB and populate it even if it was out of focus.
    \n" +"\t
    \n" +"\tYou can change the parameters in this screen and the flow direction is " +"like this:
    \n" +"\t
    \n" +"\tGerber/Excellon Object -> Change Param -> Generate " +"Geometry -> Geometry Object -> Add tools (change " +"param in Selected Tab) -> Generate CNCJob -> CNCJob Object -> Verify GCode (through Edit CNC Code) and/or append/prepend to " +"GCode (again, done in SELECTED TAB) -> Save GCode
  4. \n" +"
\n" +"\n" +"

A list of key shortcuts is available " +"through an menu entry in Help -> Shortcuts List or " +"through it's own key shortcut: F3.

\n" +"\n" +" " +msgstr "" +"\n" +"

Selected Tab - Choose an Item from " +"Project Tab

\n" +"\n" +"

Details:
\n" +"The normal flow when working in FlatCAM is the following:

\n" +"\n" +"
    \n" +"\t
  1. Loat/Import a Gerber, Excellon, Gcode, " +"DXF, Raster Image or SVG file into FlatCAM using either the menu's, " +"toolbars, key shortcuts or even dragging and dropping the files on the GUI." +"
    \n" +"\t
    \n" +"\tYou can also load a FlatCAM project by double clicking on " +"the project file, drag & drop of the file into the FLATCAM GUI or " +"through the menu/toolbar links offered within the app.

    \n" +"\t 
  2. \n" +"\t
  3. Once an object is available in the " +"Project Tab, by selecting it and then focusing on SELECTED TAB (more simpler is to double click the object name in the Project Tab), " +"SELECTED TAB will be updated with the object properties " +"according to it's kind: Gerber, Excellon, Geometry or CNCJob object.
    \n" +"\t
    \n" +"\tIf the selection of the object is done on the canvas by single click " +"instead, and the SELECTED TAB is in focus, again the object " +"properties will be displayed into the Selected Tab. Alternatively, double " +"clicking on the object on the canvas will bring the SELECTED TAB and populate it even if it was out of focus.
    \n" +"\t
    \n" +"\tYou can change the parameters in this screen and the flow direction is " +"like this:
    \n" +"\t
    \n" +"\tGerber/Excellon Object -> Change Param -> Generate " +"Geometry -> Geometry Object -> Add tools (change " +"param in Selected Tab) -> Generate CNCJob -> CNCJob Object -> Verify GCode (through Edit CNC Code) and/or append/prepend to " +"GCode (again, done in SELECTED TAB) -> Save GCode
  4. \n" +"
\n" +"\n" +"

A list of key shortcuts is available " +"through an menu entry in Help -> Shortcuts List or " +"through it's own key shortcut: F3.

\n" +"\n" +" " + +#: FlatCAMApp.py:7325 +msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." +msgstr "[WARNING_NOTCL] Failed checking for latest version. Could not connect." + +#: FlatCAMApp.py:7332 +msgid "[ERROR_NOTCL] Could not parse information about latest version." +msgstr "[ERROR_NOTCL] Could not parse information about latest version." + +#: FlatCAMApp.py:7342 +msgid "[success] FlatCAM is up to date!" +msgstr "[success] FlatCAM is up to date!" + +#: FlatCAMApp.py:7347 +msgid "Newer Version Available" +msgstr "Newer Version Available" + +#: FlatCAMApp.py:7348 +msgid "" +"There is a newer version of FlatCAM available for download:\n" +"\n" +msgstr "" +"There is a newer version of FlatCAM available for download:\n" +"\n" + +#: FlatCAMApp.py:7350 +msgid "info" +msgstr "info" + +#: FlatCAMApp.py:7369 +msgid "[success]All plots disabled." +msgstr "[success]All plots disabled." + +#: FlatCAMApp.py:7375 +msgid "[success]All non selected plots disabled." +msgstr "[success]All non selected plots disabled." + +#: FlatCAMApp.py:7381 +msgid "[success]All plots enabled." +msgstr "[success]All plots enabled." + +#: FlatCAMApp.py:7491 +msgid "Saving FlatCAM Project" +msgstr "Saving FlatCAM Project" + +#: FlatCAMApp.py:7512 FlatCAMApp.py:7543 +#, python-format +msgid "[success] Project saved to: %s" +msgstr "[success] Project saved to: %s" + +#: FlatCAMApp.py:7530 +#, python-format +msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." +msgstr "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." + +#: FlatCAMApp.py:7537 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." +msgstr "" +"[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." + +#: FlatCAMApp.py:7545 +#, python-format +msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." +msgstr "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." + +#: FlatCAMEditor.py:76 +msgid "Buffer distance:" +msgstr "Buffer distance:" + +#: FlatCAMEditor.py:77 +msgid "Buffer corner:" +msgstr "Buffer corner:" + +#: FlatCAMEditor.py:79 +msgid "" +"There are 3 types of corners:\n" +" - 'Round': the corner is rounded for exterior buffer.\n" +" - 'Square:' the corner is met in a sharp angle for exterior buffer.\n" +" - 'Beveled:' the corner is a line that directly connects the features " +"meeting in the corner" +msgstr "" +"There are 3 types of corners:\n" +" - 'Round': the corner is rounded for exterior buffer.\n" +" - 'Square:' the corner is met in a sharp angle for exterior buffer.\n" +" - 'Beveled:' the corner is a line that directly connects the features " +"meeting in the corner" + +#: FlatCAMEditor.py:85 +msgid "Round" +msgstr "Round" + +#: FlatCAMEditor.py:86 +msgid "Square" +msgstr "Square" + +#: FlatCAMEditor.py:87 +msgid "Beveled" +msgstr "Beveled" + +#: FlatCAMEditor.py:94 +msgid "Buffer Interior" +msgstr "Buffer Interior" + +#: FlatCAMEditor.py:96 +msgid "Buffer Exterior" +msgstr "Buffer Exterior" + +#: FlatCAMEditor.py:102 +msgid "Full Buffer" +msgstr "Full Buffer" + +#: FlatCAMEditor.py:123 FlatCAMEditor.py:2623 +msgid "Buffer Tool" +msgstr "Buffer Tool" + +#: FlatCAMEditor.py:134 FlatCAMEditor.py:151 FlatCAMEditor.py:168 +#: FlatCAMEditor.py:2641 FlatCAMEditor.py:2667 FlatCAMEditor.py:2693 +msgid "" +"[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " +"retry." + +#: FlatCAMEditor.py:416 flatcamGUI/FlatCAMGUI.py:3402 +#: flatcamGUI/FlatCAMGUI.py:4608 flatcamGUI/FlatCAMGUI.py:4884 +#: flatcamGUI/FlatCAMGUI.py:5015 flatcamGUI/ObjectUI.py:331 +msgid "Tool dia:" +msgstr "Tool dia:" + +#: FlatCAMEditor.py:418 flatcamGUI/FlatCAMGUI.py:5017 +msgid "" +"Diameter of the tool to\n" +"be used in the operation." +msgstr "" +"Diameter of the tool to\n" +"be used in the operation." + +#: FlatCAMEditor.py:427 flatcamGUI/FlatCAMGUI.py:4790 +#: flatcamGUI/FlatCAMGUI.py:5026 flatcamTools/ToolNonCopperClear.py:164 +#: flatcamTools/ToolPaint.py:160 +msgid "Overlap:" +msgstr "Overlap:" + +#: FlatCAMEditor.py:429 flatcamTools/ToolPaint.py:162 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." + +#: FlatCAMEditor.py:445 flatcamGUI/FlatCAMGUI.py:4806 +#: flatcamGUI/FlatCAMGUI.py:4892 flatcamGUI/FlatCAMGUI.py:5036 +#: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:180 +#: flatcamTools/ToolPaint.py:177 +msgid "Margin:" +msgstr "Margin:" + +#: FlatCAMEditor.py:447 flatcamGUI/FlatCAMGUI.py:5038 +#: flatcamTools/ToolPaint.py:179 +msgid "" +"Distance by which to avoid\n" +"the edges of the polygon to\n" +"be painted." +msgstr "" +"Distance by which to avoid\n" +"the edges of the polygon to\n" +"be painted." + +#: FlatCAMEditor.py:456 flatcamGUI/FlatCAMGUI.py:4815 +#: flatcamGUI/FlatCAMGUI.py:5047 flatcamTools/ToolNonCopperClear.py:189 +#: flatcamTools/ToolPaint.py:188 +msgid "Method:" +msgstr "Method:" + +#: FlatCAMEditor.py:458 flatcamGUI/FlatCAMGUI.py:5049 +msgid "" +"Algorithm to paint the polygon:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed." +msgstr "" +"Algorithm to paint the polygon:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed." + +#: FlatCAMEditor.py:464 flatcamGUI/FlatCAMGUI.py:4824 +#: flatcamGUI/FlatCAMGUI.py:5055 +msgid "Standard" +msgstr "Standard" + +#: FlatCAMEditor.py:465 flatcamGUI/FlatCAMGUI.py:4825 +#: flatcamGUI/FlatCAMGUI.py:5056 +msgid "Seed-based" +msgstr "Seed-based" + +#: FlatCAMEditor.py:466 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:5057 +msgid "Straight lines" +msgstr "Straight lines" + +#: FlatCAMEditor.py:471 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:5062 flatcamTools/ToolNonCopperClear.py:205 +#: flatcamTools/ToolPaint.py:204 +msgid "Connect:" +msgstr "Connect:" + +#: FlatCAMEditor.py:473 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:5064 flatcamTools/ToolNonCopperClear.py:207 +#: flatcamTools/ToolPaint.py:206 +msgid "" +"Draw lines between resulting\n" +"segments to minimize tool lifts." +msgstr "" +"Draw lines between resulting\n" +"segments to minimize tool lifts." + +#: FlatCAMEditor.py:480 flatcamGUI/FlatCAMGUI.py:4840 +#: flatcamGUI/FlatCAMGUI.py:5072 flatcamTools/ToolNonCopperClear.py:214 +#: flatcamTools/ToolPaint.py:213 +msgid "Contour:" +msgstr "Contour:" + +#: FlatCAMEditor.py:482 flatcamGUI/FlatCAMGUI.py:4842 +#: flatcamGUI/FlatCAMGUI.py:5074 flatcamTools/ToolNonCopperClear.py:216 +#: flatcamTools/ToolPaint.py:215 +msgid "" +"Cut around the perimeter of the polygon\n" +"to trim rough edges." +msgstr "" +"Cut around the perimeter of the polygon\n" +"to trim rough edges." + +#: FlatCAMEditor.py:494 +msgid "Paint" +msgstr "Paint" + +#: FlatCAMEditor.py:512 flatcamGUI/FlatCAMGUI.py:575 +#: flatcamGUI/FlatCAMGUI.py:1624 flatcamGUI/ObjectUI.py:1379 +#: flatcamTools/ToolPaint.py:340 +msgid "Paint Tool" +msgstr "Paint Tool" + +#: FlatCAMEditor.py:548 +msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Paint cancelled. No shape selected." + +#: FlatCAMEditor.py:559 flatcamTools/ToolCutOut.py:343 +#: flatcamTools/ToolCutOut.py:481 flatcamTools/ToolCutOut.py:601 +#: flatcamTools/ToolCutOut.py:706 flatcamTools/ToolDblSided.py:363 +msgid "" +"[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and " +"retry." + +#: FlatCAMEditor.py:570 +msgid "" +"[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." + +#: FlatCAMEditor.py:582 +msgid "" +"[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " +"retry." + +#: FlatCAMEditor.py:591 FlatCAMEditor.py:2648 FlatCAMEditor.py:2674 +#: FlatCAMEditor.py:2700 flatcamTools/ToolNonCopperClear.py:806 +#: flatcamTools/ToolProperties.py:104 +msgid "Tools" +msgstr "Tools" + +#: FlatCAMEditor.py:602 FlatCAMEditor.py:975 flatcamGUI/FlatCAMGUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:1635 flatcamTools/ToolTransform.py:398 +msgid "Transform Tool" +msgstr "Transform Tool" + +#: FlatCAMEditor.py:603 FlatCAMEditor.py:664 flatcamTools/ToolTransform.py:24 +#: flatcamTools/ToolTransform.py:82 +msgid "Rotate" +msgstr "Rotate" + +#: FlatCAMEditor.py:604 flatcamTools/ToolTransform.py:25 +msgid "Skew/Shear" +msgstr "Skew/Shear" + +#: FlatCAMEditor.py:605 flatcamGUI/ObjectUI.py:100 flatcamGUI/ObjectUI.py:265 +#: flatcamTools/ToolTransform.py:26 +msgid "Scale" +msgstr "Scale" + +#: FlatCAMEditor.py:606 flatcamTools/ToolTransform.py:27 +msgid "Mirror (Flip)" +msgstr "Mirror (Flip)" + +#: FlatCAMEditor.py:607 flatcamGUI/ObjectUI.py:127 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 flatcamTools/ToolTransform.py:28 +msgid "Offset" +msgstr "Offset" + +#: FlatCAMEditor.py:618 +#, python-format +msgid "Editor %s" +msgstr "Editor %s" + +#: FlatCAMEditor.py:650 FlatCAMEditor.py:4851 FlatCAMEditor.py:4887 +#: flatcamTools/ToolTransform.py:68 +msgid "Angle:" +msgstr "Angle:" + +#: FlatCAMEditor.py:652 flatcamTools/ToolTransform.py:70 +msgid "" +"Angle for Rotation action, in degrees.\n" +"Float number between -360 and 359.\n" +"Positive numbers for CW motion.\n" +"Negative numbers for CCW motion." +msgstr "" +"Angle for Rotation action, in degrees.\n" +"Float number between -360 and 359.\n" +"Positive numbers for CW motion.\n" +"Negative numbers for CCW motion." + +#: FlatCAMEditor.py:666 +msgid "" +"Rotate the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" +"Rotate the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." + +#: FlatCAMEditor.py:689 flatcamTools/ToolTransform.py:107 +msgid "Angle X:" +msgstr "Angle X:" + +#: FlatCAMEditor.py:691 FlatCAMEditor.py:709 flatcamTools/ToolTransform.py:109 +#: flatcamTools/ToolTransform.py:127 +msgid "" +"Angle for Skew action, in degrees.\n" +"Float number between -360 and 359." +msgstr "" +"Angle for Skew action, in degrees.\n" +"Float number between -360 and 359." + +#: FlatCAMEditor.py:700 flatcamTools/ToolTransform.py:118 +msgid "Skew X" +msgstr "Skew X" + +#: FlatCAMEditor.py:702 FlatCAMEditor.py:720 +msgid "" +"Skew/shear the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" +"Skew/shear the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." + +#: FlatCAMEditor.py:707 flatcamTools/ToolTransform.py:125 +msgid "Angle Y:" +msgstr "Angle Y:" + +#: FlatCAMEditor.py:718 flatcamTools/ToolTransform.py:136 +msgid "Skew Y" +msgstr "Skew Y" + +#: FlatCAMEditor.py:746 flatcamTools/ToolTransform.py:164 +msgid "Factor X:" +msgstr "Factor X:" + +#: FlatCAMEditor.py:748 flatcamTools/ToolTransform.py:166 +msgid "Factor for Scale action over X axis." +msgstr "Factor for Scale action over X axis." + +#: FlatCAMEditor.py:756 flatcamTools/ToolTransform.py:174 +msgid "Scale X" +msgstr "Scale X" + +#: FlatCAMEditor.py:758 FlatCAMEditor.py:775 +msgid "" +"Scale the selected shape(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" +"Scale the selected shape(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." + +#: FlatCAMEditor.py:763 flatcamTools/ToolTransform.py:181 +msgid "Factor Y:" +msgstr "Factor Y:" + +#: FlatCAMEditor.py:765 flatcamTools/ToolTransform.py:183 +msgid "Factor for Scale action over Y axis." +msgstr "Factor for Scale action over Y axis." + +#: FlatCAMEditor.py:773 flatcamTools/ToolTransform.py:191 +msgid "Scale Y" +msgstr "Scale Y" + +#: FlatCAMEditor.py:782 flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamTools/ToolTransform.py:200 +msgid "Link" +msgstr "Link" + +#: FlatCAMEditor.py:784 +msgid "" +"Scale the selected shape(s)\n" +"using the Scale Factor X for both axis." +msgstr "" +"Scale the selected shape(s)\n" +"using the Scale Factor X for both axis." + +#: FlatCAMEditor.py:790 flatcamGUI/FlatCAMGUI.py:5429 +#: flatcamTools/ToolTransform.py:208 +msgid "Scale Reference" +msgstr "Scale Reference" + +#: FlatCAMEditor.py:792 +msgid "" +"Scale the selected shape(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected shapes when unchecked." +msgstr "" +"Scale the selected shape(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected shapes when unchecked." + +#: FlatCAMEditor.py:820 flatcamTools/ToolTransform.py:238 +msgid "Value X:" +msgstr "Value X:" + +#: FlatCAMEditor.py:822 flatcamTools/ToolTransform.py:240 +msgid "Value for Offset action on X axis." +msgstr "Value for Offset action on X axis." + +#: FlatCAMEditor.py:830 flatcamTools/ToolTransform.py:248 +msgid "Offset X" +msgstr "Offset X" + +#: FlatCAMEditor.py:832 FlatCAMEditor.py:850 +msgid "" +"Offset the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes.\n" +msgstr "" +"Offset the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes.\n" + +#: FlatCAMEditor.py:838 flatcamTools/ToolTransform.py:255 +msgid "Value Y:" +msgstr "Value Y:" + +#: FlatCAMEditor.py:840 flatcamTools/ToolTransform.py:257 +msgid "Value for Offset action on Y axis." +msgstr "Value for Offset action on Y axis." + +#: FlatCAMEditor.py:848 flatcamTools/ToolTransform.py:265 +msgid "Offset Y" +msgstr "Offset Y" + +#: FlatCAMEditor.py:879 flatcamTools/ToolTransform.py:295 +msgid "Flip on X" +msgstr "Flip on X" + +#: FlatCAMEditor.py:881 FlatCAMEditor.py:889 +msgid "" +"Flip the selected shape(s) over the X axis.\n" +"Does not create a new shape." +msgstr "" +"Flip the selected shape(s) over the X axis.\n" +"Does not create a new shape." + +#: FlatCAMEditor.py:887 flatcamTools/ToolTransform.py:303 +msgid "Flip on Y" +msgstr "Flip on Y" + +#: FlatCAMEditor.py:896 flatcamTools/ToolTransform.py:312 +msgid "Ref Pt" +msgstr "Ref Pt" + +#: FlatCAMEditor.py:898 +msgid "" +"Flip the selected shape(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" +"Flip the selected shape(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" + +#: FlatCAMEditor.py:910 flatcamTools/ToolTransform.py:325 +msgid "Point:" +msgstr "Point:" + +#: FlatCAMEditor.py:912 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y." +msgstr "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y." + +#: FlatCAMEditor.py:922 flatcamGUI/ObjectUI.py:1059 +#: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 +#: flatcamTools/ToolNonCopperClear.py:133 flatcamTools/ToolPaint.py:131 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolTransform.py:337 +msgid "Add" +msgstr "Add" + +#: FlatCAMEditor.py:924 flatcamTools/ToolTransform.py:339 +msgid "" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. Then click Add button to insert." +msgstr "" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. Then click Add button to insert." + +#: FlatCAMEditor.py:1039 +msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Transformation cancelled. No shape selected." + +#: FlatCAMEditor.py:1060 flatcamTools/ToolTransform.py:468 +msgid "[ERROR_NOTCL]Wrong value format entered for Rotate, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Rotate, use a number." + +#: FlatCAMEditor.py:1097 flatcamTools/ToolTransform.py:502 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew X, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Skew X, use a number." + +#: FlatCAMEditor.py:1118 flatcamTools/ToolTransform.py:520 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew Y, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Skew Y, use a number." + +#: FlatCAMEditor.py:1139 flatcamTools/ToolTransform.py:538 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale X, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Scale X, use a number." + +#: FlatCAMEditor.py:1176 flatcamTools/ToolTransform.py:572 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale Y, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Scale Y, use a number." + +#: FlatCAMEditor.py:1208 flatcamTools/ToolTransform.py:601 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset X, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Offset X, use a number." + +#: FlatCAMEditor.py:1229 flatcamTools/ToolTransform.py:619 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset Y, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered for Offset Y, use a number." + +#: FlatCAMEditor.py:1247 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" +msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" + +#: FlatCAMEditor.py:1250 flatcamTools/ToolTransform.py:640 +msgid "Appying Rotate" +msgstr "Appying Rotate" + +#: FlatCAMEditor.py:1278 +msgid "[success] Done. Rotate completed." +msgstr "[success] Done. Rotate completed." + +#: FlatCAMEditor.py:1294 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" +msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" + +#: FlatCAMEditor.py:1297 flatcamTools/ToolTransform.py:692 +msgid "Applying Flip" +msgstr "Applying Flip" + +#: FlatCAMEditor.py:1327 +msgid "[success] Flip on the Y axis done ..." +msgstr "[success] Flip on the Y axis done ..." + +#: FlatCAMEditor.py:1330 +msgid "[success] Flip on the X axis done ..." +msgstr "[success] Flip on the X axis done ..." + +#: FlatCAMEditor.py:1349 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" +msgstr "" +"[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" + +#: FlatCAMEditor.py:1352 flatcamTools/ToolTransform.py:762 +msgid "Applying Skew" +msgstr "Applying Skew" + +#: FlatCAMEditor.py:1377 +#, python-format +msgid "[success] Skew on the %s axis done ..." +msgstr "[success] Skew on the %s axis done ..." + +#: FlatCAMEditor.py:1381 flatcamTools/ToolTransform.py:797 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." +msgstr "[ERROR_NOTCL] Due of %s, Skew action was not executed." + +#: FlatCAMEditor.py:1392 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" +msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" + +#: FlatCAMEditor.py:1395 flatcamTools/ToolTransform.py:811 +msgid "Applying Scale" +msgstr "Applying Scale" + +#: FlatCAMEditor.py:1428 flatcamTools/ToolTransform.py:849 +#, python-format +msgid "[success] Scale on the %s axis done ..." +msgstr "[success] Scale on the %s axis done ..." + +#: FlatCAMEditor.py:1431 flatcamTools/ToolTransform.py:852 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." +msgstr "[ERROR_NOTCL] Due of %s, Scale action was not executed." + +#: FlatCAMEditor.py:1440 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" +msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" + +#: FlatCAMEditor.py:1443 flatcamTools/ToolTransform.py:864 +msgid "Applying Offset" +msgstr "Applying Offset" + +#: FlatCAMEditor.py:1467 +#, python-format +msgid "[success] Offset on the %s axis done ..." +msgstr "[success] Offset on the %s axis done ..." + +#: FlatCAMEditor.py:1471 flatcamTools/ToolTransform.py:898 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." +msgstr "[ERROR_NOTCL] Due of %s, Offset action was not executed." + +#: FlatCAMEditor.py:1475 +msgid "Rotate ..." +msgstr "Rotate ..." + +#: FlatCAMEditor.py:1476 FlatCAMEditor.py:1533 FlatCAMEditor.py:1550 +msgid "Enter an Angle Value (degrees):" +msgstr "Enter an Angle Value (degrees):" + +#: FlatCAMEditor.py:1485 +msgid "[success] Geometry shape rotate done..." +msgstr "[success] Geometry shape rotate done..." + +#: FlatCAMEditor.py:1490 +msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." +msgstr "[WARNING_NOTCL] Geometry shape rotate cancelled..." + +#: FlatCAMEditor.py:1496 +msgid "Offset on X axis ..." +msgstr "Offset on X axis ..." + +#: FlatCAMEditor.py:1497 FlatCAMEditor.py:1516 +#, python-format +msgid "Enter a distance Value (%s):" +msgstr "Enter a distance Value (%s):" + +#: FlatCAMEditor.py:1506 +msgid "[success] Geometry shape offset on X axis done..." +msgstr "[success] Geometry shape offset on X axis done..." + +#: FlatCAMEditor.py:1510 +msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." +msgstr "[WARNING_NOTCL] Geometry shape offset X cancelled..." + +#: FlatCAMEditor.py:1515 +msgid "Offset on Y axis ..." +msgstr "Offset on Y axis ..." + +#: FlatCAMEditor.py:1525 +msgid "[success] Geometry shape offset on Y axis done..." +msgstr "[success] Geometry shape offset on Y axis done..." + +#: FlatCAMEditor.py:1529 +msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." +msgstr "[WARNING_NOTCL] Geometry shape offset Y cancelled..." + +#: FlatCAMEditor.py:1532 +msgid "Skew on X axis ..." +msgstr "Skew on X axis ..." + +#: FlatCAMEditor.py:1542 +msgid "[success] Geometry shape skew on X axis done..." +msgstr "[success] Geometry shape skew on X axis done..." + +#: FlatCAMEditor.py:1546 +msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." +msgstr "[WARNING_NOTCL] Geometry shape skew X cancelled..." + +#: FlatCAMEditor.py:1549 +msgid "Skew on Y axis ..." +msgstr "Skew on Y axis ..." + +#: FlatCAMEditor.py:1559 +msgid "[success] Geometry shape skew on Y axis done..." +msgstr "[success] Geometry shape skew on Y axis done..." + +#: FlatCAMEditor.py:1563 +msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." +msgstr "[WARNING_NOTCL] Geometry shape skew Y cancelled..." + +#: FlatCAMEditor.py:1894 FlatCAMEditor.py:1933 +msgid "Click on CENTER ..." +msgstr "Click on CENTER ..." + +#: FlatCAMEditor.py:1901 +msgid "Click on Circle perimeter point to complete ..." +msgstr "Click on Circle perimeter point to complete ..." + +#: FlatCAMEditor.py:1925 +msgid "[success]Done. Adding Circle completed." +msgstr "[success]Done. Adding Circle completed." + +#: FlatCAMEditor.py:1952 +msgid "Click on Start arc point ..." +msgstr "Click on Start arc point ..." + +#: FlatCAMEditor.py:1956 +msgid "Click on End arc point to complete ..." +msgstr "Click on End arc point to complete ..." + +#: FlatCAMEditor.py:2111 +msgid "[success]Done. Arc completed." +msgstr "[success]Done. Arc completed." + +#: FlatCAMEditor.py:2123 +msgid "Click on 1st corner ..." +msgstr "Click on 1st corner ..." + +#: FlatCAMEditor.py:2163 +msgid "Click on 1st point ..." +msgstr "Click on 1st point ..." + +#: FlatCAMEditor.py:2170 +msgid "Click on next Point or click Right mouse button to complete ..." +msgstr "Click on next Point or click Right mouse button to complete ..." + +#: FlatCAMEditor.py:2193 +msgid "[success]Done. Polygon completed." +msgstr "[success]Done. Polygon completed." + +#: FlatCAMEditor.py:2212 +msgid "[success]Done. Path completed." +msgstr "[success]Done. Path completed." + +#: FlatCAMEditor.py:2472 FlatCAMEditor.py:4034 +msgid "[WARNING_NOTCL] Move cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Move cancelled. No shape selected." + +#: FlatCAMEditor.py:2476 +msgid "Click on reference point." +msgstr "Click on reference point." + +#: FlatCAMEditor.py:2479 +msgid "Click on destination point." +msgstr "Click on destination point." + +#: FlatCAMEditor.py:2510 +msgid "[success]Done. Geometry(s) Move completed." +msgstr "[success]Done. Geometry(s) Move completed." + +#: FlatCAMEditor.py:2555 +msgid "[success]Done. Geometry(s) Copy completed." +msgstr "[success]Done. Geometry(s) Copy completed." + +#: FlatCAMEditor.py:2567 +msgid "Click on the Destination point..." +msgstr "Click on the Destination point..." + +#: FlatCAMEditor.py:2581 +#, python-format +msgid "" +"[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " +"supported. Error: %s" +msgstr "" +"[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " +"supported. Error: %s" + +#: FlatCAMEditor.py:2591 +msgid "[success]Done. Adding Text completed." +msgstr "[success]Done. Adding Text completed." + +#: FlatCAMEditor.py:2619 +msgid "Create buffer geometry ..." +msgstr "Create buffer geometry ..." + +#: FlatCAMEditor.py:2630 FlatCAMEditor.py:2656 FlatCAMEditor.py:2682 +msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Buffer cancelled. No shape selected." + +#: FlatCAMEditor.py:2652 +msgid "[success]Done. Buffer Tool completed." +msgstr "[success]Done. Buffer Tool completed." + +#: FlatCAMEditor.py:2678 +msgid "[success]Done. Buffer Int Tool completed." +msgstr "[success]Done. Buffer Int Tool completed." + +#: FlatCAMEditor.py:2704 +msgid "[success]Done. Buffer Ext Tool completed." +msgstr "[success]Done. Buffer Ext Tool completed." + +#: FlatCAMEditor.py:2737 +msgid "Create Paint geometry ..." +msgstr "Create Paint geometry ..." + +#: FlatCAMEditor.py:2751 +msgid "Shape transformations ..." +msgstr "Shape transformations ..." + +#: FlatCAMEditor.py:2776 +msgid "[WARNING_NOTCL] To add a drill first select a tool" +msgstr "[WARNING_NOTCL] To add a drill first select a tool" + +#: FlatCAMEditor.py:2785 FlatCAMEditor.py:2875 FlatCAMEditor.py:3148 +#: FlatCAMEditor.py:3173 +msgid "Click on target location ..." +msgstr "Click on target location ..." + +#: FlatCAMEditor.py:2825 +msgid "[success]Done. Drill added." +msgstr "[success]Done. Drill added." + +#: FlatCAMEditor.py:2867 +msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" +msgstr "" +"[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" + +#: FlatCAMEditor.py:2892 +msgid "Click on the Drill Circular Array Start position" +msgstr "Click on the Drill Circular Array Start position" + +#: FlatCAMEditor.py:2914 +msgid "" +"[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " +"separator." +msgstr "" +"[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " +"separator." + +#: FlatCAMEditor.py:2917 +msgid "[ERROR_NOTCL] The value is mistyped. Check the value." +msgstr "[ERROR_NOTCL] The value is mistyped. Check the value." + +#: FlatCAMEditor.py:3010 +msgid "[WARNING_NOTCL]Too many drills for the selected spacing angle." +msgstr "[WARNING_NOTCL]Too many drills for the selected spacing angle." + +#: FlatCAMEditor.py:3027 +msgid "[success]Done. Drill Array added." +msgstr "[success]Done. Drill Array added." + +#: FlatCAMEditor.py:3038 +msgid "Click on the Drill(s) to resize ..." +msgstr "Click on the Drill(s) to resize ..." + +#: FlatCAMEditor.py:3058 +msgid "" +"[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize." +msgstr "" +"[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize." + +#: FlatCAMEditor.py:3130 +msgid "[success]Done. Drill Resize completed." +msgstr "[success]Done. Drill Resize completed." + +#: FlatCAMEditor.py:3150 +msgid "Click on reference location ..." +msgstr "Click on reference location ..." + +#: FlatCAMEditor.py:3205 +msgid "[success]Done. Drill(s) Move completed." +msgstr "[success]Done. Drill(s) Move completed." + +#: FlatCAMEditor.py:3258 +msgid "[success]Done. Drill(s) copied." +msgstr "[success]Done. Drill(s) copied." + +#: FlatCAMEditor.py:3908 flatcamGUI/FlatCAMGUI.py:2114 +#: flatcamGUI/FlatCAMGUI.py:2126 +msgid "[success]Done." +msgstr "[success]Done." + +#: FlatCAMEditor.py:4041 +msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Copy cancelled. No shape selected." + +#: FlatCAMEditor.py:4048 flatcamGUI/FlatCAMGUI.py:2406 +#: flatcamGUI/FlatCAMGUI.py:2418 flatcamGUI/FlatCAMGUI.py:2452 +msgid "Click on target point." +msgstr "Click on target point." + +#: FlatCAMEditor.py:4289 +msgid "" +"[WARNING_NOTCL]A selection of at least 2 geo items is required to do " +"Intersection." +msgstr "" +"[WARNING_NOTCL]A selection of at least 2 geo items is required to do " +"Intersection." + +#: FlatCAMEditor.py:4327 FlatCAMEditor.py:4364 FlatCAMEditor.py:4436 +msgid "" +"[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to " +"generate an 'inside' shape" +msgstr "" +"[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to " +"generate an 'inside' shape" + +#: FlatCAMEditor.py:4335 FlatCAMEditor.py:4373 FlatCAMEditor.py:4444 +msgid "[WARNING_NOTCL] Nothing selected for buffering." +msgstr "[WARNING_NOTCL] Nothing selected for buffering." + +#: FlatCAMEditor.py:4339 FlatCAMEditor.py:4377 FlatCAMEditor.py:4448 +msgid "[WARNING_NOTCL] Invalid distance for buffering." +msgstr "[WARNING_NOTCL] Invalid distance for buffering." + +#: FlatCAMEditor.py:4349 FlatCAMEditor.py:4457 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value." +msgstr "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value." + +#: FlatCAMEditor.py:4357 +msgid "[success]Full buffer geometry created." +msgstr "[success]Full buffer geometry created." + +#: FlatCAMEditor.py:4386 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value." +msgstr "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value." + +#: FlatCAMEditor.py:4398 FlatCAMEditor.py:4469 +msgid "[success]Exterior buffer geometry created." +msgstr "[success]Exterior buffer geometry created." + +#: FlatCAMEditor.py:4533 +msgid "[WARNING_NOTCL]Nothing selected for painting." +msgstr "[WARNING_NOTCL]Nothing selected for painting." + +#: FlatCAMEditor.py:4539 +msgid "[WARNING] Invalid value for {}" +msgstr "[WARNING] Invalid value for {}" + +#: FlatCAMEditor.py:4545 +msgid "" +"[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " +"(100%)." +msgstr "" +"[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " +"(100%)." + +#: FlatCAMEditor.py:4604 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different method of Paint\n" +"%s" +msgstr "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different method of Paint\n" +"%s" + +#: FlatCAMEditor.py:4615 +msgid "[success] Paint done." +msgstr "[success] Paint done." + +#: FlatCAMEditor.py:4647 +msgid "Excellon Editor" +msgstr "Excellon Editor" + +#: FlatCAMEditor.py:4654 +msgid "Name:" +msgstr "Name:" + +#: FlatCAMEditor.py:4674 flatcamTools/ToolNonCopperClear.py:71 +#: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 +msgid "Tools Table" +msgstr "Tools Table" + +#: FlatCAMEditor.py:4676 flatcamGUI/ObjectUI.py:609 +msgid "" +"Tools in this Excellon object\n" +"when are used for drilling." +msgstr "" +"Tools in this Excellon object\n" +"when are used for drilling." + +#: FlatCAMEditor.py:4685 FlatCAMEditor.py:5745 FlatCAMObj.py:2203 +#: FlatCAMObj.py:2297 FlatCAMObj.py:2408 flatcamGUI/ObjectUI.py:627 +#: flatcamTools/ToolNonCopperClear.py:82 flatcamTools/ToolPaint.py:80 +#: flatcamTools/ToolSolderPaste.py:81 +msgid "Diameter" +msgstr "Diameter" + +#: FlatCAMEditor.py:4693 +msgid "Add/Delete Tool" +msgstr "Add/Delete Tool" + +#: FlatCAMEditor.py:4695 +msgid "" +"Add/Delete a tool to the tool list\n" +"for this Excellon object." +msgstr "" +"Add/Delete a tool to the tool list\n" +"for this Excellon object." + +#: FlatCAMEditor.py:4703 flatcamTools/ToolCutOut.py:77 +msgid "Tool Dia:" +msgstr "Tool Dia:" + +#: FlatCAMEditor.py:4705 flatcamGUI/ObjectUI.py:1046 +msgid "Diameter for the new tool" +msgstr "Diameter for the new tool" + +#: FlatCAMEditor.py:4714 +msgid "Add Tool" +msgstr "Add Tool" + +#: FlatCAMEditor.py:4716 +msgid "" +"Add a new tool to the tool list\n" +"with the diameter specified above." +msgstr "" +"Add a new tool to the tool list\n" +"with the diameter specified above." + +#: FlatCAMEditor.py:4726 +msgid "Delete Tool" +msgstr "Delete Tool" + +#: FlatCAMEditor.py:4728 +msgid "" +"Delete a tool in the tool list\n" +"by selecting a row in the tool table." +msgstr "" +"Delete a tool in the tool list\n" +"by selecting a row in the tool table." + +#: FlatCAMEditor.py:4746 +msgid "Resize Drill(s)" +msgstr "Resize Drill(s)" + +#: FlatCAMEditor.py:4748 +msgid "Resize a drill or a selection of drills." +msgstr "Resize a drill or a selection of drills." + +#: FlatCAMEditor.py:4755 +msgid "Resize Dia:" +msgstr "Resize Dia:" + +#: FlatCAMEditor.py:4757 +msgid "Diameter to resize to." +msgstr "Diameter to resize to." + +#: FlatCAMEditor.py:4765 +msgid "Resize" +msgstr "Resize" + +#: FlatCAMEditor.py:4767 +msgid "Resize drill(s)" +msgstr "Resize drill(s)" + +#: FlatCAMEditor.py:4789 flatcamGUI/FlatCAMGUI.py:1384 +msgid "Add Drill Array" +msgstr "Add Drill Array" + +#: FlatCAMEditor.py:4791 +msgid "Add an array of drills (linear or circular array)" +msgstr "Add an array of drills (linear or circular array)" + +#: FlatCAMEditor.py:4797 +msgid "" +"Select the type of drills array to create.\n" +"It can be Linear X(Y) or Circular" +msgstr "" +"Select the type of drills array to create.\n" +"It can be Linear X(Y) or Circular" + +#: FlatCAMEditor.py:4800 +msgid "Linear" +msgstr "Linear" + +#: FlatCAMEditor.py:4801 +msgid "Circular" +msgstr "Circular" + +#: FlatCAMEditor.py:4808 +msgid "Nr of drills:" +msgstr "Nr of drills:" + +#: FlatCAMEditor.py:4810 +msgid "Specify how many drills to be in the array." +msgstr "Specify how many drills to be in the array." + +#: FlatCAMEditor.py:4827 FlatCAMEditor.py:4872 +msgid "Direction:" +msgstr "Direction:" + +#: FlatCAMEditor.py:4829 +msgid "" +"Direction on which the linear array is oriented:\n" +"- 'X' - horizontal axis \n" +"- 'Y' - vertical axis or \n" +"- 'Angle' - a custom angle for the array inclination" +msgstr "" +"Direction on which the linear array is oriented:\n" +"- 'X' - horizontal axis \n" +"- 'Y' - vertical axis or \n" +"- 'Angle' - a custom angle for the array inclination" + +#: FlatCAMEditor.py:4838 +msgid "Angle" +msgstr "Angle" + +#: FlatCAMEditor.py:4842 +msgid "Pitch:" +msgstr "Pitch:" + +#: FlatCAMEditor.py:4844 +msgid "Pitch = Distance between elements of the array." +msgstr "Pitch = Distance between elements of the array." + +#: FlatCAMEditor.py:4853 +msgid "" +"Angle at which the linear array is placed.\n" +"The precision is of max 2 decimals.\n" +"Min value is: -359.99 degrees.\n" +"Max value is: 360.00 degrees." +msgstr "" +"Angle at which the linear array is placed.\n" +"The precision is of max 2 decimals.\n" +"Min value is: -359.99 degrees.\n" +"Max value is: 360.00 degrees." + +#: FlatCAMEditor.py:4874 +msgid "" +"Direction for circular array.Can be CW = clockwise or CCW = counter " +"clockwise." +msgstr "" +"Direction for circular array.Can be CW = clockwise or CCW = counter " +"clockwise." + +#: FlatCAMEditor.py:4889 +msgid "Angle at which each element in circular array is placed." +msgstr "Angle at which each element in circular array is placed." + +#: FlatCAMEditor.py:5210 FlatCAMObj.py:1725 +msgid "Total Drills" +msgstr "Total Drills" + +#: FlatCAMEditor.py:5242 FlatCAMObj.py:1751 +msgid "Total Slots" +msgstr "Total Slots" + +#: FlatCAMEditor.py:5316 FlatCAMObj.py:1958 FlatCAMObj.py:3221 +#: FlatCAMObj.py:3527 FlatCAMObj.py:3714 FlatCAMObj.py:3727 FlatCAMObj.py:3844 +#: FlatCAMObj.py:4252 FlatCAMObj.py:4485 FlatCAMObj.py:4891 +#: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 +#: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 +#: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 +#: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 +#: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:478 +#: flatcamTools/ToolNonCopperClear.py:625 +#: flatcamTools/ToolNonCopperClear.py:637 flatcamTools/ToolPaint.py:537 +#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:833 flatcamTools/ToolPaint.py:988 +#: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 +#: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 +#: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 +#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +msgid "[ERROR_NOTCL]Wrong value format entered, use a number." +msgstr "[ERROR_NOTCL]Wrong value format entered, use a number." + +#: FlatCAMEditor.py:5329 +msgid "" +"[WARNING_NOTCL]Tool already in the original or actual tool list.\n" +"Save and reedit Excellon if you need to add this tool. " +msgstr "" +"[WARNING_NOTCL]Tool already in the original or actual tool list.\n" +"Save and reedit Excellon if you need to add this tool. " + +#: FlatCAMEditor.py:5338 flatcamGUI/FlatCAMGUI.py:2481 +#, python-brace-format +msgid "[success]Added new tool with dia: {dia} {units}" +msgstr "[success]Added new tool with dia: {dia} {units}" + +#: FlatCAMEditor.py:5369 +msgid "[WARNING_NOTCL]Select a tool in Tool Table" +msgstr "[WARNING_NOTCL]Select a tool in Tool Table" + +#: FlatCAMEditor.py:5402 +#, python-brace-format +msgid "[success]Deleted tool with dia: {del_dia} {units}" +msgstr "[success]Deleted tool with dia: {del_dia} {units}" + +#: FlatCAMEditor.py:5799 +msgid "" +"[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " +"creation." +msgstr "" +"[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " +"creation." + +#: FlatCAMEditor.py:5808 +msgid "Creating Excellon." +msgstr "Creating Excellon." + +#: FlatCAMEditor.py:5817 +msgid "[success]Excellon editing finished." +msgstr "[success]Excellon editing finished." + +#: FlatCAMEditor.py:5834 +msgid "[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected" +msgstr "[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected" + +#: FlatCAMEditor.py:6316 +msgid "[success]Done. Drill(s) deleted." +msgstr "[success]Done. Drill(s) deleted." + +#: FlatCAMEditor.py:6386 +msgid "Click on the circular array Center position" +msgstr "Click on the circular array Center position" + +#: FlatCAMObj.py:193 +#, python-brace-format +msgid "[success]Name changed from {old} to {new}" +msgstr "[success]Name changed from {old} to {new}" + +#: FlatCAMObj.py:532 FlatCAMObj.py:1886 FlatCAMObj.py:3149 FlatCAMObj.py:5296 +msgid "Basic" +msgstr "Basic" + +#: FlatCAMObj.py:544 FlatCAMObj.py:1902 FlatCAMObj.py:3171 FlatCAMObj.py:5302 +msgid "Advanced" +msgstr "Advanced" + +#: FlatCAMObj.py:899 FlatCAMObj.py:954 +#, python-format +msgid "[success]Isolation geometry created: %s" +msgstr "[success]Isolation geometry created: %s" + +#: FlatCAMObj.py:1029 +msgid "" +"[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." +msgstr "" +"[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." + +#: FlatCAMObj.py:1044 FlatCAMObj.py:1079 +msgid "" +"[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " +"again." +msgstr "" +"[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " +"again." + +#: FlatCAMObj.py:1064 +msgid "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." +msgstr "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." + +#: FlatCAMObj.py:1136 +msgid "Generating Gerber" +msgstr "Generating Gerber" + +#: FlatCAMObj.py:1144 +msgid "[ERROR_NOTCL] Cretion of Gerber failed." +msgstr "[ERROR_NOTCL] Cretion of Gerber failed." + +#: FlatCAMObj.py:1151 +#, python-format +msgid "[success] Created: %s" +msgstr "[success] Created: %s" + +#: FlatCAMObj.py:1271 +msgid "Plotting Apertures" +msgstr "Plotting Apertures" + +#: FlatCAMObj.py:2182 FlatCAMObj.py:2273 FlatCAMObj.py:2388 +msgid "" +"[ERROR_NOTCL]Please select one or more tools from the list and try again." +msgstr "" +"[ERROR_NOTCL]Please select one or more tools from the list and try again." + +#: FlatCAMObj.py:2189 +msgid "" +"[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled." +msgstr "" +"[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled." + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Tool_nr" +msgstr "Tool_nr" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Drills_Nr" +msgstr "Drills_Nr" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Slots_Nr" +msgstr "Slots_Nr" + +#: FlatCAMObj.py:2283 +msgid "" +"[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." +msgstr "" +"[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." + +#: FlatCAMObj.py:2446 FlatCAMObj.py:4140 FlatCAMObj.py:4351 FlatCAMObj.py:4666 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"z_pdepth\"] or self." +"options[\"z_pdepth\"]" +msgstr "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"z_pdepth\"] or self." +"options[\"z_pdepth\"]" + +#: FlatCAMObj.py:2458 FlatCAMObj.py:4152 FlatCAMObj.py:4363 FlatCAMObj.py:4678 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"feedrate_probe\"] or " +"self.options[\"feedrate_probe\"]" +msgstr "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"feedrate_probe\"] or " +"self.options[\"feedrate_probe\"]" + +#: FlatCAMObj.py:2490 FlatCAMObj.py:4553 FlatCAMObj.py:4558 FlatCAMObj.py:4704 +msgid "Generating CNC Code" +msgstr "Generating CNC Code" + +#: FlatCAMObj.py:2516 FlatCAMObj.py:4850 camlib.py:4929 camlib.py:5365 +#: camlib.py:5636 +msgid "" +"[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " +"format (x, y) \n" +"but now there is only one value, not two. " +msgstr "" +"[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " +"format (x, y) \n" +"but now there is only one value, not two. " + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3105 FlatCAMObj.py:3390 +msgid "Path" +msgstr "Path" + +#: FlatCAMObj.py:2863 +msgid "In" +msgstr "In" + +#: FlatCAMObj.py:2863 +msgid "Out" +msgstr "Out" + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3186 FlatCAMObj.py:3759 +msgid "Custom" +msgstr "Custom" + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3770 FlatCAMObj.py:3771 FlatCAMObj.py:3780 +msgid "Iso" +msgstr "Iso" + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3107 FlatCAMObj.py:3392 +msgid "Rough" +msgstr "Rough" + +#: FlatCAMObj.py:2864 +msgid "Finish" +msgstr "Finish" + +#: FlatCAMObj.py:3142 flatcamGUI/FlatCAMGUI.py:463 +#: flatcamGUI/FlatCAMGUI.py:1388 flatcamGUI/ObjectUI.py:1067 +msgid "Copy" +msgstr "Copy" + +#: FlatCAMObj.py:3144 flatcamGUI/FlatCAMGUI.py:464 +#: flatcamGUI/FlatCAMGUI.py:1389 flatcamGUI/ObjectUI.py:1075 +#: flatcamTools/ToolNonCopperClear.py:145 flatcamTools/ToolPaint.py:143 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +msgid "Delete" +msgstr "Delete" + +#: FlatCAMObj.py:3362 +msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." +msgstr "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." + +#: FlatCAMObj.py:3437 +msgid "[success] Tool added in Tool Table." +msgstr "[success] Tool added in Tool Table." + +#: FlatCAMObj.py:3442 +msgid "[ERROR_NOTCL]Default Tool added. Wrong value format entered." +msgstr "[ERROR_NOTCL]Default Tool added. Wrong value format entered." + +#: FlatCAMObj.py:3472 FlatCAMObj.py:3482 +msgid "[WARNING_NOTCL]Failed. Select a tool to copy." +msgstr "[WARNING_NOTCL]Failed. Select a tool to copy." + +#: FlatCAMObj.py:3511 +msgid "[success] Tool was copied in Tool Table." +msgstr "[success] Tool was copied in Tool Table." + +#: FlatCAMObj.py:3544 +msgid "[success] Tool was edited in Tool Table." +msgstr "[success] Tool was edited in Tool Table." + +#: FlatCAMObj.py:3575 FlatCAMObj.py:3585 +msgid "[WARNING_NOTCL]Failed. Select a tool to delete." +msgstr "[WARNING_NOTCL]Failed. Select a tool to delete." + +#: FlatCAMObj.py:3609 +msgid "[success] Tool was deleted in Tool Table." +msgstr "[success] Tool was deleted in Tool Table." + +#: FlatCAMObj.py:4023 +#, python-format +msgid "" +"[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." +msgstr "" +"[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." + +#: FlatCAMObj.py:4040 +msgid "[ERROR_NOTCL]Wrong Tool Dia value format entered, use a number." +msgstr "[ERROR_NOTCL]Wrong Tool Dia value format entered, use a number." + +#: FlatCAMObj.py:4067 +msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." +msgstr "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." + +#: FlatCAMObj.py:4105 +#, python-format +msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" +msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" + +#: FlatCAMObj.py:4261 FlatCAMObj.py:4494 +msgid "" +"[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" +"Add a Tool Offset or change the Offset Type." +msgstr "" +"[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" +"Add a Tool Offset or change the Offset Type." + +#: FlatCAMObj.py:4375 +msgid "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." +msgstr "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." + +#: FlatCAMObj.py:4737 FlatCAMObj.py:4747 camlib.py:3229 camlib.py:3238 +msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." +msgstr "[ERROR_NOTCL] Scale factor has to be a number: integer or float." + +#: FlatCAMObj.py:4785 +msgid "[success]Geometry Scale done." +msgstr "[success]Geometry Scale done." + +#: FlatCAMObj.py:4802 camlib.py:3300 +msgid "" +"[ERROR_NOTCL]An (x,y) pair of values are needed. Probable you entered only " +"one value in the Offset field." +msgstr "" +"[ERROR_NOTCL]An (x,y) pair of values are needed. Probable you entered only " +"one value in the Offset field." + +#: FlatCAMObj.py:4822 +msgid "[success]Geometry Offset done." +msgstr "[success]Geometry Offset done." + +#: FlatCAMObj.py:5364 FlatCAMObj.py:5369 flatcamTools/ToolSolderPaste.py:1360 +msgid "Export Machine Code ..." +msgstr "Export Machine Code ..." + +#: FlatCAMObj.py:5375 +msgid "[WARNING_NOTCL]Export Machine Code cancelled ..." +msgstr "[WARNING_NOTCL]Export Machine Code cancelled ..." + +#: FlatCAMObj.py:5386 +#, python-format +msgid "[success] Machine Code file saved to: %s" +msgstr "[success] Machine Code file saved to: %s" + +#: FlatCAMObj.py:5417 +#, python-format +msgid "[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s" +msgstr "[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s" + +#: FlatCAMObj.py:5523 +#, python-format +msgid "" +"[WARNING_NOTCL]This CNCJob object can't be processed because it is a %s " +"CNCJob object." +msgstr "" +"[WARNING_NOTCL]This CNCJob object can't be processed because it is a %s " +"CNCJob object." + +#: FlatCAMObj.py:5576 +msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" +msgstr "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" + +#: FlatCAMObj.py:5589 +msgid "" +"[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " +"empty." +msgstr "" +"[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " +"empty." + +#: FlatCAMObj.py:5596 +msgid "[success] Toolchange G-code was replaced by a custom code." +msgstr "[success] Toolchange G-code was replaced by a custom code." + +#: FlatCAMObj.py:5611 flatcamTools/ToolSolderPaste.py:1389 +msgid "[WARNING_NOTCL] No such file or directory" +msgstr "[WARNING_NOTCL] No such file or directory" + +#: FlatCAMObj.py:5630 FlatCAMObj.py:5642 +msgid "" +"[WARNING_NOTCL] The used postprocessor file has to have in it's name: " +"'toolchange_custom'" +msgstr "" +"[WARNING_NOTCL] The used postprocessor file has to have in it's name: " +"'toolchange_custom'" + +#: FlatCAMObj.py:5648 +msgid "[ERROR] There is no postprocessor file." +msgstr "[ERROR] There is no postprocessor file." + +#: ObjectCollection.py:402 +#, python-brace-format +msgid "Object renamed from {old} to {new}" +msgstr "Object renamed from {old} to {new}" + +#: ObjectCollection.py:736 +#, python-format +msgid "[ERROR] Cause of error: %s" +msgstr "[ERROR] Cause of error: %s" + +#: camlib.py:200 +msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." +msgstr "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." + +#: camlib.py:1387 +msgid "[success]Object was mirrored ..." +msgstr "[success]Object was mirrored ..." + +#: camlib.py:1389 +msgid "[ERROR_NOTCL] Failed to mirror. No object selected" +msgstr "[ERROR_NOTCL] Failed to mirror. No object selected" + +#: camlib.py:1425 +msgid "[success]Object was rotated ..." +msgstr "[success]Object was rotated ..." + +#: camlib.py:1427 +msgid "[ERROR_NOTCL] Failed to rotate. No object selected" +msgstr "[ERROR_NOTCL] Failed to rotate. No object selected" + +#: camlib.py:1461 +msgid "[success]Object was skewed ..." +msgstr "[success]Object was skewed ..." + +#: camlib.py:1463 +msgid "[ERROR_NOTCL] Failed to skew. No object selected" +msgstr "[ERROR_NOTCL] Failed to skew. No object selected" + +#: camlib.py:2647 camlib.py:2727 +#, python-format +msgid "[WARNING] Coordinates missing, line ignored: %s" +msgstr "[WARNING] Coordinates missing, line ignored: %s" + +#: camlib.py:2648 camlib.py:2728 +msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" +msgstr "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" + +#: camlib.py:2696 +#, python-format +msgid "" +"[ERROR] Region does not have enough points. File will be processed but there " +"are parser errors. Line number: %s" +msgstr "" +"[ERROR] Region does not have enough points. File will be processed but there " +"are parser errors. Line number: %s" + +#: camlib.py:3051 +#, python-format +msgid "" +"[ERROR]Gerber Parser ERROR.\n" +"%s:" +msgstr "" +"[ERROR]Gerber Parser ERROR.\n" +"%s:" + +#: camlib.py:3267 +msgid "[success]Gerber Scale done." +msgstr "[success]Gerber Scale done." + +#: camlib.py:3324 +msgid "[success]Gerber Offset done." +msgstr "[success]Gerber Offset done." + +#: camlib.py:3700 +#, python-format +msgid "[ERROR_NOTCL] This is GCODE mark: %s" +msgstr "[ERROR_NOTCL] This is GCODE mark: %s" + +#: camlib.py:4230 +#, python-brace-format +msgid "" +"[ERROR] Excellon Parser error.\n" +"Parsing Failed. Line {l_nr}: {line}\n" +msgstr "" +"[ERROR] Excellon Parser error.\n" +"Parsing Failed. Line {l_nr}: {line}\n" + +#: camlib.py:4307 +msgid "" +"[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " +"not having a tool associated.\n" +"Check the resulting GCode." +msgstr "" +"[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " +"not having a tool associated.\n" +"Check the resulting GCode." + +#: camlib.py:4843 +#, python-format +msgid "[ERROR] There is no such parameter: %s" +msgstr "[ERROR] There is no such parameter: %s" + +#: camlib.py:4908 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"drill into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative. Check the resulting " +"CNC code (Gcode etc)." +msgstr "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"drill into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative. Check the resulting " +"CNC code (Gcode etc)." + +#: camlib.py:4915 camlib.py:5388 camlib.py:5659 +#, python-format +msgid "" +"[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" +msgstr "" +"[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" + +#: camlib.py:5131 camlib.py:5226 camlib.py:5277 +msgid "[ERROR_NOTCL]The loaded Excellon file has no drills ..." +msgstr "[ERROR_NOTCL]The loaded Excellon file has no drills ..." + +#: camlib.py:5231 +msgid "[ERROR_NOTCL] Wrong optimization type selected." +msgstr "[ERROR_NOTCL] Wrong optimization type selected." + +#: camlib.py:5376 camlib.py:5647 +msgid "" +"[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " +"combinations of other parameters." +msgstr "" +"[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " +"combinations of other parameters." + +#: camlib.py:5381 camlib.py:5652 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"cut into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"cut into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative.Check the resulting CNC " +"code (Gcode etc)." + +#: camlib.py:5393 camlib.py:5664 +msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." +msgstr "[ERROR_NOTCL] Travel Z parameter is None or zero." + +#: camlib.py:5397 camlib.py:5668 +msgid "" +"[WARNING] The Travel Z parameter has negative value. It is the height value " +"to travel between cuts.\n" +"The Z Travel parameter needs to have a positive value, assuming it is a typo " +"therefore the app will convert the value to positive.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" +"[WARNING] The Travel Z parameter has negative value. It is the height value " +"to travel between cuts.\n" +"The Z Travel parameter needs to have a positive value, assuming it is a typo " +"therefore the app will convert the value to positive.Check the resulting CNC " +"code (Gcode etc)." + +#: camlib.py:5404 camlib.py:5675 +#, python-format +msgid "" +"[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" +msgstr "" +"[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" + +#: camlib.py:5534 +#, python-format +msgid "[ERROR]Expected a Geometry, got %s" +msgstr "[ERROR]Expected a Geometry, got %s" + +#: camlib.py:5540 +msgid "" +"[ERROR_NOTCL]Trying to generate a CNC Job from a Geometry object without " +"solid_geometry." +msgstr "" +"[ERROR_NOTCL]Trying to generate a CNC Job from a Geometry object without " +"solid_geometry." + +#: camlib.py:5579 +msgid "" +"[ERROR_NOTCL]The Tool Offset value is too negative to use for the " +"current_geometry.\n" +"Raise the value (in module) and try again." +msgstr "" +"[ERROR_NOTCL]The Tool Offset value is too negative to use for the " +"current_geometry.\n" +"Raise the value (in module) and try again." + +#: camlib.py:5801 +msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." +msgstr "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." + +#: flatcamGUI/FlatCAMGUI.py:50 +msgid "&File" +msgstr "&File" + +#: flatcamGUI/FlatCAMGUI.py:55 +msgid "&New Project ...\tCTRL+N" +msgstr "&New Project ...\tCTRL+N" + +#: flatcamGUI/FlatCAMGUI.py:57 +msgid "Will create a new, blank project" +msgstr "Will create a new, blank project" + +#: flatcamGUI/FlatCAMGUI.py:62 +msgid "&New" +msgstr "&New" + +#: flatcamGUI/FlatCAMGUI.py:65 +msgid "Geometry\tN" +msgstr "Geometry\tN" + +#: flatcamGUI/FlatCAMGUI.py:67 +msgid "Will create a new, empty Geometry Object." +msgstr "Will create a new, empty Geometry Object." + +#: flatcamGUI/FlatCAMGUI.py:69 +msgid "Excellon\tL" +msgstr "Excellon\tL" + +#: flatcamGUI/FlatCAMGUI.py:71 +msgid "Will create a new, empty Excellon Object." +msgstr "Will create a new, empty Excellon Object." + +#: flatcamGUI/FlatCAMGUI.py:74 +msgid "Open" +msgstr "Open" + +#: flatcamGUI/FlatCAMGUI.py:79 +msgid "Open &Gerber ...\tCTRL+G" +msgstr "Open &Gerber ...\tCTRL+G" + +#: flatcamGUI/FlatCAMGUI.py:86 +msgid "Open &Excellon ...\tCTRL+E" +msgstr "Open &Excellon ...\tCTRL+E" + +#: flatcamGUI/FlatCAMGUI.py:91 +msgid "Open G-&Code ..." +msgstr "Open G-&Code ..." + +#: flatcamGUI/FlatCAMGUI.py:95 +msgid "Open &Project ..." +msgstr "Open &Project ..." + +#: flatcamGUI/FlatCAMGUI.py:101 +msgid "Open Config ..." +msgstr "Open Config ..." + +#: flatcamGUI/FlatCAMGUI.py:105 +msgid "Recent files" +msgstr "Recent files" + +#: flatcamGUI/FlatCAMGUI.py:111 +msgid "Run Script ...\tSHIFT+S" +msgstr "Run Script ...\tSHIFT+S" + +#: flatcamGUI/FlatCAMGUI.py:114 +msgid "" +"Will run the opened Tcl Script thus\n" +"enabling the automation of certain\n" +"functions of FlatCAM." +msgstr "" +"Will run the opened Tcl Script thus\n" +"enabling the automation of certain\n" +"functions of FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:124 +msgid "Import" +msgstr "Import" + +#: flatcamGUI/FlatCAMGUI.py:126 +msgid "&SVG as Geometry Object ..." +msgstr "&SVG as Geometry Object ..." + +#: flatcamGUI/FlatCAMGUI.py:129 +msgid "&SVG as Gerber Object ..." +msgstr "&SVG as Gerber Object ..." + +#: flatcamGUI/FlatCAMGUI.py:134 +msgid "&DXF as Geometry Object ..." +msgstr "&DXF as Geometry Object ..." + +#: flatcamGUI/FlatCAMGUI.py:137 +msgid "&DXF as Gerber Object ..." +msgstr "&DXF as Gerber Object ..." + +#: flatcamGUI/FlatCAMGUI.py:142 +msgid "Export" +msgstr "Export" + +#: flatcamGUI/FlatCAMGUI.py:145 +msgid "Export &SVG ..." +msgstr "Export &SVG ..." + +#: flatcamGUI/FlatCAMGUI.py:148 +msgid "Export DXF ..." +msgstr "Export DXF ..." + +#: flatcamGUI/FlatCAMGUI.py:153 +msgid "Export &PNG ..." +msgstr "Export &PNG ..." + +#: flatcamGUI/FlatCAMGUI.py:155 +msgid "" +"Will export an image in PNG format,\n" +"the saved image will contain the visual \n" +"information currently in FlatCAM Plot Area." +msgstr "" +"Will export an image in PNG format,\n" +"the saved image will contain the visual \n" +"information currently in FlatCAM Plot Area." + +#: flatcamGUI/FlatCAMGUI.py:163 +msgid "Export &Excellon ..." +msgstr "Export &Excellon ..." + +#: flatcamGUI/FlatCAMGUI.py:166 +msgid "" +"Will export an Excellon Object as Excellon file,\n" +"the coordinates format, the file units and zeros\n" +"are set in Preferences -> Excellon Export." +msgstr "" +"Will export an Excellon Object as Excellon file,\n" +"the coordinates format, the file units and zeros\n" +"are set in Preferences -> Excellon Export." + +#: flatcamGUI/FlatCAMGUI.py:177 +msgid "Save &Defaults" +msgstr "Save &Defaults" + +#: flatcamGUI/FlatCAMGUI.py:183 flatcamGUI/FlatCAMGUI.py:465 +msgid "Save" +msgstr "Save" + +#: flatcamGUI/FlatCAMGUI.py:185 +msgid "&Save Project ..." +msgstr "&Save Project ..." + +#: flatcamGUI/FlatCAMGUI.py:190 +msgid "Save Project &As ...\tCTRL+S" +msgstr "Save Project &As ...\tCTRL+S" + +#: flatcamGUI/FlatCAMGUI.py:194 +msgid "Save Project C&opy ..." +msgstr "Save Project C&opy ..." + +#: flatcamGUI/FlatCAMGUI.py:202 +msgid "E&xit" +msgstr "E&xit" + +#: flatcamGUI/FlatCAMGUI.py:208 +msgid "&Edit" +msgstr "&Edit" + +#: flatcamGUI/FlatCAMGUI.py:211 +msgid "Edit Object\tE" +msgstr "Edit Object\tE" + +#: flatcamGUI/FlatCAMGUI.py:212 +msgid "Save && Close Editor\tCTRL+S" +msgstr "Save && Close Editor\tCTRL+S" + +#: flatcamGUI/FlatCAMGUI.py:220 +msgid "Conversion" +msgstr "Conversion" + +#: flatcamGUI/FlatCAMGUI.py:222 +msgid "&Join Geo/Gerber/Exc -> Geo" +msgstr "&Join Geo/Gerber/Exc -> Geo" + +#: flatcamGUI/FlatCAMGUI.py:224 +msgid "" +"Merge a selection of objects, which can be of type:\n" +"- Gerber\n" +"- Excellon\n" +"- Geometry\n" +"into a new combo Geometry object." +msgstr "" +"Merge a selection of objects, which can be of type:\n" +"- Gerber\n" +"- Excellon\n" +"- Geometry\n" +"into a new combo Geometry object." + +#: flatcamGUI/FlatCAMGUI.py:231 +msgid "Join Excellon(s) -> Excellon" +msgstr "Join Excellon(s) -> Excellon" + +#: flatcamGUI/FlatCAMGUI.py:233 +msgid "Merge a selection of Excellon objects into a new combo Excellon object." +msgstr "" +"Merge a selection of Excellon objects into a new combo Excellon object." + +#: flatcamGUI/FlatCAMGUI.py:236 +msgid "Join Gerber(s) -> Gerber" +msgstr "Join Gerber(s) -> Gerber" + +#: flatcamGUI/FlatCAMGUI.py:238 +msgid "Merge a selection of Gerber objects into a new combo Gerber object." +msgstr "Merge a selection of Gerber objects into a new combo Gerber object." + +#: flatcamGUI/FlatCAMGUI.py:243 +msgid "Convert Single to MultiGeo" +msgstr "Convert Single to MultiGeo" + +#: flatcamGUI/FlatCAMGUI.py:245 +msgid "" +"Will convert a Geometry object from single_geometry type\n" +"to a multi_geometry type." +msgstr "" +"Will convert a Geometry object from single_geometry type\n" +"to a multi_geometry type." + +#: flatcamGUI/FlatCAMGUI.py:249 +msgid "Convert Multi to SingleGeo" +msgstr "Convert Multi to SingleGeo" + +#: flatcamGUI/FlatCAMGUI.py:251 +msgid "" +"Will convert a Geometry object from multi_geometry type\n" +"to a single_geometry type." +msgstr "" +"Will convert a Geometry object from multi_geometry type\n" +"to a single_geometry type." + +#: flatcamGUI/FlatCAMGUI.py:258 +msgid "&Copy Object\tCTRL+C" +msgstr "&Copy Object\tCTRL+C" + +#: flatcamGUI/FlatCAMGUI.py:260 +msgid "Copy as &Geom" +msgstr "Copy as &Geom" + +#: flatcamGUI/FlatCAMGUI.py:263 +msgid "&Delete\tDEL" +msgstr "&Delete\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:267 +msgid "Se&t Origin\tO" +msgstr "Se&t Origin\tO" + +#: flatcamGUI/FlatCAMGUI.py:268 +msgid "Jump to Location\tJ" +msgstr "Jump to Location\tJ" + +#: flatcamGUI/FlatCAMGUI.py:273 +msgid "Toggle Units\tQ" +msgstr "Toggle Units\tQ" + +#: flatcamGUI/FlatCAMGUI.py:275 +msgid "&Select All\tCTRL+A" +msgstr "&Select All\tCTRL+A" + +#: flatcamGUI/FlatCAMGUI.py:279 +msgid "&Preferences\tSHIFT+P" +msgstr "&Preferences\tSHIFT+P" + +#: flatcamGUI/FlatCAMGUI.py:282 +msgid "&Options" +msgstr "&Options" + +#: flatcamGUI/FlatCAMGUI.py:297 +msgid "&Rotate Selection\tSHIFT+(R)" +msgstr "&Rotate Selection\tSHIFT+(R)" + +#: flatcamGUI/FlatCAMGUI.py:302 +msgid "&Skew on X axis\tSHIFT+X" +msgstr "&Skew on X axis\tSHIFT+X" + +#: flatcamGUI/FlatCAMGUI.py:304 +msgid "S&kew on Y axis\tSHIFT+Y" +msgstr "S&kew on Y axis\tSHIFT+Y" + +#: flatcamGUI/FlatCAMGUI.py:309 +msgid "Flip on &X axis\tX" +msgstr "Flip on &X axis\tX" + +#: flatcamGUI/FlatCAMGUI.py:311 +msgid "Flip on &Y axis\tY" +msgstr "Flip on &Y axis\tY" + +#: flatcamGUI/FlatCAMGUI.py:316 +msgid "View source\tALT+S" +msgstr "View source\tALT+S" + +#: flatcamGUI/FlatCAMGUI.py:321 +msgid "&View" +msgstr "&View" + +#: flatcamGUI/FlatCAMGUI.py:322 +msgid "Enable all plots\tALT+1" +msgstr "Enable all plots\tALT+1" + +#: flatcamGUI/FlatCAMGUI.py:324 +msgid "Disable all plots\tALT+2" +msgstr "Disable all plots\tALT+2" + +#: flatcamGUI/FlatCAMGUI.py:326 +msgid "Disable non-selected\tALT+3" +msgstr "Disable non-selected\tALT+3" + +#: flatcamGUI/FlatCAMGUI.py:329 +msgid "&Zoom Fit\tV" +msgstr "&Zoom Fit\tV" + +#: flatcamGUI/FlatCAMGUI.py:330 +msgid "&Zoom In\t-" +msgstr "&Zoom In\t-" + +#: flatcamGUI/FlatCAMGUI.py:331 +msgid "&Zoom Out\t=" +msgstr "&Zoom Out\t=" + +#: flatcamGUI/FlatCAMGUI.py:335 +msgid "Toggle Code Editor\tCTRL+E" +msgstr "Toggle Code Editor\tCTRL+E" + +#: flatcamGUI/FlatCAMGUI.py:338 +msgid "&Toggle FullScreen\tALT+F10" +msgstr "&Toggle FullScreen\tALT+F10" + +#: flatcamGUI/FlatCAMGUI.py:340 +msgid "&Toggle Plot Area\tCTRL+F10" +msgstr "&Toggle Plot Area\tCTRL+F10" + +#: flatcamGUI/FlatCAMGUI.py:342 +msgid "&Toggle Project/Sel/Tool\t`" +msgstr "&Toggle Project/Sel/Tool\t`" + +#: flatcamGUI/FlatCAMGUI.py:345 +msgid "&Toggle Grid Snap\tG" +msgstr "&Toggle Grid Snap\tG" + +#: flatcamGUI/FlatCAMGUI.py:347 +msgid "&Toggle Axis\tSHIFT+G" +msgstr "&Toggle Axis\tSHIFT+G" + +#: flatcamGUI/FlatCAMGUI.py:350 +msgid "Toggle Workspace\tSHIFT+W" +msgstr "Toggle Workspace\tSHIFT+W" + +#: flatcamGUI/FlatCAMGUI.py:354 +msgid "&Tool" +msgstr "&Tool" + +#: flatcamGUI/FlatCAMGUI.py:356 +msgid "&Command Line\tS" +msgstr "&Command Line\tS" + +#: flatcamGUI/FlatCAMGUI.py:359 +msgid "&Help" +msgstr "&Help" + +#: flatcamGUI/FlatCAMGUI.py:360 +msgid "Help\tF1" +msgstr "Help\tF1" + +#: flatcamGUI/FlatCAMGUI.py:361 +msgid "FlatCAM.org" +msgstr "FlatCAM.org" + +#: flatcamGUI/FlatCAMGUI.py:364 +msgid "Shortcuts List\tF3" +msgstr "Shortcuts List\tF3" + +#: flatcamGUI/FlatCAMGUI.py:365 +msgid "YouTube Channel\tF4" +msgstr "YouTube Channel\tF4" + +#: flatcamGUI/FlatCAMGUI.py:367 +msgid "About" +msgstr "About" + +#: flatcamGUI/FlatCAMGUI.py:378 +msgid "Add Circle\tO" +msgstr "Add Circle\tO" + +#: flatcamGUI/FlatCAMGUI.py:380 +msgid "Add Arc\tA" +msgstr "Add Arc\tA" + +#: flatcamGUI/FlatCAMGUI.py:383 +msgid "Add Rectangle\tR" +msgstr "Add Rectangle\tR" + +#: flatcamGUI/FlatCAMGUI.py:386 +msgid "Add Polygon\tN" +msgstr "Add Polygon\tN" + +#: flatcamGUI/FlatCAMGUI.py:388 +msgid "Add Path\tP" +msgstr "Add Path\tP" + +#: flatcamGUI/FlatCAMGUI.py:390 +msgid "Add Text\tT" +msgstr "Add Text\tT" + +#: flatcamGUI/FlatCAMGUI.py:393 +msgid "Polygon Union\tU" +msgstr "Polygon Union\tU" + +#: flatcamGUI/FlatCAMGUI.py:395 +msgid "Polygon Intersection\tE" +msgstr "Polygon Intersection\tE" + +#: flatcamGUI/FlatCAMGUI.py:397 +msgid "Polygon Subtraction\tS" +msgstr "Polygon Subtraction\tS" + +#: flatcamGUI/FlatCAMGUI.py:401 +msgid "Cut Path\tX" +msgstr "Cut Path\tX" + +#: flatcamGUI/FlatCAMGUI.py:403 +msgid "Copy Geom\tC" +msgstr "Copy Geom\tC" + +#: flatcamGUI/FlatCAMGUI.py:405 +msgid "Delete Shape\tDEL" +msgstr "Delete Shape\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:408 +msgid "Move\tM" +msgstr "Move\tM" + +#: flatcamGUI/FlatCAMGUI.py:410 +msgid "Buffer Tool\tB" +msgstr "Buffer Tool\tB" + +#: flatcamGUI/FlatCAMGUI.py:413 +msgid "Paint Tool\tI" +msgstr "Paint Tool\tI" + +#: flatcamGUI/FlatCAMGUI.py:416 +msgid "Transform Tool\tALT+R" +msgstr "Transform Tool\tALT+R" + +#: flatcamGUI/FlatCAMGUI.py:420 +msgid "Toggle Corner Snap\tK" +msgstr "Toggle Corner Snap\tK" + +#: flatcamGUI/FlatCAMGUI.py:423 +msgid ">Excellon Editor<" +msgstr ">Excellon Editor<" + +#: flatcamGUI/FlatCAMGUI.py:427 +msgid "Add Drill Array\tA" +msgstr "Add Drill Array\tA" + +#: flatcamGUI/FlatCAMGUI.py:429 +msgid "Add Drill\tD" +msgstr "Add Drill\tD" + +#: flatcamGUI/FlatCAMGUI.py:433 +msgid "Resize Drill(S)\tR" +msgstr "Resize Drill(S)\tR" + +#: flatcamGUI/FlatCAMGUI.py:435 +msgid "Copy\tC" +msgstr "Copy\tC" + +#: flatcamGUI/FlatCAMGUI.py:437 +msgid "Delete\tDEL" +msgstr "Delete\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:442 +msgid "Move Drill(s)\tM" +msgstr "Move Drill(s)\tM" + +#: flatcamGUI/FlatCAMGUI.py:456 +msgid "Enable Plot" +msgstr "Enable Plot" + +#: flatcamGUI/FlatCAMGUI.py:457 +msgid "Disable Plot" +msgstr "Disable Plot" + +#: flatcamGUI/FlatCAMGUI.py:459 +msgid "Generate CNC" +msgstr "Generate CNC" + +#: flatcamGUI/FlatCAMGUI.py:460 +msgid "View Source" +msgstr "View Source" + +#: flatcamGUI/FlatCAMGUI.py:462 flatcamGUI/FlatCAMGUI.py:1390 +msgid "Edit" +msgstr "Edit" + +#: flatcamGUI/FlatCAMGUI.py:468 flatcamGUI/FlatCAMGUI.py:1396 +#: flatcamTools/ToolProperties.py:25 +msgid "Properties" +msgstr "Properties" + +#: flatcamGUI/FlatCAMGUI.py:497 +msgid "File Toolbar" +msgstr "File Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:501 +msgid "Edit Toolbar" +msgstr "Edit Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:505 +msgid "View Toolbar" +msgstr "View Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:509 +msgid "Shell Toolbar" +msgstr "Shell Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:513 +msgid "Tools Toolbar" +msgstr "Tools Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:517 +msgid "Excellon Editor Toolbar" +msgstr "Excellon Editor Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:521 +msgid "Geometry Editor Toolbar" +msgstr "Geometry Editor Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:525 +msgid "Grid Toolbar" +msgstr "Grid Toolbar" + +#: flatcamGUI/FlatCAMGUI.py:544 flatcamGUI/FlatCAMGUI.py:1593 +msgid "Open project" +msgstr "Open project" + +#: flatcamGUI/FlatCAMGUI.py:545 flatcamGUI/FlatCAMGUI.py:1594 +msgid "Save project" +msgstr "Save project" + +#: flatcamGUI/FlatCAMGUI.py:548 flatcamGUI/FlatCAMGUI.py:1597 +msgid "New Blank Geometry" +msgstr "New Blank Geometry" + +#: flatcamGUI/FlatCAMGUI.py:549 flatcamGUI/FlatCAMGUI.py:1598 +msgid "New Blank Excellon" +msgstr "New Blank Excellon" + +#: flatcamGUI/FlatCAMGUI.py:551 flatcamGUI/FlatCAMGUI.py:1600 +msgid "Editor" +msgstr "Editor" + +#: flatcamGUI/FlatCAMGUI.py:553 flatcamGUI/FlatCAMGUI.py:1602 +msgid "Save Object and close the Editor" +msgstr "Save Object and close the Editor" + +#: flatcamGUI/FlatCAMGUI.py:557 flatcamGUI/FlatCAMGUI.py:1606 +msgid "&Delete" +msgstr "&Delete" + +#: flatcamGUI/FlatCAMGUI.py:560 flatcamGUI/FlatCAMGUI.py:1609 +msgid "&Replot" +msgstr "&Replot" + +#: flatcamGUI/FlatCAMGUI.py:561 flatcamGUI/FlatCAMGUI.py:1610 +msgid "&Clear plot" +msgstr "&Clear plot" + +#: flatcamGUI/FlatCAMGUI.py:562 flatcamGUI/FlatCAMGUI.py:1611 +msgid "Zoom In" +msgstr "Zoom In" + +#: flatcamGUI/FlatCAMGUI.py:563 flatcamGUI/FlatCAMGUI.py:1612 +msgid "Zoom Out" +msgstr "Zoom Out" + +#: flatcamGUI/FlatCAMGUI.py:564 flatcamGUI/FlatCAMGUI.py:1370 +#: flatcamGUI/FlatCAMGUI.py:1613 +msgid "Zoom Fit" +msgstr "Zoom Fit" + +#: flatcamGUI/FlatCAMGUI.py:569 flatcamGUI/FlatCAMGUI.py:1618 +msgid "&Command Line" +msgstr "&Command Line" + +#: flatcamGUI/FlatCAMGUI.py:572 flatcamGUI/FlatCAMGUI.py:1621 +msgid "2Sided Tool" +msgstr "2Sided Tool" + +#: flatcamGUI/FlatCAMGUI.py:573 flatcamGUI/FlatCAMGUI.py:1622 +msgid "&Cutout Tool" +msgstr "&Cutout Tool" + +#: flatcamGUI/FlatCAMGUI.py:574 flatcamGUI/FlatCAMGUI.py:1623 +#: flatcamGUI/ObjectUI.py:463 flatcamTools/ToolNonCopperClear.py:283 +msgid "NCC Tool" +msgstr "NCC Tool" + +#: flatcamGUI/FlatCAMGUI.py:578 flatcamGUI/FlatCAMGUI.py:1627 +msgid "Panel Tool" +msgstr "Panel Tool" + +#: flatcamGUI/FlatCAMGUI.py:579 flatcamGUI/FlatCAMGUI.py:1628 +#: flatcamTools/ToolFilm.py:204 +msgid "Film Tool" +msgstr "Film Tool" + +#: flatcamGUI/FlatCAMGUI.py:580 flatcamGUI/FlatCAMGUI.py:1630 +msgid "SolderPaste Tool" +msgstr "SolderPaste Tool" + +#: flatcamGUI/FlatCAMGUI.py:583 flatcamGUI/FlatCAMGUI.py:1634 +msgid "Calculators Tool" +msgstr "Calculators Tool" + +#: flatcamGUI/FlatCAMGUI.py:587 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1638 +msgid "Select" +msgstr "Select" + +#: flatcamGUI/FlatCAMGUI.py:588 flatcamGUI/FlatCAMGUI.py:1639 +msgid "Add Drill Hole" +msgstr "Add Drill Hole" + +#: flatcamGUI/FlatCAMGUI.py:591 flatcamGUI/FlatCAMGUI.py:1642 +msgid "Resize Drill" +msgstr "Resize Drill" + +#: flatcamGUI/FlatCAMGUI.py:594 flatcamGUI/FlatCAMGUI.py:1645 +msgid "Copy Drill" +msgstr "Copy Drill" + +#: flatcamGUI/FlatCAMGUI.py:595 flatcamGUI/FlatCAMGUI.py:1647 +msgid "Delete Drill" +msgstr "Delete Drill" + +#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1650 +msgid "Move Drill" +msgstr "Move Drill" + +#: flatcamGUI/FlatCAMGUI.py:602 flatcamGUI/FlatCAMGUI.py:1654 +msgid "Add Circle" +msgstr "Add Circle" + +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1655 +msgid "Add Arc" +msgstr "Add Arc" + +#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1657 +msgid "Add Rectangle" +msgstr "Add Rectangle" + +#: flatcamGUI/FlatCAMGUI.py:608 flatcamGUI/FlatCAMGUI.py:1660 +msgid "Add Path" +msgstr "Add Path" + +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1662 +msgid "Add Polygon" +msgstr "Add Polygon" + +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1664 +msgid "Add Text" +msgstr "Add Text" + +#: flatcamGUI/FlatCAMGUI.py:612 flatcamGUI/FlatCAMGUI.py:1666 +msgid "Add Buffer" +msgstr "Add Buffer" + +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1667 +msgid "Paint Shape" +msgstr "Paint Shape" + +#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1670 +msgid "Polygon Union" +msgstr "Polygon Union" + +#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1672 +msgid "Polygon Intersection" +msgstr "Polygon Intersection" + +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1674 +msgid "Polygon Subtraction" +msgstr "Polygon Subtraction" + +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1677 +msgid "Cut Path" +msgstr "Cut Path" + +#: flatcamGUI/FlatCAMGUI.py:624 +msgid "Copy Shape(s)" +msgstr "Copy Shape(s)" + +#: flatcamGUI/FlatCAMGUI.py:627 +msgid "Delete Shape '-'" +msgstr "Delete Shape '-'" + +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1682 +msgid "Transformations" +msgstr "Transformations" + +#: flatcamGUI/FlatCAMGUI.py:631 +msgid "Move Objects " +msgstr "Move Objects " + +#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1691 +msgid "Snap to grid" +msgstr "Snap to grid" + +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1694 +msgid "Grid X snapping distance" +msgstr "Grid X snapping distance" + +#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1699 +msgid "Grid Y snapping distance" +msgstr "Grid Y snapping distance" + +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1705 +msgid "" +"When active, value on Grid_X\n" +"is copied to the Grid_Y value." +msgstr "" +"When active, value on Grid_X\n" +"is copied to the Grid_Y value." + +#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1711 +msgid "Snap to corner" +msgstr "Snap to corner" + +#: flatcamGUI/FlatCAMGUI.py:661 flatcamGUI/FlatCAMGUI.py:1715 +#: flatcamGUI/FlatCAMGUI.py:2787 +msgid "Max. magnet distance" +msgstr "Max. magnet distance" + +#: flatcamGUI/FlatCAMGUI.py:675 flatcamGUI/FlatCAMGUI.py:1364 +msgid "Project" +msgstr "Project" + +#: flatcamGUI/FlatCAMGUI.py:684 +msgid "Selected" +msgstr "Selected" + +#: flatcamGUI/FlatCAMGUI.py:691 +msgid "Tool" +msgstr "Tool" + +#: flatcamGUI/FlatCAMGUI.py:703 flatcamGUI/FlatCAMGUI.py:711 +msgid "Plot Area" +msgstr "Plot Area" + +#: flatcamGUI/FlatCAMGUI.py:735 +msgid "General" +msgstr "General" + +#: flatcamGUI/FlatCAMGUI.py:744 +msgid "APP. DEFAULTS" +msgstr "APP. DEFAULTS" + +#: flatcamGUI/FlatCAMGUI.py:745 +msgid "PROJ. OPTIONS " +msgstr "PROJ. OPTIONS " + +#: flatcamGUI/FlatCAMGUI.py:756 +msgid "GERBER" +msgstr "GERBER" + +#: flatcamGUI/FlatCAMGUI.py:765 +msgid "EXCELLON" +msgstr "EXCELLON" + +#: flatcamGUI/FlatCAMGUI.py:774 +msgid "GEOMETRY" +msgstr "GEOMETRY" + +#: flatcamGUI/FlatCAMGUI.py:784 +msgid "CNC-JOB" +msgstr "CNC-JOB" + +#: flatcamGUI/FlatCAMGUI.py:793 +msgid "TOOLS" +msgstr "TOOLS" + +#: flatcamGUI/FlatCAMGUI.py:810 +msgid "Import Preferences" +msgstr "Import Preferences" + +#: flatcamGUI/FlatCAMGUI.py:813 +msgid "" +"Import a full set of FlatCAM settings from a file\n" +"previously saved on HDD.\n" +"\n" +"FlatCAM automatically save a 'factory_defaults' file\n" +"on the first start. Do not delete that file." +msgstr "" +"Import a full set of FlatCAM settings from a file\n" +"previously saved on HDD.\n" +"\n" +"FlatCAM automatically save a 'factory_defaults' file\n" +"on the first start. Do not delete that file." + +#: flatcamGUI/FlatCAMGUI.py:820 +msgid "Export Preferences" +msgstr "Export Preferences" + +#: flatcamGUI/FlatCAMGUI.py:823 +msgid "" +"Export a full set of FlatCAM settings in a file\n" +"that is saved on HDD." +msgstr "" +"Export a full set of FlatCAM settings in a file\n" +"that is saved on HDD." + +#: flatcamGUI/FlatCAMGUI.py:828 +msgid "Open Pref Folder" +msgstr "Open Pref Folder" + +#: flatcamGUI/FlatCAMGUI.py:831 +msgid "Open the folder where FlatCAM save the preferences files." +msgstr "Open the folder where FlatCAM save the preferences files." + +#: flatcamGUI/FlatCAMGUI.py:839 +msgid "Save Preferences" +msgstr "Save Preferences" + +#: flatcamGUI/FlatCAMGUI.py:842 +msgid "" +"Save the current settings in the 'current_defaults' file\n" +"which is the file storing the working default preferences." +msgstr "" +"Save the current settings in the 'current_defaults' file\n" +"which is the file storing the working default preferences." + +#: flatcamGUI/FlatCAMGUI.py:868 +msgid "" +"General Shortcut list
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
F3\n" +"  SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab " +"or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left " +"Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" +" \n" +" " +msgstr "" +"General Shortcut list
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
F3\n" +"  SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab " +"or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left " +"Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" +" \n" +" " + +#: flatcamGUI/FlatCAMGUI.py:1145 +msgid "" +"Editor Shortcut list
\n" +"
\n" +" GEOMETRY EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
\n" +"
\n" +"
\n" +" EXCELLON EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
\n" +" " +msgstr "" +"Editor Shortcut list
\n" +"
\n" +" GEOMETRY EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
\n" +"
\n" +"
\n" +" EXCELLON EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
\n" +" " + +#: flatcamGUI/FlatCAMGUI.py:1358 +msgid "Disable" +msgstr "Disable" + +#: flatcamGUI/FlatCAMGUI.py:1360 +msgid "New" +msgstr "New" + +#: flatcamGUI/FlatCAMGUI.py:1361 +msgid "Geometry" +msgstr "Geometry" + +#: flatcamGUI/FlatCAMGUI.py:1362 +msgid "Excellon" +msgstr "Excellon" + +#: flatcamGUI/FlatCAMGUI.py:1367 +msgid "Grids" +msgstr "Grids" + +#: flatcamGUI/FlatCAMGUI.py:1369 +msgid "View" +msgstr "View" + +#: flatcamGUI/FlatCAMGUI.py:1371 +msgid "Clear Plot" +msgstr "Clear Plot" + +#: flatcamGUI/FlatCAMGUI.py:1372 +msgid "Replot" +msgstr "Replot" + +#: flatcamGUI/FlatCAMGUI.py:1375 +msgid "Geo Editor" +msgstr "Geo Editor" + +#: flatcamGUI/FlatCAMGUI.py:1376 +msgid "Line" +msgstr "Line" + +#: flatcamGUI/FlatCAMGUI.py:1377 +msgid "Rectangle" +msgstr "Rectangle" + +#: flatcamGUI/FlatCAMGUI.py:1378 flatcamGUI/FlatCAMGUI.py:4590 +#: flatcamGUI/ObjectUI.py:1431 +msgid "Cut" +msgstr "Cut" + +#: flatcamGUI/FlatCAMGUI.py:1380 flatcamGUI/FlatCAMGUI.py:1395 +#: flatcamTools/ToolMove.py:26 +msgid "Move" +msgstr "Move" + +#: flatcamGUI/FlatCAMGUI.py:1382 +msgid "Exc Editor" +msgstr "Exc Editor" + +#: flatcamGUI/FlatCAMGUI.py:1383 +msgid "Add Drill" +msgstr "Add Drill" + +#: flatcamGUI/FlatCAMGUI.py:1385 +msgid "Copy Drill(s)" +msgstr "Copy Drill(s)" + +#: flatcamGUI/FlatCAMGUI.py:1391 +msgid "Save && Close Edit" +msgstr "Save && Close Edit" + +#: flatcamGUI/FlatCAMGUI.py:1416 +msgid "Print Preview" +msgstr "Print Preview" + +#: flatcamGUI/FlatCAMGUI.py:1417 +msgid "Print Code" +msgstr "Print Code" + +#: flatcamGUI/FlatCAMGUI.py:1418 +msgid "Find in Code" +msgstr "Find in Code" + +#: flatcamGUI/FlatCAMGUI.py:1423 +msgid "Replace With" +msgstr "Replace With" + +#: flatcamGUI/FlatCAMGUI.py:1427 flatcamGUI/FlatCAMGUI.py:4588 +#: flatcamGUI/FlatCAMGUI.py:5089 flatcamGUI/ObjectUI.py:1429 +msgid "All" +msgstr "All" + +#: flatcamGUI/FlatCAMGUI.py:1429 +msgid "" +"When checked it will replace all instances in the 'Find' box\n" +"with the text in the 'Replace' box.." +msgstr "" +"When checked it will replace all instances in the 'Find' box\n" +"with the text in the 'Replace' box.." + +#: flatcamGUI/FlatCAMGUI.py:1432 +msgid "Open Code" +msgstr "Open Code" + +#: flatcamGUI/FlatCAMGUI.py:1433 +msgid "Save Code" +msgstr "Save Code" + +#: flatcamGUI/FlatCAMGUI.py:1468 +msgid "" +"Relative neasurement.\n" +"Reference is last click position" +msgstr "" +"Relative neasurement.\n" +"Reference is last click position" + +#: flatcamGUI/FlatCAMGUI.py:1474 +msgid "" +"Absolute neasurement.\n" +"Reference is (X=0, Y= 0) position" +msgstr "" +"Absolute neasurement.\n" +"Reference is (X=0, Y= 0) position" + +#: flatcamGUI/FlatCAMGUI.py:1641 +msgid "Add Drill Hole Array" +msgstr "Add Drill Hole Array" + +#: flatcamGUI/FlatCAMGUI.py:1653 +msgid "Select 'Esc'" +msgstr "Select 'Esc'" + +#: flatcamGUI/FlatCAMGUI.py:1678 +msgid "Copy Objects" +msgstr "Copy Objects" + +#: flatcamGUI/FlatCAMGUI.py:1680 +msgid "Delete Shape" +msgstr "Delete Shape" + +#: flatcamGUI/FlatCAMGUI.py:1685 +msgid "Move Objects" +msgstr "Move Objects" + +#: flatcamGUI/FlatCAMGUI.py:2060 +msgid "" +"Please first select a geometry item to be cutted\n" +"then select the geometry item that will be cutted\n" +"out of the first item. In the end press ~X~ key or\n" +"the toolbar button." +msgstr "" +"Please first select a geometry item to be cutted\n" +"then select the geometry item that will be cutted\n" +"out of the first item. In the end press ~X~ key or\n" +"the toolbar button." + +#: flatcamGUI/FlatCAMGUI.py:2067 flatcamGUI/FlatCAMGUI.py:2199 +#: flatcamGUI/FlatCAMGUI.py:2258 flatcamGUI/FlatCAMGUI.py:2278 +msgid "Warning" +msgstr "Warning" + +#: flatcamGUI/FlatCAMGUI.py:2134 flatcamGUI/FlatCAMGUI.py:2328 +msgid "[WARNING_NOTCL]Cancelled." +msgstr "[WARNING_NOTCL]Cancelled." + +#: flatcamGUI/FlatCAMGUI.py:2194 +msgid "" +"Please select geometry items \n" +"on which to perform Intersection Tool." +msgstr "" +"Please select geometry items \n" +"on which to perform Intersection Tool." + +#: flatcamGUI/FlatCAMGUI.py:2253 +msgid "" +"Please select geometry items \n" +"on which to perform Substraction Tool." +msgstr "" +"Please select geometry items \n" +"on which to perform Substraction Tool." + +#: flatcamGUI/FlatCAMGUI.py:2273 +msgid "" +"Please select geometry items \n" +"on which to perform union." +msgstr "" +"Please select geometry items \n" +"on which to perform union." + +#: flatcamGUI/FlatCAMGUI.py:2345 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to delete." +msgstr "[WARNING_NOTCL]Cancelled. Nothing selected to delete." + +#: flatcamGUI/FlatCAMGUI.py:2412 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to copy." +msgstr "[WARNING_NOTCL]Cancelled. Nothing selected to copy." + +#: flatcamGUI/FlatCAMGUI.py:2458 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to move." +msgstr "[WARNING_NOTCL]Cancelled. Nothing selected to move." + +#: flatcamGUI/FlatCAMGUI.py:2472 +msgid "New Tool ..." +msgstr "New Tool ..." + +#: flatcamGUI/FlatCAMGUI.py:2473 +msgid "Enter a Tool Diameter:" +msgstr "Enter a Tool Diameter:" + +#: flatcamGUI/FlatCAMGUI.py:2772 +msgid "Grid X value:" +msgstr "Grid X value:" + +#: flatcamGUI/FlatCAMGUI.py:2774 +msgid "This is the Grid snap value on X axis." +msgstr "This is the Grid snap value on X axis." + +#: flatcamGUI/FlatCAMGUI.py:2779 +msgid "Grid Y value:" +msgstr "Grid Y value:" + +#: flatcamGUI/FlatCAMGUI.py:2781 +msgid "This is the Grid snap value on Y axis." +msgstr "This is the Grid snap value on Y axis." + +#: flatcamGUI/FlatCAMGUI.py:2786 +msgid "Snap Max:" +msgstr "Snap Max:" + +#: flatcamGUI/FlatCAMGUI.py:2791 +msgid "Workspace:" +msgstr "Workspace:" + +#: flatcamGUI/FlatCAMGUI.py:2793 +msgid "" +"Draw a delimiting rectangle on canvas.\n" +"The purpose is to illustrate the limits for our work." +msgstr "" +"Draw a delimiting rectangle on canvas.\n" +"The purpose is to illustrate the limits for our work." + +#: flatcamGUI/FlatCAMGUI.py:2796 +msgid "Wk. format:" +msgstr "Wk. format:" + +#: flatcamGUI/FlatCAMGUI.py:2798 +msgid "" +"Select the type of rectangle to be used on canvas,\n" +"as valid workspace." +msgstr "" +"Select the type of rectangle to be used on canvas,\n" +"as valid workspace." + +#: flatcamGUI/FlatCAMGUI.py:2811 +msgid "Plot Fill:" +msgstr "Plot Fill:" + +#: flatcamGUI/FlatCAMGUI.py:2813 +msgid "" +"Set the fill color for plotted objects.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Set the fill color for plotted objects.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." + +#: flatcamGUI/FlatCAMGUI.py:2827 flatcamGUI/FlatCAMGUI.py:2877 +#: flatcamGUI/FlatCAMGUI.py:2927 +msgid "Alpha Level:" +msgstr "Alpha Level:" + +#: flatcamGUI/FlatCAMGUI.py:2829 +msgid "Set the fill transparency for plotted objects." +msgstr "Set the fill transparency for plotted objects." + +#: flatcamGUI/FlatCAMGUI.py:2846 +msgid "Plot Line:" +msgstr "Plot Line:" + +#: flatcamGUI/FlatCAMGUI.py:2848 +msgid "Set the line color for plotted objects." +msgstr "Set the line color for plotted objects." + +#: flatcamGUI/FlatCAMGUI.py:2860 +msgid "Sel. Fill:" +msgstr "Sel. Fill:" + +#: flatcamGUI/FlatCAMGUI.py:2862 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from left to right.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Set the fill color for the selection box\n" +"in case that the selection is done from left to right.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." + +#: flatcamGUI/FlatCAMGUI.py:2879 +msgid "Set the fill transparency for the 'left to right' selection box." +msgstr "Set the fill transparency for the 'left to right' selection box." + +#: flatcamGUI/FlatCAMGUI.py:2896 +msgid "Sel. Line:" +msgstr "Sel. Line:" + +#: flatcamGUI/FlatCAMGUI.py:2898 +msgid "Set the line color for the 'left to right' selection box." +msgstr "Set the line color for the 'left to right' selection box." + +#: flatcamGUI/FlatCAMGUI.py:2910 +msgid "Sel2. Fill:" +msgstr "Sel2. Fill:" + +#: flatcamGUI/FlatCAMGUI.py:2912 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from right to left.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Set the fill color for the selection box\n" +"in case that the selection is done from right to left.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." + +#: flatcamGUI/FlatCAMGUI.py:2929 +msgid "Set the fill transparency for selection 'right to left' box." +msgstr "Set the fill transparency for selection 'right to left' box." + +#: flatcamGUI/FlatCAMGUI.py:2946 +msgid "Sel2. Line:" +msgstr "Sel2. Line:" + +#: flatcamGUI/FlatCAMGUI.py:2948 +msgid "Set the line color for the 'right to left' selection box." +msgstr "Set the line color for the 'right to left' selection box." + +#: flatcamGUI/FlatCAMGUI.py:2960 +msgid "Editor Draw:" +msgstr "Editor Draw:" + +#: flatcamGUI/FlatCAMGUI.py:2962 +msgid "Set the color for the shape." +msgstr "Set the color for the shape." + +#: flatcamGUI/FlatCAMGUI.py:2974 +msgid "Editor Draw Sel.:" +msgstr "Editor Draw Sel.:" + +#: flatcamGUI/FlatCAMGUI.py:2976 +msgid "Set the color of the shape when selected." +msgstr "Set the color of the shape when selected." + +#: flatcamGUI/FlatCAMGUI.py:3023 +msgid "GUI Settings" +msgstr "GUI Settings" + +#: flatcamGUI/FlatCAMGUI.py:3030 +msgid "Layout:" +msgstr "Layout:" + +#: flatcamGUI/FlatCAMGUI.py:3032 +msgid "" +"Select an layout for FlatCAM.\n" +"It is applied immediately." +msgstr "" +"Select an layout for FlatCAM.\n" +"It is applied immediately." + +#: flatcamGUI/FlatCAMGUI.py:3048 +msgid "Style:" +msgstr "Style:" + +#: flatcamGUI/FlatCAMGUI.py:3050 +msgid "" +"Select an style for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" +"Select an style for FlatCAM.\n" +"It will be applied at the next app start." + +#: flatcamGUI/FlatCAMGUI.py:3061 +msgid "HDPI Support:" +msgstr "HDPI Support:" + +#: flatcamGUI/FlatCAMGUI.py:3063 +msgid "" +"Enable High DPI support for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" +"Enable High DPI support for FlatCAM.\n" +"It will be applied at the next app start." + +#: flatcamGUI/FlatCAMGUI.py:3076 +msgid "Clear GUI Settings:" +msgstr "Clear GUI Settings:" + +#: flatcamGUI/FlatCAMGUI.py:3078 +msgid "" +"Clear the GUI settings for FlatCAM,\n" +"such as: layout, gui state, style, hdpi support etc." +msgstr "" +"Clear the GUI settings for FlatCAM,\n" +"such as: layout, gui state, style, hdpi support etc." + +#: flatcamGUI/FlatCAMGUI.py:3081 +msgid "Clear" +msgstr "Clear" + +#: flatcamGUI/FlatCAMGUI.py:3085 +msgid "Hover Shape:" +msgstr "Hover Shape:" + +#: flatcamGUI/FlatCAMGUI.py:3087 +msgid "" +"Enable display of a hover shape for FlatCAM objects.\n" +"It is displayed whenever the mouse cursor is hovering\n" +"over any kind of not-selected object." +msgstr "" +"Enable display of a hover shape for FlatCAM objects.\n" +"It is displayed whenever the mouse cursor is hovering\n" +"over any kind of not-selected object." + +#: flatcamGUI/FlatCAMGUI.py:3128 +msgid "Are you sure you want to delete the GUI Settings? \n" +msgstr "Are you sure you want to delete the GUI Settings? \n" + +#: flatcamGUI/FlatCAMGUI.py:3131 +msgid "Clear GUI Settings" +msgstr "Clear GUI Settings" + +#: flatcamGUI/FlatCAMGUI.py:3144 +msgid "[success] GUI settings deleted ..." +msgstr "[success] GUI settings deleted ..." + +#: flatcamGUI/FlatCAMGUI.py:3151 +msgid "App Preferences" +msgstr "App Preferences" + +#: flatcamGUI/FlatCAMGUI.py:3157 +msgid "Units:" +msgstr "Units:" + +#: flatcamGUI/FlatCAMGUI.py:3158 +msgid "" +"The default value for FlatCAM units.\n" +"Whatever is selected here is set every time\n" +"FLatCAM is started." +msgstr "" +"The default value for FlatCAM units.\n" +"Whatever is selected here is set every time\n" +"FLatCAM is started." + +#: flatcamGUI/FlatCAMGUI.py:3165 +msgid "APP. LEVEL:" +msgstr "APP. LEVEL:" + +#: flatcamGUI/FlatCAMGUI.py:3166 +msgid "" +"Choose the default level of usage for FlatCAM.\n" +"BASIC level -> reduced functionality, best for beginner's.\n" +"ADVANCED level -> full functionality.\n" +"\n" +"The choice here will influence the parameters in\n" +"the Selected Tab for all kinds of FlatCAM objects." +msgstr "" +"Choose the default level of usage for FlatCAM.\n" +"BASIC level -> reduced functionality, best for beginner's.\n" +"ADVANCED level -> full functionality.\n" +"\n" +"The choice here will influence the parameters in\n" +"the Selected Tab for all kinds of FlatCAM objects." + +#: flatcamGUI/FlatCAMGUI.py:3171 flatcamGUI/FlatCAMGUI.py:3775 +msgid "Basic" +msgstr "Basic" + +#: flatcamGUI/FlatCAMGUI.py:3172 +msgid "Advanced" +msgstr "Advanced" + +#: flatcamGUI/FlatCAMGUI.py:3175 +msgid "Languages:" +msgstr "Languages:" + +#: flatcamGUI/FlatCAMGUI.py:3176 +msgid "Set the language used throughout FlatCAM." +msgstr "Set the language used throughout FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:3179 +msgid "Apply Language" +msgstr "Apply Language" + +#: flatcamGUI/FlatCAMGUI.py:3182 +msgid "Shell at StartUp:" +msgstr "Shell at StartUp:" + +#: flatcamGUI/FlatCAMGUI.py:3184 flatcamGUI/FlatCAMGUI.py:3189 +msgid "" +"Check this box if you want the shell to\n" +"start automatically at startup." +msgstr "" +"Check this box if you want the shell to\n" +"start automatically at startup." + +#: flatcamGUI/FlatCAMGUI.py:3194 +msgid "Version Check:" +msgstr "Version Check:" + +#: flatcamGUI/FlatCAMGUI.py:3196 flatcamGUI/FlatCAMGUI.py:3201 +msgid "" +"Check this box if you want to check\n" +"for a new version automatically at startup." +msgstr "" +"Check this box if you want to check\n" +"for a new version automatically at startup." + +#: flatcamGUI/FlatCAMGUI.py:3206 +msgid "Send Stats:" +msgstr "Send Stats:" + +#: flatcamGUI/FlatCAMGUI.py:3208 flatcamGUI/FlatCAMGUI.py:3213 +msgid "" +"Check this box if you agree to send anonymous\n" +"stats automatically at startup, to help improve FlatCAM." +msgstr "" +"Check this box if you agree to send anonymous\n" +"stats automatically at startup, to help improve FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:3220 +msgid "Pan Button:" +msgstr "Pan Button:" + +#: flatcamGUI/FlatCAMGUI.py:3221 +msgid "" +"Select the mouse button to use for panning:\n" +"- MMB --> Middle Mouse Button\n" +"- RMB --> Right Mouse Button" +msgstr "" +"Select the mouse button to use for panning:\n" +"- MMB --> Middle Mouse Button\n" +"- RMB --> Right Mouse Button" + +#: flatcamGUI/FlatCAMGUI.py:3224 +msgid "MMB" +msgstr "MMB" + +#: flatcamGUI/FlatCAMGUI.py:3225 +msgid "RMB" +msgstr "RMB" + +#: flatcamGUI/FlatCAMGUI.py:3228 +msgid "Multiple Sel:" +msgstr "Multiple Sel:" + +#: flatcamGUI/FlatCAMGUI.py:3229 +msgid "Select the key used for multiple selection." +msgstr "Select the key used for multiple selection." + +#: flatcamGUI/FlatCAMGUI.py:3230 +msgid "CTRL" +msgstr "CTRL" + +#: flatcamGUI/FlatCAMGUI.py:3231 +msgid "SHIFT" +msgstr "SHIFT" + +#: flatcamGUI/FlatCAMGUI.py:3234 +msgid "Project at StartUp:" +msgstr "Project at StartUp:" + +#: flatcamGUI/FlatCAMGUI.py:3236 flatcamGUI/FlatCAMGUI.py:3241 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"to be shown automatically at startup." +msgstr "" +"Check this box if you want the project/selected/tool tab area to\n" +"to be shown automatically at startup." + +#: flatcamGUI/FlatCAMGUI.py:3246 +msgid "Project AutoHide:" +msgstr "Project AutoHide:" + +#: flatcamGUI/FlatCAMGUI.py:3248 flatcamGUI/FlatCAMGUI.py:3254 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"hide automatically when there are no objects loaded and\n" +"to show whenever a new object is created." +msgstr "" +"Check this box if you want the project/selected/tool tab area to\n" +"hide automatically when there are no objects loaded and\n" +"to show whenever a new object is created." + +#: flatcamGUI/FlatCAMGUI.py:3260 +msgid "Enable ToolTips:" +msgstr "Enable ToolTips:" + +#: flatcamGUI/FlatCAMGUI.py:3262 flatcamGUI/FlatCAMGUI.py:3267 +msgid "" +"Check this box if you want to have toolTips displayed\n" +"when hovering with mouse over items throughout the App." +msgstr "" +"Check this box if you want to have toolTips displayed\n" +"when hovering with mouse over items throughout the App." + +#: flatcamGUI/FlatCAMGUI.py:3301 +msgid "Save Compressed Project" +msgstr "Save Compressed Project" + +#: flatcamGUI/FlatCAMGUI.py:3303 +msgid "" +"Whether to save a compressed or uncompressed project.\n" +"When checked it will save a compressed FlatCAM project." +msgstr "" +"Whether to save a compressed or uncompressed project.\n" +"When checked it will save a compressed FlatCAM project." + +#: flatcamGUI/FlatCAMGUI.py:3314 +msgid "Compression Level:" +msgstr "Compression Level:" + +#: flatcamGUI/FlatCAMGUI.py:3316 +msgid "" +"The level of compression used when saving\n" +"a FlatCAM project. Higher value means better compression\n" +"but require more RAM usage and more processing time." +msgstr "" +"The level of compression used when saving\n" +"a FlatCAM project. Higher value means better compression\n" +"but require more RAM usage and more processing time." + +#: flatcamGUI/FlatCAMGUI.py:3342 flatcamGUI/FlatCAMGUI.py:3583 +#: flatcamGUI/FlatCAMGUI.py:4238 flatcamGUI/FlatCAMGUI.py:4562 +#: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:576 +#: flatcamGUI/ObjectUI.py:901 flatcamGUI/ObjectUI.py:1415 +msgid "Plot Options:" +msgstr "Plot Options:" + +#: flatcamGUI/FlatCAMGUI.py:3349 flatcamGUI/FlatCAMGUI.py:3595 +#: flatcamGUI/ObjectUI.py:577 +msgid "Solid" +msgstr "Solid" + +#: flatcamGUI/FlatCAMGUI.py:3351 flatcamGUI/ObjectUI.py:158 +msgid "Solid color polygons." +msgstr "Solid color polygons." + +#: flatcamGUI/FlatCAMGUI.py:3356 +msgid "M-Color" +msgstr "M-Color" + +#: flatcamGUI/FlatCAMGUI.py:3358 flatcamGUI/ObjectUI.py:166 +msgid "Draw polygons in different colors." +msgstr "Draw polygons in different colors." + +#: flatcamGUI/FlatCAMGUI.py:3363 flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:4242 flatcamGUI/ObjectUI.py:172 +msgid "Plot" +msgstr "Plot" + +#: flatcamGUI/FlatCAMGUI.py:3365 flatcamGUI/FlatCAMGUI.py:4244 +#: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:617 +#: flatcamGUI/ObjectUI.py:947 flatcamGUI/ObjectUI.py:1502 +msgid "Plot (show) this object." +msgstr "Plot (show) this object." + +#: flatcamGUI/FlatCAMGUI.py:3370 flatcamGUI/FlatCAMGUI.py:4251 +#: flatcamGUI/FlatCAMGUI.py:4598 +msgid "Circle Steps:" +msgstr "Circle Steps:" + +#: flatcamGUI/FlatCAMGUI.py:3372 +msgid "" +"The number of circle steps for Gerber \n" +"circular aperture linear approximation." +msgstr "" +"The number of circle steps for Gerber \n" +"circular aperture linear approximation." + +#: flatcamGUI/FlatCAMGUI.py:3387 +msgid "Gerber Options" +msgstr "Gerber Options" + +#: flatcamGUI/FlatCAMGUI.py:3391 flatcamGUI/ObjectUI.py:322 +msgid "Isolation Routing:" +msgstr "Isolation Routing:" + +#: flatcamGUI/FlatCAMGUI.py:3393 flatcamGUI/ObjectUI.py:324 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut outside polygons." +msgstr "" +"Create a Geometry object with\n" +"toolpaths to cut outside polygons." + +#: flatcamGUI/FlatCAMGUI.py:3404 flatcamGUI/FlatCAMGUI.py:3961 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:856 +#: flatcamGUI/ObjectUI.py:872 +msgid "Diameter of the cutting tool." +msgstr "Diameter of the cutting tool." + +#: flatcamGUI/FlatCAMGUI.py:3411 +msgid "Width (# passes):" +msgstr "Width (# passes):" + +#: flatcamGUI/FlatCAMGUI.py:3413 flatcamGUI/ObjectUI.py:346 +msgid "" +"Width of the isolation gap in\n" +"number (integer) of tool widths." +msgstr "" +"Width of the isolation gap in\n" +"number (integer) of tool widths." + +#: flatcamGUI/FlatCAMGUI.py:3421 flatcamGUI/ObjectUI.py:354 +msgid "Pass overlap:" +msgstr "Pass overlap:" + +#: flatcamGUI/FlatCAMGUI.py:3423 flatcamGUI/ObjectUI.py:356 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means an overlap of 25%% from the tool diameter found " +"above." +msgstr "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means an overlap of 25%% from the tool diameter found " +"above." + +#: flatcamGUI/FlatCAMGUI.py:3431 flatcamGUI/ObjectUI.py:366 +msgid "Milling Type:" +msgstr "Milling Type:" + +#: flatcamGUI/FlatCAMGUI.py:3433 flatcamGUI/ObjectUI.py:368 +msgid "" +"Milling type:\n" +"- climb / best for precision milling and to reduce tool usage\n" +"- conventional / useful when there is no backlash compensation" +msgstr "" +"Milling type:\n" +"- climb / best for precision milling and to reduce tool usage\n" +"- conventional / useful when there is no backlash compensation" + +#: flatcamGUI/FlatCAMGUI.py:3438 flatcamGUI/ObjectUI.py:373 +msgid "Climb" +msgstr "Climb" + +#: flatcamGUI/FlatCAMGUI.py:3439 flatcamGUI/ObjectUI.py:374 +msgid "Conv." +msgstr "Conv." + +#: flatcamGUI/FlatCAMGUI.py:3443 +msgid "Combine Passes" +msgstr "Combine Passes" + +#: flatcamGUI/FlatCAMGUI.py:3445 flatcamGUI/ObjectUI.py:380 +msgid "Combine all passes into one object" +msgstr "Combine all passes into one object" + +#: flatcamGUI/FlatCAMGUI.py:3450 +msgid "Clear non-copper:" +msgstr "Clear non-copper:" + +#: flatcamGUI/FlatCAMGUI.py:3452 flatcamGUI/FlatCAMGUI.py:4774 +#: flatcamGUI/ObjectUI.py:457 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut all non-copper regions." +msgstr "" +"Create a Geometry object with\n" +"toolpaths to cut all non-copper regions." + +#: flatcamGUI/FlatCAMGUI.py:3461 flatcamGUI/FlatCAMGUI.py:3487 +#: flatcamGUI/ObjectUI.py:501 flatcamGUI/ObjectUI.py:535 +msgid "Boundary Margin:" +msgstr "Boundary Margin:" + +#: flatcamGUI/FlatCAMGUI.py:3463 flatcamGUI/ObjectUI.py:503 +msgid "" +"Specify the edge of the PCB\n" +"by drawing a box around all\n" +"objects with this minimum\n" +"distance." +msgstr "" +"Specify the edge of the PCB\n" +"by drawing a box around all\n" +"objects with this minimum\n" +"distance." + +#: flatcamGUI/FlatCAMGUI.py:3473 flatcamGUI/FlatCAMGUI.py:3496 +msgid "Rounded corners" +msgstr "Rounded corners" + +#: flatcamGUI/FlatCAMGUI.py:3475 +msgid "" +"Creates a Geometry objects with polygons\n" +"covering the copper-free areas of the PCB." +msgstr "" +"Creates a Geometry objects with polygons\n" +"covering the copper-free areas of the PCB." + +#: flatcamGUI/FlatCAMGUI.py:3481 flatcamGUI/ObjectUI.py:525 +msgid "Bounding Box:" +msgstr "Bounding Box:" + +#: flatcamGUI/FlatCAMGUI.py:3489 flatcamGUI/ObjectUI.py:537 +msgid "" +"Distance of the edges of the box\n" +"to the nearest polygon." +msgstr "" +"Distance of the edges of the box\n" +"to the nearest polygon." + +#: flatcamGUI/FlatCAMGUI.py:3498 flatcamGUI/ObjectUI.py:547 +msgid "" +"If the bounding box is \n" +"to have rounded corners\n" +"their radius is equal to\n" +"the margin." +msgstr "" +"If the bounding box is \n" +"to have rounded corners\n" +"their radius is equal to\n" +"the margin." + +#: flatcamGUI/FlatCAMGUI.py:3512 +msgid "Gerber Adv. Options" +msgstr "Gerber Adv. Options" + +#: flatcamGUI/FlatCAMGUI.py:3516 +msgid "Advanced Param.:" +msgstr "Advanced Param.:" + +#: flatcamGUI/FlatCAMGUI.py:3518 +msgid "" +"A list of Gerber advanced parameters.\n" +"Those parameters are available only for\n" +"Advanced App. Level." +msgstr "" +"A list of Gerber advanced parameters.\n" +"Those parameters are available only for\n" +"Advanced App. Level." + +#: flatcamGUI/FlatCAMGUI.py:3528 flatcamGUI/ObjectUI.py:385 +msgid "\"Follow\"" +msgstr "\"Follow\"" + +#: flatcamGUI/FlatCAMGUI.py:3530 flatcamGUI/ObjectUI.py:387 +msgid "" +"Generate a 'Follow' geometry.\n" +"This means that it will cut through\n" +"the middle of the trace." +msgstr "" +"Generate a 'Follow' geometry.\n" +"This means that it will cut through\n" +"the middle of the trace." + +#: flatcamGUI/FlatCAMGUI.py:3538 +msgid "Table Show/Hide" +msgstr "Table Show/Hide" + +#: flatcamGUI/FlatCAMGUI.py:3540 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"Also, on hide, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"Toggle the display of the Gerber Apertures Table.\n" +"Also, on hide, it will delete all mark shapes\n" +"that are drawn on canvas." + +#: flatcamGUI/FlatCAMGUI.py:3548 +msgid "Ap. Scale Factor:" +msgstr "Ap. Scale Factor:" + +#: flatcamGUI/FlatCAMGUI.py:3550 flatcamGUI/ObjectUI.py:254 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" +"Change the size of the selected apertures.\n" +"Factor by which to multiply\n" +"geometric features of this object." + +#: flatcamGUI/FlatCAMGUI.py:3560 +msgid "Ap. Buffer Factor:" +msgstr "Ap. Buffer Factor:" + +#: flatcamGUI/FlatCAMGUI.py:3562 flatcamGUI/ObjectUI.py:275 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to expand/shrink\n" +"geometric features of this object." +msgstr "" +"Change the size of the selected apertures.\n" +"Factor by which to expand/shrink\n" +"geometric features of this object." + +#: flatcamGUI/FlatCAMGUI.py:3580 +msgid "Excellon General" +msgstr "Excellon General" + +#: flatcamGUI/FlatCAMGUI.py:3602 +msgid "Excellon Format:" +msgstr "Excellon Format:" + +#: flatcamGUI/FlatCAMGUI.py:3604 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period.\n" +"\n" +"Possible presets:\n" +"\n" +"PROTEUS 3:3 MM LZ\n" +"DipTrace 5:2 MM TZ\n" +"DipTrace 4:3 MM LZ\n" +"\n" +"EAGLE 3:3 MM TZ\n" +"EAGLE 4:3 MM TZ\n" +"EAGLE 2:5 INCH TZ\n" +"EAGLE 3:5 INCH TZ\n" +"\n" +"ALTIUM 2:4 INCH LZ\n" +"Sprint Layout 2:4 INCH LZ\n" +"KiCAD 3:5 INCH TZ" +msgstr "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period.\n" +"\n" +"Possible presets:\n" +"\n" +"PROTEUS 3:3 MM LZ\n" +"DipTrace 5:2 MM TZ\n" +"DipTrace 4:3 MM LZ\n" +"\n" +"EAGLE 3:3 MM TZ\n" +"EAGLE 4:3 MM TZ\n" +"EAGLE 2:5 INCH TZ\n" +"EAGLE 3:5 INCH TZ\n" +"\n" +"ALTIUM 2:4 INCH LZ\n" +"Sprint Layout 2:4 INCH LZ\n" +"KiCAD 3:5 INCH TZ" + +#: flatcamGUI/FlatCAMGUI.py:3629 +msgid "INCH:" +msgstr "INCH:" + +#: flatcamGUI/FlatCAMGUI.py:3632 +msgid "Default values for INCH are 2:4" +msgstr "Default values for INCH are 2:4" + +#: flatcamGUI/FlatCAMGUI.py:3640 flatcamGUI/FlatCAMGUI.py:3673 +#: flatcamGUI/FlatCAMGUI.py:4150 +msgid "" +"This numbers signify the number of digits in\n" +"the whole part of Excellon coordinates." +msgstr "" +"This numbers signify the number of digits in\n" +"the whole part of Excellon coordinates." + +#: flatcamGUI/FlatCAMGUI.py:3654 flatcamGUI/FlatCAMGUI.py:3687 +#: flatcamGUI/FlatCAMGUI.py:4164 +msgid "" +"This numbers signify the number of digits in\n" +"the decimal part of Excellon coordinates." +msgstr "" +"This numbers signify the number of digits in\n" +"the decimal part of Excellon coordinates." + +#: flatcamGUI/FlatCAMGUI.py:3662 +msgid "METRIC:" +msgstr "METRIC:" + +#: flatcamGUI/FlatCAMGUI.py:3665 +msgid "Default values for METRIC are 3:3" +msgstr "Default values for METRIC are 3:3" + +#: flatcamGUI/FlatCAMGUI.py:3696 +msgid "Default Zeros:" +msgstr "Default Zeros:" + +#: flatcamGUI/FlatCAMGUI.py:3699 flatcamGUI/FlatCAMGUI.py:4199 +msgid "" +"This sets the type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"This sets the type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." + +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:4206 +msgid "LZ" +msgstr "LZ" + +#: flatcamGUI/FlatCAMGUI.py:3708 flatcamGUI/FlatCAMGUI.py:4207 +msgid "TZ" +msgstr "TZ" + +#: flatcamGUI/FlatCAMGUI.py:3710 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"This sets the default type of Excellon zeros.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." + +#: flatcamGUI/FlatCAMGUI.py:3724 +msgid "Default Units:" +msgstr "Default Units:" + +#: flatcamGUI/FlatCAMGUI.py:3727 +msgid "" +"This sets the default units of Excellon files.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" +"This sets the default units of Excellon files.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.Some Excellon files don't have an header\n" +"therefore this parameter will be used." + +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:4126 +msgid "INCH" +msgstr "INCH" + +#: flatcamGUI/FlatCAMGUI.py:3736 flatcamGUI/FlatCAMGUI.py:4127 +msgid "MM" +msgstr "MM" + +#: flatcamGUI/FlatCAMGUI.py:3738 +msgid "" +"This sets the units of Excellon files.\n" +"Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" +"This sets the units of Excellon files.\n" +"Some Excellon files don't have an header\n" +"therefore this parameter will be used." + +#: flatcamGUI/FlatCAMGUI.py:3754 +msgid "Excellon Optimization:" +msgstr "Excellon Optimization:" + +#: flatcamGUI/FlatCAMGUI.py:3761 +msgid "Algorithm: " +msgstr "Algorithm: " + +#: flatcamGUI/FlatCAMGUI.py:3764 flatcamGUI/FlatCAMGUI.py:3777 +msgid "" +"This sets the optimization type for the Excellon drill path.\n" +"If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" +"Guided Local Path is used. Default search time is 3sec.\n" +"Use set_sys excellon_search_time value Tcl Command to set other values.\n" +"If Basic is checked then Google OR-Tools Basic algorithm is used.\n" +"\n" +"If DISABLED, then FlatCAM works in 32bit mode and it uses \n" +"Travelling Salesman algorithm for path optimization." +msgstr "" +"This sets the optimization type for the Excellon drill path.\n" +"If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" +"Guided Local Path is used. Default search time is 3sec.\n" +"Use set_sys excellon_search_time value Tcl Command to set other values.\n" +"If Basic is checked then Google OR-Tools Basic algorithm is used.\n" +"\n" +"If DISABLED, then FlatCAM works in 32bit mode and it uses \n" +"Travelling Salesman algorithm for path optimization." + +#: flatcamGUI/FlatCAMGUI.py:3774 +msgid "MH" +msgstr "MH" + +#: flatcamGUI/FlatCAMGUI.py:3789 +msgid "Optimization Time: " +msgstr "Optimization Time: " + +#: flatcamGUI/FlatCAMGUI.py:3792 +msgid "" +"When OR-Tools Metaheuristic (MH) is enabled there is a\n" +"maximum threshold for how much time is spent doing the\n" +"path optimization. This max duration is set here.\n" +"In seconds." +msgstr "" +"When OR-Tools Metaheuristic (MH) is enabled there is a\n" +"maximum threshold for how much time is spent doing the\n" +"path optimization. This max duration is set here.\n" +"In seconds." + +#: flatcamGUI/FlatCAMGUI.py:3833 +msgid "Excellon Options" +msgstr "Excellon Options" + +#: flatcamGUI/FlatCAMGUI.py:3836 flatcamGUI/ObjectUI.py:655 +msgid "Create CNC Job" +msgstr "Create CNC Job" + +#: flatcamGUI/FlatCAMGUI.py:3838 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object." +msgstr "" +"Parameters used to create a CNC Job object\n" +"for this drill object." + +#: flatcamGUI/FlatCAMGUI.py:3846 flatcamGUI/FlatCAMGUI.py:4302 +#: flatcamGUI/FlatCAMGUI.py:5301 flatcamGUI/ObjectUI.py:666 +#: flatcamGUI/ObjectUI.py:1130 flatcamTools/ToolCalculators.py:108 +msgid "Cut Z:" +msgstr "Cut Z:" + +#: flatcamGUI/FlatCAMGUI.py:3848 flatcamGUI/ObjectUI.py:668 +msgid "" +"Drill depth (negative)\n" +"below the copper surface." +msgstr "" +"Drill depth (negative)\n" +"below the copper surface." + +#: flatcamGUI/FlatCAMGUI.py:3855 flatcamGUI/FlatCAMGUI.py:4335 +#: flatcamGUI/ObjectUI.py:676 flatcamGUI/ObjectUI.py:1166 +msgid "Travel Z:" +msgstr "Travel Z:" + +#: flatcamGUI/FlatCAMGUI.py:3857 flatcamGUI/ObjectUI.py:678 +msgid "" +"Tool height when travelling\n" +"across the XY plane." +msgstr "" +"Tool height when travelling\n" +"across the XY plane." + +#: flatcamGUI/FlatCAMGUI.py:3865 flatcamGUI/FlatCAMGUI.py:4345 +msgid "Tool change:" +msgstr "Tool change:" + +#: flatcamGUI/FlatCAMGUI.py:3867 flatcamGUI/FlatCAMGUI.py:4347 +#: flatcamGUI/ObjectUI.py:688 +msgid "" +"Include tool-change sequence\n" +"in G-Code (Pause for tool change)." +msgstr "" +"Include tool-change sequence\n" +"in G-Code (Pause for tool change)." + +#: flatcamGUI/FlatCAMGUI.py:3874 flatcamGUI/FlatCAMGUI.py:4355 +msgid "Toolchange Z:" +msgstr "Toolchange Z:" + +#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/FlatCAMGUI.py:4357 +msgid "Toolchange Z position." +msgstr "Toolchange Z position." + +#: flatcamGUI/FlatCAMGUI.py:3882 +msgid "Feedrate:" +msgstr "Feedrate:" + +#: flatcamGUI/FlatCAMGUI.py:3884 +msgid "" +"Tool speed while drilling\n" +"(in units per minute)." +msgstr "" +"Tool speed while drilling\n" +"(in units per minute)." + +#: flatcamGUI/FlatCAMGUI.py:3892 +msgid "Spindle Speed:" +msgstr "Spindle Speed:" + +#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/FlatCAMGUI.py:4387 +#: flatcamGUI/ObjectUI.py:752 +msgid "" +"Speed of the spindle\n" +"in RPM (optional)" +msgstr "" +"Speed of the spindle\n" +"in RPM (optional)" + +#: flatcamGUI/FlatCAMGUI.py:3902 flatcamGUI/FlatCAMGUI.py:4395 +#: flatcamGUI/ObjectUI.py:760 flatcamGUI/ObjectUI.py:1289 +msgid "Dwell:" +msgstr "Dwell:" + +#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/ObjectUI.py:762 flatcamGUI/ObjectUI.py:1292 +msgid "" +"Pause to allow the spindle to reach its\n" +"speed before cutting." +msgstr "" +"Pause to allow the spindle to reach its\n" +"speed before cutting." + +#: flatcamGUI/FlatCAMGUI.py:3907 flatcamGUI/FlatCAMGUI.py:4400 +msgid "Duration:" +msgstr "Duration:" + +#: flatcamGUI/FlatCAMGUI.py:3909 flatcamGUI/FlatCAMGUI.py:4402 +#: flatcamGUI/ObjectUI.py:767 flatcamGUI/ObjectUI.py:1299 +msgid "Number of milliseconds for spindle to dwell." +msgstr "Number of milliseconds for spindle to dwell." + +#: flatcamGUI/FlatCAMGUI.py:3921 flatcamGUI/FlatCAMGUI.py:4412 +#: flatcamGUI/ObjectUI.py:775 +msgid "Postprocessor:" +msgstr "Postprocessor:" + +#: flatcamGUI/FlatCAMGUI.py:3923 +msgid "" +"The postprocessor file that dictates\n" +"gcode output." +msgstr "" +"The postprocessor file that dictates\n" +"gcode output." + +#: flatcamGUI/FlatCAMGUI.py:3933 +msgid "Gcode: " +msgstr "Gcode: " + +#: flatcamGUI/FlatCAMGUI.py:3935 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to drills." +msgstr "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to drills." + +#: flatcamGUI/FlatCAMGUI.py:3940 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:823 +msgid "Drills" +msgstr "Drills" + +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:824 +msgid "Slots" +msgstr "Slots" + +#: flatcamGUI/FlatCAMGUI.py:3942 flatcamGUI/ObjectUI.py:825 +msgid "Both" +msgstr "Both" + +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:840 +msgid "Mill Holes" +msgstr "Mill Holes" + +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:842 +msgid "Create Geometry for milling holes." +msgstr "Create Geometry for milling holes." + +#: flatcamGUI/FlatCAMGUI.py:3959 +msgid "Drill Tool dia:" +msgstr "Drill Tool dia:" + +#: flatcamGUI/FlatCAMGUI.py:3966 +msgid "Slot Tool dia:" +msgstr "Slot Tool dia:" + +#: flatcamGUI/FlatCAMGUI.py:3968 +msgid "" +"Diameter of the cutting tool\n" +"when milling slots." +msgstr "" +"Diameter of the cutting tool\n" +"when milling slots." + +#: flatcamGUI/FlatCAMGUI.py:3980 +msgid "Defaults" +msgstr "Defaults" + +#: flatcamGUI/FlatCAMGUI.py:3993 +msgid "Excellon Adv. Options" +msgstr "Excellon Adv. Options" + +#: flatcamGUI/FlatCAMGUI.py:3999 flatcamGUI/FlatCAMGUI.py:4435 +msgid "Advanced Options:" +msgstr "Advanced Options:" + +#: flatcamGUI/FlatCAMGUI.py:4001 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object that are shown when App Level is Advanced." +msgstr "" +"Parameters used to create a CNC Job object\n" +"for this drill object that are shown when App Level is Advanced." + +#: flatcamGUI/FlatCAMGUI.py:4009 +msgid "Offset Z:" +msgstr "Offset Z:" + +#: flatcamGUI/FlatCAMGUI.py:4011 flatcamGUI/ObjectUI.py:645 +msgid "" +"Some drill bits (the larger ones) need to drill deeper\n" +"to create the desired exit hole diameter due of the tip shape.\n" +"The value here can compensate the Cut Z parameter." +msgstr "" +"Some drill bits (the larger ones) need to drill deeper\n" +"to create the desired exit hole diameter due of the tip shape.\n" +"The value here can compensate the Cut Z parameter." + +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/FlatCAMGUI.py:4446 +msgid "Toolchange X,Y:" +msgstr "Toolchange X,Y:" + +#: flatcamGUI/FlatCAMGUI.py:4020 flatcamGUI/FlatCAMGUI.py:4448 +msgid "Toolchange X,Y position." +msgstr "Toolchange X,Y position." + +#: flatcamGUI/FlatCAMGUI.py:4026 flatcamGUI/FlatCAMGUI.py:4455 +#: flatcamGUI/ObjectUI.py:705 +msgid "Start move Z:" +msgstr "Start move Z:" + +#: flatcamGUI/FlatCAMGUI.py:4028 +msgid "" +"Height of the tool just after start.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Height of the tool just after start.\n" +"Delete the value if you don't need this feature." + +#: flatcamGUI/FlatCAMGUI.py:4035 flatcamGUI/FlatCAMGUI.py:4465 +#: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1212 +msgid "End move Z:" +msgstr "End move Z:" + +#: flatcamGUI/FlatCAMGUI.py:4037 flatcamGUI/FlatCAMGUI.py:4467 +msgid "" +"Height of the tool after\n" +"the last move at the end of the job." +msgstr "" +"Height of the tool after\n" +"the last move at the end of the job." + +#: flatcamGUI/FlatCAMGUI.py:4044 flatcamGUI/FlatCAMGUI.py:4475 +#: flatcamGUI/ObjectUI.py:736 +msgid "Feedrate Rapids:" +msgstr "Feedrate Rapids:" + +#: flatcamGUI/FlatCAMGUI.py:4046 flatcamGUI/ObjectUI.py:738 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." + +#: flatcamGUI/FlatCAMGUI.py:4057 flatcamGUI/FlatCAMGUI.py:4499 +#: flatcamGUI/ObjectUI.py:786 flatcamGUI/ObjectUI.py:1321 +msgid "Probe Z depth:" +msgstr "Probe Z depth:" + +#: flatcamGUI/FlatCAMGUI.py:4059 flatcamGUI/FlatCAMGUI.py:4501 +#: flatcamGUI/ObjectUI.py:788 flatcamGUI/ObjectUI.py:1324 +msgid "" +"The maximum depth that the probe is allowed\n" +"to probe. Negative value, in current units." +msgstr "" +"The maximum depth that the probe is allowed\n" +"to probe. Negative value, in current units." + +#: flatcamGUI/FlatCAMGUI.py:4067 flatcamGUI/FlatCAMGUI.py:4509 +#: flatcamGUI/ObjectUI.py:798 flatcamGUI/ObjectUI.py:1335 +msgid "Feedrate Probe:" +msgstr "Feedrate Probe:" + +#: flatcamGUI/FlatCAMGUI.py:4069 flatcamGUI/FlatCAMGUI.py:4511 +#: flatcamGUI/ObjectUI.py:800 flatcamGUI/ObjectUI.py:1338 +msgid "The feedrate used while the probe is probing." +msgstr "The feedrate used while the probe is probing." + +#: flatcamGUI/FlatCAMGUI.py:4075 flatcamGUI/FlatCAMGUI.py:4518 +msgid "Fast Plunge:" +msgstr "Fast Plunge:" + +#: flatcamGUI/FlatCAMGUI.py:4077 flatcamGUI/FlatCAMGUI.py:4520 +msgid "" +"By checking this, the vertical move from\n" +"Z_Toolchange to Z_move is done with G0,\n" +"meaning the fastest speed available.\n" +"WARNING: the move is done at Toolchange X,Y coords." +msgstr "" +"By checking this, the vertical move from\n" +"Z_Toolchange to Z_move is done with G0,\n" +"meaning the fastest speed available.\n" +"WARNING: the move is done at Toolchange X,Y coords." + +#: flatcamGUI/FlatCAMGUI.py:4086 +msgid "Fast Retract:" +msgstr "Fast Retract:" + +#: flatcamGUI/FlatCAMGUI.py:4088 +msgid "" +"Exit hole strategy.\n" +" - When uncheked, while exiting the drilled hole the drill bit\n" +"will travel slow, with set feedrate (G1), up to zero depth and then\n" +"travel as fast as possible (G0) to the Z Move (travel height).\n" +" - When checked the travel from Z cut (cut depth) to Z_move\n" +"(travel height) is done as fast as possible (G0) in one move." +msgstr "" +"Exit hole strategy.\n" +" - When uncheked, while exiting the drilled hole the drill bit\n" +"will travel slow, with set feedrate (G1), up to zero depth and then\n" +"travel as fast as possible (G0) to the Z Move (travel height).\n" +" - When checked the travel from Z cut (cut depth) to Z_move\n" +"(travel height) is done as fast as possible (G0) in one move." + +#: flatcamGUI/FlatCAMGUI.py:4107 +msgid "Excellon Export" +msgstr "Excellon Export" + +#: flatcamGUI/FlatCAMGUI.py:4110 +msgid "Export Options:" +msgstr "Export Options:" + +#: flatcamGUI/FlatCAMGUI.py:4112 +msgid "" +"The parameters set here are used in the file exported\n" +"when using the File -> Export -> Export Excellon menu entry." +msgstr "" +"The parameters set here are used in the file exported\n" +"when using the File -> Export -> Export Excellon menu entry." + +#: flatcamGUI/FlatCAMGUI.py:4121 +msgid "Units:" +msgstr "Units:" + +#: flatcamGUI/FlatCAMGUI.py:4123 flatcamGUI/FlatCAMGUI.py:4129 +msgid "The units used in the Excellon file." +msgstr "The units used in the Excellon file." + +#: flatcamGUI/FlatCAMGUI.py:4135 +msgid "Int/Decimals:" +msgstr "Int/Decimals:" + +#: flatcamGUI/FlatCAMGUI.py:4137 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period." +msgstr "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period." + +#: flatcamGUI/FlatCAMGUI.py:4173 +msgid "Format:" +msgstr "Format:" + +#: flatcamGUI/FlatCAMGUI.py:4175 flatcamGUI/FlatCAMGUI.py:4185 +msgid "" +"Select the kind of coordinates format used.\n" +"Coordinates can be saved with decimal point or without.\n" +"When there is no decimal point, it is required to specify\n" +"the number of digits for integer part and the number of decimals.\n" +"Also it will have to be specified if LZ = leading zeros are kept\n" +"or TZ = trailing zeros are kept." +msgstr "" +"Select the kind of coordinates format used.\n" +"Coordinates can be saved with decimal point or without.\n" +"When there is no decimal point, it is required to specify\n" +"the number of digits for integer part and the number of decimals.\n" +"Also it will have to be specified if LZ = leading zeros are kept\n" +"or TZ = trailing zeros are kept." + +#: flatcamGUI/FlatCAMGUI.py:4182 +msgid "Decimal" +msgstr "Decimal" + +#: flatcamGUI/FlatCAMGUI.py:4183 +msgid "No-Decimal" +msgstr "No-Decimal" + +#: flatcamGUI/FlatCAMGUI.py:4196 +msgid "Zeros:" +msgstr "Zeros:" + +#: flatcamGUI/FlatCAMGUI.py:4209 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"This sets the default type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." + +#: flatcamGUI/FlatCAMGUI.py:4235 +msgid "Geometry General" +msgstr "Geometry General" + +#: flatcamGUI/FlatCAMGUI.py:4253 +msgid "" +"The number of circle steps for Geometry \n" +"circle and arc shapes linear approximation." +msgstr "" +"The number of circle steps for Geometry \n" +"circle and arc shapes linear approximation." + +#: flatcamGUI/FlatCAMGUI.py:4261 +msgid "Tools" +msgstr "Tools" + +#: flatcamGUI/FlatCAMGUI.py:4268 +msgid "Tool dia: " +msgstr "Tool dia: " + +#: flatcamGUI/FlatCAMGUI.py:4270 +msgid "" +"The diameter of the cutting\n" +"tool.." +msgstr "" +"The diameter of the cutting\n" +"tool.." + +#: flatcamGUI/FlatCAMGUI.py:4285 +msgid "Geometry Options" +msgstr "Geometry Options" + +#: flatcamGUI/FlatCAMGUI.py:4290 +msgid "Create CNC Job:" +msgstr "Create CNC Job:" + +#: flatcamGUI/FlatCAMGUI.py:4292 +msgid "" +"Create a CNC Job object\n" +"tracing the contours of this\n" +"Geometry object." +msgstr "" +"Create a CNC Job object\n" +"tracing the contours of this\n" +"Geometry object." + +#: flatcamGUI/FlatCAMGUI.py:4304 flatcamGUI/ObjectUI.py:1133 +msgid "" +"Cutting depth (negative)\n" +"below the copper surface." +msgstr "" +"Cutting depth (negative)\n" +"below the copper surface." + +#: flatcamGUI/FlatCAMGUI.py:4312 +msgid "Multidepth" +msgstr "Multidepth" + +#: flatcamGUI/FlatCAMGUI.py:4314 +msgid "Multidepth usage: True or False." +msgstr "Multidepth usage: True or False." + +#: flatcamGUI/FlatCAMGUI.py:4319 +msgid "Depth/Pass:" +msgstr "Depth/Pass:" + +#: flatcamGUI/FlatCAMGUI.py:4321 +msgid "" +"The depth to cut on each pass,\n" +"when multidepth is enabled.\n" +"It has positive value although\n" +"it is a fraction from the depth\n" +"which has negative value." +msgstr "" +"The depth to cut on each pass,\n" +"when multidepth is enabled.\n" +"It has positive value although\n" +"it is a fraction from the depth\n" +"which has negative value." + +#: flatcamGUI/FlatCAMGUI.py:4337 flatcamGUI/ObjectUI.py:1169 +msgid "" +"Height of the tool when\n" +"moving without cutting." +msgstr "" +"Height of the tool when\n" +"moving without cutting." + +#: flatcamGUI/FlatCAMGUI.py:4364 flatcamGUI/ObjectUI.py:1224 +msgid "Feed Rate X-Y:" +msgstr "Feed Rate X-Y:" + +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/ObjectUI.py:1227 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute" +msgstr "" +"Cutting speed in the XY\n" +"plane in units per minute" + +#: flatcamGUI/FlatCAMGUI.py:4374 +msgid "Feed Rate Z:" +msgstr "Feed Rate Z:" + +#: flatcamGUI/FlatCAMGUI.py:4376 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute.\n" +"It is called also Plunge." +msgstr "" +"Cutting speed in the XY\n" +"plane in units per minute.\n" +"It is called also Plunge." + +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/ObjectUI.py:750 +#: flatcamGUI/ObjectUI.py:1276 +msgid "Spindle speed:" +msgstr "Spindle speed:" + +#: flatcamGUI/FlatCAMGUI.py:4414 +msgid "" +"The postprocessor file that dictates\n" +"Machine Code output." +msgstr "" +"The postprocessor file that dictates\n" +"Machine Code output." + +#: flatcamGUI/FlatCAMGUI.py:4430 +msgid "Geometry Adv. Options" +msgstr "Geometry Adv. Options" + +#: flatcamGUI/FlatCAMGUI.py:4437 +msgid "" +"Parameters to create a CNC Job object\n" +"tracing the contours of a Geometry object." +msgstr "" +"Parameters to create a CNC Job object\n" +"tracing the contours of a Geometry object." + +#: flatcamGUI/FlatCAMGUI.py:4457 +msgid "" +"Height of the tool just after starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Height of the tool just after starting the work.\n" +"Delete the value if you don't need this feature." + +#: flatcamGUI/FlatCAMGUI.py:4477 +msgid "" +"Cutting speed in the XY plane\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Cutting speed in the XY plane\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." + +#: flatcamGUI/FlatCAMGUI.py:4489 +msgid "Re-cut 1st pt." +msgstr "Re-cut 1st pt." + +#: flatcamGUI/FlatCAMGUI.py:4491 flatcamGUI/ObjectUI.py:1267 +msgid "" +"In order to remove possible\n" +"copper leftovers where first cut\n" +"meet with last cut, we generate an\n" +"extended cut over the first cut section." +msgstr "" +"In order to remove possible\n" +"copper leftovers where first cut\n" +"meet with last cut, we generate an\n" +"extended cut over the first cut section." + +#: flatcamGUI/FlatCAMGUI.py:4530 +msgid "Seg. X size:" +msgstr "Seg. X size:" + +#: flatcamGUI/FlatCAMGUI.py:4532 +msgid "" +"The size of the trace segment on the X axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the X axis." +msgstr "" +"The size of the trace segment on the X axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the X axis." + +#: flatcamGUI/FlatCAMGUI.py:4541 +msgid "Seg. Y size:" +msgstr "Seg. Y size:" + +#: flatcamGUI/FlatCAMGUI.py:4543 +msgid "" +"The size of the trace segment on the Y axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the Y axis." +msgstr "" +"The size of the trace segment on the Y axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the Y axis." + +#: flatcamGUI/FlatCAMGUI.py:4559 +msgid "CNC Job General" +msgstr "CNC Job General" + +#: flatcamGUI/FlatCAMGUI.py:4572 flatcamGUI/ObjectUI.py:615 +#: flatcamGUI/ObjectUI.py:945 flatcamGUI/ObjectUI.py:1499 +msgid "Plot Object" +msgstr "Plot Object" + +#: flatcamGUI/FlatCAMGUI.py:4579 +msgid "Plot kind:" +msgstr "Plot kind:" + +#: flatcamGUI/FlatCAMGUI.py:4581 flatcamGUI/ObjectUI.py:1421 +msgid "" +"This selects the kind of geometries on the canvas to plot.\n" +"Those can be either of type 'Travel' which means the moves\n" +"above the work piece or it can be of type 'Cut',\n" +"which means the moves that cut into the material." +msgstr "" +"This selects the kind of geometries on the canvas to plot.\n" +"Those can be either of type 'Travel' which means the moves\n" +"above the work piece or it can be of type 'Cut',\n" +"which means the moves that cut into the material." + +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/ObjectUI.py:1430 +msgid "Travel" +msgstr "Travel" + +#: flatcamGUI/FlatCAMGUI.py:4600 +msgid "" +"The number of circle steps for GCode \n" +"circle and arc shapes linear approximation." +msgstr "" +"The number of circle steps for GCode \n" +"circle and arc shapes linear approximation." + +#: flatcamGUI/FlatCAMGUI.py:4610 +msgid "" +"Diameter of the tool to be\n" +"rendered in the plot." +msgstr "" +"Diameter of the tool to be\n" +"rendered in the plot." + +#: flatcamGUI/FlatCAMGUI.py:4618 +msgid "Coords dec.:" +msgstr "Coords dec.:" + +#: flatcamGUI/FlatCAMGUI.py:4620 +msgid "" +"The number of decimals to be used for \n" +"the X, Y, Z coordinates in CNC code (GCODE, etc.)" +msgstr "" +"The number of decimals to be used for \n" +"the X, Y, Z coordinates in CNC code (GCODE, etc.)" + +#: flatcamGUI/FlatCAMGUI.py:4628 +msgid "Feedrate dec.:" +msgstr "Feedrate dec.:" + +#: flatcamGUI/FlatCAMGUI.py:4630 +msgid "" +"The number of decimals to be used for \n" +"the Feedrate parameter in CNC code (GCODE, etc.)" +msgstr "" +"The number of decimals to be used for \n" +"the Feedrate parameter in CNC code (GCODE, etc.)" + +#: flatcamGUI/FlatCAMGUI.py:4645 +msgid "CNC Job Options" +msgstr "CNC Job Options" + +#: flatcamGUI/FlatCAMGUI.py:4648 flatcamGUI/FlatCAMGUI.py:4689 +msgid "Export G-Code:" +msgstr "Export G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4650 flatcamGUI/FlatCAMGUI.py:4691 +#: flatcamGUI/ObjectUI.py:1535 +msgid "" +"Export and save G-Code to\n" +"make this object to a file." +msgstr "" +"Export and save G-Code to\n" +"make this object to a file." + +#: flatcamGUI/FlatCAMGUI.py:4656 +msgid "Prepend to G-Code:" +msgstr "Prepend to G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4658 +msgid "" +"Type here any G-Code commands you would\n" +"like to add at the beginning of the G-Code file." +msgstr "" +"Type here any G-Code commands you would\n" +"like to add at the beginning of the G-Code file." + +#: flatcamGUI/FlatCAMGUI.py:4667 +msgid "Append to G-Code:" +msgstr "Append to G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/ObjectUI.py:1557 +msgid "" +"Type here any G-Code commands you would\n" +"like to append to the generated file.\n" +"I.e.: M2 (End of program)" +msgstr "" +"Type here any G-Code commands you would\n" +"like to append to the generated file.\n" +"I.e.: M2 (End of program)" + +#: flatcamGUI/FlatCAMGUI.py:4686 +msgid "CNC Job Adv. Options" +msgstr "CNC Job Adv. Options" + +#: flatcamGUI/FlatCAMGUI.py:4697 flatcamGUI/ObjectUI.py:1575 +msgid "Toolchange G-Code:" +msgstr "Toolchange G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4699 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro." +msgstr "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro." + +#: flatcamGUI/FlatCAMGUI.py:4713 flatcamGUI/ObjectUI.py:1597 +msgid "Use Toolchange Macro" +msgstr "Use Toolchange Macro" + +#: flatcamGUI/FlatCAMGUI.py:4715 flatcamGUI/ObjectUI.py:1600 +msgid "" +"Check this box if you want to use\n" +"a Custom Toolchange GCode (macro)." +msgstr "" +"Check this box if you want to use\n" +"a Custom Toolchange GCode (macro)." + +#: flatcamGUI/FlatCAMGUI.py:4727 flatcamGUI/ObjectUI.py:1616 +msgid "" +"A list of the FlatCAM variables that can be used\n" +"in the Toolchange event.\n" +"They have to be surrounded by the '%' symbol" +msgstr "" +"A list of the FlatCAM variables that can be used\n" +"in the Toolchange event.\n" +"They have to be surrounded by the '%' symbol" + +#: flatcamGUI/FlatCAMGUI.py:4734 flatcamGUI/ObjectUI.py:1624 +msgid "Parameters" +msgstr "Parameters" + +#: flatcamGUI/FlatCAMGUI.py:4737 flatcamGUI/ObjectUI.py:1627 +msgid "FlatCAM CNC parameters" +msgstr "FlatCAM CNC parameters" + +#: flatcamGUI/FlatCAMGUI.py:4738 flatcamGUI/ObjectUI.py:1628 +msgid "tool = tool number" +msgstr "tool = tool number" + +#: flatcamGUI/FlatCAMGUI.py:4739 flatcamGUI/ObjectUI.py:1629 +msgid "tooldia = tool diameter" +msgstr "tooldia = tool diameter" + +#: flatcamGUI/FlatCAMGUI.py:4740 flatcamGUI/ObjectUI.py:1630 +msgid "t_drills = for Excellon, total number of drills" +msgstr "t_drills = for Excellon, total number of drills" + +#: flatcamGUI/FlatCAMGUI.py:4741 flatcamGUI/ObjectUI.py:1631 +msgid "x_toolchange = X coord for Toolchange" +msgstr "x_toolchange = X coord for Toolchange" + +#: flatcamGUI/FlatCAMGUI.py:4742 flatcamGUI/ObjectUI.py:1632 +msgid "y_toolchange = Y coord for Toolchange" +msgstr "y_toolchange = Y coord for Toolchange" + +#: flatcamGUI/FlatCAMGUI.py:4743 flatcamGUI/ObjectUI.py:1633 +msgid "z_toolchange = Z coord for Toolchange" +msgstr "z_toolchange = Z coord for Toolchange" + +#: flatcamGUI/FlatCAMGUI.py:4744 +msgid "z_cut = Z depth for the cut" +msgstr "z_cut = Z depth for the cut" + +#: flatcamGUI/FlatCAMGUI.py:4745 +msgid "z_move = Z height for travel" +msgstr "z_move = Z height for travel" + +#: flatcamGUI/FlatCAMGUI.py:4746 flatcamGUI/ObjectUI.py:1636 +msgid "z_depthpercut = the step value for multidepth cut" +msgstr "z_depthpercut = the step value for multidepth cut" + +#: flatcamGUI/FlatCAMGUI.py:4747 flatcamGUI/ObjectUI.py:1637 +msgid "spindlesspeed = the value for the spindle speed" +msgstr "spindlesspeed = the value for the spindle speed" + +#: flatcamGUI/FlatCAMGUI.py:4748 flatcamGUI/ObjectUI.py:1638 +msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" +msgstr "dwelltime = time to dwell to allow the spindle to reach it's set RPM" + +#: flatcamGUI/FlatCAMGUI.py:4769 +msgid "NCC Tool Options" +msgstr "NCC Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:4772 flatcamGUI/FlatCAMGUI.py:4873 +#: flatcamGUI/FlatCAMGUI.py:4943 flatcamGUI/FlatCAMGUI.py:5002 +#: flatcamGUI/FlatCAMGUI.py:5105 flatcamGUI/FlatCAMGUI.py:5166 +#: flatcamGUI/FlatCAMGUI.py:5365 flatcamGUI/FlatCAMGUI.py:5492 +msgid "Parameters:" +msgstr "Parameters:" + +#: flatcamGUI/FlatCAMGUI.py:4782 flatcamGUI/FlatCAMGUI.py:5503 +msgid "Tools dia:" +msgstr "Tools dia:" + +#: flatcamGUI/FlatCAMGUI.py:4784 +msgid "Diameters of the cutting tools, separated by ','" +msgstr "Diameters of the cutting tools, separated by ','" + +#: flatcamGUI/FlatCAMGUI.py:4792 flatcamTools/ToolNonCopperClear.py:166 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be cleared are still \n" +"not cleared.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be cleared are still \n" +"not cleared.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." + +#: flatcamGUI/FlatCAMGUI.py:4808 flatcamTools/ToolNonCopperClear.py:182 +msgid "Bounding box margin." +msgstr "Bounding box margin." + +#: flatcamGUI/FlatCAMGUI.py:4817 flatcamTools/ToolNonCopperClear.py:191 +#: flatcamTools/ToolPaint.py:190 +msgid "" +"Algorithm for non-copper clearing:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed.
Line-based: Parallel " +"lines." +msgstr "" +"Algorithm for non-copper clearing:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed.
Line-based: Parallel " +"lines." + +#: flatcamGUI/FlatCAMGUI.py:4849 flatcamTools/ToolNonCopperClear.py:223 +#: flatcamTools/ToolPaint.py:222 +msgid "Rest M.:" +msgstr "Rest M.:" + +#: flatcamGUI/FlatCAMGUI.py:4851 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool.\n" +"If not checked, use the standard algorithm." +msgstr "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool.\n" +"If not checked, use the standard algorithm." + +#: flatcamGUI/FlatCAMGUI.py:4870 +msgid "Cutout Tool Options" +msgstr "Cutout Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:4875 flatcamGUI/ObjectUI.py:473 +msgid "" +"Create toolpaths to cut around\n" +"the PCB and separate it from\n" +"the original board." +msgstr "" +"Create toolpaths to cut around\n" +"the PCB and separate it from\n" +"the original board." + +#: flatcamGUI/FlatCAMGUI.py:4894 +msgid "" +"Distance from objects at which\n" +"to draw the cutout." +msgstr "" +"Distance from objects at which\n" +"to draw the cutout." + +#: flatcamGUI/FlatCAMGUI.py:4901 flatcamTools/ToolCutOut.py:96 +msgid "Gap size:" +msgstr "Gap size:" + +#: flatcamGUI/FlatCAMGUI.py:4903 +msgid "" +"Size of the gaps in the toolpath\n" +"that will remain to hold the\n" +"board in place." +msgstr "" +"Size of the gaps in the toolpath\n" +"that will remain to hold the\n" +"board in place." + +#: flatcamGUI/FlatCAMGUI.py:4911 flatcamTools/ToolCutOut.py:125 +msgid "Gaps:" +msgstr "Gaps:" + +#: flatcamGUI/FlatCAMGUI.py:4913 +msgid "" +"Number of bridge gaps used for the cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" +"Number of bridge gaps used for the cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" + +#: flatcamGUI/FlatCAMGUI.py:4940 +msgid "2Sided Tool Options" +msgstr "2Sided Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:4945 +msgid "" +"A tool to help in creating a double sided\n" +"PCB using alignment holes." +msgstr "" +"A tool to help in creating a double sided\n" +"PCB using alignment holes." + +#: flatcamGUI/FlatCAMGUI.py:4955 flatcamTools/ToolDblSided.py:235 +msgid "Drill diam.:" +msgstr "Drill diam.:" + +#: flatcamGUI/FlatCAMGUI.py:4957 flatcamTools/ToolDblSided.py:226 +#: flatcamTools/ToolDblSided.py:237 +msgid "Diameter of the drill for the alignment holes." +msgstr "Diameter of the drill for the alignment holes." + +#: flatcamGUI/FlatCAMGUI.py:4964 +msgid "X" +msgstr "X" + +#: flatcamGUI/FlatCAMGUI.py:4965 +msgid "Y" +msgstr "Y" + +#: flatcamGUI/FlatCAMGUI.py:4966 flatcamTools/ToolDblSided.py:120 +msgid "Mirror Axis:" +msgstr "Mirror Axis:" + +#: flatcamGUI/FlatCAMGUI.py:4968 flatcamTools/ToolDblSided.py:122 +msgid "Mirror vertically (X) or horizontally (Y)." +msgstr "Mirror vertically (X) or horizontally (Y)." + +#: flatcamGUI/FlatCAMGUI.py:4977 +msgid "Point" +msgstr "Point" + +#: flatcamGUI/FlatCAMGUI.py:4978 +msgid "Box" +msgstr "Box" + +#: flatcamGUI/FlatCAMGUI.py:4979 flatcamTools/ToolDblSided.py:133 +msgid "Axis Ref:" +msgstr "Axis Ref:" + +#: flatcamGUI/FlatCAMGUI.py:4981 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a Geometry object) in \n" +"the middle." +msgstr "" +"The axis should pass through a point or cut\n" +" a specified box (in a Geometry object) in \n" +"the middle." + +#: flatcamGUI/FlatCAMGUI.py:4997 +msgid "Paint Tool Options" +msgstr "Paint Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5004 flatcamGUI/ObjectUI.py:1370 +msgid "" +"Creates tool paths to cover the\n" +"whole area of a polygon (remove\n" +"all copper). You will be asked\n" +"to click on the desired polygon." +msgstr "" +"Creates tool paths to cover the\n" +"whole area of a polygon (remove\n" +"all copper). You will be asked\n" +"to click on the desired polygon." + +#: flatcamGUI/FlatCAMGUI.py:5028 +msgid "" +"How much (fraction) of the tool\n" +"width to overlap each tool pass." +msgstr "" +"How much (fraction) of the tool\n" +"width to overlap each tool pass." + +#: flatcamGUI/FlatCAMGUI.py:5082 flatcamTools/ToolPaint.py:237 +msgid "Selection:" +msgstr "Selection:" + +#: flatcamGUI/FlatCAMGUI.py:5084 +msgid "How to select the polygons to paint." +msgstr "How to select the polygons to paint." + +#: flatcamGUI/FlatCAMGUI.py:5088 +msgid "Single" +msgstr "Single" + +#: flatcamGUI/FlatCAMGUI.py:5102 +msgid "Film Tool Options" +msgstr "Film Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5107 +msgid "" +"Create a PCB film from a Gerber or Geometry\n" +"FlatCAM object.\n" +"The file is saved in SVG format." +msgstr "" +"Create a PCB film from a Gerber or Geometry\n" +"FlatCAM object.\n" +"The file is saved in SVG format." + +#: flatcamGUI/FlatCAMGUI.py:5116 +msgid "Pos" +msgstr "Pos" + +#: flatcamGUI/FlatCAMGUI.py:5117 +msgid "Neg" +msgstr "Neg" + +#: flatcamGUI/FlatCAMGUI.py:5118 flatcamTools/ToolFilm.py:116 +msgid "Film Type:" +msgstr "Film Type:" + +#: flatcamGUI/FlatCAMGUI.py:5120 flatcamTools/ToolFilm.py:118 +msgid "" +"Generate a Positive black film or a Negative film.\n" +"Positive means that it will print the features\n" +"with black on a white canvas.\n" +"Negative means that it will print the features\n" +"with white on a black canvas.\n" +"The Film format is SVG." +msgstr "" +"Generate a Positive black film or a Negative film.\n" +"Positive means that it will print the features\n" +"with black on a white canvas.\n" +"Negative means that it will print the features\n" +"with white on a black canvas.\n" +"The Film format is SVG." + +#: flatcamGUI/FlatCAMGUI.py:5131 flatcamTools/ToolFilm.py:130 +msgid "Border:" +msgstr "Border:" + +#: flatcamGUI/FlatCAMGUI.py:5133 flatcamTools/ToolFilm.py:132 +msgid "" +"Specify a border around the object.\n" +"Only for negative film.\n" +"It helps if we use as a Box Object the same \n" +"object as in Film Object. It will create a thick\n" +"black bar around the actual print allowing for a\n" +"better delimitation of the outline features which are of\n" +"white color like the rest and which may confound with the\n" +"surroundings if not for this border." +msgstr "" +"Specify a border around the object.\n" +"Only for negative film.\n" +"It helps if we use as a Box Object the same \n" +"object as in Film Object. It will create a thick\n" +"black bar around the actual print allowing for a\n" +"better delimitation of the outline features which are of\n" +"white color like the rest and which may confound with the\n" +"surroundings if not for this border." + +#: flatcamGUI/FlatCAMGUI.py:5146 flatcamTools/ToolFilm.py:144 +msgid "Scale Stroke:" +msgstr "Scale Stroke:" + +#: flatcamGUI/FlatCAMGUI.py:5148 flatcamTools/ToolFilm.py:146 +msgid "" +"Scale the line stroke thickness of each feature in the SVG file.\n" +"It means that the line that envelope each SVG feature will be thicker or " +"thinner,\n" +"therefore the fine features may be more affected by this parameter." +msgstr "" +"Scale the line stroke thickness of each feature in the SVG file.\n" +"It means that the line that envelope each SVG feature will be thicker or " +"thinner,\n" +"therefore the fine features may be more affected by this parameter." + +#: flatcamGUI/FlatCAMGUI.py:5163 +msgid "Panelize Tool Options" +msgstr "Panelize Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5168 +msgid "" +"Create an object that contains an array of (x, y) elements,\n" +"each element is a copy of the source object spaced\n" +"at a X distance, Y distance of each other." +msgstr "" +"Create an object that contains an array of (x, y) elements,\n" +"each element is a copy of the source object spaced\n" +"at a X distance, Y distance of each other." + +#: flatcamGUI/FlatCAMGUI.py:5179 flatcamTools/ToolPanelize.py:113 +msgid "Spacing cols:" +msgstr "Spacing cols:" + +#: flatcamGUI/FlatCAMGUI.py:5181 flatcamTools/ToolPanelize.py:115 +msgid "" +"Spacing between columns of the desired panel.\n" +"In current units." +msgstr "" +"Spacing between columns of the desired panel.\n" +"In current units." + +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamTools/ToolPanelize.py:122 +msgid "Spacing rows:" +msgstr "Spacing rows:" + +#: flatcamGUI/FlatCAMGUI.py:5191 flatcamTools/ToolPanelize.py:124 +msgid "" +"Spacing between rows of the desired panel.\n" +"In current units." +msgstr "" +"Spacing between rows of the desired panel.\n" +"In current units." + +#: flatcamGUI/FlatCAMGUI.py:5199 flatcamTools/ToolPanelize.py:131 +msgid "Columns:" +msgstr "Columns:" + +#: flatcamGUI/FlatCAMGUI.py:5201 flatcamTools/ToolPanelize.py:133 +msgid "Number of columns of the desired panel" +msgstr "Number of columns of the desired panel" + +#: flatcamGUI/FlatCAMGUI.py:5208 flatcamTools/ToolPanelize.py:139 +msgid "Rows:" +msgstr "Rows:" + +#: flatcamGUI/FlatCAMGUI.py:5210 flatcamTools/ToolPanelize.py:141 +msgid "Number of rows of the desired panel" +msgstr "Number of rows of the desired panel" + +#: flatcamGUI/FlatCAMGUI.py:5216 +msgid "Gerber" +msgstr "Gerber" + +#: flatcamGUI/FlatCAMGUI.py:5217 +msgid "Geo" +msgstr "Geo" + +#: flatcamGUI/FlatCAMGUI.py:5218 flatcamTools/ToolPanelize.py:148 +msgid "Panel Type:" +msgstr "Panel Type:" + +#: flatcamGUI/FlatCAMGUI.py:5220 +msgid "" +"Choose the type of object for the panel object:\n" +"- Gerber\n" +"- Geometry" +msgstr "" +"Choose the type of object for the panel object:\n" +"- Gerber\n" +"- Geometry" + +#: flatcamGUI/FlatCAMGUI.py:5229 +msgid "Constrain within:" +msgstr "Constrain within:" + +#: flatcamGUI/FlatCAMGUI.py:5231 flatcamTools/ToolPanelize.py:160 +msgid "" +"Area define by DX and DY within to constrain the panel.\n" +"DX and DY values are in current units.\n" +"Regardless of how many columns and rows are desired,\n" +"the final panel will have as many columns and rows as\n" +"they fit completely within selected area." +msgstr "" +"Area define by DX and DY within to constrain the panel.\n" +"DX and DY values are in current units.\n" +"Regardless of how many columns and rows are desired,\n" +"the final panel will have as many columns and rows as\n" +"they fit completely within selected area." + +#: flatcamGUI/FlatCAMGUI.py:5240 flatcamTools/ToolPanelize.py:169 +msgid "Width (DX):" +msgstr "Width (DX):" + +#: flatcamGUI/FlatCAMGUI.py:5242 flatcamTools/ToolPanelize.py:171 +msgid "" +"The width (DX) within which the panel must fit.\n" +"In current units." +msgstr "" +"The width (DX) within which the panel must fit.\n" +"In current units." + +#: flatcamGUI/FlatCAMGUI.py:5249 flatcamTools/ToolPanelize.py:177 +msgid "Height (DY):" +msgstr "Height (DY):" + +#: flatcamGUI/FlatCAMGUI.py:5251 flatcamTools/ToolPanelize.py:179 +msgid "" +"The height (DY)within which the panel must fit.\n" +"In current units." +msgstr "" +"The height (DY)within which the panel must fit.\n" +"In current units." + +#: flatcamGUI/FlatCAMGUI.py:5265 +msgid "Calculators Tool Options" +msgstr "Calculators Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5268 +msgid "V-Shape Tool Calculator:" +msgstr "V-Shape Tool Calculator:" + +#: flatcamGUI/FlatCAMGUI.py:5270 +msgid "" +"Calculate the tool diameter for a given V-shape tool,\n" +"having the tip diameter, tip angle and\n" +"depth-of-cut as parameters." +msgstr "" +"Calculate the tool diameter for a given V-shape tool,\n" +"having the tip diameter, tip angle and\n" +"depth-of-cut as parameters." + +#: flatcamGUI/FlatCAMGUI.py:5281 flatcamTools/ToolCalculators.py:94 +msgid "Tip Diameter:" +msgstr "Tip Diameter:" + +#: flatcamGUI/FlatCAMGUI.py:5283 +msgid "" +"This is the tool tip diameter.\n" +"It is specified by manufacturer." +msgstr "" +"This is the tool tip diameter.\n" +"It is specified by manufacturer." + +#: flatcamGUI/FlatCAMGUI.py:5291 +msgid "Tip angle:" +msgstr "Tip angle:" + +#: flatcamGUI/FlatCAMGUI.py:5293 +msgid "" +"This is the angle on the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" +"This is the angle on the tip of the tool.\n" +"It is specified by manufacturer." + +#: flatcamGUI/FlatCAMGUI.py:5303 +msgid "" +"This is depth to cut into material.\n" +"In the CNCJob object it is the CutZ parameter." +msgstr "" +"This is depth to cut into material.\n" +"In the CNCJob object it is the CutZ parameter." + +#: flatcamGUI/FlatCAMGUI.py:5310 +msgid "ElectroPlating Calculator:" +msgstr "ElectroPlating Calculator:" + +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolCalculators.py:152 +msgid "" +"This calculator is useful for those who plate the via/pad/drill holes,\n" +"using a method like grahite ink or calcium hypophosphite ink or palladium " +"chloride." +msgstr "" +"This calculator is useful for those who plate the via/pad/drill holes,\n" +"using a method like grahite ink or calcium hypophosphite ink or palladium " +"chloride." + +#: flatcamGUI/FlatCAMGUI.py:5322 flatcamTools/ToolCalculators.py:161 +msgid "Board Length:" +msgstr "Board Length:" + +#: flatcamGUI/FlatCAMGUI.py:5324 flatcamTools/ToolCalculators.py:165 +msgid "This is the board length. In centimeters." +msgstr "This is the board length. In centimeters." + +#: flatcamGUI/FlatCAMGUI.py:5330 flatcamTools/ToolCalculators.py:167 +msgid "Board Width:" +msgstr "Board Width:" + +#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCalculators.py:171 +msgid "This is the board width.In centimeters." +msgstr "This is the board width.In centimeters." + +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolCalculators.py:173 +msgid "Current Density:" +msgstr "Current Density:" + +#: flatcamGUI/FlatCAMGUI.py:5340 flatcamTools/ToolCalculators.py:177 +msgid "" +"Current density to pass through the board. \n" +"In Amps per Square Feet ASF." +msgstr "" +"Current density to pass through the board. \n" +"In Amps per Square Feet ASF." + +#: flatcamGUI/FlatCAMGUI.py:5346 flatcamTools/ToolCalculators.py:181 +msgid "Copper Growth:" +msgstr "Copper Growth:" + +#: flatcamGUI/FlatCAMGUI.py:5349 flatcamTools/ToolCalculators.py:185 +msgid "" +"How thick the copper growth is intended to be.\n" +"In microns." +msgstr "" +"How thick the copper growth is intended to be.\n" +"In microns." + +#: flatcamGUI/FlatCAMGUI.py:5362 +msgid "Transform Tool Options" +msgstr "Transform Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5367 +msgid "" +"Various transformations that can be applied\n" +"on a FlatCAM object." +msgstr "" +"Various transformations that can be applied\n" +"on a FlatCAM object." + +#: flatcamGUI/FlatCAMGUI.py:5377 +msgid "Rotate Angle:" +msgstr "Rotate Angle:" + +#: flatcamGUI/FlatCAMGUI.py:5379 +msgid "Angle for rotation. In degrees." +msgstr "Angle for rotation. In degrees." + +#: flatcamGUI/FlatCAMGUI.py:5386 +msgid "Skew_X angle:" +msgstr "Skew_X angle:" + +#: flatcamGUI/FlatCAMGUI.py:5388 +msgid "Angle for Skew/Shear on X axis. In degrees." +msgstr "Angle for Skew/Shear on X axis. In degrees." + +#: flatcamGUI/FlatCAMGUI.py:5395 +msgid "Skew_Y angle:" +msgstr "Skew_Y angle:" + +#: flatcamGUI/FlatCAMGUI.py:5397 +msgid "Angle for Skew/Shear on Y axis. In degrees." +msgstr "Angle for Skew/Shear on Y axis. In degrees." + +#: flatcamGUI/FlatCAMGUI.py:5404 +msgid "Scale_X factor:" +msgstr "Scale_X factor:" + +#: flatcamGUI/FlatCAMGUI.py:5406 +msgid "Factor for scaling on X axis." +msgstr "Factor for scaling on X axis." + +#: flatcamGUI/FlatCAMGUI.py:5413 +msgid "Scale_Y factor:" +msgstr "Scale_Y factor:" + +#: flatcamGUI/FlatCAMGUI.py:5415 +msgid "Factor for scaling on Y axis." +msgstr "Factor for scaling on Y axis." + +#: flatcamGUI/FlatCAMGUI.py:5423 +msgid "" +"Scale the selected object(s)\n" +"using the Scale_X factor for both axis." +msgstr "" +"Scale the selected object(s)\n" +"using the Scale_X factor for both axis." + +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolTransform.py:210 +msgid "" +"Scale the selected object(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected objects when unchecked." +msgstr "" +"Scale the selected object(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected objects when unchecked." + +#: flatcamGUI/FlatCAMGUI.py:5440 +msgid "Offset_X val:" +msgstr "Offset_X val:" + +#: flatcamGUI/FlatCAMGUI.py:5442 +msgid "Distance to offset on X axis. In current units." +msgstr "Distance to offset on X axis. In current units." + +#: flatcamGUI/FlatCAMGUI.py:5449 +msgid "Offset_Y val:" +msgstr "Offset_Y val:" + +#: flatcamGUI/FlatCAMGUI.py:5451 +msgid "Distance to offset on Y axis. In current units." +msgstr "Distance to offset on Y axis. In current units." + +#: flatcamGUI/FlatCAMGUI.py:5457 +msgid "Mirror Reference" +msgstr "Mirror Reference" + +#: flatcamGUI/FlatCAMGUI.py:5459 flatcamTools/ToolTransform.py:314 +msgid "" +"Flip the selected object(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" +"Flip the selected object(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" + +#: flatcamGUI/FlatCAMGUI.py:5470 +msgid " Mirror Ref. Point:" +msgstr " Mirror Ref. Point:" + +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamTools/ToolTransform.py:327 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y and" +msgstr "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y and" + +#: flatcamGUI/FlatCAMGUI.py:5489 +msgid "SolderPaste Tool Options" +msgstr "SolderPaste Tool Options" + +#: flatcamGUI/FlatCAMGUI.py:5494 +msgid "" +"A tool to create GCode for dispensing\n" +"solder paste onto a PCB." +msgstr "" +"A tool to create GCode for dispensing\n" +"solder paste onto a PCB." + +#: flatcamGUI/FlatCAMGUI.py:5505 +msgid "Diameters of nozzle tools, separated by ','" +msgstr "Diameters of nozzle tools, separated by ','" + +#: flatcamGUI/FlatCAMGUI.py:5512 +msgid "New Nozzle Dia:" +msgstr "New Nozzle Dia:" + +#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolSolderPaste.py:103 +msgid "Diameter for the new Nozzle tool to add in the Tool Table" +msgstr "Diameter for the new Nozzle tool to add in the Tool Table" + +#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolSolderPaste.py:166 +msgid "Z Dispense Start:" +msgstr "Z Dispense Start:" + +#: flatcamGUI/FlatCAMGUI.py:5524 flatcamTools/ToolSolderPaste.py:168 +msgid "The height (Z) when solder paste dispensing starts." +msgstr "The height (Z) when solder paste dispensing starts." + +#: flatcamGUI/FlatCAMGUI.py:5531 flatcamTools/ToolSolderPaste.py:174 +msgid "Z Dispense:" +msgstr "Z Dispense:" + +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamTools/ToolSolderPaste.py:176 +msgid "The height (Z) when doing solder paste dispensing." +msgstr "The height (Z) when doing solder paste dispensing." + +#: flatcamGUI/FlatCAMGUI.py:5540 flatcamTools/ToolSolderPaste.py:183 +msgid "Z Dispense Stop:" +msgstr "Z Dispense Stop:" + +#: flatcamGUI/FlatCAMGUI.py:5542 flatcamTools/ToolSolderPaste.py:185 +msgid "The height (Z) when solder paste dispensing stops." +msgstr "The height (Z) when solder paste dispensing stops." + +#: flatcamGUI/FlatCAMGUI.py:5549 flatcamTools/ToolSolderPaste.py:191 +msgid "Z Travel:" +msgstr "Z Travel:" + +#: flatcamGUI/FlatCAMGUI.py:5551 flatcamTools/ToolSolderPaste.py:193 +msgid "" +"The height (Z) for travel between pads\n" +"(without dispensing solder paste)." +msgstr "" +"The height (Z) for travel between pads\n" +"(without dispensing solder paste)." + +#: flatcamGUI/FlatCAMGUI.py:5559 flatcamTools/ToolSolderPaste.py:200 +msgid "Z Toolchange:" +msgstr "Z Toolchange:" + +#: flatcamGUI/FlatCAMGUI.py:5561 flatcamTools/ToolSolderPaste.py:202 +msgid "The height (Z) for tool (nozzle) change." +msgstr "The height (Z) for tool (nozzle) change." + +#: flatcamGUI/FlatCAMGUI.py:5568 flatcamTools/ToolSolderPaste.py:208 +msgid "XY Toolchange:" +msgstr "XY Toolchange:" + +#: flatcamGUI/FlatCAMGUI.py:5570 flatcamTools/ToolSolderPaste.py:210 +msgid "" +"The X,Y location for tool (nozzle) change.\n" +"The format is (x, y) where x and y are real numbers." +msgstr "" +"The X,Y location for tool (nozzle) change.\n" +"The format is (x, y) where x and y are real numbers." + +#: flatcamGUI/FlatCAMGUI.py:5578 flatcamTools/ToolSolderPaste.py:217 +msgid "Feedrate X-Y:" +msgstr "Feedrate X-Y:" + +#: flatcamGUI/FlatCAMGUI.py:5580 flatcamTools/ToolSolderPaste.py:219 +msgid "Feedrate (speed) while moving on the X-Y plane." +msgstr "Feedrate (speed) while moving on the X-Y plane." + +#: flatcamGUI/FlatCAMGUI.py:5587 flatcamTools/ToolSolderPaste.py:225 +msgid "Feedrate Z:" +msgstr "Feedrate Z:" + +#: flatcamGUI/FlatCAMGUI.py:5589 flatcamTools/ToolSolderPaste.py:227 +msgid "" +"Feedrate (speed) while moving vertically\n" +"(on Z plane)." +msgstr "" +"Feedrate (speed) while moving vertically\n" +"(on Z plane)." + +#: flatcamGUI/FlatCAMGUI.py:5597 flatcamTools/ToolSolderPaste.py:234 +msgid "Feedrate Z Dispense:" +msgstr "Feedrate Z Dispense:" + +#: flatcamGUI/FlatCAMGUI.py:5599 flatcamTools/ToolSolderPaste.py:236 +msgid "" +"Feedrate (speed) while moving up vertically\n" +" to Dispense position (on Z plane)." +msgstr "" +"Feedrate (speed) while moving up vertically\n" +" to Dispense position (on Z plane)." + +#: flatcamGUI/FlatCAMGUI.py:5607 flatcamTools/ToolSolderPaste.py:243 +msgid "Spindle Speed FWD:" +msgstr "Spindle Speed FWD:" + +#: flatcamGUI/FlatCAMGUI.py:5609 flatcamTools/ToolSolderPaste.py:245 +msgid "" +"The dispenser speed while pushing solder paste\n" +"through the dispenser nozzle." +msgstr "" +"The dispenser speed while pushing solder paste\n" +"through the dispenser nozzle." + +#: flatcamGUI/FlatCAMGUI.py:5617 flatcamTools/ToolSolderPaste.py:252 +msgid "Dwell FWD:" +msgstr "Dwell FWD:" + +#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolSolderPaste.py:254 +msgid "Pause after solder dispensing." +msgstr "Pause after solder dispensing." + +#: flatcamGUI/FlatCAMGUI.py:5626 flatcamTools/ToolSolderPaste.py:260 +msgid "Spindle Speed REV:" +msgstr "Spindle Speed REV:" + +#: flatcamGUI/FlatCAMGUI.py:5628 flatcamTools/ToolSolderPaste.py:262 +msgid "" +"The dispenser speed while retracting solder paste\n" +"through the dispenser nozzle." +msgstr "" +"The dispenser speed while retracting solder paste\n" +"through the dispenser nozzle." + +#: flatcamGUI/FlatCAMGUI.py:5636 flatcamTools/ToolSolderPaste.py:269 +msgid "Dwell REV:" +msgstr "Dwell REV:" + +#: flatcamGUI/FlatCAMGUI.py:5638 flatcamTools/ToolSolderPaste.py:271 +msgid "" +"Pause after solder paste dispenser retracted,\n" +"to allow pressure equilibrium." +msgstr "" +"Pause after solder paste dispenser retracted,\n" +"to allow pressure equilibrium." + +#: flatcamGUI/FlatCAMGUI.py:5645 flatcamTools/ToolSolderPaste.py:277 +msgid "PostProcessors:" +msgstr "PostProcessors:" + +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolSolderPaste.py:279 +msgid "Files that control the GCode generation." +msgstr "Files that control the GCode generation." + +#: flatcamGUI/FlatCAMGUI.py:5677 flatcamGUI/FlatCAMGUI.py:5683 +msgid "Idle." +msgstr "Idle." + +#: flatcamGUI/FlatCAMGUI.py:5707 +msgid "Application started ..." +msgstr "Application started ..." + +#: flatcamGUI/FlatCAMGUI.py:5708 +msgid "Hello!" +msgstr "Hello!" + +#: flatcamGUI/ObjectUI.py:33 +msgid "FlatCAM Object" +msgstr "FlatCAM Object" + +#: flatcamGUI/ObjectUI.py:58 +msgid "" +"BASIC is suitable for a beginner. Many parameters\n" +"are hidden from the user in this mode.\n" +"ADVANCED mode will make available all parameters.\n" +"\n" +"To change the application LEVEL, go to:\n" +"Edit -> Preferences -> General and check:\n" +"'APP. LEVEL' radio button." +msgstr "" +"BASIC is suitable for a beginner. Many parameters\n" +"are hidden from the user in this mode.\n" +"ADVANCED mode will make available all parameters.\n" +"\n" +"To change the application LEVEL, go to:\n" +"Edit -> Preferences -> General and check:\n" +"'APP. LEVEL' radio button." + +#: flatcamGUI/ObjectUI.py:79 +msgid "Scale:" +msgstr "Scale:" + +#: flatcamGUI/ObjectUI.py:81 +msgid "Change the size of the object." +msgstr "Change the size of the object." + +#: flatcamGUI/ObjectUI.py:89 +msgid "Factor:" +msgstr "Factor:" + +#: flatcamGUI/ObjectUI.py:91 +msgid "" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" +"Factor by which to multiply\n" +"geometric features of this object." + +#: flatcamGUI/ObjectUI.py:102 +msgid "Perform scaling operation." +msgstr "Perform scaling operation." + +#: flatcamGUI/ObjectUI.py:108 +msgid "Offset:" +msgstr "Offset:" + +#: flatcamGUI/ObjectUI.py:110 +msgid "Change the position of this object." +msgstr "Change the position of this object." + +#: flatcamGUI/ObjectUI.py:117 +msgid "Vector:" +msgstr "Vector:" + +#: flatcamGUI/ObjectUI.py:119 +msgid "" +"Amount by which to move the object\n" +"in the x and y axes in (x, y) format." +msgstr "" +"Amount by which to move the object\n" +"in the x and y axes in (x, y) format." + +#: flatcamGUI/ObjectUI.py:129 +msgid "Perform the offset operation." +msgstr "Perform the offset operation." + +#: flatcamGUI/ObjectUI.py:143 +msgid "Gerber Object" +msgstr "Gerber Object" + +#: flatcamGUI/ObjectUI.py:156 +msgid "Solid " +msgstr "Solid " + +#: flatcamGUI/ObjectUI.py:164 +msgid "M-Color " +msgstr "M-Color " + +#: flatcamGUI/ObjectUI.py:182 flatcamGUI/ObjectUI.py:588 +#: flatcamGUI/ObjectUI.py:907 flatcamGUI/ObjectUI.py:1437 +msgid "Name:" +msgstr "Name:" + +#: flatcamGUI/ObjectUI.py:192 +msgid "Apertures:" +msgstr "Apertures:" + +#: flatcamGUI/ObjectUI.py:194 +msgid "Apertures Table for the Gerber Object." +msgstr "Apertures Table for the Gerber Object." + +#: flatcamGUI/ObjectUI.py:203 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"Toggle the display of the Gerber Apertures Table.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." + +#: flatcamGUI/ObjectUI.py:214 +msgid "Mark All" +msgstr "Mark All" + +#: flatcamGUI/ObjectUI.py:216 +msgid "" +"When checked it will display all the apertures.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"When checked it will display all the apertures.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." + +#: flatcamGUI/ObjectUI.py:228 +msgid "Code" +msgstr "Code" + +#: flatcamGUI/ObjectUI.py:228 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 +msgid "Type" +msgstr "Type" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Size" +msgstr "Size" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Dim" +msgstr "Dim" + +#: flatcamGUI/ObjectUI.py:232 +msgid "Index" +msgstr "Index" + +#: flatcamGUI/ObjectUI.py:234 +msgid "Aperture Code" +msgstr "Aperture Code" + +#: flatcamGUI/ObjectUI.py:236 +msgid "Type of aperture: circular, rectangle, macros etc" +msgstr "Type of aperture: circular, rectangle, macros etc" + +#: flatcamGUI/ObjectUI.py:238 +msgid "Aperture Size:" +msgstr "Aperture Size:" + +#: flatcamGUI/ObjectUI.py:240 +msgid "" +"Aperture Dimensions:\n" +" - (width, height) for R, O type.\n" +" - (dia, nVertices) for P type" +msgstr "" +"Aperture Dimensions:\n" +" - (width, height) for R, O type.\n" +" - (dia, nVertices) for P type" + +#: flatcamGUI/ObjectUI.py:244 +msgid "Mark the aperture instances on canvas." +msgstr "Mark the aperture instances on canvas." + +#: flatcamGUI/ObjectUI.py:252 +msgid "Scale Factor:" +msgstr "Scale Factor:" + +#: flatcamGUI/ObjectUI.py:267 +msgid "Perform scaling operation on the selected apertures." +msgstr "Perform scaling operation on the selected apertures." + +#: flatcamGUI/ObjectUI.py:273 +msgid "Buffer Factor:" +msgstr "Buffer Factor:" + +#: flatcamGUI/ObjectUI.py:286 +msgid "Buffer" +msgstr "Buffer" + +#: flatcamGUI/ObjectUI.py:288 +msgid "Perform buffer operation on the selected apertures." +msgstr "Perform buffer operation on the selected apertures." + +#: flatcamGUI/ObjectUI.py:296 +msgid "Generate new Gerber Object:" +msgstr "Generate new Gerber Object:" + +#: flatcamGUI/ObjectUI.py:298 +msgid "Will generate a new Gerber object from the changed apertures." +msgstr "Will generate a new Gerber object from the changed apertures." + +#: flatcamGUI/ObjectUI.py:304 +msgid "Go" +msgstr "Go" + +#: flatcamGUI/ObjectUI.py:306 +msgid "" +"Will generate a new Gerber object from the changed apertures.\n" +"This new object can then be isolated etc." +msgstr "" +"Will generate a new Gerber object from the changed apertures.\n" +"This new object can then be isolated etc." + +#: flatcamGUI/ObjectUI.py:333 +msgid "" +"Diameter of the cutting tool.\n" +"If you want to have an isolation path\n" +"inside the actual shape of the Gerber\n" +"feature, use a negative value for\n" +"this parameter." +msgstr "" +"Diameter of the cutting tool.\n" +"If you want to have an isolation path\n" +"inside the actual shape of the Gerber\n" +"feature, use a negative value for\n" +"this parameter." + +#: flatcamGUI/ObjectUI.py:344 +msgid "Passes:" +msgstr "Passes:" + +#: flatcamGUI/ObjectUI.py:378 +msgid "Combine" +msgstr "Combine" + +#: flatcamGUI/ObjectUI.py:394 +msgid "Generate Isolation Geometry:" +msgstr "Generate Isolation Geometry:" + +#: flatcamGUI/ObjectUI.py:396 +msgid "" +"Create a Geometry object with toolpaths to cut \n" +"isolation outside, inside or on both sides of the\n" +"object. For a Gerber object outside means outside\n" +"of the Gerber feature and inside means inside of\n" +"the Gerber feature, if possible at all. This means\n" +"that only if the Gerber feature has openings inside, they\n" +"will be isolated. If what is wanted is to cut isolation\n" +"inside the actual Gerber feature, use a negative tool\n" +"diameter above." +msgstr "" +"Create a Geometry object with toolpaths to cut \n" +"isolation outside, inside or on both sides of the\n" +"object. For a Gerber object outside means outside\n" +"of the Gerber feature and inside means inside of\n" +"the Gerber feature, if possible at all. This means\n" +"that only if the Gerber feature has openings inside, they\n" +"will be isolated. If what is wanted is to cut isolation\n" +"inside the actual Gerber feature, use a negative tool\n" +"diameter above." + +#: flatcamGUI/ObjectUI.py:415 +msgid "FULL Geo" +msgstr "FULL Geo" + +#: flatcamGUI/ObjectUI.py:417 +msgid "" +"Create the Geometry Object\n" +"for isolation routing. It contains both\n" +"the interiors and exteriors geometry." +msgstr "" +"Create the Geometry Object\n" +"for isolation routing. It contains both\n" +"the interiors and exteriors geometry." + +#: flatcamGUI/ObjectUI.py:426 +msgid "Ext Geo" +msgstr "Ext Geo" + +#: flatcamGUI/ObjectUI.py:428 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the exteriors geometry." +msgstr "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the exteriors geometry." + +#: flatcamGUI/ObjectUI.py:435 +msgid "Int Geo" +msgstr "Int Geo" + +#: flatcamGUI/ObjectUI.py:437 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the interiors geometry." +msgstr "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the interiors geometry." + +#: flatcamGUI/ObjectUI.py:455 +msgid "Clear N-copper:" +msgstr "Clear N-copper:" + +#: flatcamGUI/ObjectUI.py:465 flatcamTools/ToolNonCopperClear.py:239 +msgid "" +"Create the Geometry Object\n" +"for non-copper routing." +msgstr "" +"Create the Geometry Object\n" +"for non-copper routing." + +#: flatcamGUI/ObjectUI.py:471 +msgid "Board cutout:" +msgstr "Board cutout:" + +#: flatcamGUI/ObjectUI.py:479 +msgid "Cutout Tool" +msgstr "Cutout Tool" + +#: flatcamGUI/ObjectUI.py:481 +msgid "" +"Generate the geometry for\n" +"the board cutout." +msgstr "" +"Generate the geometry for\n" +"the board cutout." + +#: flatcamGUI/ObjectUI.py:487 +msgid "Non-copper regions:" +msgstr "Non-copper regions:" + +#: flatcamGUI/ObjectUI.py:489 +msgid "" +"Create polygons covering the\n" +"areas without copper on the PCB.\n" +"Equivalent to the inverse of this\n" +"object. Can be used to remove all\n" +"copper from a specified region." +msgstr "" +"Create polygons covering the\n" +"areas without copper on the PCB.\n" +"Equivalent to the inverse of this\n" +"object. Can be used to remove all\n" +"copper from a specified region." + +#: flatcamGUI/ObjectUI.py:514 flatcamGUI/ObjectUI.py:545 +msgid "Rounded Geo" +msgstr "Rounded Geo" + +#: flatcamGUI/ObjectUI.py:516 +msgid "Resulting geometry will have rounded corners." +msgstr "Resulting geometry will have rounded corners." + +#: flatcamGUI/ObjectUI.py:521 flatcamGUI/ObjectUI.py:555 +#: flatcamTools/ToolCutOut.py:159 flatcamTools/ToolCutOut.py:179 +#: flatcamTools/ToolCutOut.py:230 flatcamTools/ToolSolderPaste.py:127 +msgid "Generate Geo" +msgstr "Generate Geo" + +#: flatcamGUI/ObjectUI.py:527 +msgid "" +"Create a geometry surrounding the Gerber object.\n" +"Square shape." +msgstr "" +"Create a geometry surrounding the Gerber object.\n" +"Square shape." + +#: flatcamGUI/ObjectUI.py:557 +msgid "Generate the Geometry object." +msgstr "Generate the Geometry object." + +#: flatcamGUI/ObjectUI.py:568 +msgid "Excellon Object" +msgstr "Excellon Object" + +#: flatcamGUI/ObjectUI.py:579 +msgid "Solid circles." +msgstr "Solid circles." + +#: flatcamGUI/ObjectUI.py:607 flatcamGUI/ObjectUI.py:926 +msgid "Tools Table" +msgstr "Tools Table" + +#: flatcamGUI/ObjectUI.py:628 +msgid "Offset Z" +msgstr "Offset Z" + +#: flatcamGUI/ObjectUI.py:632 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn in the Machine Code." +msgstr "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn in the Machine Code." + +#: flatcamGUI/ObjectUI.py:636 flatcamGUI/ObjectUI.py:972 +#: flatcamTools/ToolNonCopperClear.py:96 flatcamTools/ToolPaint.py:94 +msgid "" +"Tool Diameter. It's value (in current FlatCAM units) \n" +"is the cut width into the material." +msgstr "" +"Tool Diameter. It's value (in current FlatCAM units) \n" +"is the cut width into the material." + +#: flatcamGUI/ObjectUI.py:639 +msgid "" +"The number of Drill holes. Holes that are drilled with\n" +"a drill bit." +msgstr "" +"The number of Drill holes. Holes that are drilled with\n" +"a drill bit." + +#: flatcamGUI/ObjectUI.py:642 +msgid "" +"The number of Slot holes. Holes that are created by\n" +"milling them with an endmill bit." +msgstr "" +"The number of Slot holes. Holes that are created by\n" +"milling them with an endmill bit." + +#: flatcamGUI/ObjectUI.py:649 +msgid "Toggle display of the drills for the current tool." +msgstr "Toggle display of the drills for the current tool." + +#: flatcamGUI/ObjectUI.py:657 +msgid "" +"Create a CNC Job object\n" +"for this drill object." +msgstr "" +"Create a CNC Job object\n" +"for this drill object." + +#: flatcamGUI/ObjectUI.py:686 flatcamGUI/ObjectUI.py:1186 +msgid "Tool change" +msgstr "Tool change" + +#: flatcamGUI/ObjectUI.py:694 flatcamGUI/ObjectUI.py:1179 +msgid "Tool change Z:" +msgstr "Tool change Z:" + +#: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1182 +msgid "" +"Z-axis position (height) for\n" +"tool change." +msgstr "" +"Z-axis position (height) for\n" +"tool change." + +#: flatcamGUI/ObjectUI.py:707 +msgid "" +"Tool height just before starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Tool height just before starting the work.\n" +"Delete the value if you don't need this feature." + +#: flatcamGUI/ObjectUI.py:717 +msgid "" +"Z-axis position (height) for\n" +"the last move." +msgstr "" +"Z-axis position (height) for\n" +"the last move." + +#: flatcamGUI/ObjectUI.py:725 +msgid "Feedrate (Plunge):" +msgstr "Feedrate (Plunge):" + +#: flatcamGUI/ObjectUI.py:727 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for linear move G01." +msgstr "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for linear move G01." + +#: flatcamGUI/ObjectUI.py:777 +msgid "" +"The json file that dictates\n" +"gcode output." +msgstr "" +"The json file that dictates\n" +"gcode output." + +#: flatcamGUI/ObjectUI.py:809 +msgid "" +"Select from the Tools Table above\n" +"the tools you want to include." +msgstr "" +"Select from the Tools Table above\n" +"the tools you want to include." + +#: flatcamGUI/ObjectUI.py:816 +msgid "Type: " +msgstr "Type: " + +#: flatcamGUI/ObjectUI.py:818 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to a series of drills." +msgstr "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to a series of drills." + +#: flatcamGUI/ObjectUI.py:833 +msgid "Create GCode" +msgstr "Create GCode" + +#: flatcamGUI/ObjectUI.py:835 +msgid "Generate the CNC Job." +msgstr "Generate the CNC Job." + +#: flatcamGUI/ObjectUI.py:847 +msgid "" +"Select from the Tools Table above\n" +" the hole dias that are to be milled." +msgstr "" +"Select from the Tools Table above\n" +" the hole dias that are to be milled." + +#: flatcamGUI/ObjectUI.py:854 +msgid "Drills Tool dia:" +msgstr "Drills Tool dia:" + +#: flatcamGUI/ObjectUI.py:861 +msgid "Mill Drills Geo" +msgstr "Mill Drills Geo" + +#: flatcamGUI/ObjectUI.py:863 +msgid "" +"Create the Geometry Object\n" +"for milling DRILLS toolpaths." +msgstr "" +"Create the Geometry Object\n" +"for milling DRILLS toolpaths." + +#: flatcamGUI/ObjectUI.py:870 +msgid "Slots Tool dia:" +msgstr "Slots Tool dia:" + +#: flatcamGUI/ObjectUI.py:877 +msgid "Mill Slots Geo" +msgstr "Mill Slots Geo" + +#: flatcamGUI/ObjectUI.py:879 +msgid "" +"Create the Geometry Object\n" +"for milling SLOTS toolpaths." +msgstr "" +"Create the Geometry Object\n" +"for milling SLOTS toolpaths." + +#: flatcamGUI/ObjectUI.py:897 +msgid "Geometry Object" +msgstr "Geometry Object" + +#: flatcamGUI/ObjectUI.py:928 +msgid "" +"Tools in this Geometry object used for cutting.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V). \n" +"When V-shaped is selected the 'Type' entry is automatically \n" +"set to Isolation, the CutZ parameter in the UI form is\n" +"grayed out and Cut Z is automatically calculated from the newly \n" +"showed UI form entries named V-Tip Dia and V-Tip Angle." +msgstr "" +"Tools in this Geometry object used for cutting.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V). \n" +"When V-shaped is selected the 'Type' entry is automatically \n" +"set to Isolation, the CutZ parameter in the UI form is\n" +"grayed out and Cut Z is automatically calculated from the newly \n" +"showed UI form entries named V-Tip Dia and V-Tip Angle." + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "Dia" +msgstr "Dia" + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "TT" +msgstr "TT" + +#: flatcamGUI/ObjectUI.py:966 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn" +msgstr "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn" + +#: flatcamGUI/ObjectUI.py:977 +msgid "" +"The value for the Offset can be:\n" +"- Path -> There is no offset, the tool cut will be done through the geometry " +"line.\n" +"- In(side) -> The tool cut will follow the geometry inside. It will create a " +"'pocket'.\n" +"- Out(side) -> The tool cut will follow the geometry line on the outside." +msgstr "" +"The value for the Offset can be:\n" +"- Path -> There is no offset, the tool cut will be done through the geometry " +"line.\n" +"- In(side) -> The tool cut will follow the geometry inside. It will create a " +"'pocket'.\n" +"- Out(side) -> The tool cut will follow the geometry line on the outside." + +#: flatcamGUI/ObjectUI.py:984 +msgid "" +"The (Operation) Type has only informative value. Usually the UI form " +"values \n" +"are choosed based on the operation type and this will serve as a reminder.\n" +"Can be 'Roughing', 'Finishing' or 'Isolation'.\n" +"For Roughing we may choose a lower Feedrate and multiDepth cut.\n" +"For Finishing we may choose a higher Feedrate, without multiDepth.\n" +"For Isolation we need a lower Feedrate as it use a milling bit with a fine " +"tip." +msgstr "" +"The (Operation) Type has only informative value. Usually the UI form " +"values \n" +"are choosed based on the operation type and this will serve as a reminder.\n" +"Can be 'Roughing', 'Finishing' or 'Isolation'.\n" +"For Roughing we may choose a lower Feedrate and multiDepth cut.\n" +"For Finishing we may choose a higher Feedrate, without multiDepth.\n" +"For Isolation we need a lower Feedrate as it use a milling bit with a fine " +"tip." + +#: flatcamGUI/ObjectUI.py:993 +msgid "" +"The Tool Type (TT) can be:\n" +"- Circular with 1 ... 4 teeth -> it is informative only. Being circular the " +"cut width in material\n" +"is exactly the tool diameter.\n" +"- Ball -> informative only and make reference to the Ball type endmill.\n" +"- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable " +"two additional UI form\n" +"fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust " +"the Z-Cut parameter such\n" +"as the cut width into material will be equal with the value in the Tool " +"Diameter column of this table.\n" +"Choosing the V-Shape Tool Type automatically will select the Operation Type " +"as Isolation." +msgstr "" +"The Tool Type (TT) can be:\n" +"- Circular with 1 ... 4 teeth -> it is informative only. Being circular the " +"cut width in material\n" +"is exactly the tool diameter.\n" +"- Ball -> informative only and make reference to the Ball type endmill.\n" +"- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable " +"two additional UI form\n" +"fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust " +"the Z-Cut parameter such\n" +"as the cut width into material will be equal with the value in the Tool " +"Diameter column of this table.\n" +"Choosing the V-Shape Tool Type automatically will select the Operation Type " +"as Isolation." + +#: flatcamGUI/ObjectUI.py:1004 +msgid "" +"Plot column. It is visible only for MultiGeo geometries, meaning geometries " +"that holds the geometry\n" +"data into the tools. For those geometries, deleting the tool will delete the " +"geometry data also,\n" +"so be WARNED. From the checkboxes on each row it can be enabled/disabled the " +"plot on canvas\n" +"for the corresponding tool." +msgstr "" +"Plot column. It is visible only for MultiGeo geometries, meaning geometries " +"that holds the geometry\n" +"data into the tools. For those geometries, deleting the tool will delete the " +"geometry data also,\n" +"so be WARNED. From the checkboxes on each row it can be enabled/disabled the " +"plot on canvas\n" +"for the corresponding tool." + +#: flatcamGUI/ObjectUI.py:1017 +msgid "Tool Offset:" +msgstr "Tool Offset:" + +#: flatcamGUI/ObjectUI.py:1020 +msgid "" +"The value to offset the cut when \n" +"the Offset type selected is 'Offset'.\n" +"The value can be positive for 'outside'\n" +"cut and negative for 'inside' cut." +msgstr "" +"The value to offset the cut when \n" +"the Offset type selected is 'Offset'.\n" +"The value can be positive for 'outside'\n" +"cut and negative for 'inside' cut." + +#: flatcamGUI/ObjectUI.py:1043 +msgid "Tool Dia:" +msgstr "Tool Dia:" + +#: flatcamGUI/ObjectUI.py:1062 flatcamTools/ToolNonCopperClear.py:135 +#: flatcamTools/ToolPaint.py:133 +msgid "" +"Add a new tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" +"Add a new tool to the Tool Table\n" +"with the diameter specified above." + +#: flatcamGUI/ObjectUI.py:1070 +msgid "" +"Copy a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" +"Copy a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." + +#: flatcamGUI/ObjectUI.py:1078 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." + +#: flatcamGUI/ObjectUI.py:1094 +msgid "Tool Data" +msgstr "Tool Data" + +#: flatcamGUI/ObjectUI.py:1097 +msgid "" +"The data used for creating GCode.\n" +"Each tool store it's own set of such data." +msgstr "" +"The data used for creating GCode.\n" +"Each tool store it's own set of such data." + +#: flatcamGUI/ObjectUI.py:1107 +msgid "V-Tip Dia:" +msgstr "V-Tip Dia:" + +#: flatcamGUI/ObjectUI.py:1110 +msgid "The tip diameter for V-Shape Tool" +msgstr "The tip diameter for V-Shape Tool" + +#: flatcamGUI/ObjectUI.py:1118 +msgid "V-Tip Angle:" +msgstr "V-Tip Angle:" + +#: flatcamGUI/ObjectUI.py:1121 +msgid "" +"The tip angle for V-Shape Tool.\n" +"In degree." +msgstr "" +"The tip angle for V-Shape Tool.\n" +"In degree." + +#: flatcamGUI/ObjectUI.py:1142 +msgid "Multi-Depth:" +msgstr "Multi-Depth:" + +#: flatcamGUI/ObjectUI.py:1145 +msgid "" +"Use multiple passes to limit\n" +"the cut depth in each pass. Will\n" +"cut multiple times until Cut Z is\n" +"reached.\n" +"To the right, input the depth of \n" +"each pass (positive value)." +msgstr "" +"Use multiple passes to limit\n" +"the cut depth in each pass. Will\n" +"cut multiple times until Cut Z is\n" +"reached.\n" +"To the right, input the depth of \n" +"each pass (positive value)." + +#: flatcamGUI/ObjectUI.py:1158 +msgid "Depth of each pass (positive)." +msgstr "Depth of each pass (positive)." + +#: flatcamGUI/ObjectUI.py:1189 +msgid "" +"Include tool-change sequence\n" +"in the Machine Code (Pause for tool change)." +msgstr "" +"Include tool-change sequence\n" +"in the Machine Code (Pause for tool change)." + +#: flatcamGUI/ObjectUI.py:1215 +msgid "" +"This is the height (Z) at which the CNC\n" +"will go as the last move." +msgstr "" +"This is the height (Z) at which the CNC\n" +"will go as the last move." + +#: flatcamGUI/ObjectUI.py:1236 +msgid "Feed Rate Z (Plunge):" +msgstr "Feed Rate Z (Plunge):" + +#: flatcamGUI/ObjectUI.py:1239 +msgid "" +"Cutting speed in the Z\n" +"plane in units per minute" +msgstr "" +"Cutting speed in the Z\n" +"plane in units per minute" + +#: flatcamGUI/ObjectUI.py:1248 +msgid "Feed Rate Rapids:" +msgstr "Feed Rate Rapids:" + +#: flatcamGUI/ObjectUI.py:1251 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Cutting speed in the XY\n" +"plane in units per minute\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." + +#: flatcamGUI/ObjectUI.py:1264 +msgid "Cut over 1st pt" +msgstr "Cut over 1st pt" + +#: flatcamGUI/ObjectUI.py:1279 +msgid "" +"Speed of the spindle in RPM (optional).\n" +"If LASER postprocessor is used,\n" +"this value is the power of laser." +msgstr "" +"Speed of the spindle in RPM (optional).\n" +"If LASER postprocessor is used,\n" +"this value is the power of laser." + +#: flatcamGUI/ObjectUI.py:1308 +msgid "PostProcessor:" +msgstr "PostProcessor:" + +#: flatcamGUI/ObjectUI.py:1311 +msgid "" +"The Postprocessor file that dictates\n" +"the Machine Code (like GCode, RML, HPGL) output." +msgstr "" +"The Postprocessor file that dictates\n" +"the Machine Code (like GCode, RML, HPGL) output." + +#: flatcamGUI/ObjectUI.py:1349 +msgid "" +"Add at least one tool in the tool-table.\n" +"Click the header to select all, or Ctrl + LMB\n" +"for custom selection of tools." +msgstr "" +"Add at least one tool in the tool-table.\n" +"Click the header to select all, or Ctrl + LMB\n" +"for custom selection of tools." + +#: flatcamGUI/ObjectUI.py:1356 +msgid "Generate" +msgstr "Generate" + +#: flatcamGUI/ObjectUI.py:1359 +msgid "Generate the CNC Job object." +msgstr "Generate the CNC Job object." + +#: flatcamGUI/ObjectUI.py:1367 +msgid "Paint Area:" +msgstr "Paint Area:" + +#: flatcamGUI/ObjectUI.py:1382 +msgid "Launch Paint Tool in Tools Tab." +msgstr "Launch Paint Tool in Tools Tab." + +#: flatcamGUI/ObjectUI.py:1399 +msgid "CNC Job Object" +msgstr "CNC Job Object" + +#: flatcamGUI/ObjectUI.py:1418 +msgid "Plot kind:" +msgstr "Plot kind:" + +#: flatcamGUI/ObjectUI.py:1443 +msgid "Travelled dist.:" +msgstr "Travelled dist.:" + +#: flatcamGUI/ObjectUI.py:1446 flatcamGUI/ObjectUI.py:1453 +msgid "" +"This is the total travelled distance on X-Y plane.\n" +"In current units." +msgstr "" +"This is the total travelled distance on X-Y plane.\n" +"In current units." + +#: flatcamGUI/ObjectUI.py:1481 +msgid "CNC Tools Table" +msgstr "CNC Tools Table" + +#: flatcamGUI/ObjectUI.py:1484 +msgid "" +"Tools in this CNCJob object used for cutting.\n" +"The tool diameter is used for plotting on canvas.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V)." +msgstr "" +"Tools in this CNCJob object used for cutting.\n" +"The tool diameter is used for plotting on canvas.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V)." + +#: flatcamGUI/ObjectUI.py:1518 +msgid "P" +msgstr "P" + +#: flatcamGUI/ObjectUI.py:1524 +msgid "Update Plot" +msgstr "Update Plot" + +#: flatcamGUI/ObjectUI.py:1526 +msgid "Update the plot." +msgstr "Update the plot." + +#: flatcamGUI/ObjectUI.py:1533 +msgid "Export CNC Code:" +msgstr "Export CNC Code:" + +#: flatcamGUI/ObjectUI.py:1541 +msgid "Prepend to CNC Code:" +msgstr "Prepend to CNC Code:" + +#: flatcamGUI/ObjectUI.py:1544 +msgid "" +"Type here any G-Code commands you would\n" +"like to add to the beginning of the generated file." +msgstr "" +"Type here any G-Code commands you would\n" +"like to add to the beginning of the generated file." + +#: flatcamGUI/ObjectUI.py:1554 +msgid "Append to CNC Code" +msgstr "Append to CNC Code" + +#: flatcamGUI/ObjectUI.py:1578 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro.\n" +"The FlatCAM variables are surrounded by '%' symbol.\n" +"\n" +"WARNING: it can be used only with a postprocessor file\n" +"that has 'toolchange_custom' in it's name and this is built\n" +"having as template the 'Toolchange Custom' posprocessor file." +msgstr "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro.\n" +"The FlatCAM variables are surrounded by '%' symbol.\n" +"\n" +"WARNING: it can be used only with a postprocessor file\n" +"that has 'toolchange_custom' in it's name and this is built\n" +"having as template the 'Toolchange Custom' posprocessor file." + +#: flatcamGUI/ObjectUI.py:1634 +msgid "z_cut = depth where to cut" +msgstr "z_cut = depth where to cut" + +#: flatcamGUI/ObjectUI.py:1635 +msgid "z_move = height where to travel" +msgstr "z_move = height where to travel" + +#: flatcamGUI/ObjectUI.py:1656 +msgid "View CNC Code" +msgstr "View CNC Code" + +#: flatcamGUI/ObjectUI.py:1659 +msgid "" +"Opens TAB to view/modify/print G-Code\n" +"file." +msgstr "" +"Opens TAB to view/modify/print G-Code\n" +"file." + +#: flatcamGUI/ObjectUI.py:1665 +msgid "Save CNC Code" +msgstr "Save CNC Code" + +#: flatcamGUI/ObjectUI.py:1668 +msgid "" +"Opens dialog to save G-Code\n" +"file." +msgstr "" +"Opens dialog to save G-Code\n" +"file." + +#: flatcamTools/ToolCalculators.py:24 +msgid "Calculators" +msgstr "Calculators" + +#: flatcamTools/ToolCalculators.py:25 +msgid "V-Shape Tool Calculator" +msgstr "V-Shape Tool Calculator" + +#: flatcamTools/ToolCalculators.py:26 +msgid "Units Calculator" +msgstr "Units Calculator" + +#: flatcamTools/ToolCalculators.py:27 +msgid "ElectroPlating Calculator" +msgstr "ElectroPlating Calculator" + +#: flatcamTools/ToolCalculators.py:68 +msgid "Here you enter the value to be converted from INCH to MM" +msgstr "Here you enter the value to be converted from INCH to MM" + +#: flatcamTools/ToolCalculators.py:73 +msgid "Here you enter the value to be converted from MM to INCH" +msgstr "Here you enter the value to be converted from MM to INCH" + +#: flatcamTools/ToolCalculators.py:98 +msgid "" +"This is the diameter of the tool tip.\n" +"The manufacturer specifies it." +msgstr "" +"This is the diameter of the tool tip.\n" +"The manufacturer specifies it." + +#: flatcamTools/ToolCalculators.py:101 +msgid "Tip Angle:" +msgstr "Tip Angle:" + +#: flatcamTools/ToolCalculators.py:105 +msgid "" +"This is the angle of the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" +"This is the angle of the tip of the tool.\n" +"It is specified by manufacturer." + +#: flatcamTools/ToolCalculators.py:112 +msgid "" +"This is the depth to cut into the material.\n" +"In the CNCJob is the CutZ parameter." +msgstr "" +"This is the depth to cut into the material.\n" +"In the CNCJob is the CutZ parameter." + +#: flatcamTools/ToolCalculators.py:115 +msgid "Tool Diameter:" +msgstr "Tool Diameter:" + +#: flatcamTools/ToolCalculators.py:119 +msgid "" +"This is the tool diameter to be entered into\n" +"FlatCAM Gerber section.\n" +"In the CNCJob section it is called >Tool dia<." +msgstr "" +"This is the tool diameter to be entered into\n" +"FlatCAM Gerber section.\n" +"In the CNCJob section it is called >Tool dia<." + +#: flatcamTools/ToolCalculators.py:131 flatcamTools/ToolCalculators.py:214 +msgid "Calculate" +msgstr "Calculate" + +#: flatcamTools/ToolCalculators.py:134 +msgid "" +"Calculate either the Cut Z or the effective tool diameter,\n" +" depending on which is desired and which is known. " +msgstr "" +"Calculate either the Cut Z or the effective tool diameter,\n" +" depending on which is desired and which is known. " + +#: flatcamTools/ToolCalculators.py:190 +msgid "Current Value:" +msgstr "Current Value:" + +#: flatcamTools/ToolCalculators.py:194 +msgid "" +"This is the current intensity value\n" +"to be set on the Power Supply. In Amps." +msgstr "" +"This is the current intensity value\n" +"to be set on the Power Supply. In Amps." + +#: flatcamTools/ToolCalculators.py:198 +msgid "Time:" +msgstr "Time:" + +#: flatcamTools/ToolCalculators.py:202 +msgid "" +"This is the calculated time required for the procedure.\n" +"In minutes." +msgstr "" +"This is the calculated time required for the procedure.\n" +"In minutes." + +#: flatcamTools/ToolCalculators.py:217 +msgid "" +"Calculate the current intensity value and the procedure time,\n" +" depending on the parameters above" +msgstr "" +"Calculate the current intensity value and the procedure time,\n" +" depending on the parameters above" + +#: flatcamTools/ToolCutOut.py:17 +msgid "Cutout PCB" +msgstr "Cutout PCB" + +#: flatcamTools/ToolCutOut.py:53 +msgid "Obj Type:" +msgstr "Obj Type:" + +#: flatcamTools/ToolCutOut.py:55 +msgid "" +"Specify the type of object to be cutout.\n" +"It can be of type: Gerber or Geometry.\n" +"What is selected here will dictate the kind\n" +"of objects that will populate the 'Object' combobox." +msgstr "" +"Specify the type of object to be cutout.\n" +"It can be of type: Gerber or Geometry.\n" +"What is selected here will dictate the kind\n" +"of objects that will populate the 'Object' combobox." + +#: flatcamTools/ToolCutOut.py:69 flatcamTools/ToolPanelize.py:71 +msgid "Object:" +msgstr "Object:" + +#: flatcamTools/ToolCutOut.py:71 +msgid "Object to be cutout. " +msgstr "Object to be cutout. " + +#: flatcamTools/ToolCutOut.py:79 +msgid "" +"Diameter of the tool used to cutout\n" +"the PCB shape out of the surrounding material." +msgstr "" +"Diameter of the tool used to cutout\n" +"the PCB shape out of the surrounding material." + +#: flatcamTools/ToolCutOut.py:88 +msgid "" +"Margin over bounds. A positive value here\n" +"will make the cutout of the PCB further from\n" +"the actual PCB border" +msgstr "" +"Margin over bounds. A positive value here\n" +"will make the cutout of the PCB further from\n" +"the actual PCB border" + +#: flatcamTools/ToolCutOut.py:98 +msgid "" +"The size of the bridge gaps in the cutout\n" +"used to keep the board connected to\n" +"the surrounding material (the one \n" +"from which the PCB is cutout)." +msgstr "" +"The size of the bridge gaps in the cutout\n" +"used to keep the board connected to\n" +"the surrounding material (the one \n" +"from which the PCB is cutout)." + +#: flatcamTools/ToolCutOut.py:114 +msgid "A. Automatic Bridge Gaps" +msgstr "A. Automatic Bridge Gaps" + +#: flatcamTools/ToolCutOut.py:116 +msgid "This section handle creation of automatic bridge gaps." +msgstr "This section handle creation of automatic bridge gaps." + +#: flatcamTools/ToolCutOut.py:127 +msgid "" +"Number of gaps used for the Automatic cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" +"Number of gaps used for the Automatic cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" + +#: flatcamTools/ToolCutOut.py:150 +msgid "FreeForm:" +msgstr "FreeForm:" + +#: flatcamTools/ToolCutOut.py:152 +msgid "" +"The cutout shape can be of ny shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" +"The cutout shape can be of ny shape.\n" +"Useful when the PCB has a non-rectangular shape." + +#: flatcamTools/ToolCutOut.py:161 +msgid "" +"Cutout the selected object.\n" +"The cutout shape can be of any shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" +"Cutout the selected object.\n" +"The cutout shape can be of any shape.\n" +"Useful when the PCB has a non-rectangular shape." + +#: flatcamTools/ToolCutOut.py:170 +msgid "Rectangular:" +msgstr "Rectangular:" + +#: flatcamTools/ToolCutOut.py:172 +msgid "" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." + +#: flatcamTools/ToolCutOut.py:181 +msgid "" +"Cutout the selected object.\n" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" +"Cutout the selected object.\n" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." + +#: flatcamTools/ToolCutOut.py:189 +msgid "B. Manual Bridge Gaps" +msgstr "B. Manual Bridge Gaps" + +#: flatcamTools/ToolCutOut.py:191 +msgid "" +"This section handle creation of manual bridge gaps.\n" +"This is done by mouse clicking on the perimeter of the\n" +"Geometry object that is used as a cutout object. " +msgstr "" +"This section handle creation of manual bridge gaps.\n" +"This is done by mouse clicking on the perimeter of the\n" +"Geometry object that is used as a cutout object. " + +#: flatcamTools/ToolCutOut.py:207 +msgid "Geo Obj:" +msgstr "Geo Obj:" + +#: flatcamTools/ToolCutOut.py:209 +msgid "Geometry object used to create the manual cutout." +msgstr "Geometry object used to create the manual cutout." + +#: flatcamTools/ToolCutOut.py:220 +msgid "Manual Geo:" +msgstr "Manual Geo:" + +#: flatcamTools/ToolCutOut.py:222 flatcamTools/ToolCutOut.py:232 +msgid "" +"If the object to be cutout is a Gerber\n" +"first create a Geometry that surrounds it,\n" +"to be used as the cutout, if one doesn't exist yet.\n" +"Select the source Gerber file in the top object combobox." +msgstr "" +"If the object to be cutout is a Gerber\n" +"first create a Geometry that surrounds it,\n" +"to be used as the cutout, if one doesn't exist yet.\n" +"Select the source Gerber file in the top object combobox." + +#: flatcamTools/ToolCutOut.py:242 +msgid "Manual Add Bridge Gaps:" +msgstr "Manual Add Bridge Gaps:" + +#: flatcamTools/ToolCutOut.py:244 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material." +msgstr "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material." + +#: flatcamTools/ToolCutOut.py:251 +msgid "Generate Gap" +msgstr "Generate Gap" + +#: flatcamTools/ToolCutOut.py:253 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material.\n" +"The LMB click has to be done on the perimeter of\n" +"the Geometry object used as a cutout geometry." +msgstr "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material.\n" +"The LMB click has to be done on the perimeter of\n" +"the Geometry object used as a cutout geometry." + +#: flatcamTools/ToolCutOut.py:329 flatcamTools/ToolCutOut.py:468 +#: flatcamTools/ToolNonCopperClear.py:659 flatcamTools/ToolPaint.py:757 +#: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve object: %s" +msgstr "[ERROR_NOTCL]Could not retrieve object: %s" + +#: flatcamTools/ToolCutOut.py:333 +msgid "" +"[ERROR_NOTCL]There is no object selected for Cutout.\n" +"Select one and try again." +msgstr "" +"[ERROR_NOTCL]There is no object selected for Cutout.\n" +"Select one and try again." + +#: flatcamTools/ToolCutOut.py:349 +msgid "" +"[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" +"[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer." + +#: flatcamTools/ToolCutOut.py:359 flatcamTools/ToolCutOut.py:496 +#: flatcamTools/ToolCutOut.py:721 +msgid "" +"[WARNING_NOTCL] Margin value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Margin value is missing or wrong format. Add it and retry." + +#: flatcamTools/ToolCutOut.py:370 flatcamTools/ToolCutOut.py:507 +#: flatcamTools/ToolCutOut.py:616 +msgid "" +"[WARNING_NOTCL] Gap size value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Gap size value is missing or wrong format. Add it and retry." + +#: flatcamTools/ToolCutOut.py:377 flatcamTools/ToolCutOut.py:514 +msgid "[WARNING_NOTCL] Number of gaps value is missing. Add it and retry." +msgstr "[WARNING_NOTCL] Number of gaps value is missing. Add it and retry." + +#: flatcamTools/ToolCutOut.py:381 flatcamTools/ToolCutOut.py:518 +msgid "" +"[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 " +"or 8. Fill in a correct value and retry. " +msgstr "" +"[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 " +"or 8. Fill in a correct value and retry. " + +#: flatcamTools/ToolCutOut.py:386 flatcamTools/ToolCutOut.py:523 +msgid "" +"[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" +"Optionally, this Multi-geo Geometry can be converted to Single-geo " +"Geometry,\n" +"and after that perform Cutout." +msgstr "" +"[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" +"Optionally, this Multi-geo Geometry can be converted to Single-geo " +"Geometry,\n" +"and after that perform Cutout." + +#: flatcamTools/ToolCutOut.py:452 flatcamTools/ToolCutOut.py:586 +msgid "[success] Any form CutOut operation finished." +msgstr "[success] Any form CutOut operation finished." + +#: flatcamTools/ToolCutOut.py:472 flatcamTools/ToolPaint.py:761 +#: flatcamTools/ToolPanelize.py:299 +#, python-format +msgid "[ERROR_NOTCL]Object not found: %s" +msgstr "[ERROR_NOTCL]Object not found: %s" + +#: flatcamTools/ToolCutOut.py:486 flatcamTools/ToolCutOut.py:606 +#: flatcamTools/ToolCutOut.py:711 +msgid "" +"[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" +"[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer." + +#: flatcamTools/ToolCutOut.py:591 +msgid "" +"Click on the selected geometry object perimeter to create a bridge gap ..." +msgstr "" +"Click on the selected geometry object perimeter to create a bridge gap ..." + +#: flatcamTools/ToolCutOut.py:632 +msgid "Making manual bridge gap..." +msgstr "Making manual bridge gap..." + +#: flatcamTools/ToolCutOut.py:655 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Geoemtry object: %s" +msgstr "[ERROR_NOTCL]Could not retrieve Geoemtry object: %s" + +#: flatcamTools/ToolCutOut.py:659 +#, python-format +msgid "[ERROR_NOTCL]Geometry object for manual cutout not found: %s" +msgstr "[ERROR_NOTCL]Geometry object for manual cutout not found: %s" + +#: flatcamTools/ToolCutOut.py:669 +msgid "[success] Added manual Bridge Gap." +msgstr "[success] Added manual Bridge Gap." + +#: flatcamTools/ToolCutOut.py:686 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Gerber object: %s" +msgstr "[ERROR_NOTCL]Could not retrieve Gerber object: %s" + +#: flatcamTools/ToolCutOut.py:690 +msgid "" +"[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" +"Select one and try again." +msgstr "" +"[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" +"Select one and try again." + +#: flatcamTools/ToolCutOut.py:695 +msgid "" +"[ERROR_NOTCL]The selected object has to be of Gerber type.\n" +"Select a Gerber file and try again." +msgstr "" +"[ERROR_NOTCL]The selected object has to be of Gerber type.\n" +"Select a Gerber file and try again." + +#: flatcamTools/ToolDblSided.py:18 +msgid "2-Sided PCB" +msgstr "2-Sided PCB" + +#: flatcamTools/ToolDblSided.py:52 flatcamTools/ToolDblSided.py:76 +#: flatcamTools/ToolDblSided.py:100 +msgid "Mirror" +msgstr "Mirror" + +#: flatcamTools/ToolDblSided.py:54 flatcamTools/ToolDblSided.py:78 +#: flatcamTools/ToolDblSided.py:102 +msgid "" +"Mirrors (flips) the specified object around \n" +"the specified axis. Does not create a new \n" +"object, but modifies it." +msgstr "" +"Mirrors (flips) the specified object around \n" +"the specified axis. Does not create a new \n" +"object, but modifies it." + +#: flatcamTools/ToolDblSided.py:73 +msgid "Excellon Object to be mirrored." +msgstr "Excellon Object to be mirrored." + +#: flatcamTools/ToolDblSided.py:97 +msgid "Geometry Obj to be mirrored." +msgstr "Geometry Obj to be mirrored." + +#: flatcamTools/ToolDblSided.py:135 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a FlatCAM object) through \n" +"the center." +msgstr "" +"The axis should pass through a point or cut\n" +" a specified box (in a FlatCAM object) through \n" +"the center." + +#: flatcamTools/ToolDblSided.py:152 +msgid "Point/Box Reference:" +msgstr "Point/Box Reference:" + +#: flatcamTools/ToolDblSided.py:154 +msgid "" +"If 'Point' is selected above it store the coordinates (x, y) through which\n" +"the mirroring axis passes.\n" +"If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or " +"Geo).\n" +"Through the center of this object pass the mirroring axis selected above." +msgstr "" +"If 'Point' is selected above it store the coordinates (x, y) through which\n" +"the mirroring axis passes.\n" +"If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or " +"Geo).\n" +"Through the center of this object pass the mirroring axis selected above." + +#: flatcamTools/ToolDblSided.py:162 +msgid "" +"Add the coordinates in format (x, y) through which the mirroring " +"axis \n" +" selected in 'MIRROR AXIS' pass.\n" +"The (x, y) coordinates are captured by pressing SHIFT key\n" +"and left mouse button click on canvas or you can enter the coords manually." +msgstr "" +"Add the coordinates in format (x, y) through which the mirroring " +"axis \n" +" selected in 'MIRROR AXIS' pass.\n" +"The (x, y) coordinates are captured by pressing SHIFT key\n" +"and left mouse button click on canvas or you can enter the coords manually." + +#: flatcamTools/ToolDblSided.py:182 +msgid "Gerber Reference Box Object" +msgstr "Gerber Reference Box Object" + +#: flatcamTools/ToolDblSided.py:183 +msgid "Excellon Reference Box Object" +msgstr "Excellon Reference Box Object" + +#: flatcamTools/ToolDblSided.py:184 +msgid "Geometry Reference Box Object" +msgstr "Geometry Reference Box Object" + +#: flatcamTools/ToolDblSided.py:193 +msgid "Alignment Drill Coordinates:" +msgstr "Alignment Drill Coordinates:" + +#: flatcamTools/ToolDblSided.py:195 +msgid "" +"Alignment holes (x1, y1), (x2, y2), ... on one side of the mirror axis. For " +"each set of (x, y) coordinates\n" +"entered here, a pair of drills will be created:\n" +"\n" +"- one drill at the coordinates from the field\n" +"- one drill in mirror position over the axis selected above in the 'Mirror " +"Axis'." +msgstr "" +"Alignment holes (x1, y1), (x2, y2), ... on one side of the mirror axis. For " +"each set of (x, y) coordinates\n" +"entered here, a pair of drills will be created:\n" +"\n" +"- one drill at the coordinates from the field\n" +"- one drill in mirror position over the axis selected above in the 'Mirror " +"Axis'." + +#: flatcamTools/ToolDblSided.py:210 +msgid "" +"Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" +"on one side of the mirror axis.\n" +"\n" +"The coordinates set can be obtained:\n" +"- press SHIFT key and left mouse clicking on canvas. Then click Add.\n" +"- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the " +"field.\n" +"- press SHIFT key and left mouse clicking on canvas. Then RMB click in the " +"field and click Paste.\n" +"- by entering the coords manually in the format: (x1, y1), (x2, y2), ..." +msgstr "" +"Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" +"on one side of the mirror axis.\n" +"\n" +"The coordinates set can be obtained:\n" +"- press SHIFT key and left mouse clicking on canvas. Then click Add.\n" +"- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the " +"field.\n" +"- press SHIFT key and left mouse clicking on canvas. Then RMB click in the " +"field and click Paste.\n" +"- by entering the coords manually in the format: (x1, y1), (x2, y2), ..." + +#: flatcamTools/ToolDblSided.py:224 +msgid "Alignment Drill Diameter" +msgstr "Alignment Drill Diameter" + +#: flatcamTools/ToolDblSided.py:247 +msgid "Create Excellon Object" +msgstr "Create Excellon Object" + +#: flatcamTools/ToolDblSided.py:249 +msgid "" +"Creates an Excellon Object containing the\n" +"specified alignment holes and their mirror\n" +"images." +msgstr "" +"Creates an Excellon Object containing the\n" +"specified alignment holes and their mirror\n" +"images." + +#: flatcamTools/ToolDblSided.py:255 +msgid "Reset" +msgstr "Reset" + +#: flatcamTools/ToolDblSided.py:257 +msgid "Resets all the fields." +msgstr "Resets all the fields." + +#: flatcamTools/ToolDblSided.py:302 +msgid "2-Sided Tool" +msgstr "2-Sided Tool" + +#: flatcamTools/ToolDblSided.py:327 +msgid "" +"[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates are " +"missing. Add them and retry." +msgstr "" +"[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates are " +"missing. Add them and retry." + +#: flatcamTools/ToolDblSided.py:346 +msgid "" +"[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry." +msgstr "" +"[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry." + +#: flatcamTools/ToolDblSided.py:368 +msgid "" +"[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry." +msgstr "" +"[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry." + +#: flatcamTools/ToolDblSided.py:375 +msgid "" +"[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them " +"and retry." +msgstr "" +"[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them " +"and retry." + +#: flatcamTools/ToolDblSided.py:397 +msgid "[success] Excellon object with alignment drills created..." +msgstr "[success] Excellon object with alignment drills created..." + +#: flatcamTools/ToolDblSided.py:406 +msgid "[WARNING_NOTCL] There is no Gerber object loaded ..." +msgstr "[WARNING_NOTCL] There is no Gerber object loaded ..." + +#: flatcamTools/ToolDblSided.py:410 flatcamTools/ToolDblSided.py:453 +#: flatcamTools/ToolDblSided.py:497 +msgid "" +"[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored." +msgstr "" +"[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored." + +#: flatcamTools/ToolDblSided.py:420 +msgid "" +"[WARNING_NOTCL] 'Point' coordinates missing. Using Origin (0, 0) as " +"mirroring reference." +msgstr "" +"[WARNING_NOTCL] 'Point' coordinates missing. Using Origin (0, 0) as " +"mirroring reference." + +#: flatcamTools/ToolDblSided.py:430 flatcamTools/ToolDblSided.py:474 +#: flatcamTools/ToolDblSided.py:511 +msgid "[WARNING_NOTCL] There is no Box object loaded ..." +msgstr "[WARNING_NOTCL] There is no Box object loaded ..." + +#: flatcamTools/ToolDblSided.py:440 +#, python-format +msgid "[success] Gerber %s was mirrored..." +msgstr "[success] Gerber %s was mirrored..." + +#: flatcamTools/ToolDblSided.py:449 +msgid "[WARNING_NOTCL] There is no Excellon object loaded ..." +msgstr "[WARNING_NOTCL] There is no Excellon object loaded ..." + +#: flatcamTools/ToolDblSided.py:464 +msgid "" +"[WARNING_NOTCL] There are no Point coordinates in the Point field. Add " +"coords and try again ..." +msgstr "" +"[WARNING_NOTCL] There are no Point coordinates in the Point field. Add " +"coords and try again ..." + +#: flatcamTools/ToolDblSided.py:484 +#, python-format +msgid "[success] Excellon %s was mirrored..." +msgstr "[success] Excellon %s was mirrored..." + +#: flatcamTools/ToolDblSided.py:493 +msgid "[WARNING_NOTCL] There is no Geometry object loaded ..." +msgstr "[WARNING_NOTCL] There is no Geometry object loaded ..." + +#: flatcamTools/ToolDblSided.py:521 +#, python-format +msgid "[success] Geometry %s was mirrored..." +msgstr "[success] Geometry %s was mirrored..." + +#: flatcamTools/ToolFilm.py:25 +msgid "Film PCB" +msgstr "Film PCB" + +#: flatcamTools/ToolFilm.py:56 flatcamTools/ToolImage.py:53 +#: flatcamTools/ToolPanelize.py:56 +msgid "Object Type:" +msgstr "Object Type:" + +#: flatcamTools/ToolFilm.py:58 +msgid "" +"Specify the type of object for which to create the film.\n" +"The object can be of type: Gerber or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Film Object combobox." +msgstr "" +"Specify the type of object for which to create the film.\n" +"The object can be of type: Gerber or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Film Object combobox." + +#: flatcamTools/ToolFilm.py:71 +msgid "Film Object:" +msgstr "Film Object:" + +#: flatcamTools/ToolFilm.py:73 +msgid "Object for which to create the film." +msgstr "Object for which to create the film." + +#: flatcamTools/ToolFilm.py:89 flatcamTools/ToolPanelize.py:89 +msgid "Box Type:" +msgstr "Box Type:" + +#: flatcamTools/ToolFilm.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"film creation. It can be: Gerber or Geometry type.The selection here decide " +"the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" +"Specify the type of object to be used as an container for\n" +"film creation. It can be: Gerber or Geometry type.The selection here decide " +"the type of objects that will be\n" +"in the Box Object combobox." + +#: flatcamTools/ToolFilm.py:104 flatcamTools/ToolPanelize.py:104 +msgid "Box Object:" +msgstr "Box Object:" + +#: flatcamTools/ToolFilm.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object for which we create the film.\n" +"Usually it is the PCB outline but it can be also the\n" +"same object for which the film is created." +msgstr "" +"The actual object that is used a container for the\n" +" selected object for which we create the film.\n" +"Usually it is the PCB outline but it can be also the\n" +"same object for which the film is created." + +#: flatcamTools/ToolFilm.py:157 +msgid "Save Film" +msgstr "Save Film" + +#: flatcamTools/ToolFilm.py:159 +msgid "" +"Create a Film for the selected object, within\n" +"the specified box. Does not create a new \n" +" FlatCAM object, but directly save it in SVG format\n" +"which can be opened with Inkscape." +msgstr "" +"Create a Film for the selected object, within\n" +"the specified box. Does not create a new \n" +" FlatCAM object, but directly save it in SVG format\n" +"which can be opened with Inkscape." + +#: flatcamTools/ToolFilm.py:225 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry." +msgstr "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry." + +#: flatcamTools/ToolFilm.py:231 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry." +msgstr "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry." + +#: flatcamTools/ToolFilm.py:255 +msgid "Generating Film ..." +msgstr "Generating Film ..." + +#: flatcamTools/ToolFilm.py:260 flatcamTools/ToolFilm.py:264 +msgid "Export SVG positive" +msgstr "Export SVG positive" + +#: flatcamTools/ToolFilm.py:269 +msgid "[WARNING_NOTCL]Export SVG positive cancelled." +msgstr "[WARNING_NOTCL]Export SVG positive cancelled." + +#: flatcamTools/ToolFilm.py:276 flatcamTools/ToolFilm.py:280 +msgid "Export SVG negative" +msgstr "Export SVG negative" + +#: flatcamTools/ToolFilm.py:285 +msgid "[WARNING_NOTCL]Export SVG negative cancelled." +msgstr "[WARNING_NOTCL]Export SVG negative cancelled." + +#: flatcamTools/ToolImage.py:25 +msgid "Image as Object" +msgstr "Image as Object" + +#: flatcamTools/ToolImage.py:31 +msgid "Image to PCB" +msgstr "Image to PCB" + +#: flatcamTools/ToolImage.py:55 +msgid "" +"Specify the type of object to create from the image.\n" +"It can be of type: Gerber or Geometry." +msgstr "" +"Specify the type of object to create from the image.\n" +"It can be of type: Gerber or Geometry." + +#: flatcamTools/ToolImage.py:63 +msgid "DPI value:" +msgstr "DPI value:" + +#: flatcamTools/ToolImage.py:65 +msgid "Specify a DPI value for the image." +msgstr "Specify a DPI value for the image." + +#: flatcamTools/ToolImage.py:72 +msgid "Level of detail" +msgstr "Level of detail" + +#: flatcamTools/ToolImage.py:81 +msgid "Image type" +msgstr "Image type" + +#: flatcamTools/ToolImage.py:83 +msgid "" +"Choose a method for the image interpretation.\n" +"B/W means a black & white image. Color means a colored image." +msgstr "" +"Choose a method for the image interpretation.\n" +"B/W means a black & white image. Color means a colored image." + +#: flatcamTools/ToolImage.py:90 flatcamTools/ToolImage.py:103 +#: flatcamTools/ToolImage.py:114 flatcamTools/ToolImage.py:125 +msgid "Mask value" +msgstr "Mask value" + +#: flatcamTools/ToolImage.py:92 +msgid "" +"Mask for monochrome image.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry.\n" +"0 means no detail and 255 means everything \n" +"(which is totally black)." +msgstr "" +"Mask for monochrome image.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry.\n" +"0 means no detail and 255 means everything \n" +"(which is totally black)." + +#: flatcamTools/ToolImage.py:105 +msgid "" +"Mask for RED color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Mask for RED color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." + +#: flatcamTools/ToolImage.py:116 +msgid "" +"Mask for GREEN color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Mask for GREEN color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." + +#: flatcamTools/ToolImage.py:127 +msgid "" +"Mask for BLUE color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Mask for BLUE color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." + +#: flatcamTools/ToolImage.py:139 +msgid "Import image" +msgstr "Import image" + +#: flatcamTools/ToolImage.py:141 +msgid "Open a image of raster type and then import it in FlatCAM." +msgstr "Open a image of raster type and then import it in FlatCAM." + +#: flatcamTools/ToolImage.py:170 +msgid "Image Tool" +msgstr "Image Tool" + +#: flatcamTools/ToolImage.py:200 flatcamTools/ToolImage.py:203 +msgid "Import IMAGE" +msgstr "Import IMAGE" + +#: flatcamTools/ToolMeasurement.py:26 +msgid "Measurement" +msgstr "Measurement" + +#: flatcamTools/ToolMeasurement.py:47 +msgid "Start" +msgstr "Start" + +#: flatcamTools/ToolMeasurement.py:47 flatcamTools/ToolMeasurement.py:50 +msgid "Coords" +msgstr "Coords" + +#: flatcamTools/ToolMeasurement.py:48 flatcamTools/ToolMeasurement.py:99 +msgid "This is measuring Start point coordinates." +msgstr "This is measuring Start point coordinates." + +#: flatcamTools/ToolMeasurement.py:50 +msgid "Stop" +msgstr "Stop" + +#: flatcamTools/ToolMeasurement.py:51 flatcamTools/ToolMeasurement.py:104 +msgid "This is the measuring Stop point coordinates." +msgstr "This is the measuring Stop point coordinates." + +#: flatcamTools/ToolMeasurement.py:54 flatcamTools/ToolMeasurement.py:109 +msgid "This is the distance measured over the X axis." +msgstr "This is the distance measured over the X axis." + +#: flatcamTools/ToolMeasurement.py:57 flatcamTools/ToolMeasurement.py:115 +msgid "This is the distance measured over the Y axis." +msgstr "This is the distance measured over the Y axis." + +#: flatcamTools/ToolMeasurement.py:59 +msgid "DISTANCE" +msgstr "DISTANCE" + +#: flatcamTools/ToolMeasurement.py:60 flatcamTools/ToolMeasurement.py:121 +msgid "This is the point to point Euclidian distance." +msgstr "This is the point to point Euclidian distance." + +#: flatcamTools/ToolMeasurement.py:63 flatcamTools/ToolMeasurement.py:70 +#: flatcamTools/ToolMeasurement.py:77 flatcamTools/ToolMeasurement.py:84 +#: flatcamTools/ToolMeasurement.py:91 +msgid "Those are the units in which the distance is measured." +msgstr "Those are the units in which the distance is measured." + +#: flatcamTools/ToolMeasurement.py:124 +msgid "Measure" +msgstr "Measure" + +#: flatcamTools/ToolMeasurement.py:183 +msgid "Meas. Tool" +msgstr "Meas. Tool" + +#: flatcamTools/ToolMeasurement.py:276 +msgid "MEASURING: Click on the Start point ..." +msgstr "MEASURING: Click on the Start point ..." + +#: flatcamTools/ToolMeasurement.py:305 +msgid "MEASURING: Click on the Destination point ..." +msgstr "MEASURING: Click on the Destination point ..." + +#: flatcamTools/ToolMeasurement.py:326 +#, python-brace-format +msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" +msgstr "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" + +#: flatcamTools/ToolMove.py:81 +msgid "MOVE: Click on the Start point ..." +msgstr "MOVE: Click on the Start point ..." + +#: flatcamTools/ToolMove.py:88 +msgid "[WARNING_NOTCL] MOVE action cancelled. No object(s) to move." +msgstr "[WARNING_NOTCL] MOVE action cancelled. No object(s) to move." + +#: flatcamTools/ToolMove.py:110 +msgid "MOVE: Click on the Destination point ..." +msgstr "MOVE: Click on the Destination point ..." + +#: flatcamTools/ToolMove.py:128 +msgid "Moving ..." +msgstr "Moving ..." + +#: flatcamTools/ToolMove.py:135 +msgid "[WARNING_NOTCL] No object(s) selected." +msgstr "[WARNING_NOTCL] No object(s) selected." + +#: flatcamTools/ToolMove.py:158 +#, python-format +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> %s" +msgstr "[ERROR_NOTCL] ToolMove.on_left_click() --> %s" + +#: flatcamTools/ToolMove.py:164 +#, python-format +msgid "[success]%s object was moved ..." +msgstr "[success]%s object was moved ..." + +#: flatcamTools/ToolMove.py:174 +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> Error when mouse left click." +msgstr "" +"[ERROR_NOTCL] ToolMove.on_left_click() --> Error when mouse left click." + +#: flatcamTools/ToolMove.py:202 +msgid "[WARNING_NOTCL]Move action cancelled." +msgstr "[WARNING_NOTCL]Move action cancelled." + +#: flatcamTools/ToolMove.py:214 +msgid "[WARNING_NOTCL]Object(s) not selected" +msgstr "[WARNING_NOTCL]Object(s) not selected" + +#: flatcamTools/ToolNonCopperClear.py:25 +msgid "Non-Copper Clearing" +msgstr "Non-Copper Clearing" + +#: flatcamTools/ToolNonCopperClear.py:63 +msgid "Gerber object to be cleared of excess copper. " +msgstr "Gerber object to be cleared of excess copper. " + +#: flatcamTools/ToolNonCopperClear.py:73 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for copper clearing." +msgstr "" +"Tools pool from which the algorithm\n" +"will pick the ones used for copper clearing." + +#: flatcamTools/ToolNonCopperClear.py:88 +msgid "" +"This is the Tool Number.\n" +"Non copper clearing will start with the tool with the biggest \n" +"diameter, continuing until there are no more tools.\n" +"Only tools that create NCC clearing geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" +"This is the Tool Number.\n" +"Non copper clearing will start with the tool with the biggest \n" +"diameter, continuing until there are no more tools.\n" +"Only tools that create NCC clearing geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." + +#: flatcamTools/ToolNonCopperClear.py:100 flatcamTools/ToolPaint.py:98 +msgid "" +"The Tool Type (TT) can be:
- Circular with 1 ... 4 teeth -> it is " +"informative only. Being circular,
the cut width in material is exactly " +"the tool diameter.
- Ball -> informative only and make reference " +"to the Ball type endmill.
- V-Shape -> it will disable de Z-Cut " +"parameter in the resulting geometry UI form and enable two additional UI " +"form fields in the resulting geometry: V-Tip Dia and V-Tip Angle. Adjusting " +"those two values will adjust the Z-Cut parameter such as the cut width into " +"material will be equal with the value in the Tool Diameter column of this " +"table.
Choosing the V-Shape Tool Type automatically will select " +"the Operation Type in the resulting geometry as Isolation." +msgstr "" +"The Tool Type (TT) can be:
- Circular with 1 ... 4 teeth -> it is " +"informative only. Being circular,
the cut width in material is exactly " +"the tool diameter.
- Ball -> informative only and make reference " +"to the Ball type endmill.
- V-Shape -> it will disable de Z-Cut " +"parameter in the resulting geometry UI form and enable two additional UI " +"form fields in the resulting geometry: V-Tip Dia and V-Tip Angle. Adjusting " +"those two values will adjust the Z-Cut parameter such as the cut width into " +"material will be equal with the value in the Tool Diameter column of this " +"table.
Choosing the V-Shape Tool Type automatically will select " +"the Operation Type in the resulting geometry as Isolation." + +#: flatcamTools/ToolNonCopperClear.py:119 flatcamTools/ToolPaint.py:117 +msgid "Tool Dia" +msgstr "Tool Dia" + +#: flatcamTools/ToolNonCopperClear.py:121 +msgid "Diameter for the new tool to add in the Tool Table" +msgstr "Diameter for the new tool to add in the Tool Table" + +#: flatcamTools/ToolNonCopperClear.py:147 flatcamTools/ToolPaint.py:145 +#: flatcamTools/ToolSolderPaste.py:123 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row(s) in the Tool Table." +msgstr "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row(s) in the Tool Table." + +#: flatcamTools/ToolNonCopperClear.py:225 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"If not checked, use the standard algorithm." +msgstr "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"If not checked, use the standard algorithm." + +#: flatcamTools/ToolNonCopperClear.py:237 +msgid "Generate Geometry" +msgstr "Generate Geometry" + +#: flatcamTools/ToolNonCopperClear.py:483 flatcamTools/ToolPaint.py:543 +#: flatcamTools/ToolSolderPaste.py:760 +msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." +msgstr "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." + +#: flatcamTools/ToolNonCopperClear.py:511 flatcamTools/ToolPaint.py:567 +msgid "[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table." +msgstr "[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table." + +#: flatcamTools/ToolNonCopperClear.py:516 flatcamTools/ToolPaint.py:572 +msgid "[success] New tool added to Tool Table." +msgstr "[success] New tool added to Tool Table." + +#: flatcamTools/ToolNonCopperClear.py:549 +msgid "[ERROR_NOTCL] Wrong value format entered, use a number." +msgstr "[ERROR_NOTCL] Wrong value format entered, use a number." + +#: flatcamTools/ToolNonCopperClear.py:558 flatcamTools/ToolPaint.py:615 +msgid "[success] Tool from Tool Table was edited." +msgstr "[success] Tool from Tool Table was edited." + +#: flatcamTools/ToolNonCopperClear.py:569 flatcamTools/ToolPaint.py:626 +#: flatcamTools/ToolSolderPaste.py:846 +msgid "" +"[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " +"Table." +msgstr "" +"[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " +"Table." + +#: flatcamTools/ToolNonCopperClear.py:608 flatcamTools/ToolPaint.py:723 +msgid "[WARNING_NOTCL]Delete failed. Select a tool to delete." +msgstr "[WARNING_NOTCL]Delete failed. Select a tool to delete." + +#: flatcamTools/ToolNonCopperClear.py:613 flatcamTools/ToolPaint.py:728 +msgid "[success] Tool(s) deleted from Tool Table." +msgstr "[success] Tool(s) deleted from Tool Table." + +#: flatcamTools/ToolNonCopperClear.py:666 +msgid "[ERROR_NOTCL]No Gerber file available." +msgstr "[ERROR_NOTCL]No Gerber file available." + +#: flatcamTools/ToolNonCopperClear.py:704 +#: flatcamTools/ToolNonCopperClear.py:826 +msgid "Clearing Non-Copper areas." +msgstr "Clearing Non-Copper areas." + +#: flatcamTools/ToolNonCopperClear.py:722 +#, python-format +msgid "[success] Non-Copper Clearing with ToolDia = %s started." +msgstr "[success] Non-Copper Clearing with ToolDia = %s started." + +#: flatcamTools/ToolNonCopperClear.py:791 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" +msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" + +#: flatcamTools/ToolNonCopperClear.py:796 +msgid "[success] NCC Tool finished." +msgstr "[success] NCC Tool finished." + +#: flatcamTools/ToolNonCopperClear.py:798 +msgid "" +"[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " +"cleared. Check the result." +msgstr "" +"[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " +"cleared. Check the result." + +#: flatcamTools/ToolNonCopperClear.py:844 +#, python-format +msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." +msgstr "[success] Non-Copper Rest Clearing with ToolDia = %s started." + +#: flatcamTools/ToolNonCopperClear.py:942 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" +msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" + +#: flatcamTools/ToolNonCopperClear.py:950 +msgid "" +"[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " +"settings." +msgstr "" +"[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " +"settings." + +#: flatcamTools/ToolPaint.py:24 +msgid "Paint Area" +msgstr "Paint Area" + +#: flatcamTools/ToolPaint.py:60 +msgid "Geometry:" +msgstr "Geometry:" + +#: flatcamTools/ToolPaint.py:62 +msgid "Geometry object to be painted. " +msgstr "Geometry object to be painted. " + +#: flatcamTools/ToolPaint.py:71 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for painting." +msgstr "" +"Tools pool from which the algorithm\n" +"will pick the ones used for painting." + +#: flatcamTools/ToolPaint.py:86 +msgid "" +"This is the Tool Number.\n" +"Painting will start with the tool with the biggest diameter,\n" +"continuing until there are no more tools.\n" +"Only tools that create painting geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" +"This is the Tool Number.\n" +"Painting will start with the tool with the biggest diameter,\n" +"continuing until there are no more tools.\n" +"Only tools that create painting geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." + +#: flatcamTools/ToolPaint.py:119 +msgid "Diameter for the new tool." +msgstr "Diameter for the new tool." + +#: flatcamTools/ToolPaint.py:224 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"\n" +"If not checked, use the standard algorithm." +msgstr "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"\n" +"If not checked, use the standard algorithm." + +#: flatcamTools/ToolPaint.py:239 +msgid "" +"How to select the polygons to paint.
Options:
- Single: left " +"mouse click on the polygon to be painted.
- All: paint all " +"polygons." +msgstr "" +"How to select the polygons to paint.
Options:
- Single: left " +"mouse click on the polygon to be painted.
- All: paint all " +"polygons." + +#: flatcamTools/ToolPaint.py:254 +msgid "Create Paint Geometry" +msgstr "Create Paint Geometry" + +#: flatcamTools/ToolPaint.py:256 +msgid "" +"After clicking here, click inside
the polygon you wish to be painted if " +"Single is selected.
If All is selected then the Paint will " +"start after click.
A new Geometry object with the tool
paths will be " +"created." +msgstr "" +"After clicking here, click inside
the polygon you wish to be painted if " +"Single is selected.
If All is selected then the Paint will " +"start after click.
A new Geometry object with the tool
paths will be " +"created." + +#: flatcamTools/ToolPaint.py:732 +msgid "geometry_on_paint_button" +msgstr "geometry_on_paint_button" + +#: flatcamTools/ToolPaint.py:735 flatcamTools/ToolPaint.py:780 +msgid "[WARNING_NOTCL]Click inside the desired polygon." +msgstr "[WARNING_NOTCL]Click inside the desired polygon." + +#: flatcamTools/ToolPaint.py:767 +msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." +msgstr "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." + +#: flatcamTools/ToolPaint.py:789 flatcamTools/ToolPaint.py:992 +msgid "Painting polygon..." +msgstr "Painting polygon..." + +#: flatcamTools/ToolPaint.py:840 +msgid "[WARNING] No polygon found." +msgstr "[WARNING] No polygon found." + +#: flatcamTools/ToolPaint.py:843 +msgid "Painting polygon." +msgstr "Painting polygon." + +#: flatcamTools/ToolPaint.py:885 +msgid "[ERROR_NOTCL] Geometry could not be painted completely" +msgstr "[ERROR_NOTCL] Geometry could not be painted completely" + +#: flatcamTools/ToolPaint.py:911 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different strategy of paint\n" +"%s" +msgstr "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different strategy of paint\n" +"%s" + +#: flatcamTools/ToolPaint.py:953 +#, python-format +msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" +msgstr "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" + +#: flatcamTools/ToolPaint.py:959 flatcamTools/ToolPaint.py:1251 +msgid "Polygon Paint started ..." +msgstr "Polygon Paint started ..." + +#: flatcamTools/ToolPaint.py:1107 flatcamTools/ToolPaint.py:1196 +#, python-format +msgid "" +"[ERROR] Could not do Paint All. Try a different combination of parameters. " +"Or a different Method of paint\n" +"%s" +msgstr "" +"[ERROR] Could not do Paint All. Try a different combination of parameters. " +"Or a different Method of paint\n" +"%s" + +#: flatcamTools/ToolPaint.py:1131 +msgid "" +"[ERROR] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" +"[ERROR] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." + +#: flatcamTools/ToolPaint.py:1140 +msgid "[success] Paint All Done." +msgstr "[success] Paint All Done." + +#: flatcamTools/ToolPaint.py:1226 +msgid "" +"[ERROR_NOTCL] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" +"[ERROR_NOTCL] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." + +#: flatcamTools/ToolPaint.py:1235 +msgid "[success] Paint All with Rest-Machining done." +msgstr "[success] Paint All with Rest-Machining done." + +#: flatcamTools/ToolPanelize.py:25 +msgid "Panelize PCB" +msgstr "Panelize PCB" + +#: flatcamTools/ToolPanelize.py:58 +msgid "" +"Specify the type of object to be panelized\n" +"It can be of type: Gerber, Excellon or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Object combobox." +msgstr "" +"Specify the type of object to be panelized\n" +"It can be of type: Gerber, Excellon or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Object combobox." + +#: flatcamTools/ToolPanelize.py:73 +msgid "" +"Object to be panelized. This means that it will\n" +"be duplicated in an array of rows and columns." +msgstr "" +"Object to be panelized. This means that it will\n" +"be duplicated in an array of rows and columns." + +#: flatcamTools/ToolPanelize.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"panelization. It can be: Gerber or Geometry type.\n" +"The selection here decide the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" +"Specify the type of object to be used as an container for\n" +"panelization. It can be: Gerber or Geometry type.\n" +"The selection here decide the type of objects that will be\n" +"in the Box Object combobox." + +#: flatcamTools/ToolPanelize.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object that is to be panelized." +msgstr "" +"The actual object that is used a container for the\n" +" selected object that is to be panelized." + +#: flatcamTools/ToolPanelize.py:150 +msgid "" +"Choose the type of object for the panel object:\n" +"- Geometry\n" +"- Gerber" +msgstr "" +"Choose the type of object for the panel object:\n" +"- Geometry\n" +"- Gerber" + +#: flatcamTools/ToolPanelize.py:158 +msgid "Constrain panel within:" +msgstr "Constrain panel within:" + +#: flatcamTools/ToolPanelize.py:192 +msgid "Panelize Object" +msgstr "Panelize Object" + +#: flatcamTools/ToolPanelize.py:194 +msgid "" +"Panelize the specified object around the specified box.\n" +"In other words it creates multiple copies of the source object,\n" +"arranged in a 2D array of rows and columns." +msgstr "" +"Panelize the specified object around the specified box.\n" +"In other words it creates multiple copies of the source object,\n" +"arranged in a 2D array of rows and columns." + +#: flatcamTools/ToolPanelize.py:311 +#, python-format +msgid "[WARNING]No object Box. Using instead %s" +msgstr "[WARNING]No object Box. Using instead %s" + +#: flatcamTools/ToolPanelize.py:392 +msgid "" +"[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive " +"integer." +msgstr "" +"[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive " +"integer." + +#: flatcamTools/ToolPanelize.py:417 flatcamTools/ToolPanelize.py:526 +msgid "Generating panel ... Please wait." +msgstr "Generating panel ... Please wait." + +#: flatcamTools/ToolPanelize.py:520 +msgid "[success]Panel done..." +msgstr "[success]Panel done..." + +#: flatcamTools/ToolPanelize.py:523 +#, python-brace-format +msgid "" +"[WARNING] Too big for the constrain area. Final panel has {col} columns and " +"{row} rows" +msgstr "" +"[WARNING] Too big for the constrain area. Final panel has {col} columns and " +"{row} rows" + +#: flatcamTools/ToolPanelize.py:531 +msgid "[success]Panel created successfully." +msgstr "[success]Panel created successfully." + +#: flatcamTools/ToolProperties.py:103 +msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." +msgstr "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." + +#: flatcamTools/ToolProperties.py:110 +msgid "[success] Object Properties are displayed." +msgstr "[success] Object Properties are displayed." + +#: flatcamTools/ToolProperties.py:111 +msgid "Properties Tool" +msgstr "Properties Tool" + +#: flatcamTools/ToolShell.py:69 +msgid "...proccessing..." +msgstr "...proccessing..." + +#: flatcamTools/ToolShell.py:71 +#, python-format +msgid "...proccessing... [%s]" +msgstr "...proccessing... [%s]" + +#: flatcamTools/ToolSolderPaste.py:37 +msgid "Solder Paste Tool" +msgstr "Solder Paste Tool" + +#: flatcamTools/ToolSolderPaste.py:65 +msgid "Gerber Solder paste object. " +msgstr "Gerber Solder paste object. " + +#: flatcamTools/ToolSolderPaste.py:72 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for dispensing solder paste." +msgstr "" +"Tools pool from which the algorithm\n" +"will pick the ones used for dispensing solder paste." + +#: flatcamTools/ToolSolderPaste.py:87 +msgid "" +"This is the Tool Number.\n" +"The solder dispensing will start with the tool with the biggest \n" +"diameter, continuing until there are no more Nozzle tools.\n" +"If there are no longer tools but there are still pads not covered\n" +" with solder paste, the app will issue a warning message box." +msgstr "" +"This is the Tool Number.\n" +"The solder dispensing will start with the tool with the biggest \n" +"diameter, continuing until there are no more Nozzle tools.\n" +"If there are no longer tools but there are still pads not covered\n" +" with solder paste, the app will issue a warning message box." + +#: flatcamTools/ToolSolderPaste.py:94 +msgid "" +"Nozzle tool Diameter. It's value (in current FlatCAM units)\n" +"is the width of the solder paste dispensed." +msgstr "" +"Nozzle tool Diameter. It's value (in current FlatCAM units)\n" +"is the width of the solder paste dispensed." + +#: flatcamTools/ToolSolderPaste.py:101 +msgid "New Nozzle Tool" +msgstr "New Nozzle Tool" + +#: flatcamTools/ToolSolderPaste.py:117 +msgid "" +"Add a new nozzle tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" +"Add a new nozzle tool to the Tool Table\n" +"with the diameter specified above." + +#: flatcamTools/ToolSolderPaste.py:129 +msgid "Generate solder paste dispensing geometry." +msgstr "Generate solder paste dispensing geometry." + +#: flatcamTools/ToolSolderPaste.py:142 +msgid "STEP 1" +msgstr "STEP 1" + +#: flatcamTools/ToolSolderPaste.py:144 +msgid "" +"First step is to select a number of nozzle tools for usage\n" +"and then optionally modify the GCode parameters bellow." +msgstr "" +"First step is to select a number of nozzle tools for usage\n" +"and then optionally modify the GCode parameters bellow." + +#: flatcamTools/ToolSolderPaste.py:147 +msgid "" +"Select tools.\n" +"Modify parameters." +msgstr "" +"Select tools.\n" +"Modify parameters." + +#: flatcamTools/ToolSolderPaste.py:290 +msgid "Generate GCode" +msgstr "Generate GCode" + +#: flatcamTools/ToolSolderPaste.py:292 +msgid "" +"Generate GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" +"Generate GCode for Solder Paste dispensing\n" +"on PCB pads." + +#: flatcamTools/ToolSolderPaste.py:308 +msgid "STEP 2:" +msgstr "STEP 2:" + +#: flatcamTools/ToolSolderPaste.py:310 +msgid "" +"Second step is to create a solder paste dispensing\n" +"geometry out of an Solder Paste Mask Gerber file." +msgstr "" +"Second step is to create a solder paste dispensing\n" +"geometry out of an Solder Paste Mask Gerber file." + +#: flatcamTools/ToolSolderPaste.py:326 +msgid "Geo Result:" +msgstr "Geo Result:" + +#: flatcamTools/ToolSolderPaste.py:328 +msgid "" +"Geometry Solder Paste object.\n" +"The name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" +"Geometry Solder Paste object.\n" +"The name of the object has to end in:\n" +"'_solderpaste' as a protection." + +#: flatcamTools/ToolSolderPaste.py:337 +msgid "STEP 3:" +msgstr "STEP 3:" + +#: flatcamTools/ToolSolderPaste.py:339 +msgid "" +"Third step is to select a solder paste dispensing geometry,\n" +"and then generate a CNCJob object.\n" +"\n" +"REMEMBER: if you want to create a CNCJob with new parameters,\n" +"first you need to generate a geometry with those new params,\n" +"and only after that you can generate an updated CNCJob." +msgstr "" +"Third step is to select a solder paste dispensing geometry,\n" +"and then generate a CNCJob object.\n" +"\n" +"REMEMBER: if you want to create a CNCJob with new parameters,\n" +"first you need to generate a geometry with those new params,\n" +"and only after that you can generate an updated CNCJob." + +#: flatcamTools/ToolSolderPaste.py:359 +msgid "CNC Result:" +msgstr "CNC Result:" + +#: flatcamTools/ToolSolderPaste.py:361 +msgid "" +"CNCJob Solder paste object.\n" +"In order to enable the GCode save section,\n" +"the name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" +"CNCJob Solder paste object.\n" +"In order to enable the GCode save section,\n" +"the name of the object has to end in:\n" +"'_solderpaste' as a protection." + +#: flatcamTools/ToolSolderPaste.py:371 +msgid "View GCode" +msgstr "View GCode" + +#: flatcamTools/ToolSolderPaste.py:373 +msgid "" +"View the generated GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" +"View the generated GCode for Solder Paste dispensing\n" +"on PCB pads." + +#: flatcamTools/ToolSolderPaste.py:377 +msgid "Save GCode" +msgstr "Save GCode" + +#: flatcamTools/ToolSolderPaste.py:379 +msgid "" +"Save the generated GCode for Solder Paste dispensing\n" +"on PCB pads, to a file." +msgstr "" +"Save the generated GCode for Solder Paste dispensing\n" +"on PCB pads, to a file." + +#: flatcamTools/ToolSolderPaste.py:383 +msgid "STEP 4:" +msgstr "STEP 4:" + +#: flatcamTools/ToolSolderPaste.py:385 +msgid "" +"Fourth step (and last) is to select a CNCJob made from \n" +"a solder paste dispensing geometry, and then view/save it's GCode." +msgstr "" +"Fourth step (and last) is to select a CNCJob made from \n" +"a solder paste dispensing geometry, and then view/save it's GCode." + +#: flatcamTools/ToolSolderPaste.py:413 +msgid "Delete Object" +msgstr "Delete Object" + +#: flatcamTools/ToolSolderPaste.py:788 +msgid "" +"[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." +msgstr "" +"[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." + +#: flatcamTools/ToolSolderPaste.py:793 +msgid "[success] New Nozzle tool added to Tool Table." +msgstr "[success] New Nozzle tool added to Tool Table." + +#: flatcamTools/ToolSolderPaste.py:835 +msgid "[success] Nozzle tool from Tool Table was edited." +msgstr "[success] Nozzle tool from Tool Table was edited." + +#: flatcamTools/ToolSolderPaste.py:891 +msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." +msgstr "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." + +#: flatcamTools/ToolSolderPaste.py:896 +msgid "[success] Nozzle tool(s) deleted from Tool Table." +msgstr "[success] Nozzle tool(s) deleted from Tool Table." + +#: flatcamTools/ToolSolderPaste.py:951 +msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." +msgstr "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." + +#: flatcamTools/ToolSolderPaste.py:968 +msgid "Creating Solder Paste dispensing geometry." +msgstr "Creating Solder Paste dispensing geometry." + +#: flatcamTools/ToolSolderPaste.py:980 +msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." +msgstr "[WARNING_NOTCL] No Nozzle tools in the tool table." + +#: flatcamTools/ToolSolderPaste.py:1106 flatcamTools/ToolSolderPaste.py:1161 +msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." +msgstr "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." + +#: flatcamTools/ToolSolderPaste.py:1109 +msgid "[success] Solder Paste geometry generated successfully..." +msgstr "[success] Solder Paste geometry generated successfully..." + +#: flatcamTools/ToolSolderPaste.py:1115 +msgid "" +"[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " +"diameters..." +msgstr "" +"[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " +"diameters..." + +#: flatcamTools/ToolSolderPaste.py:1129 +msgid "Generating Solder Paste dispensing geometry..." +msgstr "Generating Solder Paste dispensing geometry..." + +#: flatcamTools/ToolSolderPaste.py:1149 +msgid "[WARNING_NOTCL] There is no Geometry object available." +msgstr "[WARNING_NOTCL] There is no Geometry object available." + +#: flatcamTools/ToolSolderPaste.py:1153 +msgid "" +"[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " +"geometry." +msgstr "" +"[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " +"geometry." + +#: flatcamTools/ToolSolderPaste.py:1258 +#, python-format +msgid "[success] ToolSolderPaste CNCjob created: %s" +msgstr "[success] ToolSolderPaste CNCjob created: %s" + +#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 +#: flatcamTools/ToolSolderPaste.py:1345 +msgid "" +"[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " +"solder_paste_tool CNCJob object." +msgstr "" +"[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " +"solder_paste_tool CNCJob object." + +#: flatcamTools/ToolSolderPaste.py:1317 +msgid "[ERROR_NOTCL] No Gcode in the object..." +msgstr "[ERROR_NOTCL] No Gcode in the object..." + +#: flatcamTools/ToolSolderPaste.py:1326 +#, python-format +msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" +msgstr "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" + +#: flatcamTools/ToolSolderPaste.py:1355 +msgid "Export GCode ..." +msgstr "Export GCode ..." + +#: flatcamTools/ToolSolderPaste.py:1363 +msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." +msgstr "[WARNING_NOTCL] Export Machine Code cancelled ..." + +#: flatcamTools/ToolSolderPaste.py:1393 +#, python-format +msgid "[success] Solder paste dispenser GCode file saved to: %s" +msgstr "[success] Solder paste dispenser GCode file saved to: %s" + +#: flatcamTools/ToolTransform.py:23 +msgid "Object Transform" +msgstr "Object Transform" + +#: flatcamTools/ToolTransform.py:84 +msgid "" +"Rotate the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" +"Rotate the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." + +#: flatcamTools/ToolTransform.py:120 flatcamTools/ToolTransform.py:138 +msgid "" +"Skew/shear the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" +"Skew/shear the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." + +#: flatcamTools/ToolTransform.py:176 flatcamTools/ToolTransform.py:193 +msgid "" +"Scale the selected object(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" +"Scale the selected object(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." + +#: flatcamTools/ToolTransform.py:202 +msgid "" +"Scale the selected object(s)\n" +"using the Scale Factor X for both axis." +msgstr "" +"Scale the selected object(s)\n" +"using the Scale Factor X for both axis." + +#: flatcamTools/ToolTransform.py:250 flatcamTools/ToolTransform.py:267 +msgid "" +"Offset the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects.\n" +msgstr "" +"Offset the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects.\n" + +#: flatcamTools/ToolTransform.py:297 flatcamTools/ToolTransform.py:305 +msgid "" +"Flip the selected object(s) over the X axis.\n" +"Does not create a new object.\n" +" " +msgstr "" +"Flip the selected object(s) over the X axis.\n" +"Does not create a new object.\n" +" " + +#: flatcamTools/ToolTransform.py:637 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to rotate!" +msgstr "[WARNING_NOTCL] No object selected. Please Select an object to rotate!" + +#: flatcamTools/ToolTransform.py:665 +msgid "CNCJob objects can't be rotated." +msgstr "CNCJob objects can't be rotated." + +#: flatcamTools/ToolTransform.py:674 +msgid "[success]Rotate done ..." +msgstr "[success]Rotate done ..." + +#: flatcamTools/ToolTransform.py:689 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to flip!" +msgstr "[WARNING_NOTCL] No object selected. Please Select an object to flip!" + +#: flatcamTools/ToolTransform.py:724 +msgid "CNCJob objects can't be mirrored/flipped." +msgstr "CNCJob objects can't be mirrored/flipped." + +#: flatcamTools/ToolTransform.py:735 +msgid "[success]Flip on the Y axis done ..." +msgstr "[success]Flip on the Y axis done ..." + +#: flatcamTools/ToolTransform.py:745 +msgid "[success]Flip on the X axis done ..." +msgstr "[success]Flip on the X axis done ..." + +#: flatcamTools/ToolTransform.py:759 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!" +msgstr "" +"[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!" + +#: flatcamTools/ToolTransform.py:781 +msgid "CNCJob objects can't be skewed." +msgstr "CNCJob objects can't be skewed." + +#: flatcamTools/ToolTransform.py:793 +#, python-format +msgid "[success]Skew on the %s axis done ..." +msgstr "[success]Skew on the %s axis done ..." + +#: flatcamTools/ToolTransform.py:808 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to scale!" +msgstr "[WARNING_NOTCL] No object selected. Please Select an object to scale!" + +#: flatcamTools/ToolTransform.py:841 +msgid "CNCJob objects can't be scaled." +msgstr "CNCJob objects can't be scaled." + +#: flatcamTools/ToolTransform.py:861 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to offset!" +msgstr "[WARNING_NOTCL] No object selected. Please Select an object to offset!" + +#: flatcamTools/ToolTransform.py:882 +msgid "CNCJob objects can't be offseted." +msgstr "CNCJob objects can't be offseted." + +#: flatcamTools/ToolTransform.py:894 +#, python-format +msgid "[success]Offset on the %s axis done ..." +msgstr "[success]Offset on the %s axis done ..." + +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25\\% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25\\% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." + +#| msgid "z_toolchange = Z coord for Toolchange" +msgid "z_cut = Z coord for Toolchange" +msgstr "z_cut = Z coord for Toolchange" + +#| msgid "z_toolchange = Z coord for Toolchange" +msgid "z_move = Z coord for Toolchange" +msgstr "z_move = Z coord for Toolchange" + +msgid "%s/Project_%s" +msgstr "%s/Project_%s" + +msgid "tool_tab" +msgstr "tool_tab" diff --git a/locale/ro/LC_MESSAGES/strings.mo b/locale/ro/LC_MESSAGES/strings.mo new file mode 100644 index 00000000..85708fc3 Binary files /dev/null and b/locale/ro/LC_MESSAGES/strings.mo differ diff --git a/locale/ro/LC_MESSAGES/strings.po b/locale/ro/LC_MESSAGES/strings.po new file mode 100644 index 00000000..0e556fb7 --- /dev/null +++ b/locale/ro/LC_MESSAGES/strings.po @@ -0,0 +1,10496 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2019-03-17 23:06+0200\n" +"PO-Revision-Date: 2019-03-18 01:21+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n" +"%100<=19) ? 1 : 2);\n" +"X-Poedit-Basepath: ../../..\n" +"X-Poedit-SearchPath-0: .\n" + +#: FlatCAMApp.py:844 +msgid "[ERROR] Could not find the Language files. The App strings are missing." +msgstr "" +"[ERROR]Nu am gasit fişierele cu traduceri. Mesajele aplicatiei lipsesc." + +#: FlatCAMApp.py:1672 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +msgid "Open cancelled." +msgstr "Deschidere anulata." + +#: FlatCAMApp.py:1686 +msgid "Open Config file failed." +msgstr "Deshciderea fişierului de configurare a esuat." + +#: FlatCAMApp.py:1871 +msgid "" +"[WARNING_NOTCL] Editing a MultiGeo Geometry is not possible for the moment." +msgstr "" +"[WARNING_NOTCL] Editarea unei Geometrii tip multigeo nu este posibila " +"momentan." + +#: FlatCAMApp.py:1892 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to edit." +msgstr "" +"[WARNING_NOTCL] Selectează un obiect tip Geometrie sau Excellon pentru " +"editare." + +#: FlatCAMApp.py:1903 +msgid "[WARNING_NOTCL]Editor is activated ..." +msgstr "[WARNING_NOTCL] Editorul este activ. .." + +#: FlatCAMApp.py:1942 +msgid "[WARNING] Object empty after edit." +msgstr "[WARNING] Obiectul nu are date dupa editare." + +#: FlatCAMApp.py:1951 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to update." +msgstr "" +"[WARNING_NOTCL] Selectează un obiect tip Geometrie sau Excellon pentru " +"salvare." + +#: FlatCAMApp.py:1964 +#, python-format +msgid "[selected] %s is updated, returning to App..." +msgstr "[selected] %s este actualizat, intoarcere la aplicatie." + +#: FlatCAMApp.py:2287 +msgid "[ERROR] Could not load defaults file." +msgstr "[ERROR] Nu am putut incarca fişierul cu valori default." + +#: FlatCAMApp.py:2299 +msgid "[ERROR] Failed to parse defaults file." +msgstr "[ERROR] Parsarea fişierului cu valori default a esuat." + +#: FlatCAMApp.py:2320 FlatCAMApp.py:2323 +msgid "Import FlatCAM Preferences" +msgstr "Importa Preferințele FlatCAM" + +#: FlatCAMApp.py:2328 +msgid "[WARNING_NOTCL]FlatCAM preferences import cancelled." +msgstr "[WARNING_NOTCL] Importul preferințelor FlatCAM a esuat." + +#: FlatCAMApp.py:2336 FlatCAMApp.py:2810 +msgid "[ERROR_NOTCL] Could not load defaults file." +msgstr "" +"[ERROR_NOTCL] Nu a fost posibila incarcarea fişierului cu valori default." + +#: FlatCAMApp.py:2344 FlatCAMApp.py:2819 +msgid "[ERROR_NOTCL] Failed to parse defaults file." +msgstr "[ERROR_NOTCL] Parsarea fişierului cu valori default a esuat." + +#: FlatCAMApp.py:2347 +#, python-format +msgid "[success]Imported Defaults from %s" +msgstr "[success] Valorile default au fost importate din %s" + +#: FlatCAMApp.py:2357 FlatCAMApp.py:2361 +msgid "Export FlatCAM Preferences" +msgstr "Exporta Preferințele FlatCAM" + +#: FlatCAMApp.py:2367 +msgid "[WARNING_NOTCL]FlatCAM preferences export cancelled." +msgstr "[WARNING_NOTCL] Exportul preferințelor FlatCAM este anulat." + +#: FlatCAMApp.py:2383 +msgid "[ERROR_NOTCL]Could not load defaults file." +msgstr "" +"[ERROR_NOTCL] Nu a fost posibila incarcarea fişierului cu valori default." + +#: FlatCAMApp.py:2402 FlatCAMApp.py:2833 +msgid "[ERROR_NOTCL] Failed to write defaults to file." +msgstr "[ERROR_NOTCL] Salvarea valorilor default intr-un fişier a esuat." + +#: FlatCAMApp.py:2454 +msgid "[ERROR_NOTCL]Failed to open recent files file for writing." +msgstr "" +"[ERROR_NOTCL] Deschiderea fişierului cu >fişiere recente< pentru a fi salvat " +"a esuat." + +#: FlatCAMApp.py:2539 camlib.py:4229 +msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" +msgstr "" +"[ERROR_NOTCL] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " +"detalii.\n" + +#: FlatCAMApp.py:2540 +#, python-brace-format +msgid "" +"Object ({kind}) failed because: {error} \n" +"\n" +msgstr "" +"Obiectul ({kind}) a esuat din cauza: {error} \n" +"\n" + +#: FlatCAMApp.py:2560 +msgid "Converting units to " +msgstr "Se convertesc unitatile la " + +#: FlatCAMApp.py:2618 FlatCAMApp.py:2621 FlatCAMApp.py:2624 FlatCAMApp.py:2627 +#, python-brace-format +msgid "" +"[selected]{kind} created/selected: {name}" +msgstr "" +"[selected]{kind} creat/selectat: {name}" + +#: FlatCAMApp.py:2865 +msgid "[success]Defaults saved." +msgstr "[success] Valorile default au fost salvate." + +#: FlatCAMApp.py:2886 +msgid "[ERROR_NOTCL] Could not load factory defaults file." +msgstr "" +"[ERROR_NOTCL] Fişierul cu valori default de fabrica nu a putut fi deschis." + +#: FlatCAMApp.py:2895 +msgid "[ERROR_NOTCL] Failed to parse factory defaults file." +msgstr "" +"[ERROR_NOTCL] Parsarea fişierului cu valori default de fabrica a esuat." + +#: FlatCAMApp.py:2909 +msgid "[ERROR_NOTCL] Failed to write factory defaults to file." +msgstr "" +"[ERROR_NOTCL]] Salvarea fişierului cu valori default de fabrica intr-un " +"fişier a esuat." + +#: FlatCAMApp.py:2913 +msgid "Factory defaults saved." +msgstr "Valori default de fabrica au fost salvate." + +#: FlatCAMApp.py:2918 +msgid "" +"There are files/objects modified in FlatCAM. \n" +"Do you want to Save the project?" +msgstr "" +"FlatCAM are fişiere/obiecte care au fost modificate. \n" +"Dorești să Salvezi proiectul?" + +#: FlatCAMApp.py:2921 FlatCAMApp.py:5190 +msgid "Save changes" +msgstr "Salvează modificarile." + +#: FlatCAMApp.py:2981 +msgid "" +"[ERROR] Failed join. The Geometry objects are of different types.\n" +"At least one is MultiGeo type and the other is SingleGeo type. A possibility " +"is to convert from one to another and retry joining \n" +"but in the case of converting from MultiGeo to SingleGeo, informations may " +"be lost and the result may not be what was expected. \n" +"Check the generated GCODE." +msgstr "" +"[ERROR] Fuziune esuata. Obiectele Geometrii sunt de tipuri diferite.\n" +"Cel putin unul este de tip Multigeo și celalalt este tip SinglGeo. O " +"posibilitate este să convertesti dintr-unul in celalalt și să reincerci " +"fuzionarea \n" +"dar un cazul conversiei de la MultiGeo to SingleGeo, se pot pierde " +"informatii și rezultatul ar putea să nu fie cel dorit. \n" +"Verifică codul G-Code generat." + +#: FlatCAMApp.py:3022 +msgid "[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects." +msgstr "" +"[ERROR_NOTCL] Esuat. Fuzionarea Excellon functionează doar cu obiecte de tip " +"Excellon." + +#: FlatCAMApp.py:3044 +msgid "[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects." +msgstr "" +"[ERROR_NOTCL] Esuat. Fuzionarea Gerber functionează doar cu obiecte de tip " +"Gerber ." + +#: FlatCAMApp.py:3059 FlatCAMApp.py:3084 +msgid "[ERROR_NOTCL]Failed. Select a Geometry Object and try again." +msgstr "" +"[ERROR_NOTCL] Esuat. Selectează un obiect Geometrie și încearcă din nou." + +#: FlatCAMApp.py:3063 FlatCAMApp.py:3088 +#, python-format +msgid "[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" +msgstr "[ERROR_NOTCL] Se astepta o Geometrie FlatCAM, s-a primit %s" + +#: FlatCAMApp.py:3076 +msgid "[success] A Geometry object was converted to MultiGeo type." +msgstr "[success] Un obiect Geometrie a fost convertit la tipul MultiGeo." + +#: FlatCAMApp.py:3102 +msgid "[success] A Geometry object was converted to SingleGeo type." +msgstr "[success] Un obiect Geometrie a fost convertit la tipul SingleGeo ." + +#: FlatCAMApp.py:3286 +#, python-format +msgid "[success]Converted units to %s" +msgstr "[success] Conversie unitati la %s" + +#: FlatCAMApp.py:3297 +msgid "[WARNING_NOTCL]Units conversion cancelled." +msgstr "[WARNING_NOTCL] Conversia unitatilor este anulata." + +#: FlatCAMApp.py:3862 +msgid "Open file" +msgstr "Deschide fişierul ..." + +#: FlatCAMApp.py:3913 FlatCAMApp.py:3918 +msgid "Export G-Code ..." +msgstr "Exporta G-Code ..." + +#: FlatCAMApp.py:3921 +msgid "[WARNING_NOTCL]Export Code cancelled." +msgstr "[WARNING_NOTCL Exportul GCode este anulat." + +#: FlatCAMApp.py:3931 +msgid "[WARNING] No such file or directory" +msgstr "[WARNING] Nu exista un asa fişier sau director" + +#: FlatCAMApp.py:3938 +#, python-format +msgid "Saved to: %s" +msgstr "Salvat in: %s" + +#: FlatCAMApp.py:4001 FlatCAMApp.py:4033 FlatCAMApp.py:4044 FlatCAMApp.py:4055 +#: flatcamTools/ToolNonCopperClear.py:487 flatcamTools/ToolSolderPaste.py:764 +msgid "" +"[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " +"format." +msgstr "" +"[WARNING_NOTCL] Introdu un diametru al uneltei valid: valoare ne-nula in " +"format Real." + +#: FlatCAMApp.py:4006 FlatCAMApp.py:4038 FlatCAMApp.py:4049 FlatCAMApp.py:4060 +#: flatcamGUI/FlatCAMGUI.py:2484 +msgid "[WARNING_NOTCL] Adding Tool cancelled ..." +msgstr "[WARNING_NOTCL] Adaugarea unei unelte anulata ..." + +#: FlatCAMApp.py:4009 +msgid "" +"Adding Tool works only when Advanced is checked.\n" +"Go to Preferences -> General - Show Advanced Options." +msgstr "" +"Adaugarea de unelte noi functionează doar in modul Avansat.\n" +"Pentru aceasta mergi in Preferințe -> General - Activează Modul Avansat." + +#: FlatCAMApp.py:4114 +msgid "Object(s) deleted ..." +msgstr "Obiect(ele) sters(e)." + +#: FlatCAMApp.py:4118 +msgid "Failed. No object(s) selected..." +msgstr "Esuat. Nici-un obiect nu este selectat." + +#: FlatCAMApp.py:4120 +msgid "Save the work in Editor and try again ..." +msgstr "Salvează continutul din Editor și încearcă din nou." + +#: FlatCAMApp.py:4133 +msgid "Click to set the origin ..." +msgstr "Click pentru a seta originea..." + +#: FlatCAMApp.py:4145 +msgid "Jump to ..." +msgstr "Sari la ..." + +#: FlatCAMApp.py:4146 +msgid "Enter the coordinates in format X,Y:" +msgstr "Introduceți coordonatele in format X,Y:" + +#: FlatCAMApp.py:4153 +msgid "Wrong coordinates. Enter coordinates in format: X,Y" +msgstr "Coordonate gresite. Introduceți coordonatele in format X,Y." + +#: FlatCAMApp.py:4168 +msgid "Done." +msgstr "Executat." + +#: FlatCAMApp.py:4300 +msgid "[success] Origin set ..." +msgstr "[success] Originea a fost setata ..." + +#: FlatCAMApp.py:4318 +msgid "Preferences" +msgstr "Preferințe" + +#: FlatCAMApp.py:4338 +msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." +msgstr "" +"[WARNING_NOTCL] Nu sete nici-un obiect selectat pentru oglindire pe axa Y." + +#: FlatCAMApp.py:4363 +msgid "[success] Flip on Y axis done." +msgstr "[success] Oglindire pe axa Y executata." + +#: FlatCAMApp.py:4365 FlatCAMApp.py:4405 FlatCAMEditor.py:1340 +#: flatcamTools/ToolTransform.py:750 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." +msgstr "[ERROR_NOTCL] Datorita %s, oglindirea a esuat." + +#: FlatCAMApp.py:4378 +msgid "[WARNING_NOTCL] No object selected to Flip on X axis." +msgstr "" +"[WARNING_NOTCL] Nu sete nici-un obiect selectat pentru oglindire pe axa X." + +#: FlatCAMApp.py:4403 +msgid "[success] Flip on X axis done." +msgstr "[success] Oglindirea pe axa X executata." + +#: FlatCAMApp.py:4418 +msgid "[WARNING_NOTCL] No object selected to Rotate." +msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Rotatie." + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Transform" +msgstr "Transformare" + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Enter the Angle value:" +msgstr "Introduceți valoaea Unghiului:" + +#: FlatCAMApp.py:4451 +msgid "[success] Rotation done." +msgstr "[success] Rotatie executata." + +#: FlatCAMApp.py:4453 FlatCAMEditor.py:1283 flatcamTools/ToolTransform.py:678 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." +msgstr "[ERROR_NOTCL] Datorita %s, Rotatia a esuat." + +#: FlatCAMApp.py:4464 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." +msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Deformare pe axa X." + +#: FlatCAMApp.py:4485 +msgid "[success] Skew on X axis done." +msgstr "[success] Deformare pe axa X executata." + +#: FlatCAMApp.py:4495 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." +msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Deformare pe axa Y." + +#: FlatCAMApp.py:4516 +msgid "[success] Skew on Y axis done." +msgstr "[success] Deformare pe axa Y executata." + +#: FlatCAMApp.py:4612 FlatCAMApp.py:4639 +msgid "" +"[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " +"format." +msgstr "" +"[WARNING_NOTCL] Introduceți o valoare pentru Grila ne-nula și in format Real." + +#: FlatCAMApp.py:4618 +msgid "[success] New Grid added ..." +msgstr "[success] O noua valoare pt Grila a fost adaugata..." + +#: FlatCAMApp.py:4621 +msgid "[WARNING_NOTCL] Grid already exists ..." +msgstr "[WARNING_NOTCL] Grila exista deja." + +#: FlatCAMApp.py:4624 +msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." +msgstr "[WARNING_NOTCL] Adaugarea unei valori de Grila a fost anulata ..." + +#: FlatCAMApp.py:4646 +msgid "[ERROR_NOTCL] Grid Value does not exist ..." +msgstr "[ERROR_NOTCL] Valoarea Grilei nu exista ..." + +#: FlatCAMApp.py:4649 +msgid "[success] Grid Value deleted ..." +msgstr "[success] Valoarea Grila a fost stearsa." + +#: FlatCAMApp.py:4652 +msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." +msgstr "[WARNING_NOTCL] Stergera unei valori de Grila a fost anulata ..." + +#: FlatCAMApp.py:4691 +msgid "[WARNING_NOTCL]No object selected to copy it's name" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat pentru i se copia valoarea" + +#: FlatCAMApp.py:4695 +msgid "Name copied on clipboard ..." +msgstr "Numele a fost copiat pe Clipboard ..." + +#: FlatCAMApp.py:4990 FlatCAMApp.py:4993 FlatCAMApp.py:4996 FlatCAMApp.py:4999 +#: FlatCAMApp.py:5013 FlatCAMApp.py:5016 FlatCAMApp.py:5019 FlatCAMApp.py:5022 +#: FlatCAMApp.py:5061 FlatCAMApp.py:5064 FlatCAMApp.py:5067 FlatCAMApp.py:5070 +#: ObjectCollection.py:696 ObjectCollection.py:699 ObjectCollection.py:702 +#: ObjectCollection.py:705 +#, python-brace-format +msgid "[selected]{name} selected" +msgstr "[selected]{name} selectat" + +#: FlatCAMApp.py:5187 +msgid "" +"There are files/objects opened in FlatCAM.\n" +"Creating a New project will delete them.\n" +"Do you want to Save the project?" +msgstr "" +"Exista fişiere/obiecte deschide in FlatCAM.\n" +"Crearea unui nou Proiect le va sterge..\n" +"Doriti să Salvati proiectul curentt?" + +#: FlatCAMApp.py:5205 +msgid "[success] New Project created..." +msgstr "[success] Un nou Proiect a fost creat..." + +#: FlatCAMApp.py:5286 +msgid "" +"[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." +msgstr "" +"[WARNING_NOTCL] Selectati un obiect Gerber sau Excellon pentru a-i vedea " +"codul sursa." + +#: FlatCAMApp.py:5293 +msgid "" +"[WARNING_NOTCL] There is no selected object for which to see it's source " +"file code." +msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru a-i vedea codul sursa." + +#: FlatCAMApp.py:5297 FlatCAMApp.py:6728 FlatCAMObj.py:5398 +msgid "Code Editor" +msgstr "Editor Cod" + +#: FlatCAMApp.py:5310 +#, python-format +msgid "[ERROR]App.on_view_source() -->%s" +msgstr "[ERROR]App.on_view_source() -->%s" + +#: FlatCAMApp.py:5348 FlatCAMApp.py:5351 flatcamGUI/FlatCAMGUI.py:541 +#: flatcamGUI/FlatCAMGUI.py:1590 +msgid "Open Gerber" +msgstr "Incarca Gerber" + +#: FlatCAMApp.py:5356 +msgid "[WARNING_NOTCL] Open Gerber cancelled." +msgstr "[WARNING_NOTCL] Incarcarea unui fişier Gerber este anulata." + +#: FlatCAMApp.py:5377 FlatCAMApp.py:5380 flatcamGUI/FlatCAMGUI.py:542 +#: flatcamGUI/FlatCAMGUI.py:1591 +msgid "Open Excellon" +msgstr "Incarca Excellon" + +#: FlatCAMApp.py:5385 +msgid "[WARNING_NOTCL]Open Excellon cancelled." +msgstr "[WARNING_NOTCL] Incarcarea unui fişier Excellon este anulata." + +#: FlatCAMApp.py:5407 FlatCAMApp.py:5410 +msgid "Open G-Code" +msgstr "Incarca G-Code" + +#: FlatCAMApp.py:5415 +msgid "[WARNING_NOTCL]Open G-Code cancelled." +msgstr "[WARNING_NOTCL]Incarcarea unui fişier G-Code este anulata." + +#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 +msgid "Open Project" +msgstr "Incarca Project" + +#: FlatCAMApp.py:5444 +msgid "[WARNING_NOTCL]Open Project cancelled." +msgstr "[WARNING_NOTCL] Incarcarea unui Proiect a fost anulata." + +#: FlatCAMApp.py:5463 FlatCAMApp.py:5466 +msgid "Open Configuration File" +msgstr "Incarca un fişier de Configurare" + +#: FlatCAMApp.py:5470 +msgid "[WARNING_NOTCL]Open Config cancelled." +msgstr "[WARNING_NOTCL] Incarcarea unui fişier de Configurare este anulata." + +#: FlatCAMApp.py:5485 FlatCAMApp.py:5682 FlatCAMApp.py:7588 FlatCAMApp.py:7608 +#: FlatCAMApp.py:7629 FlatCAMApp.py:7651 +msgid "[WARNING_NOTCL] No object selected." +msgstr "[WARNING_NOTCL] Nici-un obiect selectat." + +#: FlatCAMApp.py:5486 FlatCAMApp.py:5683 +msgid "Please Select a Geometry object to export" +msgstr "Selectează un obiect Geometrie pentru export" + +#: FlatCAMApp.py:5497 +msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." +msgstr "" +"[ERROR_NOTCL] Doar obiectele Geometrie, Gerber și CNCJob pot fi folosite." + +#: FlatCAMApp.py:5510 FlatCAMApp.py:5514 +msgid "Export SVG" +msgstr "Exporta SVG" + +#: FlatCAMApp.py:5519 +msgid "[WARNING_NOTCL]Export SVG cancelled." +msgstr "[WARNING_NOTCL] Exportul SVG este anulat." + +#: FlatCAMApp.py:5533 +msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" +msgstr "" +"[[WARNING_NOTCL]] Datele trebuie să fie organizate intr-o arie 3D cu ultima " +"dimensiune cu valoarea 3 sau 4." + +#: FlatCAMApp.py:5539 FlatCAMApp.py:5543 +msgid "Export PNG Image" +msgstr "Exporta imagine PNG" + +#: FlatCAMApp.py:5548 +msgid "Export PNG cancelled." +msgstr "Exportul imagine PNG este anulat." + +#: FlatCAMApp.py:5565 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." +msgstr "" +"[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Gerber pentru " +"export." + +#: FlatCAMApp.py:5570 +msgid "" +"[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." +msgstr "" +"[ERROR_NOTCL] Esuat. Doar obiectele tip Gerber pot fi salvate ca fişiere " +"Gerber..." + +#: FlatCAMApp.py:5582 +msgid "Save Gerber source file" +msgstr "Salvează codul sursa Gerber ca fişier" + +#: FlatCAMApp.py:5587 +msgid "[WARNING_NOTCL] Save Gerber source file cancelled." +msgstr "[WARNING_NOTCL] Salvarea codului sursa Gerber este anulata." + +#: FlatCAMApp.py:5604 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Excellon object to " +"export." +msgstr "" +"[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Excellon " +"pentru export." + +#: FlatCAMApp.py:5609 FlatCAMApp.py:5648 +msgid "" +"[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." +msgstr "" +"[ERROR_NOTCL] Esuat. Doar obiectele tip Excellon pot fi salvate ca fişiere " +"Excellon ..." + +#: FlatCAMApp.py:5617 FlatCAMApp.py:5621 +msgid "Save Excellon source file" +msgstr "Salvează codul sursa Excellon ca fişier" + +#: FlatCAMApp.py:5626 +msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." +msgstr "[WARNING_NOTCL] Salvarea codului sursa Excellon este anulata." + +#: FlatCAMApp.py:5643 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an Excellon object to " +"export." +msgstr "" +"[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Excellon " +"pentru export." + +#: FlatCAMApp.py:5656 FlatCAMApp.py:5660 +msgid "Export Excellon" +msgstr "Exporta Excellon" + +#: FlatCAMApp.py:5665 +msgid "[WARNING_NOTCL]Export Excellon cancelled." +msgstr "[WARNING_NOTCL] Exportul Excellon anulat." + +#: FlatCAMApp.py:5693 +msgid "[ERROR_NOTCL] Only Geometry objects can be used." +msgstr "[ERROR_NOTCL] Doar obiecte tip Geometrie pot fi folosite." + +#: FlatCAMApp.py:5706 FlatCAMApp.py:5710 +msgid "Export DXF" +msgstr "Exporta DXF" + +#: FlatCAMApp.py:5715 +msgid "[WARNING_NOTCL] Export DXF cancelled." +msgstr "[WARNING_NOTCL] Exportul DXF anulat." + +#: FlatCAMApp.py:5733 FlatCAMApp.py:5736 +msgid "Import SVG" +msgstr "Importa SVG" + +#: FlatCAMApp.py:5744 +msgid "[WARNING_NOTCL] Open SVG cancelled." +msgstr "[WARNING_NOTCL] Importul SVG anulat." + +#: FlatCAMApp.py:5763 FlatCAMApp.py:5766 +msgid "Import DXF" +msgstr "Importa DXF" + +#: FlatCAMApp.py:5774 +msgid "[WARNING_NOTCL]Open DXF cancelled." +msgstr "[WARNING_NOTCL] Incarcarea fişier DXF anulata." + +#: FlatCAMApp.py:5792 FlatCAMApp.py:5795 +msgid "Open TCL script" +msgstr "Incarca TCL script" + +#: FlatCAMApp.py:5803 +msgid "[WARNING_NOTCL]Open TCL script cancelled." +msgstr "[WARNING_NOTCL]Incarcarea TCL script anulata." + +#: FlatCAMApp.py:5851 FlatCAMApp.py:5855 +msgid "Save Project As ..." +msgstr "Salvează Proiectul ca ..." + +#: FlatCAMApp.py:5852 +#, python-brace-format +msgid "{l_save}/Project_{date}" +msgstr "{l_save}/Proiect_{date}" + +#: FlatCAMApp.py:5860 +msgid "[WARNING_NOTCL] Save Project cancelled." +msgstr "[WARNING_NOTCL] Salvarea Proiect anulata." + +#: FlatCAMApp.py:5905 +msgid "Exporting SVG" +msgstr "SVG in curs de export" + +#: FlatCAMApp.py:5938 FlatCAMApp.py:6043 FlatCAMApp.py:6157 +#, python-format +msgid "[success] SVG file exported to %s" +msgstr "[success] Fişier SVG exportat in %s" + +#: FlatCAMApp.py:5969 FlatCAMApp.py:6089 +#, python-format +msgid "[WARNING_NOTCL]No object Box. Using instead %s" +msgstr "" +"[WARNING_NOTCL] Nu este nici-un container Box pentru obiect. Se foloseşte %s" + +#: FlatCAMApp.py:6046 FlatCAMApp.py:6160 +msgid "Generating Film ... Please wait." +msgstr "Filmul se generează ... Asteapta!" + +#: FlatCAMApp.py:6307 +#, python-format +msgid "[success] Excellon file exported to %s" +msgstr "[success] Fişierul Excellon exportat in %s" + +#: FlatCAMApp.py:6314 +msgid "Exporting Excellon" +msgstr "Excellon in curs de export" + +#: FlatCAMApp.py:6319 FlatCAMApp.py:6326 +msgid "[ERROR_NOTCL] Could not export Excellon file." +msgstr "[ERROR_NOTCL] Fişierul Excellon nu a putut fi exportat." + +#: FlatCAMApp.py:6365 +#, python-format +msgid "[success] DXF file exported to %s" +msgstr "[success] Fişierul DXF exportat in %s" + +#: FlatCAMApp.py:6371 +msgid "Exporting DXF" +msgstr "DXF in curs de export" + +#: FlatCAMApp.py:6376 FlatCAMApp.py:6383 +msgid "[[WARNING_NOTCL]] Could not export DXF file." +msgstr "[[WARNING_NOTCL]] Fişierul DXF nu a putut fi exportat." + +#: FlatCAMApp.py:6403 FlatCAMApp.py:6445 FlatCAMApp.py:6486 +msgid "" +"[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " +"Gerber are supported" +msgstr "" +"[ERROR_NOTCL] Typul parametrului nu este compatibil. Doar Geometrie is " +"Gerber sunt acceptate." + +#: FlatCAMApp.py:6413 +msgid "Importing SVG" +msgstr "SVG in curs de ia fi importat" + +#: FlatCAMApp.py:6424 FlatCAMApp.py:6466 FlatCAMApp.py:6506 FlatCAMApp.py:6582 +#: FlatCAMApp.py:6649 FlatCAMApp.py:6714 +#, python-format +msgid "[success] Opened: %s" +msgstr "[success] Incarcat: %s" + +#: FlatCAMApp.py:6455 +msgid "Importing DXF" +msgstr "DXF in curs de a fi importat" + +#: FlatCAMApp.py:6494 +msgid "Importing Image" +msgstr "Imaginea in curs de a fi importata" + +#: FlatCAMApp.py:6535 FlatCAMApp.py:6537 +#, python-format +msgid "[ERROR_NOTCL] Failed to open file: %s" +msgstr "[ERROR_NOTCL] Esec in incarcarea fişierului %s" + +#: FlatCAMApp.py:6540 +#, python-brace-format +msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" +msgstr "[ERROR_NOTCL] Esec in parsarea fişierului: {name}. {error}" + +#: FlatCAMApp.py:6546 FlatCAMEditor.py:5802 FlatCAMObj.py:4104 +msgid "[ERROR] An internal error has ocurred. See shell.\n" +msgstr "" +"[ERROR] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " +"detalii.\n" + +#: FlatCAMApp.py:6555 +msgid "" +"[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." +msgstr "" +"[ERROR_NOTCL] Obiectul nu estetip Gerber sau este gol. Se anulează crearea " +"obiectului." + +#: FlatCAMApp.py:6563 +msgid "Opening Gerber" +msgstr "Gerber in curs de incarcare" + +#: FlatCAMApp.py:6573 +msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." +msgstr "" +"[ERROR_NOTCL] Incarcarea Gerber a esuat. Probabil nu este de tip Gerber." + +#: FlatCAMApp.py:6608 +msgid "[ERROR_NOTCL] This is not Excellon file." +msgstr "[ERROR_NOTCL] Acesta nu este un fişier Excellon." + +#: FlatCAMApp.py:6611 +#, python-format +msgid "[ERROR_NOTCL] Cannot open file: %s" +msgstr "[ERROR_NOTCL] Fişierul %s nu se poate incarca." + +#: FlatCAMApp.py:6616 +msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" +msgstr "" +"[ERROR_NOTCL] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " +"detalii.\n" + +#: FlatCAMApp.py:6632 +#, python-format +msgid "[ERROR_NOTCL] No geometry found in file: %s" +msgstr "" +"[ERROR_NOTCL] Nici-o informatie de tip geometrie nu s-a gasit in fişierul: %s" + +#: FlatCAMApp.py:6635 +msgid "Opening Excellon." +msgstr "Excellon in curs de incarcare" + +#: FlatCAMApp.py:6642 +msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." +msgstr "" +"[ERROR_NOTCL] Incarcarea Excellon a esuat. Probabil nu este de tip Excellon." + +#: FlatCAMApp.py:6681 +#, python-format +msgid "[ERROR_NOTCL] Failed to open %s" +msgstr "[ERROR_NOTCL] Incarcarea fişierului %s a esuat." + +#: FlatCAMApp.py:6691 +msgid "[ERROR_NOTCL] This is not GCODE" +msgstr "[ERROR_NOTCL] Acest obiect nu este de tip GCode" + +#: FlatCAMApp.py:6697 +msgid "Opening G-Code." +msgstr "G-Code in curs de incarcare" + +#: FlatCAMApp.py:6705 +msgid "" +"[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n" +" Attempting to create a FlatCAM CNCJob Object from G-Code file failed during " +"processing" +msgstr "" +"[ERROR_NOTCL] Esec in crearea unui obiect CNCJob. Probabil nu este un fişier " +"GCode.\n" +"Incercarea de a crea un obiect CNCJob din G-Code a esuat in timpul " +"procesarii." + +#: FlatCAMApp.py:6745 +#, python-format +msgid "[ERROR_NOTCL] Failed to open config file: %s" +msgstr "[ERROR_NOTCL] Esec in incarcarea fişierului de configurare: %s" + +#: FlatCAMApp.py:6770 FlatCAMApp.py:6787 +#, python-format +msgid "[ERROR_NOTCL] Failed to open project file: %s" +msgstr "[ERROR_NOTCL] Esec in incarcarea fişierului de configurare: %s" + +#: FlatCAMApp.py:6777 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse project file: %s" +msgstr "[ERROR_NOTCL] Esec in incarcarea fişierului de configurare: %s" + +#: FlatCAMApp.py:6813 +#, python-format +msgid "[success] Project loaded from: %s" +msgstr "[success] Proeictul a fost incarcat din: %s" + +#: FlatCAMApp.py:6943 +msgid "Available commands:\n" +msgstr "Comenzi disponibile:\n" + +#: FlatCAMApp.py:6945 +msgid "" +"\n" +"\n" +"Type help for usage.\n" +" Example: help open_gerber" +msgstr "" +"\n" +"\n" +"Introduceți help pentru utilizare.\n" +"Exemplu: help open_gerber" + +#: FlatCAMApp.py:7093 +msgid "Shows list of commands." +msgstr "Arata o lista de comenzi." + +#: FlatCAMApp.py:7146 +msgid "[ERROR_NOTCL] Failed to load recent item list." +msgstr "[ERROR_NOTCL] Esec in incarcarea listei cu obiecte recente." + +#: FlatCAMApp.py:7153 +msgid "[ERROR_NOTCL] Failed to parse recent item list." +msgstr "[ERROR_NOTCL] Esec in parsarea listei cu obiecte recente." + +#: FlatCAMApp.py:7214 flatcamGUI/FlatCAMGUI.py:856 +msgid "Shortcut Key List" +msgstr "Lista cu taste Shortcut" + +#: FlatCAMApp.py:7221 +msgid "" +"\n" +"

Selected Tab - Choose an Item from " +"Project Tab

\n" +"\n" +"

Details:
\n" +"The normal flow when working in FlatCAM is the following:

\n" +"\n" +"
    \n" +"\t
  1. Loat/Import a Gerber, Excellon, Gcode, " +"DXF, Raster Image or SVG file into FlatCAM using either the menu's, " +"toolbars, key shortcuts or even dragging and dropping the files on the GUI." +"
    \n" +"\t
    \n" +"\tYou can also load a FlatCAM project by double clicking on " +"the project file, drag & drop of the file into the FLATCAM GUI or " +"through the menu/toolbar links offered within the app.

    \n" +"\t 
  2. \n" +"\t
  3. Once an object is available in the " +"Project Tab, by selecting it and then focusing on SELECTED TAB (more simpler is to double click the object name in the Project Tab), " +"SELECTED TAB will be updated with the object properties " +"according to it's kind: Gerber, Excellon, Geometry or CNCJob object.
    \n" +"\t
    \n" +"\tIf the selection of the object is done on the canvas by single click " +"instead, and the SELECTED TAB is in focus, again the object " +"properties will be displayed into the Selected Tab. Alternatively, double " +"clicking on the object on the canvas will bring the SELECTED TAB and populate it even if it was out of focus.
    \n" +"\t
    \n" +"\tYou can change the parameters in this screen and the flow direction is " +"like this:
    \n" +"\t
    \n" +"\tGerber/Excellon Object -> Change Param -> Generate " +"Geometry -> Geometry Object -> Add tools (change " +"param in Selected Tab) -> Generate CNCJob -> CNCJob Object -> Verify GCode (through Edit CNC Code) and/or append/prepend to " +"GCode (again, done in SELECTED TAB) -> Save GCode
  4. \n" +"
\n" +"\n" +"

A list of key shortcuts is available " +"through an menu entry in Help -> Shortcuts List or " +"through it's own key shortcut: F3.

\n" +"\n" +" " +msgstr "" +"\n" +"

Tab Selectat - Alege o intrare din " +"Tab-ul Proiect

\n" +"\n" +"

Detalii:
\n" +"Fluxul normal când se lucrează in FlatCAM este urmatorul:

\n" +"\n" +"
    \n" +"\t
  1. Incarca/Importa un fişier Gerber, " +"Excellon, Gcode, DXF, Imagine Raster sau SVG in FlatCAM folosind ori " +"meniurile, toolbarurile, tastele shortcut sau chiar tragerea și eliberarea " +"fişierelor in fereastra FlatCAM.
    \n" +"\t
    \n" +"\tPoti să incarci și un proiect FlatCAM prin dublu click pe " +"fişierul proiect, tragerea și eliberarea fişierului peste FLATCAM GUI sau " +"prin sistemul de meniuri/toolbaruri oferit in cadrul aplicatiei.

    \n" +"\t 
  2. \n" +"\t
  3. Odata ce un obiect este disponibil in " +"Tab-ul Proiect, prin selectarea și focalizarea in Tab-ul SELECTAT(mai simplu prin dublu click pe numele obiectului in lista dinTab-ul " +"Proiect), Tab-ul SELECTAT va fi updatat conform cu tipul " +"sau: Gerber, Excellon, Geometrie sau CNCJob.
    \n" +"\t
    \n" +"\tDaca selectia este efectuata pe Canvas prin simplu click și Tab-ul " +"SELECTAT este in focus, din nou, proprietatile obiectului vor fi " +"afisate in Tab-ul SELECTAT. Alternativ, prin dublu click pe obiect in Canvas " +"se va aduce Tab-ul SELECTAT in focus și va fi actualizat cu " +"informatie chair daca initial nu era focalizat.
    \n" +"\t
    \n" +"\tO suma de parametri se pot schimba in acest Tab and directia in lucru este " +"urmatoarea:
    \n" +"\t
    \n" +"\tObiectul Gerber/Excellon -> Schimba Parametru -> " +"Generează Geometrie ->Obiectul Geometrie -> Adaugă " +"unelte (prin schimbare parametru in Tab-ul SELECTAT) -> Generează CNCJob -" +"> Obiect CNCJob-> Verifică GCode (folosind Editare " +"cod CNC) și/sau Adaugă cod GCode la inceput/la sfarsit (din nou, efectuat in " +"Tab-ul SELECTAT) -> Salvează GCode
  4. \n" +"
\n" +"\n" +"

O lista cu tastele shortcut este " +"disponibila ca și meniu in Help ->Lista Shortcut-uri sau prin propria tasta shortcutt: F3.\n" +"\n" +" " + +#: FlatCAMApp.py:7325 +msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." +msgstr "" +"[WARNING_NOTCL] Verificarea pentru ultima versiune a esuat. Nu a fost " +"posibila conectarea la server." + +#: FlatCAMApp.py:7332 +msgid "[ERROR_NOTCL] Could not parse information about latest version." +msgstr "" +"[ERROR_NOTCL] Informatia cu privire la ultima versiune nu s-a putut " +"interpreta." + +#: FlatCAMApp.py:7342 +msgid "[success] FlatCAM is up to date!" +msgstr "[success] FlatCAM este la ultima versiune!" + +#: FlatCAMApp.py:7347 +msgid "Newer Version Available" +msgstr "O noua versiune este disponibila" + +#: FlatCAMApp.py:7348 +msgid "" +"There is a newer version of FlatCAM available for download:\n" +"\n" +msgstr "" +"O noua versiune de FlatCAM este disponibila pentru download::\n" +"\n" + +#: FlatCAMApp.py:7350 +msgid "info" +msgstr "Informatie" + +#: FlatCAMApp.py:7369 +msgid "[success]All plots disabled." +msgstr "[success] Toate afisarile sunt dezactivate." + +#: FlatCAMApp.py:7375 +msgid "[success]All non selected plots disabled." +msgstr "[success] Toate afisarile care nu sunt selectate sunt dezactivate." + +#: FlatCAMApp.py:7381 +msgid "[success]All plots enabled." +msgstr "[success] Toate afisarile sunt activate." + +#: FlatCAMApp.py:7491 +msgid "Saving FlatCAM Project" +msgstr "Proiectul FlatCAM este in curs de salvare" + +#: FlatCAMApp.py:7512 FlatCAMApp.py:7543 +#, python-format +msgid "[success] Project saved to: %s" +msgstr "[success] Proiectul s-a salvat in: %s" + +#: FlatCAMApp.py:7530 +#, python-format +msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." +msgstr "" +"[ERROR_NOTCL] Verificarea proiectului salvat a esuat: %s. Incearcă să il " +"salvezi din nou." + +#: FlatCAMApp.py:7537 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." +msgstr "" +"[ERROR_NOTCL] Parsarea proiectului salvat a esuat: %s. Incearcă să il " +"salvezi din nou." + +#: FlatCAMApp.py:7545 +#, python-format +msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." +msgstr "" +"[ERROR_NOTCL] Salvarea proiectului a esuat: %s. Incearcă să il salvezi din " +"nou." + +#: FlatCAMEditor.py:76 +msgid "Buffer distance:" +msgstr "Distanta pt bufer:" + +#: FlatCAMEditor.py:77 +msgid "Buffer corner:" +msgstr "Coltul pt bufer:" + +#: FlatCAMEditor.py:79 +msgid "" +"There are 3 types of corners:\n" +" - 'Round': the corner is rounded for exterior buffer.\n" +" - 'Square:' the corner is met in a sharp angle for exterior buffer.\n" +" - 'Beveled:' the corner is a line that directly connects the features " +"meeting in the corner" +msgstr "" +"Sunt disponibile 3 tipuri de colțuri:\n" +" - 'Rotund': coltul este rotunjit in cazul buferului exterior.\n" +" - 'Patrat:' colțurile formează unghi de 90 grade pt buferul exterior\n" +" - 'Beveled:' coltul este inlocuit cu o linie care uneste capetele liniilor " +"care formează coltul" + +#: FlatCAMEditor.py:85 +msgid "Round" +msgstr "Rotund" + +#: FlatCAMEditor.py:86 +msgid "Square" +msgstr "Patrat" + +#: FlatCAMEditor.py:87 +msgid "Beveled" +msgstr "Beveled" + +#: FlatCAMEditor.py:94 +msgid "Buffer Interior" +msgstr "Bufer interior" + +#: FlatCAMEditor.py:96 +msgid "Buffer Exterior" +msgstr "Bufer Exterior" + +#: FlatCAMEditor.py:102 +msgid "Full Buffer" +msgstr "Bufer complet" + +#: FlatCAMEditor.py:123 FlatCAMEditor.py:2623 +msgid "Buffer Tool" +msgstr "Unealta Bufer" + +#: FlatCAMEditor.py:134 FlatCAMEditor.py:151 FlatCAMEditor.py:168 +#: FlatCAMEditor.py:2641 FlatCAMEditor.py:2667 FlatCAMEditor.py:2693 +msgid "" +"[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Valoarea distantei bufer lipseste sau este intr-un format " +"gresit. Adaugă din nou și reîncearcă." + +#: FlatCAMEditor.py:416 flatcamGUI/FlatCAMGUI.py:3402 +#: flatcamGUI/FlatCAMGUI.py:4608 flatcamGUI/FlatCAMGUI.py:4884 +#: flatcamGUI/FlatCAMGUI.py:5015 flatcamGUI/ObjectUI.py:331 +msgid "Tool dia:" +msgstr "Dia unealta:" + +#: FlatCAMEditor.py:418 flatcamGUI/FlatCAMGUI.py:5017 +msgid "" +"Diameter of the tool to\n" +"be used in the operation." +msgstr "" +"Diametrul uneltei care este utilizata in operatie. \n" +"Este și lăţimea de tăiere pentru uneltele cilindrice." + +#: FlatCAMEditor.py:427 flatcamGUI/FlatCAMGUI.py:4790 +#: flatcamGUI/FlatCAMGUI.py:5026 flatcamTools/ToolNonCopperClear.py:164 +#: flatcamTools/ToolPaint.py:160 +msgid "Overlap:" +msgstr "Suprapunere:" + +#: FlatCAMEditor.py:429 flatcamTools/ToolPaint.py:162 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" +"Cat de mult (fractie) din diametrul uneltei să se suprapună la fiecare " +"trecere a uneltei.\n" +"Exemplu:\n" +"O valoare aici de 0.25 inseamna 25% din diametrul uneltei de mai sus.\n" +"\n" +"Ajustează valoarea incepand de la valori mici și pe urma creste daca ariile " +"care ar trebui\n" +" >pictate< inca nu sunt procesate.\n" +"Valori scazute = procesare rapida,executie rapida a PCB-ului.\n" +"Valori mari= procesare lenta cat și o executie la fel de lenta a PCB-ului,\n" +"datorita numărului mai mare de treceri-tăiere." + +#: FlatCAMEditor.py:445 flatcamGUI/FlatCAMGUI.py:4806 +#: flatcamGUI/FlatCAMGUI.py:4892 flatcamGUI/FlatCAMGUI.py:5036 +#: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:180 +#: flatcamTools/ToolPaint.py:177 +msgid "Margin:" +msgstr "Margine:" + +#: FlatCAMEditor.py:447 flatcamGUI/FlatCAMGUI.py:5038 +#: flatcamTools/ToolPaint.py:179 +msgid "" +"Distance by which to avoid\n" +"the edges of the polygon to\n" +"be painted." +msgstr "" +"Distanta fata de marginile\n" +"poligonului care trebuie\n" +"să fie >pictat<." + +#: FlatCAMEditor.py:456 flatcamGUI/FlatCAMGUI.py:4815 +#: flatcamGUI/FlatCAMGUI.py:5047 flatcamTools/ToolNonCopperClear.py:189 +#: flatcamTools/ToolPaint.py:188 +msgid "Method:" +msgstr "Metoda:" + +#: FlatCAMEditor.py:458 flatcamGUI/FlatCAMGUI.py:5049 +msgid "" +"Algorithm to paint the polygon:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed." +msgstr "" +"Algoritm pentru a picta poligonul
Standard: Pas fix spre interior." +"
Samanta: Spre exterior pornind de la un punct-samanta." + +#: FlatCAMEditor.py:464 flatcamGUI/FlatCAMGUI.py:4824 +#: flatcamGUI/FlatCAMGUI.py:5055 +msgid "Standard" +msgstr "Standard" + +#: FlatCAMEditor.py:465 flatcamGUI/FlatCAMGUI.py:4825 +#: flatcamGUI/FlatCAMGUI.py:5056 +msgid "Seed-based" +msgstr "Punct-samanta" + +#: FlatCAMEditor.py:466 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:5057 +msgid "Straight lines" +msgstr "Linii drepte" + +#: FlatCAMEditor.py:471 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:5062 flatcamTools/ToolNonCopperClear.py:205 +#: flatcamTools/ToolPaint.py:204 +msgid "Connect:" +msgstr "Conectează:" + +#: FlatCAMEditor.py:473 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:5064 flatcamTools/ToolNonCopperClear.py:207 +#: flatcamTools/ToolPaint.py:206 +msgid "" +"Draw lines between resulting\n" +"segments to minimize tool lifts." +msgstr "" +"Desenează linii între segmentele\n" +"rezultate pentru a minimiza miscarile\n" +"de ridicare a uneltei." + +#: FlatCAMEditor.py:480 flatcamGUI/FlatCAMGUI.py:4840 +#: flatcamGUI/FlatCAMGUI.py:5072 flatcamTools/ToolNonCopperClear.py:214 +#: flatcamTools/ToolPaint.py:213 +msgid "Contour:" +msgstr "Contur:" + +#: FlatCAMEditor.py:482 flatcamGUI/FlatCAMGUI.py:4842 +#: flatcamGUI/FlatCAMGUI.py:5074 flatcamTools/ToolNonCopperClear.py:216 +#: flatcamTools/ToolPaint.py:215 +msgid "" +"Cut around the perimeter of the polygon\n" +"to trim rough edges." +msgstr "" +"Taie de-a lungul perimetrului poligonului\n" +"pentru a elimina bavurile." + +#: FlatCAMEditor.py:494 +msgid "Paint" +msgstr "Pictează" + +#: FlatCAMEditor.py:512 flatcamGUI/FlatCAMGUI.py:575 +#: flatcamGUI/FlatCAMGUI.py:1624 flatcamGUI/ObjectUI.py:1379 +#: flatcamTools/ToolPaint.py:340 +msgid "Paint Tool" +msgstr "Unealta Paint" + +#: FlatCAMEditor.py:548 +msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Operatie Paint anulata. Nici-o forma selectata." + +#: FlatCAMEditor.py:559 flatcamTools/ToolCutOut.py:343 +#: flatcamTools/ToolCutOut.py:481 flatcamTools/ToolCutOut.py:601 +#: flatcamTools/ToolCutOut.py:706 flatcamTools/ToolDblSided.py:363 +msgid "" +"[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Diametrul uneltei lipseste sau este intr-un format " +"incompatibil. Adaugă-l și reîncearcă." + +#: FlatCAMEditor.py:570 +msgid "" +"[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Valoarea de suprapunere a uneltei lipseste sau este intr-un " +"format incompatibil. Adaugă-o și reîncearcă." + +#: FlatCAMEditor.py:582 +msgid "" +"[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " +"retry." +msgstr "" +"[WARNING_NOTCL] Valoarea de margine lipseste sau este intr-un format " +"incompatibil. Adaugă-o și reîncearcă." + +#: FlatCAMEditor.py:591 FlatCAMEditor.py:2648 FlatCAMEditor.py:2674 +#: FlatCAMEditor.py:2700 flatcamTools/ToolNonCopperClear.py:806 +#: flatcamTools/ToolProperties.py:104 +msgid "Tools" +msgstr "Unelte" + +#: FlatCAMEditor.py:602 FlatCAMEditor.py:975 flatcamGUI/FlatCAMGUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:1635 flatcamTools/ToolTransform.py:398 +msgid "Transform Tool" +msgstr "Unealta Transformare" + +#: FlatCAMEditor.py:603 FlatCAMEditor.py:664 flatcamTools/ToolTransform.py:24 +#: flatcamTools/ToolTransform.py:82 +msgid "Rotate" +msgstr "Rotatie" + +#: FlatCAMEditor.py:604 flatcamTools/ToolTransform.py:25 +msgid "Skew/Shear" +msgstr "Deformare" + +#: FlatCAMEditor.py:605 flatcamGUI/ObjectUI.py:100 flatcamGUI/ObjectUI.py:265 +#: flatcamTools/ToolTransform.py:26 +msgid "Scale" +msgstr "Scalare" + +#: FlatCAMEditor.py:606 flatcamTools/ToolTransform.py:27 +msgid "Mirror (Flip)" +msgstr "Oglindire" + +#: FlatCAMEditor.py:607 flatcamGUI/ObjectUI.py:127 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 flatcamTools/ToolTransform.py:28 +msgid "Offset" +msgstr "Ofset" + +#: FlatCAMEditor.py:618 +#, python-format +msgid "Editor %s" +msgstr "Editor %s" + +#: FlatCAMEditor.py:650 FlatCAMEditor.py:4851 FlatCAMEditor.py:4887 +#: flatcamTools/ToolTransform.py:68 +msgid "Angle:" +msgstr "Unghi:" + +#: FlatCAMEditor.py:652 flatcamTools/ToolTransform.py:70 +msgid "" +"Angle for Rotation action, in degrees.\n" +"Float number between -360 and 359.\n" +"Positive numbers for CW motion.\n" +"Negative numbers for CCW motion." +msgstr "" +"Unghiul pentru Rotatie, in grade. Număr Real cu valori între -360 și 359.\n" +"Numerele pozitive inseamna o miscare in sens ace ceasornic.\n" +"Numerele negative inseamna o miscare in sens invers ace ceasornic." + +#: FlatCAMEditor.py:666 +msgid "" +"Rotate the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" +"Roteste formele selectate.\n" +"Punctul de referinţă este mijlocul\n" +"formei înconjurătoare care cuprinde\n" +"toate formele selectate." + +#: FlatCAMEditor.py:689 flatcamTools/ToolTransform.py:107 +msgid "Angle X:" +msgstr "Unghi X:" + +#: FlatCAMEditor.py:691 FlatCAMEditor.py:709 flatcamTools/ToolTransform.py:109 +#: flatcamTools/ToolTransform.py:127 +msgid "" +"Angle for Skew action, in degrees.\n" +"Float number between -360 and 359." +msgstr "" +"Valoarea unghiului de Deformare, in grade.\n" +"Ia valori Reale între -360 and 359 grade." + +#: FlatCAMEditor.py:700 flatcamTools/ToolTransform.py:118 +msgid "Skew X" +msgstr "Deformare X" + +#: FlatCAMEditor.py:702 FlatCAMEditor.py:720 +msgid "" +"Skew/shear the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" +"Deformează formele selectate.\n" +"Punctul de referinţă este mijlocul\n" +"formei înconjurătoare care cuprinde\n" +"toate formele selectate." + +#: FlatCAMEditor.py:707 flatcamTools/ToolTransform.py:125 +msgid "Angle Y:" +msgstr "Unghi Y:" + +#: FlatCAMEditor.py:718 flatcamTools/ToolTransform.py:136 +msgid "Skew Y" +msgstr "Deformare Y" + +#: FlatCAMEditor.py:746 flatcamTools/ToolTransform.py:164 +msgid "Factor X:" +msgstr "Factor X:" + +#: FlatCAMEditor.py:748 flatcamTools/ToolTransform.py:166 +msgid "Factor for Scale action over X axis." +msgstr "Factor pentru scalarea pe axa X" + +#: FlatCAMEditor.py:756 flatcamTools/ToolTransform.py:174 +msgid "Scale X" +msgstr "Scalează X" + +#: FlatCAMEditor.py:758 FlatCAMEditor.py:775 +msgid "" +"Scale the selected shape(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" +"Scalează formele selectate.\n" +"Punctul de referinţă depinde de \n" +"starea checkbox-ului >Referința scalare<." + +#: FlatCAMEditor.py:763 flatcamTools/ToolTransform.py:181 +msgid "Factor Y:" +msgstr "Factor Y:" + +#: FlatCAMEditor.py:765 flatcamTools/ToolTransform.py:183 +msgid "Factor for Scale action over Y axis." +msgstr "Factor pentru scalarea pe axa Y." + +#: FlatCAMEditor.py:773 flatcamTools/ToolTransform.py:191 +msgid "Scale Y" +msgstr "Scalează Y" + +#: FlatCAMEditor.py:782 flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamTools/ToolTransform.py:200 +msgid "Link" +msgstr "Legatura" + +#: FlatCAMEditor.py:784 +msgid "" +"Scale the selected shape(s)\n" +"using the Scale Factor X for both axis." +msgstr "" +"Scalează formele selectate\n" +"folsoind factorul: Factor X pentru ambele axe." + +#: FlatCAMEditor.py:790 flatcamGUI/FlatCAMGUI.py:5429 +#: flatcamTools/ToolTransform.py:208 +msgid "Scale Reference" +msgstr "Referința scalare" + +#: FlatCAMEditor.py:792 +msgid "" +"Scale the selected shape(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected shapes when unchecked." +msgstr "" +"Scalează formele selectate.\n" +"Punctul de referinţă este mijlocul\n" +"formei înconjurătoare care cuprinde\n" +"toate formele selectate când nu este\n" +"bifat și este originea când este bifat." + +#: FlatCAMEditor.py:820 flatcamTools/ToolTransform.py:238 +msgid "Value X:" +msgstr "Valoare X:" + +#: FlatCAMEditor.py:822 flatcamTools/ToolTransform.py:240 +msgid "Value for Offset action on X axis." +msgstr "Valoare pentru deplasarea pe axa X." + +#: FlatCAMEditor.py:830 flatcamTools/ToolTransform.py:248 +msgid "Offset X" +msgstr "Ofset pe X" + +#: FlatCAMEditor.py:832 FlatCAMEditor.py:850 +msgid "" +"Offset the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes.\n" +msgstr "" +"Deplasează formele selectate\n" +"Punctul de referinţă este mijlocul\n" +"formei înconjurătoare care cuprinde\n" +"toate formele selectate.\n" + +#: FlatCAMEditor.py:838 flatcamTools/ToolTransform.py:255 +msgid "Value Y:" +msgstr "Valoare Y:" + +#: FlatCAMEditor.py:840 flatcamTools/ToolTransform.py:257 +msgid "Value for Offset action on Y axis." +msgstr "Valoare pentru deplasarea pe axa Y." + +#: FlatCAMEditor.py:848 flatcamTools/ToolTransform.py:265 +msgid "Offset Y" +msgstr "Ofset pe Y" + +#: FlatCAMEditor.py:879 flatcamTools/ToolTransform.py:295 +msgid "Flip on X" +msgstr "Oglindeste pe X" + +#: FlatCAMEditor.py:881 FlatCAMEditor.py:889 +msgid "" +"Flip the selected shape(s) over the X axis.\n" +"Does not create a new shape." +msgstr "" +"Oglindeste formele selectate peste axa X\n" +"Nu crează noi forme." + +#: FlatCAMEditor.py:887 flatcamTools/ToolTransform.py:303 +msgid "Flip on Y" +msgstr "Oglindeste pe Y" + +#: FlatCAMEditor.py:896 flatcamTools/ToolTransform.py:312 +msgid "Ref Pt" +msgstr "Pt ref" + +#: FlatCAMEditor.py:898 +msgid "" +"Flip the selected shape(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" +"Oglindeste formele selectate\n" +"in jurul punctului din câmpul >Punct<\n" +"\n" +"Coordonatele punctului pot fi obtinute\n" +"prin click pe canvas in timp ce se tine apasata\n" +"tasta SHIFT.\n" +"Apoi click pe butonul >Adaugă< pentru a insera\n" +"coordonatele.\n" +"Alternativ se pot introduce manual in formatul (x, y). \n" +"La final click pe >Oglindeste pe X(Y)<." + +#: FlatCAMEditor.py:910 flatcamTools/ToolTransform.py:325 +msgid "Point:" +msgstr "Punct:" + +#: FlatCAMEditor.py:912 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y." +msgstr "" +"Coordonatele in format (x, y) folosite pentru oglindire.\n" +"Valoarea 'x' in (x, y) va fi folosita când se face oglindire pe X\n" +"și valoarea 'y' in (x, y) va fi folosita când se face oglindire pe Y." + +#: FlatCAMEditor.py:922 flatcamGUI/ObjectUI.py:1059 +#: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 +#: flatcamTools/ToolNonCopperClear.py:133 flatcamTools/ToolPaint.py:131 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolTransform.py:337 +msgid "Add" +msgstr "Adaugă" + +#: FlatCAMEditor.py:924 flatcamTools/ToolTransform.py:339 +msgid "" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. Then click Add button to insert." +msgstr "" +"Coordonatele punctului se pot obtine\n" +"prin click pe canvas in timp ce se tine apasata\n" +"tasta SHIFT.\n" +"La final, apasa butonul >Adaugă< pt a le insera." + +#: FlatCAMEditor.py:1039 +msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Transformare anulata. Nici-o forma nu este selectata." + +#: FlatCAMEditor.py:1060 flatcamTools/ToolTransform.py:468 +msgid "[ERROR_NOTCL]Wrong value format entered for Rotate, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Rotatie, foloseşte un număr " +"Real." + +#: FlatCAMEditor.py:1097 flatcamTools/ToolTransform.py:502 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew X, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Deformare X, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1118 flatcamTools/ToolTransform.py:520 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew Y, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Deformare Y, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1139 flatcamTools/ToolTransform.py:538 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale X, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Scalare X, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1176 flatcamTools/ToolTransform.py:572 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale Y, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Scalare Y, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1208 flatcamTools/ToolTransform.py:601 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset X, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Ofset pe X, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1229 flatcamTools/ToolTransform.py:619 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset Y, use a number." +msgstr "" +"[ERROR_NOTCL] Valoare incorecta intodusa pentru Ofset pe Y, foloseşte un " +"număr Real." + +#: FlatCAMEditor.py:1247 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" +msgstr "" +"[WARNING_NOTCL] Nici-o forma nu este selectata. Selectează o forma pentru a " +"putea face Rotatie!" + +#: FlatCAMEditor.py:1250 flatcamTools/ToolTransform.py:640 +msgid "Appying Rotate" +msgstr "Executie Rotatie" + +#: FlatCAMEditor.py:1278 +msgid "[success] Done. Rotate completed." +msgstr "[success] Executat. Rotatie finalizata." + +#: FlatCAMEditor.py:1294 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" +msgstr "" +"[WARNING_NOTCL] Nici-o forma nu este selectata. Selectează o forma pentru a " +"putea face Oglindire!" + +#: FlatCAMEditor.py:1297 flatcamTools/ToolTransform.py:692 +msgid "Applying Flip" +msgstr "Executie Oglindire" + +#: FlatCAMEditor.py:1327 +msgid "[success] Flip on the Y axis done ..." +msgstr "Oglindirea pe axa X efectuata ..." + +#: FlatCAMEditor.py:1330 +msgid "[success] Flip on the X axis done ..." +msgstr "Oglindirea pe axa Y efectuata ..." + +#: FlatCAMEditor.py:1349 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" +msgstr "" +"[WARNING_NOTCL] Nici-o forma nu este selectata. Selectează o forma pentru a " +"putea face Deformare!" + +#: FlatCAMEditor.py:1352 flatcamTools/ToolTransform.py:762 +msgid "Applying Skew" +msgstr "Executie Deformare" + +#: FlatCAMEditor.py:1377 +#, python-format +msgid "[success] Skew on the %s axis done ..." +msgstr "[success] Deformarea pe axa %s executata ..." + +#: FlatCAMEditor.py:1381 flatcamTools/ToolTransform.py:797 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." +msgstr "[ERROR_NOTCL] Datorita erorii: %s, Deformarea a fost anulata." + +#: FlatCAMEditor.py:1392 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" +msgstr "" +"[WARNING_NOTCL] Nici-o forma nu este selectata. Selectează o forma pentru a " +"putea face Scalare!" + +#: FlatCAMEditor.py:1395 flatcamTools/ToolTransform.py:811 +msgid "Applying Scale" +msgstr "Executie Scalare" + +#: FlatCAMEditor.py:1428 flatcamTools/ToolTransform.py:849 +#, python-format +msgid "[success] Scale on the %s axis done ..." +msgstr "[success] Scalarea pe axa %s executata ..." + +#: FlatCAMEditor.py:1431 flatcamTools/ToolTransform.py:852 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." +msgstr "[ERROR_NOTCL] Datorita erorii: %s, Scalarea a fost anulata ..." + +#: FlatCAMEditor.py:1440 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" +msgstr "" +"[WARNING_NOTCL] Nici-o forma nu este selectata. Selectează o forma pentru a " +"putea face Ofset!" + +#: FlatCAMEditor.py:1443 flatcamTools/ToolTransform.py:864 +msgid "Applying Offset" +msgstr "Executie Ofset" + +#: FlatCAMEditor.py:1467 +#, python-format +msgid "[success] Offset on the %s axis done ..." +msgstr "[success] Deplasarea pe axa %s executata ..." + +#: FlatCAMEditor.py:1471 flatcamTools/ToolTransform.py:898 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." +msgstr "[ERROR_NOTCL] Datorita erorii: %s, Deplasarea a fost anulata." + +#: FlatCAMEditor.py:1475 +msgid "Rotate ..." +msgstr "Rotatie ..." + +#: FlatCAMEditor.py:1476 FlatCAMEditor.py:1533 FlatCAMEditor.py:1550 +msgid "Enter an Angle Value (degrees):" +msgstr "Introdu o valoare in grade pt Unghi:" + +#: FlatCAMEditor.py:1485 +msgid "[success] Geometry shape rotate done..." +msgstr "[success] Rotatia formei geometrice executata ..." + +#: FlatCAMEditor.py:1490 +msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." +msgstr "[WARNING_NOTCL] Rotatia formei geometrice anulata ..." + +#: FlatCAMEditor.py:1496 +msgid "Offset on X axis ..." +msgstr "Ofset pe axa X ..." + +#: FlatCAMEditor.py:1497 FlatCAMEditor.py:1516 +#, python-format +msgid "Enter a distance Value (%s):" +msgstr "Introdu of valoare pt Distanta (%s):" + +#: FlatCAMEditor.py:1506 +msgid "[success] Geometry shape offset on X axis done..." +msgstr "[success] Deplasarea formei geometrice pe axa X executata ..." + +#: FlatCAMEditor.py:1510 +msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." +msgstr "[WARNING_NOTCL] Deplasarea formei geometrice pe axa X anulata ..." + +#: FlatCAMEditor.py:1515 +msgid "Offset on Y axis ..." +msgstr "Ofset pe axa Y ..." + +#: FlatCAMEditor.py:1525 +msgid "[success] Geometry shape offset on Y axis done..." +msgstr "[success] Deplasarea formei geometrice pe axa Y executata ..." + +#: FlatCAMEditor.py:1529 +msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." +msgstr "[WARNING_NOTCL] Deplasarea formei geometrice pe axa Y anulata ..." + +#: FlatCAMEditor.py:1532 +msgid "Skew on X axis ..." +msgstr "Deformare pe axa X ..." + +#: FlatCAMEditor.py:1542 +msgid "[success] Geometry shape skew on X axis done..." +msgstr "[success] Deformarea formei geometrice pe axa X executata ..." + +#: FlatCAMEditor.py:1546 +msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." +msgstr "[WARNING_NOTCL] Deformarea formei geometrice pe axa X anulata ..." + +#: FlatCAMEditor.py:1549 +msgid "Skew on Y axis ..." +msgstr "Deformare pe axa Y ..." + +#: FlatCAMEditor.py:1559 +msgid "[success] Geometry shape skew on Y axis done..." +msgstr "[success] Deformarea formei geometrice pe axa Y executata ..." + +#: FlatCAMEditor.py:1563 +msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." +msgstr "[success] Deformarea formei geometrice pe axa Y executata ..." + +#: FlatCAMEditor.py:1894 FlatCAMEditor.py:1933 +msgid "Click on CENTER ..." +msgstr "Click in Centru ..." + +#: FlatCAMEditor.py:1901 +msgid "Click on Circle perimeter point to complete ..." +msgstr "Click pe un punct aflat pe circumferinta Cercului pentru terminare ..." + +#: FlatCAMEditor.py:1925 +msgid "[success]Done. Adding Circle completed." +msgstr "[success] Executat. Adaugarea unei forme Cerc terminata." + +#: FlatCAMEditor.py:1952 +msgid "Click on Start arc point ..." +msgstr "Click pe punctul de Start al Arcului ..." + +#: FlatCAMEditor.py:1956 +msgid "Click on End arc point to complete ..." +msgstr "Click pe punctul de End al Arcului pentru terminare ..." + +#: FlatCAMEditor.py:2111 +msgid "[success]Done. Arc completed." +msgstr "[success] Executat. Adaugarea unei forme Arc terminata." + +#: FlatCAMEditor.py:2123 +msgid "Click on 1st corner ..." +msgstr "Click pe primul colt ..." + +#: FlatCAMEditor.py:2163 +msgid "Click on 1st point ..." +msgstr "Click pe primul punct ..." + +#: FlatCAMEditor.py:2170 +msgid "Click on next Point or click Right mouse button to complete ..." +msgstr "" +"Click pe punctul urmator sau click buton dreapta al mousului pentru " +"terminare ..." + +#: FlatCAMEditor.py:2193 +msgid "[success]Done. Polygon completed." +msgstr "[success] Executat. Adaugarea unei forme Poligon terminata." + +#: FlatCAMEditor.py:2212 +msgid "[success]Done. Path completed." +msgstr "[success] Executata. Adaugarea unei forme tip Cale terminata." + +#: FlatCAMEditor.py:2472 FlatCAMEditor.py:4034 +msgid "[WARNING_NOTCL] Move cancelled. No shape selected." +msgstr "[WARNING_NOTCL] Mutare anulata. Nici-o forma nu este selectata." + +#: FlatCAMEditor.py:2476 +msgid "Click on reference point." +msgstr "Click pe punctul de referinţă." + +#: FlatCAMEditor.py:2479 +msgid "Click on destination point." +msgstr "Click pe punctul de Destinatie." + +#: FlatCAMEditor.py:2510 +msgid "[success]Done. Geometry(s) Move completed." +msgstr "[success] Executat. Mutarea Geometriilor terminata." + +#: FlatCAMEditor.py:2555 +msgid "[success]Done. Geometry(s) Copy completed." +msgstr "[success] Executat. Copierea Geometriilor terminata." + +#: FlatCAMEditor.py:2567 +msgid "Click on the Destination point..." +msgstr "Click pe punctul de Destinatie ..." + +#: FlatCAMEditor.py:2581 +#, python-format +msgid "" +"[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " +"supported. Error: %s" +msgstr "" +"[ERROR] Fontul nu este compatibil. Doar cele tip: Regular, Bold, Italic și " +"BoldItalic sunt acceptate. Eroarea:: %s" + +#: FlatCAMEditor.py:2591 +msgid "[success]Done. Adding Text completed." +msgstr "[success] Executat. Adaugarea de Text terminata." + +#: FlatCAMEditor.py:2619 +msgid "Create buffer geometry ..." +msgstr "Crează o geometrie de tipe Bufer ..." + +#: FlatCAMEditor.py:2630 FlatCAMEditor.py:2656 FlatCAMEditor.py:2682 +msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." +msgstr "" +"[WARNING_NOTCL] Crearea de geometrie Bufer anulata. Nici-o forma geometrică " +"nu este selectata." + +#: FlatCAMEditor.py:2652 +msgid "[success]Done. Buffer Tool completed." +msgstr "[success] Executat. Unealta Bufer terminat." + +#: FlatCAMEditor.py:2678 +msgid "[success]Done. Buffer Int Tool completed." +msgstr "[success] Executat. Unealta Bufer Intern terminat." + +#: FlatCAMEditor.py:2704 +msgid "[success]Done. Buffer Ext Tool completed." +msgstr "[success] Executat. Unealta Bufer Extern terminat." + +#: FlatCAMEditor.py:2737 +msgid "Create Paint geometry ..." +msgstr "Crează o geometrie Paint ..." + +#: FlatCAMEditor.py:2751 +msgid "Shape transformations ..." +msgstr "Transformari de forme geometrice ..." + +#: FlatCAMEditor.py:2776 +msgid "[WARNING_NOTCL] To add a drill first select a tool" +msgstr "" +"[WARNING_NOTCL] Pentru a adăuga o operatie de găurire mai intai selectează " +"un burghiu (unealta)" + +#: FlatCAMEditor.py:2785 FlatCAMEditor.py:2875 FlatCAMEditor.py:3148 +#: FlatCAMEditor.py:3173 +msgid "Click on target location ..." +msgstr "Click pe locatia tinta ..." + +#: FlatCAMEditor.py:2825 +msgid "[success]Done. Drill added." +msgstr "[success] Executat. Operatie de găurire adaugata." + +#: FlatCAMEditor.py:2867 +msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" +msgstr "" +"[WARNING_NOTCL] Pentru a adăuga o arie de operatii de găurire mai intai " +"selectează un burghiu (unealta)" + +#: FlatCAMEditor.py:2892 +msgid "Click on the Drill Circular Array Start position" +msgstr "Click pe punctul de Start al ariei de operatii de găurire" + +#: FlatCAMEditor.py:2914 +msgid "" +"[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " +"separator." +msgstr "" +"[ERROR_NOTCL] Valoarea nu este număr Real. Verifică să nu fi folosit virgula " +"in loc de punct ca și separator decimal." + +#: FlatCAMEditor.py:2917 +msgid "[ERROR_NOTCL] The value is mistyped. Check the value." +msgstr "[ERROR_NOTCL] Valoarea este gresita. Verifică ce ai introdus." + +#: FlatCAMEditor.py:3010 +msgid "[WARNING_NOTCL]Too many drills for the selected spacing angle." +msgstr "" +"[WARNING_NOTCL] Prea multe operatii de găurire pentru unghiul selectat." + +#: FlatCAMEditor.py:3027 +msgid "[success]Done. Drill Array added." +msgstr "[success] Executat. Aria de operatii de găurire a fost adaugata." + +#: FlatCAMEditor.py:3038 +msgid "Click on the Drill(s) to resize ..." +msgstr "" +"Click pe operatiile de găurire care se doreste să fie redimensionate ..." + +#: FlatCAMEditor.py:3058 +msgid "" +"[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize." +msgstr "" +"[ERROR_NOTCL] Redimensionarea operatiilor de găurire a esuat. Adaugă o " +"valoare pentru dimetrul la care se face redimensionarea." + +#: FlatCAMEditor.py:3130 +msgid "[success]Done. Drill Resize completed." +msgstr "[success]Executat. Redimensionare găurire terminata." + +#: FlatCAMEditor.py:3150 +msgid "Click on reference location ..." +msgstr "Click pe locatia de referinţă ..." + +#: FlatCAMEditor.py:3205 +msgid "[success]Done. Drill(s) Move completed." +msgstr "[success]Executat. Operatiile de găurire au fost mutate." + +#: FlatCAMEditor.py:3258 +msgid "[success]Done. Drill(s) copied." +msgstr "[success]Executat. Operatiile de găurire au fost copiate." + +#: FlatCAMEditor.py:3908 flatcamGUI/FlatCAMGUI.py:2114 +#: flatcamGUI/FlatCAMGUI.py:2126 +msgid "[success]Done." +msgstr "[success]Executat." + +#: FlatCAMEditor.py:4041 +msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." +msgstr "" +"[WARNING_NOTCL] Copiere anulata. Nici-o forma geometrică nu este selectata." + +#: FlatCAMEditor.py:4048 flatcamGUI/FlatCAMGUI.py:2406 +#: flatcamGUI/FlatCAMGUI.py:2418 flatcamGUI/FlatCAMGUI.py:2452 +msgid "Click on target point." +msgstr "Click pe punctul tinta." + +#: FlatCAMEditor.py:4289 +msgid "" +"[WARNING_NOTCL]A selection of at least 2 geo items is required to do " +"Intersection." +msgstr "" +"[WARNING_NOTCL] Cel putin o selecţie de doua forme geometrice este necesară " +"pentru a face o Intersecţie." + +#: FlatCAMEditor.py:4327 FlatCAMEditor.py:4364 FlatCAMEditor.py:4436 +msgid "" +"[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to " +"generate an 'inside' shape" +msgstr "" +"[ERROR_NOTCL] O valoare de bufer negativă nu se accepta. Folosete Bufer " +"Interior pentru a genera o forma geo. interioara." + +#: FlatCAMEditor.py:4335 FlatCAMEditor.py:4373 FlatCAMEditor.py:4444 +msgid "[WARNING_NOTCL] Nothing selected for buffering." +msgstr "" +"[WARNING_NOTCL] Nici-o forma geometrică nu este selectata pentru a face " +"Bufer." + +#: FlatCAMEditor.py:4339 FlatCAMEditor.py:4377 FlatCAMEditor.py:4448 +msgid "[WARNING_NOTCL] Invalid distance for buffering." +msgstr "[WARNING_NOTCL] Distanta invalida pentru a face Bufer." + +#: FlatCAMEditor.py:4349 FlatCAMEditor.py:4457 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value." +msgstr "" +"[ERROR_NOTCL] Esuat, rezultatul este gol. Foloseşte o valoare diferita " +"pentru Bufer." + +#: FlatCAMEditor.py:4357 +msgid "[success]Full buffer geometry created." +msgstr "[success] Geometrie tip Bufer Complet creata." + +#: FlatCAMEditor.py:4386 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value." +msgstr "" +"[ERROR_NOTCL] Esuat, rezultatul este gol. Foloseşte of valoare mai mica pt. " +"Bufer." + +#: FlatCAMEditor.py:4398 FlatCAMEditor.py:4469 +msgid "[success]Exterior buffer geometry created." +msgstr "[success] Geometrie Bufer Exterior creata." + +#: FlatCAMEditor.py:4533 +msgid "[WARNING_NOTCL]Nothing selected for painting." +msgstr "" +"[WARNING_NOTCL] Nici-o forma geometrică nu este selectata pentru Paint." + +#: FlatCAMEditor.py:4539 +msgid "[WARNING] Invalid value for {}" +msgstr "[WARNING] Valoare invalida pentru {}" + +#: FlatCAMEditor.py:4545 +msgid "" +"[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " +"(100%)." +msgstr "" +"[ERROR_NOTCL] Nu se poate face Paint. Valoarea de suprapunere trebuie să fie " +"mai putin de 1.00 (100%)." + +#: FlatCAMEditor.py:4604 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different method of Paint\n" +"%s" +msgstr "" +"[ERROR] Nu se poate face Paint. Incearcă o combinatie diferita de parametri. " +"Or o metoda diferita de Paint\n" +"%s" + +#: FlatCAMEditor.py:4615 +msgid "[success] Paint done." +msgstr "[success] Paint executat." + +#: FlatCAMEditor.py:4647 +msgid "Excellon Editor" +msgstr "Editor Excellon" + +#: FlatCAMEditor.py:4654 +msgid "Name:" +msgstr "Nume:" + +#: FlatCAMEditor.py:4674 flatcamTools/ToolNonCopperClear.py:71 +#: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 +msgid "Tools Table" +msgstr "Tabela Unelte" + +#: FlatCAMEditor.py:4676 flatcamGUI/ObjectUI.py:609 +msgid "" +"Tools in this Excellon object\n" +"when are used for drilling." +msgstr "" +"Burghie (unelte) in acest obiect Excellon\n" +"când se face găurire." + +#: FlatCAMEditor.py:4685 FlatCAMEditor.py:5745 FlatCAMObj.py:2203 +#: FlatCAMObj.py:2297 FlatCAMObj.py:2408 flatcamGUI/ObjectUI.py:627 +#: flatcamTools/ToolNonCopperClear.py:82 flatcamTools/ToolPaint.py:80 +#: flatcamTools/ToolSolderPaste.py:81 +msgid "Diameter" +msgstr "Diametru" + +#: FlatCAMEditor.py:4693 +msgid "Add/Delete Tool" +msgstr "Adaugă/Sterge Unealta" + +#: FlatCAMEditor.py:4695 +msgid "" +"Add/Delete a tool to the tool list\n" +"for this Excellon object." +msgstr "" +"Adaugă/Sterge o unealta la lista de unelte\n" +"pentru acest obiect Excellon." + +#: FlatCAMEditor.py:4703 flatcamTools/ToolCutOut.py:77 +msgid "Tool Dia:" +msgstr "Dia. Unealta:" + +#: FlatCAMEditor.py:4705 flatcamGUI/ObjectUI.py:1046 +msgid "Diameter for the new tool" +msgstr "Diametru pentru noua unealta (burghiu, freza)" + +#: FlatCAMEditor.py:4714 +msgid "Add Tool" +msgstr "Adaugă Unealta" + +#: FlatCAMEditor.py:4716 +msgid "" +"Add a new tool to the tool list\n" +"with the diameter specified above." +msgstr "" +"Adaugă o unealta noua la lista de unelte\n" +"cu diametrul specificat deasupra." + +#: FlatCAMEditor.py:4726 +msgid "Delete Tool" +msgstr "Sterge Unealta" + +#: FlatCAMEditor.py:4728 +msgid "" +"Delete a tool in the tool list\n" +"by selecting a row in the tool table." +msgstr "" +"Sterge o unealta in lista de unelte\n" +"prin selectarea unei linii in tabela de unelte." + +#: FlatCAMEditor.py:4746 +msgid "Resize Drill(s)" +msgstr "Redimensionare operatii de găurire" + +#: FlatCAMEditor.py:4748 +msgid "Resize a drill or a selection of drills." +msgstr "" +"Redimensionează o operatie de găurire sau o selecţie de operatii de găurire." + +#: FlatCAMEditor.py:4755 +msgid "Resize Dia:" +msgstr "Redimensionare Dia:" + +#: FlatCAMEditor.py:4757 +msgid "Diameter to resize to." +msgstr "Diametrul la care se face redimensionarea." + +#: FlatCAMEditor.py:4765 +msgid "Resize" +msgstr "Redimensionează" + +#: FlatCAMEditor.py:4767 +msgid "Resize drill(s)" +msgstr "Redimensionează op. de găurire." + +#: FlatCAMEditor.py:4789 flatcamGUI/FlatCAMGUI.py:1384 +msgid "Add Drill Array" +msgstr "Adaugă o arie de op. găurire" + +#: FlatCAMEditor.py:4791 +msgid "Add an array of drills (linear or circular array)" +msgstr "Adaugă o arie de operatii de găurire (arie lineara sau circulara)." + +#: FlatCAMEditor.py:4797 +msgid "" +"Select the type of drills array to create.\n" +"It can be Linear X(Y) or Circular" +msgstr "" +"Selectează tipul de arii de operatii de găurire.\n" +"Poate fi Liniar X(Y) sau Circular." + +#: FlatCAMEditor.py:4800 +msgid "Linear" +msgstr "Liniar" + +#: FlatCAMEditor.py:4801 +msgid "Circular" +msgstr "Circular" + +#: FlatCAMEditor.py:4808 +msgid "Nr of drills:" +msgstr "Nr. op. găurire" + +#: FlatCAMEditor.py:4810 +msgid "Specify how many drills to be in the array." +msgstr "Specifica cate operatii de găurire să fie incluse in arie." + +#: FlatCAMEditor.py:4827 FlatCAMEditor.py:4872 +msgid "Direction:" +msgstr "Direcţie:" + +#: FlatCAMEditor.py:4829 +msgid "" +"Direction on which the linear array is oriented:\n" +"- 'X' - horizontal axis \n" +"- 'Y' - vertical axis or \n" +"- 'Angle' - a custom angle for the array inclination" +msgstr "" +"Directia in care aria lineara este orientata:\n" +"- 'X' - pe axa orizontala \n" +"- 'Y' - pe axa verticala sau \n" +"- 'Unghi' - un unghi particular pentru inclinatia ariei" + +#: FlatCAMEditor.py:4838 +msgid "Angle" +msgstr "Unghi" + +#: FlatCAMEditor.py:4842 +msgid "Pitch:" +msgstr "Pas:" + +#: FlatCAMEditor.py:4844 +msgid "Pitch = Distance between elements of the array." +msgstr "Pas = Distanta între elementele ariei." + +#: FlatCAMEditor.py:4853 +msgid "" +"Angle at which the linear array is placed.\n" +"The precision is of max 2 decimals.\n" +"Min value is: -359.99 degrees.\n" +"Max value is: 360.00 degrees." +msgstr "" +"Unghiul global la care aria lineara este plasata.\n" +"Precizia este de max 2 zecimale.\n" +"Val minima este: -359.99 grade.\n" +"Val maxima este: 360.00 grade." + +#: FlatCAMEditor.py:4874 +msgid "" +"Direction for circular array.Can be CW = clockwise or CCW = counter " +"clockwise." +msgstr "" +"Directia pentru aria circulara. Poate fi CW = in sensul acelor de ceasornic " +"sau CCW = invers acelor de ceasornic" + +#: FlatCAMEditor.py:4889 +msgid "Angle at which each element in circular array is placed." +msgstr "" +"Unghiul la care fiecare element al ariei circulare este plasat fata de " +"originea ariei." + +#: FlatCAMEditor.py:5210 FlatCAMObj.py:1725 +msgid "Total Drills" +msgstr "Nr. Tot. Op. Găurire" + +#: FlatCAMEditor.py:5242 FlatCAMObj.py:1751 +msgid "Total Slots" +msgstr "Nr. Tot. Sloturi" + +#: FlatCAMEditor.py:5316 FlatCAMObj.py:1958 FlatCAMObj.py:3221 +#: FlatCAMObj.py:3527 FlatCAMObj.py:3714 FlatCAMObj.py:3727 FlatCAMObj.py:3844 +#: FlatCAMObj.py:4252 FlatCAMObj.py:4485 FlatCAMObj.py:4891 +#: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 +#: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 +#: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 +#: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 +#: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:478 +#: flatcamTools/ToolNonCopperClear.py:625 +#: flatcamTools/ToolNonCopperClear.py:637 flatcamTools/ToolPaint.py:537 +#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:833 flatcamTools/ToolPaint.py:988 +#: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 +#: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 +#: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 +#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +msgid "[ERROR_NOTCL]Wrong value format entered, use a number." +msgstr "[ERROR_NOTCL] Valoare in format incorect, foloseşte un număr." + +#: FlatCAMEditor.py:5329 +msgid "" +"[WARNING_NOTCL]Tool already in the original or actual tool list.\n" +"Save and reedit Excellon if you need to add this tool. " +msgstr "" +"[WARNING_NOTCL] Unealta este deja in lista originala sau actuala de unelte.\n" +"Salvează și reeditează obiectul Excellon daca ai nevoie să adaugi aceasta " +"unealta." + +#: FlatCAMEditor.py:5338 flatcamGUI/FlatCAMGUI.py:2481 +#, python-brace-format +msgid "[success]Added new tool with dia: {dia} {units}" +msgstr "[success] O noua unealta este adaugata cu diametrul: {dia} {units}" + +#: FlatCAMEditor.py:5369 +msgid "[WARNING_NOTCL]Select a tool in Tool Table" +msgstr "[WARNING_NOTCL] Selectează o unealta in Tabela de Unelte" + +#: FlatCAMEditor.py:5402 +#, python-brace-format +msgid "[success]Deleted tool with dia: {del_dia} {units}" +msgstr "[success] Unealta stearsa cu diametrul: {del_dia} {units}" + +#: FlatCAMEditor.py:5799 +msgid "" +"[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " +"creation." +msgstr "" +"[ERROR_NOTCL] Nu exista definitii de unelte in fişier. Se anulează crearea " +"de obiect Excellon." + +#: FlatCAMEditor.py:5808 +msgid "Creating Excellon." +msgstr "In curs de creere Excellon." + +#: FlatCAMEditor.py:5817 +msgid "[success]Excellon editing finished." +msgstr "[success] Editarea Excellon a fost terminata." + +#: FlatCAMEditor.py:5834 +msgid "[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected" +msgstr "" +"[WARNING_NOTCL] Anulata. Nu este selectata nici-o unealta sau op. de găurire." + +#: FlatCAMEditor.py:6316 +msgid "[success]Done. Drill(s) deleted." +msgstr "[success] Executat. Operatiile de găurire sterse." + +#: FlatCAMEditor.py:6386 +msgid "Click on the circular array Center position" +msgstr "Click pe punctul de Centru al ariei circulare." + +#: FlatCAMObj.py:193 +#, python-brace-format +msgid "[success]Name changed from {old} to {new}" +msgstr "[success] Numele schimbat din {old} in {new}" + +#: FlatCAMObj.py:532 FlatCAMObj.py:1886 FlatCAMObj.py:3149 FlatCAMObj.py:5296 +msgid "Basic" +msgstr "Baza" + +#: FlatCAMObj.py:544 FlatCAMObj.py:1902 FlatCAMObj.py:3171 FlatCAMObj.py:5302 +msgid "Advanced" +msgstr "Avansat" + +#: FlatCAMObj.py:899 FlatCAMObj.py:954 +#, python-format +msgid "[success]Isolation geometry created: %s" +msgstr "[success] Geometria de izolare creata: %s" + +#: FlatCAMObj.py:1029 +msgid "" +"[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." +msgstr "" +"[ERROR_NOTCL] Factorul de scalare a aperturii lipseste sau este in format " +"gresit." + +#: FlatCAMObj.py:1044 FlatCAMObj.py:1079 +msgid "" +"[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " +"again." +msgstr "" +"[WARNING_NOTCL] Nici-o apertura sel. pt scalare. Selectează cel putin o " +"apertura și încearcă din nou." + +#: FlatCAMObj.py:1064 +msgid "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." +msgstr "[ERROR_NOTCL] Valoarea pt bufer apertura lipseste " + +#: FlatCAMObj.py:1136 +msgid "Generating Gerber" +msgstr "Gerber in curs de creare" + +#: FlatCAMObj.py:1144 +msgid "[ERROR_NOTCL] Cretion of Gerber failed." +msgstr "[ERROR_NOTCL] Crearea unui fişier Gerber a esuat." + +#: FlatCAMObj.py:1151 +#, python-format +msgid "[success] Created: %s" +msgstr "[success] Creat: %s" + +#: FlatCAMObj.py:1271 +msgid "Plotting Apertures" +msgstr "Aperturile sunt in curs de afișare" + +#: FlatCAMObj.py:2182 FlatCAMObj.py:2273 FlatCAMObj.py:2388 +msgid "" +"[ERROR_NOTCL]Please select one or more tools from the list and try again." +msgstr "" +"[ERROR_NOTCL] Selectează una sau mai multe unelte din lista și încearcă din " +"nou." + +#: FlatCAMObj.py:2189 +msgid "" +"[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled." +msgstr "" +"[ERROR_NOTCL] Anulat. Freza pt frezarea găurilor este mai mare decat " +"diametrul găurii." + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Tool_nr" +msgstr "Nr. Unealta" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Drills_Nr" +msgstr "Nr. gaura" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Slots_Nr" +msgstr "Nr. slot" + +#: FlatCAMObj.py:2283 +msgid "" +"[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." +msgstr "" +"[ERROR_NOTCL] Anulat. Freza este mai mare decat diametrul slotului de frezat." + +#: FlatCAMObj.py:2446 FlatCAMObj.py:4140 FlatCAMObj.py:4351 FlatCAMObj.py:4666 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"z_pdepth\"] or self." +"options[\"z_pdepth\"]" +msgstr "" +"[ERROR_NOTCL] Valoare gresita pt self.defaults[\"z_pdepth\"] sau self." +"options[\"z_pdepth\"]" + +#: FlatCAMObj.py:2458 FlatCAMObj.py:4152 FlatCAMObj.py:4363 FlatCAMObj.py:4678 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"feedrate_probe\"] or " +"self.options[\"feedrate_probe\"]" +msgstr "" +"[ERROR_NOTCL] Valoare gresita pt self.defaults[\"feedrate_probe\"] sau self." +"options[\"feedrate_probe\"]" + +#: FlatCAMObj.py:2490 FlatCAMObj.py:4553 FlatCAMObj.py:4558 FlatCAMObj.py:4704 +msgid "Generating CNC Code" +msgstr "CNC Code in curs de generare" + +#: FlatCAMObj.py:2516 FlatCAMObj.py:4850 camlib.py:4929 camlib.py:5365 +#: camlib.py:5636 +msgid "" +"[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " +"format (x, y) \n" +"but now there is only one value, not two. " +msgstr "" +"[ERROR] Parametrul >Schimbare Unealta X, Y< in Editare -> Peferinte trebuie " +"să fie in formatul (x, y) \n" +"dar are o singura valoare in loc de doua. " + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3105 FlatCAMObj.py:3390 +msgid "Path" +msgstr "Pe cale" + +#: FlatCAMObj.py:2863 +msgid "In" +msgstr "În" + +#: FlatCAMObj.py:2863 +msgid "Out" +msgstr "Afară" + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3186 FlatCAMObj.py:3759 +msgid "Custom" +msgstr "Personalizat" + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3770 FlatCAMObj.py:3771 FlatCAMObj.py:3780 +msgid "Iso" +msgstr "Izo." + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3107 FlatCAMObj.py:3392 +msgid "Rough" +msgstr "Grosier" + +#: FlatCAMObj.py:2864 +msgid "Finish" +msgstr "Finisare" + +#: FlatCAMObj.py:3142 flatcamGUI/FlatCAMGUI.py:463 +#: flatcamGUI/FlatCAMGUI.py:1388 flatcamGUI/ObjectUI.py:1067 +msgid "Copy" +msgstr "Copiaza" + +#: FlatCAMObj.py:3144 flatcamGUI/FlatCAMGUI.py:464 +#: flatcamGUI/FlatCAMGUI.py:1389 flatcamGUI/ObjectUI.py:1075 +#: flatcamTools/ToolNonCopperClear.py:145 flatcamTools/ToolPaint.py:143 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +msgid "Delete" +msgstr "Sterge" + +#: FlatCAMObj.py:3362 +msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." +msgstr "[ERROR_NOTCL] Introdu diametrul dorit pt unealta in format Real." + +#: FlatCAMObj.py:3437 +msgid "[success] Tool added in Tool Table." +msgstr "[success] Unealta adaugata in Tabela de Unelte." + +#: FlatCAMObj.py:3442 +msgid "[ERROR_NOTCL]Default Tool added. Wrong value format entered." +msgstr "" +"[ERROR_NOTCL] Unealta implicita adaugatadar valoarea are un format gresit." + +#: FlatCAMObj.py:3472 FlatCAMObj.py:3482 +msgid "[WARNING_NOTCL]Failed. Select a tool to copy." +msgstr "[WARNING_NOTCL] Esuat. Selectează o unealta pt copiere." + +#: FlatCAMObj.py:3511 +msgid "[success] Tool was copied in Tool Table." +msgstr "[success] Unealta a fost copiata in Tabela de Unelte." + +#: FlatCAMObj.py:3544 +msgid "[success] Tool was edited in Tool Table." +msgstr "[success] Unealta a fost editata in Tabela de Unelte." + +#: FlatCAMObj.py:3575 FlatCAMObj.py:3585 +msgid "[WARNING_NOTCL]Failed. Select a tool to delete." +msgstr "[WARNING_NOTCL] Esuat. Selectează o unealta pentru stergere." + +#: FlatCAMObj.py:3609 +msgid "[success] Tool was deleted in Tool Table." +msgstr "[success] Unealta a fost stearsa din Tabela de Unelte." + +#: FlatCAMObj.py:4023 +#, python-format +msgid "" +"[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." +msgstr "" +"[WARNING_NOTCL] Acest obiect Geometrie nu poate fi procesar decoarece este " +"Geometrie %s." + +#: FlatCAMObj.py:4040 +msgid "[ERROR_NOTCL]Wrong Tool Dia value format entered, use a number." +msgstr "" +"[ERROR_NOTCL] Diametrul uneltei este in format gresit, foloseşte un număr " +"Real." + +#: FlatCAMObj.py:4067 +msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." +msgstr "" +"[ERROR_NOTCL] Esuat. Nici-o unealta nu este selectata in Tabela de Unelte ..." + +#: FlatCAMObj.py:4105 +#, python-format +msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" +msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" + +#: FlatCAMObj.py:4261 FlatCAMObj.py:4494 +msgid "" +"[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" +"Add a Tool Offset or change the Offset Type." +msgstr "" +"[WARNING] Un ofset pt unealta este selectat in Tabela de Unelte dar nici-o " +"val. nu este oferita.\n" +"Adaugă un ofset pt unealta sau schimba Tipul Ofset." + +#: FlatCAMObj.py:4375 +msgid "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." +msgstr "[ERROR_NOTCL] Anulat. Fişier gol, nu are geometrie ..." + +#: FlatCAMObj.py:4737 FlatCAMObj.py:4747 camlib.py:3229 camlib.py:3238 +msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." +msgstr "" +"[ERROR_NOTCL] Factorul de scalare trebuie să fie un număr: natural sau real." + +#: FlatCAMObj.py:4785 +msgid "[success]Geometry Scale done." +msgstr "[success] Scalare Geometrie executata." + +#: FlatCAMObj.py:4802 camlib.py:3300 +msgid "" +"[ERROR_NOTCL]An (x,y) pair of values are needed. Probable you entered only " +"one value in the Offset field." +msgstr "" +"[ERROR_NOTCL] O pereche de valori (x,y) este necesară. Probabil că ai " +"introdus numai o singura valoare in câmpul Offset." + +#: FlatCAMObj.py:4822 +msgid "[success]Geometry Offset done." +msgstr "[success] Ofset Geometrie executat." + +#: FlatCAMObj.py:5364 FlatCAMObj.py:5369 flatcamTools/ToolSolderPaste.py:1360 +msgid "Export Machine Code ..." +msgstr "Exporta CNC Cod Masina ..." + +#: FlatCAMObj.py:5375 +msgid "[WARNING_NOTCL]Export Machine Code cancelled ..." +msgstr "[WARNING_NOTCL] Exportul de cod CNC a fost anulat ..." + +#: FlatCAMObj.py:5386 +#, python-format +msgid "[success] Machine Code file saved to: %s" +msgstr "[success] Fişierul cu cod CNC este salvat in: %s" + +#: FlatCAMObj.py:5417 +#, python-format +msgid "[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s" +msgstr "[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s" + +#: FlatCAMObj.py:5523 +#, python-format +msgid "" +"[WARNING_NOTCL]This CNCJob object can't be processed because it is a %s " +"CNCJob object." +msgstr "" +"[WARNING_NOTCL] Acest obiect CNCJob nu poate fi procesar deoarece este un " +"obiect CNCJob tip %s." + +#: FlatCAMObj.py:5576 +msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" +msgstr "[ERROR_NOTCL] G-code nu contine codul pt unitati: G20 sau G21" + +#: FlatCAMObj.py:5589 +msgid "" +"[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " +"empty." +msgstr "" +"[ERROR_NOTCL] Anulat. Codul G-Code din Macro-ul Schimbare unealta este " +"activat dar nuc contine nimic." + +#: FlatCAMObj.py:5596 +msgid "[success] Toolchange G-code was replaced by a custom code." +msgstr "" +"[success] G-Code-ul pt schimbare unealta a fost inlocuit cu un cod " +"pesonalizat." + +#: FlatCAMObj.py:5611 flatcamTools/ToolSolderPaste.py:1389 +msgid "[WARNING_NOTCL] No such file or directory" +msgstr "[WARNING_NOTCL] Nu exista un asemenea fişier sau director" + +#: FlatCAMObj.py:5630 FlatCAMObj.py:5642 +msgid "" +"[WARNING_NOTCL] The used postprocessor file has to have in it's name: " +"'toolchange_custom'" +msgstr "" +"[WARNING_NOTCL] Postprocesorul folosit trebuie să aibă in numele sau: " +"'toolchange_custom'" + +#: FlatCAMObj.py:5648 +msgid "[ERROR] There is no postprocessor file." +msgstr "[ERROR] Nu exista nici-un fişier postprocesor." + +#: ObjectCollection.py:402 +#, python-brace-format +msgid "Object renamed from {old} to {new}" +msgstr "Obiectul este redenumit din {old} in {new}." + +#: ObjectCollection.py:736 +#, python-format +msgid "[ERROR] Cause of error: %s" +msgstr "[ERROR] Motivul erorii: %s" + +#: camlib.py:200 +msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." +msgstr "" +"[ERROR_NOTCL] self.solid_geometry nu este tip BaseGeometry sau tip lista." + +#: camlib.py:1387 +msgid "[success]Object was mirrored ..." +msgstr "[success] Obiectul a fost oglindit ..." + +#: camlib.py:1389 +msgid "[ERROR_NOTCL] Failed to mirror. No object selected" +msgstr "[ERROR_NOTCL] Oglindire esuata. Nici-un obiect nu este selectat ..." + +#: camlib.py:1425 +msgid "[success]Object was rotated ..." +msgstr "[success] Obiectul a fost rotit ..." + +#: camlib.py:1427 +msgid "[ERROR_NOTCL] Failed to rotate. No object selected" +msgstr "[ERROR_NOTCL] Rotatie esuata. Nici-un obiect nu este selectat ..." + +#: camlib.py:1461 +msgid "[success]Object was skewed ..." +msgstr "[success] Obiectul a fost deformat ..." + +#: camlib.py:1463 +msgid "[ERROR_NOTCL] Failed to skew. No object selected" +msgstr "[ERROR_NOTCL] Deformare esuata. Nici-un obiect nu este selectat ..." + +#: camlib.py:2647 camlib.py:2727 +#, python-format +msgid "[WARNING] Coordinates missing, line ignored: %s" +msgstr "[WARNING] Coordonatele lipsesc, linia este ignorata: %s" + +#: camlib.py:2648 camlib.py:2728 +msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" +msgstr "" +"[WARNING_NOTCL] Fişierul Gerber poate fi corrupt. Verificati fişierul!!!" + +#: camlib.py:2696 +#, python-format +msgid "" +"[ERROR] Region does not have enough points. File will be processed but there " +"are parser errors. Line number: %s" +msgstr "" +"[ERROR] Regiunea Gerber nu are suficiente puncte. Fişierul va fi procesat " +"dar sunt erori de parsare. Numărul liniei: %s" + +#: camlib.py:3051 +#, python-format +msgid "" +"[ERROR]Gerber Parser ERROR.\n" +"%s:" +msgstr "" +"[ERROR] Eroare in parserul Gerber.\n" +"%s:" + +#: camlib.py:3267 +msgid "[success]Gerber Scale done." +msgstr "[success] Scalarea Gerber efectuata." + +#: camlib.py:3324 +msgid "[success]Gerber Offset done." +msgstr "[success] Offsetare Gerber efectuata." + +#: camlib.py:3700 +#, python-format +msgid "[ERROR_NOTCL] This is GCODE mark: %s" +msgstr "[ERROR_NOTCL] Acesta este un marcaj Gerber: %s" + +#: camlib.py:4230 +#, python-brace-format +msgid "" +"[ERROR] Excellon Parser error.\n" +"Parsing Failed. Line {l_nr}: {line}\n" +msgstr "" +"[ERROR] Eroare in parserul Excellon.\n" +"Parsare esuata. Linia {l_nr}: {line}\n" +"\n" + +#: camlib.py:4307 +msgid "" +"[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " +"not having a tool associated.\n" +"Check the resulting GCode." +msgstr "" +"[WARNING] Excellon.create_geometry() -> o locatie de găurire a fost sarita " +"deoarece nu are o unealta asociata.\n" +"Verifică codul G-Code rezultat." + +#: camlib.py:4843 +#, python-format +msgid "[ERROR] There is no such parameter: %s" +msgstr "[ERROR] Nu exista un asemenea parametru: %s" + +#: camlib.py:4908 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"drill into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative. Check the resulting " +"CNC code (Gcode etc)." +msgstr "" +"[WARNING] Parametrul >Z tăiere< are o valoare pozitivă. Reprezinta adâncimea " +"de tăiere in material prin urmare poate fi numai negativ.\n" +"Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " +"intr-o valoare negativă. Verifică codul masina (G-Code etc) rezultat." + +#: camlib.py:4915 camlib.py:5388 camlib.py:5659 +#, python-format +msgid "" +"[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" +msgstr "" +"[WARNING] Parametrul >Z tăiere< este nul. Nu va fi nici-o tăiere prin urmare " +"nu procesam fişierul %s" + +#: camlib.py:5131 camlib.py:5226 camlib.py:5277 +msgid "[ERROR_NOTCL]The loaded Excellon file has no drills ..." +msgstr "[ERROR_NOTCL] Fişierul Excellon incarcat nu are găuri ..." + +#: camlib.py:5231 +msgid "[ERROR_NOTCL] Wrong optimization type selected." +msgstr "[ERROR_NOTCL] Un tip de optimizare incorrect a fost selectat." + +#: camlib.py:5376 camlib.py:5647 +msgid "" +"[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " +"combinations of other parameters." +msgstr "" +"[ERROR_NOTCL] Parametrul >Z tăiere< este None sau zero. Cel mai probabil o " +"combinatie nefericita de parametri." + +#: camlib.py:5381 camlib.py:5652 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"cut into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" +"[WARNING] Parametrul >Z tăiere< are o valoare pozitivă. Reprezinta adâncimea " +"de tăiere in material prin urmare poate fi numai negativ.\n" +"Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " +"intr-o valoare negativă. Verifică codul masina (G-Code etc) rezultat." + +#: camlib.py:5393 camlib.py:5664 +msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." +msgstr "[ERROR_NOTCL] Parametrul >Z deplasare< este None sau zero." + +#: camlib.py:5397 camlib.py:5668 +msgid "" +"[WARNING] The Travel Z parameter has negative value. It is the height value " +"to travel between cuts.\n" +"The Z Travel parameter needs to have a positive value, assuming it is a typo " +"therefore the app will convert the value to positive.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" +"[WARNING] Parametrul >Z deplasare< are o valoare negativă. Reprezinta " +"Înălţimea la care unealta se deplasează fără să taie prin urmare poate fi " +"numai pozitiv.\n" +"Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " +"intr-o valoare pozitivă. Verifică codul masina (G-Code etc) rezultat." + +#: camlib.py:5404 camlib.py:5675 +#, python-format +msgid "" +"[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" +msgstr "" +"[WARNING] Parametrul >Z deplasare< este zero. Aceasta este periculos, prin " +"urmare fişierul %s nu se procesează." + +#: camlib.py:5534 +#, python-format +msgid "[ERROR]Expected a Geometry, got %s" +msgstr "[ERROR] Se astepta o Geometrie, am primit in schimb %s" + +#: camlib.py:5540 +msgid "" +"[ERROR_NOTCL]Trying to generate a CNC Job from a Geometry object without " +"solid_geometry." +msgstr "" +"[ERROR_NOTCL] Se încearcă generarea unui CNC Job dintr-un obiect Geometrie " +"fără atributul solid_geometry." + +#: camlib.py:5579 +msgid "" +"[ERROR_NOTCL]The Tool Offset value is too negative to use for the " +"current_geometry.\n" +"Raise the value (in module) and try again." +msgstr "" +"[ERROR_NOTCL] Valoarea pentru >Offset unealta< este prea negativă pentru a " +"fi folosita. \n" +"Mareste valoarea absoluta și încearcă din nou." + +#: camlib.py:5801 +msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." +msgstr "" +"[ERROR_NOTCL] Nu exista date cu privier la unealta in geometria SolderPaste." + +#: flatcamGUI/FlatCAMGUI.py:50 +msgid "&File" +msgstr "&Fişiere" + +#: flatcamGUI/FlatCAMGUI.py:55 +msgid "&New Project ...\tCTRL+N" +msgstr "&Proiect Nou...\tCTRL+N" + +#: flatcamGUI/FlatCAMGUI.py:57 +msgid "Will create a new, blank project" +msgstr "Se va crea un proiect nou, fără continut" + +#: flatcamGUI/FlatCAMGUI.py:62 +msgid "&New" +msgstr "&Nou" + +#: flatcamGUI/FlatCAMGUI.py:65 +msgid "Geometry\tN" +msgstr "Geometrie\tN" + +#: flatcamGUI/FlatCAMGUI.py:67 +msgid "Will create a new, empty Geometry Object." +msgstr "Va crea un obiect nou de tip Geometrie, fără continut." + +#: flatcamGUI/FlatCAMGUI.py:69 +msgid "Excellon\tL" +msgstr "Excellon\tL" + +#: flatcamGUI/FlatCAMGUI.py:71 +msgid "Will create a new, empty Excellon Object." +msgstr "Va crea un obiect nou de tip Excellon, fără continut." + +#: flatcamGUI/FlatCAMGUI.py:74 +msgid "Open" +msgstr "Incarca" + +#: flatcamGUI/FlatCAMGUI.py:79 +msgid "Open &Gerber ...\tCTRL+G" +msgstr "Incarca &Gerber ...\tCTRL+G" + +#: flatcamGUI/FlatCAMGUI.py:86 +msgid "Open &Excellon ...\tCTRL+E" +msgstr "Incarca &Excellon ...\tCTRL+E" + +#: flatcamGUI/FlatCAMGUI.py:91 +msgid "Open G-&Code ..." +msgstr "Incarca G-&Code ..." + +#: flatcamGUI/FlatCAMGUI.py:95 +msgid "Open &Project ..." +msgstr "Incarca &Project ..." + +#: flatcamGUI/FlatCAMGUI.py:101 +msgid "Open Config ..." +msgstr "Incarca Config ..." + +#: flatcamGUI/FlatCAMGUI.py:105 +msgid "Recent files" +msgstr "Fişierele Recente" + +#: flatcamGUI/FlatCAMGUI.py:111 +msgid "Run Script ...\tSHIFT+S" +msgstr "Rulează Script ...\tSHIFT+S" + +#: flatcamGUI/FlatCAMGUI.py:114 +msgid "" +"Will run the opened Tcl Script thus\n" +"enabling the automation of certain\n" +"functions of FlatCAM." +msgstr "" +"Va rula un script TCL astfel oferind\n" +"o automatizare a anumitor functii\n" +"din FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:124 +msgid "Import" +msgstr "Import" + +#: flatcamGUI/FlatCAMGUI.py:126 +msgid "&SVG as Geometry Object ..." +msgstr "&SVG ca și obiect Geometrie ..." + +#: flatcamGUI/FlatCAMGUI.py:129 +msgid "&SVG as Gerber Object ..." +msgstr "&SVG ca și obiect Gerber ..." + +#: flatcamGUI/FlatCAMGUI.py:134 +msgid "&DXF as Geometry Object ..." +msgstr "&DXF ca și obiect Geometrie ..." + +#: flatcamGUI/FlatCAMGUI.py:137 +msgid "&DXF as Gerber Object ..." +msgstr "&DXF ca și obiect Gerber ..." + +#: flatcamGUI/FlatCAMGUI.py:142 +msgid "Export" +msgstr "Export" + +#: flatcamGUI/FlatCAMGUI.py:145 +msgid "Export &SVG ..." +msgstr "Exporta &SVG ..." + +#: flatcamGUI/FlatCAMGUI.py:148 +msgid "Export DXF ..." +msgstr "Exporta DXF ..." + +#: flatcamGUI/FlatCAMGUI.py:153 +msgid "Export &PNG ..." +msgstr "Exporta &PNG ..." + +#: flatcamGUI/FlatCAMGUI.py:155 +msgid "" +"Will export an image in PNG format,\n" +"the saved image will contain the visual \n" +"information currently in FlatCAM Plot Area." +msgstr "" +"Va exporta o imagine in format PNG,\n" +"imagina salvata va contine elementele vizuale\n" +"afisate in zona de afișare." + +#: flatcamGUI/FlatCAMGUI.py:163 +msgid "Export &Excellon ..." +msgstr "Exporta Excellon ..." + +#: flatcamGUI/FlatCAMGUI.py:166 +msgid "" +"Will export an Excellon Object as Excellon file,\n" +"the coordinates format, the file units and zeros\n" +"are set in Preferences -> Excellon Export." +msgstr "" +"Va exporta un obiect Excellon intr-un fişier Excellon.\n" +"Formatul coordonatelor, unitatile de masura și tipul\n" +"de zerouri se vor seta in Preferințe -> Export Excellon." + +#: flatcamGUI/FlatCAMGUI.py:177 +msgid "Save &Defaults" +msgstr "Salvează valori &Default" + +#: flatcamGUI/FlatCAMGUI.py:183 flatcamGUI/FlatCAMGUI.py:465 +msgid "Save" +msgstr "Salvează" + +#: flatcamGUI/FlatCAMGUI.py:185 +msgid "&Save Project ..." +msgstr "&Salvează Proiect ..." + +#: flatcamGUI/FlatCAMGUI.py:190 +msgid "Save Project &As ...\tCTRL+S" +msgstr "Salvează Proiect &ca ...\tCTRL+S" + +#: flatcamGUI/FlatCAMGUI.py:194 +msgid "Save Project C&opy ..." +msgstr "Salvează o C&opie Proiect..." + +#: flatcamGUI/FlatCAMGUI.py:202 +msgid "E&xit" +msgstr "Iesire" + +#: flatcamGUI/FlatCAMGUI.py:208 +msgid "&Edit" +msgstr "&Editare" + +#: flatcamGUI/FlatCAMGUI.py:211 +msgid "Edit Object\tE" +msgstr "Editare Obiect\tE" + +#: flatcamGUI/FlatCAMGUI.py:212 +msgid "Save && Close Editor\tCTRL+S" +msgstr "Salvează && Inchide Editor\tCTRL+S" + +#: flatcamGUI/FlatCAMGUI.py:220 +msgid "Conversion" +msgstr "Conversii" + +#: flatcamGUI/FlatCAMGUI.py:222 +msgid "&Join Geo/Gerber/Exc -> Geo" +msgstr "&Fuzionează Geo/Gerber/Exc -> Geo" + +#: flatcamGUI/FlatCAMGUI.py:224 +msgid "" +"Merge a selection of objects, which can be of type:\n" +"- Gerber\n" +"- Excellon\n" +"- Geometry\n" +"into a new combo Geometry object." +msgstr "" +"Fuzionează o selecţie de obiecte care pot fi de tipul:\n" +"- Gerber\n" +"- Excellon\n" +"- Geometrie\n" +"intr-un nou obiect tip Geometrie >combo<." + +#: flatcamGUI/FlatCAMGUI.py:231 +msgid "Join Excellon(s) -> Excellon" +msgstr "Fuzionează Excellon(s) -> Excellon" + +#: flatcamGUI/FlatCAMGUI.py:233 +msgid "Merge a selection of Excellon objects into a new combo Excellon object." +msgstr "" +"Fuzionează o selecţie de obiecte Excellon intr-un nou obiect Excellon >combo<" + +#: flatcamGUI/FlatCAMGUI.py:236 +msgid "Join Gerber(s) -> Gerber" +msgstr "Fuzionează Gerber(s) -> Gerber" + +#: flatcamGUI/FlatCAMGUI.py:238 +msgid "Merge a selection of Gerber objects into a new combo Gerber object." +msgstr "" +"Fuzionează o selecţie de obiecte Gerber intr-un nou obiect Gerber >combo<" + +#: flatcamGUI/FlatCAMGUI.py:243 +msgid "Convert Single to MultiGeo" +msgstr "Converteste SingleGeo in MultiGeo" + +#: flatcamGUI/FlatCAMGUI.py:245 +msgid "" +"Will convert a Geometry object from single_geometry type\n" +"to a multi_geometry type." +msgstr "" +"Va converti un obiect Geometrie din tipul simpla geometrie (SingleGeo)\n" +"la tipul geometrie complexa (MultiGeo)." + +#: flatcamGUI/FlatCAMGUI.py:249 +msgid "Convert Multi to SingleGeo" +msgstr "Converteste MultiGeo in SingleGeo" + +#: flatcamGUI/FlatCAMGUI.py:251 +msgid "" +"Will convert a Geometry object from multi_geometry type\n" +"to a single_geometry type." +msgstr "" +"Va converti un obiect Geometrie din tipul geometrie complexa (MultiGeo)\n" +"la tipul geometrie simpla (SingleGeo)." + +#: flatcamGUI/FlatCAMGUI.py:258 +msgid "&Copy Object\tCTRL+C" +msgstr "&Copiaza Obiect\tCTRL+C" + +#: flatcamGUI/FlatCAMGUI.py:260 +msgid "Copy as &Geom" +msgstr "Copiaza ca &Geo" + +#: flatcamGUI/FlatCAMGUI.py:263 +msgid "&Delete\tDEL" +msgstr "&Sterge\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:267 +msgid "Se&t Origin\tO" +msgstr "Se&tează Originea\tO" + +#: flatcamGUI/FlatCAMGUI.py:268 +msgid "Jump to Location\tJ" +msgstr "Sari la Locatie\tJ" + +#: flatcamGUI/FlatCAMGUI.py:273 +msgid "Toggle Units\tQ" +msgstr "Comuta Unitati\tQ" + +#: flatcamGUI/FlatCAMGUI.py:275 +msgid "&Select All\tCTRL+A" +msgstr "&Selectează Tot\tCTRL+A" + +#: flatcamGUI/FlatCAMGUI.py:279 +msgid "&Preferences\tSHIFT+P" +msgstr "&Preferințe\tSHIFT+P" + +#: flatcamGUI/FlatCAMGUI.py:282 +msgid "&Options" +msgstr "&Opțiuni" + +#: flatcamGUI/FlatCAMGUI.py:297 +msgid "&Rotate Selection\tSHIFT+(R)" +msgstr "&Roteste Selectia\tSHIFT+(R)" + +#: flatcamGUI/FlatCAMGUI.py:302 +msgid "&Skew on X axis\tSHIFT+X" +msgstr "&Deformează pe axa X\tSHIFT+X" + +#: flatcamGUI/FlatCAMGUI.py:304 +msgid "S&kew on Y axis\tSHIFT+Y" +msgstr "Deformează pe axa Y\tSHIFT+Y" + +#: flatcamGUI/FlatCAMGUI.py:309 +msgid "Flip on &X axis\tX" +msgstr "Oglindeste pe axa &X\tX" + +#: flatcamGUI/FlatCAMGUI.py:311 +msgid "Flip on &Y axis\tY" +msgstr "Oglindeste pe axa &Y\tY" + +#: flatcamGUI/FlatCAMGUI.py:316 +msgid "View source\tALT+S" +msgstr "Vezi sursa\tALT+S" + +#: flatcamGUI/FlatCAMGUI.py:321 +msgid "&View" +msgstr "&Vizualizare" + +#: flatcamGUI/FlatCAMGUI.py:322 +msgid "Enable all plots\tALT+1" +msgstr "Activează toate afisarile\tALT+1" + +#: flatcamGUI/FlatCAMGUI.py:324 +msgid "Disable all plots\tALT+2" +msgstr "Dezactivează toate afisarile\tALT+2" + +#: flatcamGUI/FlatCAMGUI.py:326 +msgid "Disable non-selected\tALT+3" +msgstr "Dezactivează non-selectate\tALT+3" + +#: flatcamGUI/FlatCAMGUI.py:329 +msgid "&Zoom Fit\tV" +msgstr "&Mareste și potriveste\tV" + +#: flatcamGUI/FlatCAMGUI.py:330 +msgid "&Zoom In\t-" +msgstr "&Mareste\t-" + +#: flatcamGUI/FlatCAMGUI.py:331 +msgid "&Zoom Out\t=" +msgstr "&Micsorează\t=" + +#: flatcamGUI/FlatCAMGUI.py:335 +msgid "Toggle Code Editor\tCTRL+E" +msgstr "Comuta Editorul de cod\tCTRL+E" + +#: flatcamGUI/FlatCAMGUI.py:338 +msgid "&Toggle FullScreen\tALT+F10" +msgstr "Comuta FullScreen\tALT+F10" + +#: flatcamGUI/FlatCAMGUI.py:340 +msgid "&Toggle Plot Area\tCTRL+F10" +msgstr "Comuta Aria de Afișare\tCTRL+F10" + +#: flatcamGUI/FlatCAMGUI.py:342 +msgid "&Toggle Project/Sel/Tool\t`" +msgstr "Comuta Proiect/Sel/Unealta\t`" + +#: flatcamGUI/FlatCAMGUI.py:345 +msgid "&Toggle Grid Snap\tG" +msgstr "Comuta Grid\tG" + +#: flatcamGUI/FlatCAMGUI.py:347 +msgid "&Toggle Axis\tSHIFT+G" +msgstr "Comuta Axe\tSHIFT+G" + +#: flatcamGUI/FlatCAMGUI.py:350 +msgid "Toggle Workspace\tSHIFT+W" +msgstr "Comuta Suprafata de lucru\tSHIFT+W" + +#: flatcamGUI/FlatCAMGUI.py:354 +msgid "&Tool" +msgstr "Unelte" + +#: flatcamGUI/FlatCAMGUI.py:356 +msgid "&Command Line\tS" +msgstr "&Linie de comanda\tS" + +#: flatcamGUI/FlatCAMGUI.py:359 +msgid "&Help" +msgstr "Ajutor" + +#: flatcamGUI/FlatCAMGUI.py:360 +msgid "Help\tF1" +msgstr "Ajutor\tF1" + +#: flatcamGUI/FlatCAMGUI.py:361 +msgid "FlatCAM.org" +msgstr "FlatCAM.org" + +#: flatcamGUI/FlatCAMGUI.py:364 +msgid "Shortcuts List\tF3" +msgstr "Lista shortcut-uri\tF3" + +#: flatcamGUI/FlatCAMGUI.py:365 +msgid "YouTube Channel\tF4" +msgstr "YouTube \tF4" + +#: flatcamGUI/FlatCAMGUI.py:367 +msgid "About" +msgstr "Despre" + +#: flatcamGUI/FlatCAMGUI.py:378 +msgid "Add Circle\tO" +msgstr "Adaugă Cerc\tO" + +#: flatcamGUI/FlatCAMGUI.py:380 +msgid "Add Arc\tA" +msgstr "Adaugă Arc\tA" + +#: flatcamGUI/FlatCAMGUI.py:383 +msgid "Add Rectangle\tR" +msgstr "Adaugă Patrulater\tR" + +#: flatcamGUI/FlatCAMGUI.py:386 +msgid "Add Polygon\tN" +msgstr "Adaugă Poligon\tN" + +#: flatcamGUI/FlatCAMGUI.py:388 +msgid "Add Path\tP" +msgstr "Adaugă Cale\tP" + +#: flatcamGUI/FlatCAMGUI.py:390 +msgid "Add Text\tT" +msgstr "Adaugă Text\tT" + +#: flatcamGUI/FlatCAMGUI.py:393 +msgid "Polygon Union\tU" +msgstr "Uniune Poligoane\tU" + +#: flatcamGUI/FlatCAMGUI.py:395 +msgid "Polygon Intersection\tE" +msgstr "Intersecţie Poligoane\tE" + +#: flatcamGUI/FlatCAMGUI.py:397 +msgid "Polygon Subtraction\tS" +msgstr "Substractie Poligoane\tS" + +#: flatcamGUI/FlatCAMGUI.py:401 +msgid "Cut Path\tX" +msgstr "Tăiere Cale\tX" + +#: flatcamGUI/FlatCAMGUI.py:403 +msgid "Copy Geom\tC" +msgstr "Copiaza Geo\tC" + +#: flatcamGUI/FlatCAMGUI.py:405 +msgid "Delete Shape\tDEL" +msgstr "Sterge forma Geo.\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:408 +msgid "Move\tM" +msgstr "Muta\tM" + +#: flatcamGUI/FlatCAMGUI.py:410 +msgid "Buffer Tool\tB" +msgstr "Unealta Bufer\tB" + +#: flatcamGUI/FlatCAMGUI.py:413 +msgid "Paint Tool\tI" +msgstr "Unealta Paint\t" + +#: flatcamGUI/FlatCAMGUI.py:416 +msgid "Transform Tool\tALT+R" +msgstr "Unealta Transformare\tALT+R" + +#: flatcamGUI/FlatCAMGUI.py:420 +msgid "Toggle Corner Snap\tK" +msgstr "Comuta lipire colt\tK" + +#: flatcamGUI/FlatCAMGUI.py:423 +msgid ">Excellon Editor<" +msgstr ">Editor Excellon<" + +#: flatcamGUI/FlatCAMGUI.py:427 +msgid "Add Drill Array\tA" +msgstr "Adaugă Arie Găuriri\tA" + +#: flatcamGUI/FlatCAMGUI.py:429 +msgid "Add Drill\tD" +msgstr "Adaugă Găurire\tD" + +#: flatcamGUI/FlatCAMGUI.py:433 +msgid "Resize Drill(S)\tR" +msgstr "Redimens. Găuriri\tR" + +#: flatcamGUI/FlatCAMGUI.py:435 +msgid "Copy\tC" +msgstr "Copiaza\tC" + +#: flatcamGUI/FlatCAMGUI.py:437 +msgid "Delete\tDEL" +msgstr "Sterge\tDEL" + +#: flatcamGUI/FlatCAMGUI.py:442 +msgid "Move Drill(s)\tM" +msgstr "Muta Găuriri\tM" + +#: flatcamGUI/FlatCAMGUI.py:456 +msgid "Enable Plot" +msgstr "Activează Afișare" + +#: flatcamGUI/FlatCAMGUI.py:457 +msgid "Disable Plot" +msgstr "Dezactivează Afișare" + +#: flatcamGUI/FlatCAMGUI.py:459 +msgid "Generate CNC" +msgstr "Generează CNC" + +#: flatcamGUI/FlatCAMGUI.py:460 +msgid "View Source" +msgstr "Vizualiz. Sursa" + +#: flatcamGUI/FlatCAMGUI.py:462 flatcamGUI/FlatCAMGUI.py:1390 +msgid "Edit" +msgstr "Editează" + +#: flatcamGUI/FlatCAMGUI.py:468 flatcamGUI/FlatCAMGUI.py:1396 +#: flatcamTools/ToolProperties.py:25 +msgid "Properties" +msgstr "Proprietati" + +#: flatcamGUI/FlatCAMGUI.py:497 +msgid "File Toolbar" +msgstr "Toolbar Fişiere" + +#: flatcamGUI/FlatCAMGUI.py:501 +msgid "Edit Toolbar" +msgstr "Toolbar Editare" + +#: flatcamGUI/FlatCAMGUI.py:505 +msgid "View Toolbar" +msgstr "Toolbar Vizualizare" + +#: flatcamGUI/FlatCAMGUI.py:509 +msgid "Shell Toolbar" +msgstr "Toolbar Linie de comanda" + +#: flatcamGUI/FlatCAMGUI.py:513 +msgid "Tools Toolbar" +msgstr "Toolbar Unelte" + +#: flatcamGUI/FlatCAMGUI.py:517 +msgid "Excellon Editor Toolbar" +msgstr "Toolbar Editor Excellon" + +#: flatcamGUI/FlatCAMGUI.py:521 +msgid "Geometry Editor Toolbar" +msgstr "Toolbar Editor Geometrii" + +#: flatcamGUI/FlatCAMGUI.py:525 +msgid "Grid Toolbar" +msgstr "Toolbar Grid-uri" + +#: flatcamGUI/FlatCAMGUI.py:544 flatcamGUI/FlatCAMGUI.py:1593 +msgid "Open project" +msgstr "Incarca Proiect" + +#: flatcamGUI/FlatCAMGUI.py:545 flatcamGUI/FlatCAMGUI.py:1594 +msgid "Save project" +msgstr "Salvează Proiect" + +#: flatcamGUI/FlatCAMGUI.py:548 flatcamGUI/FlatCAMGUI.py:1597 +msgid "New Blank Geometry" +msgstr "Geometrie Noua (goala)" + +#: flatcamGUI/FlatCAMGUI.py:549 flatcamGUI/FlatCAMGUI.py:1598 +msgid "New Blank Excellon" +msgstr "Excellon nou (gol)" + +#: flatcamGUI/FlatCAMGUI.py:551 flatcamGUI/FlatCAMGUI.py:1600 +msgid "Editor" +msgstr "Editor" + +#: flatcamGUI/FlatCAMGUI.py:553 flatcamGUI/FlatCAMGUI.py:1602 +msgid "Save Object and close the Editor" +msgstr "Salvează Obiectul și inchide Editorul" + +#: flatcamGUI/FlatCAMGUI.py:557 flatcamGUI/FlatCAMGUI.py:1606 +msgid "&Delete" +msgstr "&Sterge" + +#: flatcamGUI/FlatCAMGUI.py:560 flatcamGUI/FlatCAMGUI.py:1609 +msgid "&Replot" +msgstr "&Reafișare" + +#: flatcamGUI/FlatCAMGUI.py:561 flatcamGUI/FlatCAMGUI.py:1610 +msgid "&Clear plot" +msgstr "&Sterge Afișare" + +#: flatcamGUI/FlatCAMGUI.py:562 flatcamGUI/FlatCAMGUI.py:1611 +msgid "Zoom In" +msgstr "Marire" + +#: flatcamGUI/FlatCAMGUI.py:563 flatcamGUI/FlatCAMGUI.py:1612 +msgid "Zoom Out" +msgstr "Micsorare" + +#: flatcamGUI/FlatCAMGUI.py:564 flatcamGUI/FlatCAMGUI.py:1370 +#: flatcamGUI/FlatCAMGUI.py:1613 +msgid "Zoom Fit" +msgstr "Marire și ajustare" + +#: flatcamGUI/FlatCAMGUI.py:569 flatcamGUI/FlatCAMGUI.py:1618 +msgid "&Command Line" +msgstr "&Linie de comanda" + +#: flatcamGUI/FlatCAMGUI.py:572 flatcamGUI/FlatCAMGUI.py:1621 +msgid "2Sided Tool" +msgstr "Unealta 2-fețe" + +#: flatcamGUI/FlatCAMGUI.py:573 flatcamGUI/FlatCAMGUI.py:1622 +msgid "&Cutout Tool" +msgstr "Unealta Decupare" + +#: flatcamGUI/FlatCAMGUI.py:574 flatcamGUI/FlatCAMGUI.py:1623 +#: flatcamGUI/ObjectUI.py:463 flatcamTools/ToolNonCopperClear.py:283 +msgid "NCC Tool" +msgstr "Unealta NCC" + +#: flatcamGUI/FlatCAMGUI.py:578 flatcamGUI/FlatCAMGUI.py:1627 +msgid "Panel Tool" +msgstr "Unealta Panel" + +#: flatcamGUI/FlatCAMGUI.py:579 flatcamGUI/FlatCAMGUI.py:1628 +#: flatcamTools/ToolFilm.py:204 +msgid "Film Tool" +msgstr "Unealta Film" + +#: flatcamGUI/FlatCAMGUI.py:580 flatcamGUI/FlatCAMGUI.py:1630 +msgid "SolderPaste Tool" +msgstr "Unealta Dispenser SP" + +#: flatcamGUI/FlatCAMGUI.py:583 flatcamGUI/FlatCAMGUI.py:1634 +msgid "Calculators Tool" +msgstr "Unealta Calculatoare" + +#: flatcamGUI/FlatCAMGUI.py:587 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1638 +msgid "Select" +msgstr "Selectează" + +#: flatcamGUI/FlatCAMGUI.py:588 flatcamGUI/FlatCAMGUI.py:1639 +msgid "Add Drill Hole" +msgstr "Adaugă o Găurire" + +#: flatcamGUI/FlatCAMGUI.py:591 flatcamGUI/FlatCAMGUI.py:1642 +msgid "Resize Drill" +msgstr "Redimens. Găurire" + +#: flatcamGUI/FlatCAMGUI.py:594 flatcamGUI/FlatCAMGUI.py:1645 +msgid "Copy Drill" +msgstr "Copiaza Găurire" + +#: flatcamGUI/FlatCAMGUI.py:595 flatcamGUI/FlatCAMGUI.py:1647 +msgid "Delete Drill" +msgstr "Sterge Găurire" + +#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1650 +msgid "Move Drill" +msgstr "Muta Găurire" + +#: flatcamGUI/FlatCAMGUI.py:602 flatcamGUI/FlatCAMGUI.py:1654 +msgid "Add Circle" +msgstr "Adaugă Cerc" + +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1655 +msgid "Add Arc" +msgstr "Adaugă Arc" + +#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1657 +msgid "Add Rectangle" +msgstr "Adaugă Patrulater" + +#: flatcamGUI/FlatCAMGUI.py:608 flatcamGUI/FlatCAMGUI.py:1660 +msgid "Add Path" +msgstr "Adaugă Cale" + +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1662 +msgid "Add Polygon" +msgstr "Adaugă Poligon" + +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1664 +msgid "Add Text" +msgstr "Adaugă Text" + +#: flatcamGUI/FlatCAMGUI.py:612 flatcamGUI/FlatCAMGUI.py:1666 +msgid "Add Buffer" +msgstr "Adaugă Bufer" + +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1667 +msgid "Paint Shape" +msgstr "Paint o forma" + +#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1670 +msgid "Polygon Union" +msgstr "Uniune Poligoane" + +#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1672 +msgid "Polygon Intersection" +msgstr "Intersecţie Poligoane" + +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1674 +msgid "Polygon Subtraction" +msgstr "Substractie Poligoane" + +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1677 +msgid "Cut Path" +msgstr "Taie Cale" + +#: flatcamGUI/FlatCAMGUI.py:624 +msgid "Copy Shape(s)" +msgstr "Copiaza forme geo." + +#: flatcamGUI/FlatCAMGUI.py:627 +msgid "Delete Shape '-'" +msgstr "Sterge forme geo." + +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1682 +msgid "Transformations" +msgstr "Transformari" + +#: flatcamGUI/FlatCAMGUI.py:631 +msgid "Move Objects " +msgstr "Muta obiecte" + +#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1691 +msgid "Snap to grid" +msgstr "Lipire la grid" + +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1694 +msgid "Grid X snapping distance" +msgstr "Distanta de lipire la grid pe axa X" + +#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1699 +msgid "Grid Y snapping distance" +msgstr "Distanta de lipire la grid pe axa Y" + +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1705 +msgid "" +"When active, value on Grid_X\n" +"is copied to the Grid_Y value." +msgstr "" +"când este activ, valoarea de pe Grid_X\n" +"este copiata și in Grid_Y" + +#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1711 +msgid "Snap to corner" +msgstr "Lipire la colt" + +#: flatcamGUI/FlatCAMGUI.py:661 flatcamGUI/FlatCAMGUI.py:1715 +#: flatcamGUI/FlatCAMGUI.py:2787 +msgid "Max. magnet distance" +msgstr "Distanta magnetica maxima" + +#: flatcamGUI/FlatCAMGUI.py:675 flatcamGUI/FlatCAMGUI.py:1364 +msgid "Project" +msgstr "Proiect" + +#: flatcamGUI/FlatCAMGUI.py:684 +msgid "Selected" +msgstr "Selectat" + +#: flatcamGUI/FlatCAMGUI.py:691 +msgid "Tool" +msgstr "Unealta" + +#: flatcamGUI/FlatCAMGUI.py:703 flatcamGUI/FlatCAMGUI.py:711 +msgid "Plot Area" +msgstr "Arie Afișare" + +#: flatcamGUI/FlatCAMGUI.py:735 +msgid "General" +msgstr "General" + +#: flatcamGUI/FlatCAMGUI.py:744 +msgid "APP. DEFAULTS" +msgstr "Default for App" + +#: flatcamGUI/FlatCAMGUI.py:745 +msgid "PROJ. OPTIONS " +msgstr "Opțiuni Proiect" + +#: flatcamGUI/FlatCAMGUI.py:756 +msgid "GERBER" +msgstr "GERBER" + +#: flatcamGUI/FlatCAMGUI.py:765 +msgid "EXCELLON" +msgstr "EXCELLON" + +#: flatcamGUI/FlatCAMGUI.py:774 +msgid "GEOMETRY" +msgstr "GEOMETRIE" + +#: flatcamGUI/FlatCAMGUI.py:784 +msgid "CNC-JOB" +msgstr "CNCJob" + +#: flatcamGUI/FlatCAMGUI.py:793 +msgid "TOOLS" +msgstr "Unelte" + +#: flatcamGUI/FlatCAMGUI.py:810 +msgid "Import Preferences" +msgstr "Importa Preferințele" + +#: flatcamGUI/FlatCAMGUI.py:813 +msgid "" +"Import a full set of FlatCAM settings from a file\n" +"previously saved on HDD.\n" +"\n" +"FlatCAM automatically save a 'factory_defaults' file\n" +"on the first start. Do not delete that file." +msgstr "" +"Importa un set complet de setari ale FlatCAM dintr-un fişier\n" +"care a fost anterior salvat pe HDD..\n" +"\n" +"FlatCAM salvează automat un fişier numit 'factory_defaults'\n" +"la prima pornire. Nu sterge acel fişier." + +#: flatcamGUI/FlatCAMGUI.py:820 +msgid "Export Preferences" +msgstr "Exporta Preferințele" + +#: flatcamGUI/FlatCAMGUI.py:823 +msgid "" +"Export a full set of FlatCAM settings in a file\n" +"that is saved on HDD." +msgstr "" +"Exporta un set complet de setari ale FlatCAM\n" +"intr-un fişier care se salvează pe HDD." + +#: flatcamGUI/FlatCAMGUI.py:828 +msgid "Open Pref Folder" +msgstr "Deschide Pref Dir" + +#: flatcamGUI/FlatCAMGUI.py:831 +msgid "Open the folder where FlatCAM save the preferences files." +msgstr "Deschide directorul unde FlatCAM salvează fişierele cu setari." + +#: flatcamGUI/FlatCAMGUI.py:839 +msgid "Save Preferences" +msgstr "Salvează Pref" + +#: flatcamGUI/FlatCAMGUI.py:842 +msgid "" +"Save the current settings in the 'current_defaults' file\n" +"which is the file storing the working default preferences." +msgstr "" +"Salvează setarile curente in fişierul numit: 'current_defaults'\n" +"fişier care este cel unde se salvează preferințele cu care se va lucra." + +#: flatcamGUI/FlatCAMGUI.py:868 +msgid "" +"General Shortcut list
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
F3\n" +"  SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab " +"or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left " +"Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" +" \n" +" " +msgstr "" +"General Shortcut list
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
F3\n" +"  Afisează Lista de Shortcut-uri
  
1 Focus in Tab-ul Proiect
2 Focus in Tab-ul Selectat
3 Focus in Tab-ul Unelte
  
E Editează Obiectul (daca este selectat)\n" +"
G Grid On/Off
J Sari la Coordinate
L Excellon Nou
M Muta Obj
N Geometrie Noua
O Setează Originea
Q Schimba Unitatile
P Deschide Unealta de Proprietati
R Roteste cu 90 grade CW
S Comuta Shell (linia de comanda)
T Adaugă o Unealta (când focus-ul este in " +"Tab-ul Selectat pt Geo, sau in Unealta NCC sau unealta Paint)
V Mareste și potriveste
X Oglindeste pe axa X
Y Oglindeste pe axa Y
'=' Micsorează
'-' Mareste
  
CTRL+A Selectează Tot
CTRL+C Copiaza Obiect
CTRL+E Deschide fişier Excellon
CTRL+G Deschide fişier Gerber
CTRL+N Proiect Nou
CTRL+M Unealta de Masurare
CTRL+O Deschide Proiect
CTRL+S Salvează Proiect ca
CTRL+F10 Comuta Aria de Afișare
  
SHIFT+C Copiaza Nume Obiect
SHIFT+E Comuta Editor Cod
SHIFT+G Comuta Axele
SHIFT+P Deschide Preferințe
SHIFT+R Roteste cu 90 grade CCW
SHIFT+S Rulează un Script
SHIFT+W Comuta Spatiul de Lucru
SHIFT+X Deformează pe axa X
SHIFT+Y Deformează pe axa Y
  
ALT+C Unealta Calculatoare
ALT+D Unealta 2-Layer
ALT+K Unealta Dispensare Pasta Fludor
ALT+L Unealta Film PCB
ALT+N Unealta de curățare zone cupru
ALT+P Unealta Paint
ALT+R Unealta Transformari
ALT+S Vizualiz. Codul Sursa
ALT+U Unealta de Decupare
ALT+1 Activează toate Afisarile
ALT+2 Dezactivează toate afisarile/td>\n" +"
ALT+3 Dezactivează toate afisarile neselectate\n" +"
ALT+F10 Comuta Full Screen
  
F1 Deschide Manualul Online
F4 Deschide Tutoriale Online
Del Sterge Obiectul
Del Alternativ: Sterge Unealta
'`' (in stânga Tasta_1)Comuta Aria Notebook " +"(in stânga)
SPACE (Dez)Activează afișare obiect
Escape Deselectează toate obiectele
\n" +" \n" +" " + +#: flatcamGUI/FlatCAMGUI.py:1145 +msgid "" +"Editor Shortcut list
\n" +"
\n" +" GEOMETRY EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
\n" +"
\n" +"
\n" +" EXCELLON EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
\n" +" " +msgstr "" +"Editor Shortcut list
\n" +"
\n" +" EDITORUL DE GEOMETRII
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Desenează un Arc
B Unealta Bufer
C Copiaza o geometrie
E Unealta Intersecţie Poligoane
I Unealta Paint
J Sari la Locatie (x, y)
K Comuta lipire colt
M Muta forma geometrică
N Desenează un Poligon
O Desenează un Cerc
P Desenează o Cale
R Desenează un Patrulater
S Unealta Substractie Poligoane
T Unealta de adaugare Text
U Unealta de Uniune Poligoane
X Oglindeste forma geo pe axa X
Y Oglindeste forma geo pe axa Y
  
SHIFT+X Deformează forma geo pe axa X/td>\n" +"
SHIFT+Y Deformează forma geo pe axa Y
  
ALT+R Unealta de Trasformari din Editor
ALT+X Deplasează forma geo pe axa X
ALT+Y Deplasează forma geo pe axa Y
  
CTRL+M Unealta de Masurare
CTRL+S Salvează obiectul și iesi din Editor
CTRL+X Unealta de tăiere Poligoane
  
Space Roteste forma geometrică
ENTER Termina desenatul pentru anumite unelte\n" +"
ESC Renunta și intoarce-te la Select
Del Sterge forma geometrică
\n" +"
\n" +"
\n" +" EDITORUL EXCELLON
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Adaugă o arie de găuriri\n" +"
C Copiaza Găuriri
D Adaugă găurire
J Sari la Locatie (x, y)
M Muta Găuriri
R Redimensionează găuriri
T Adaugă o noua Unealta
  
Del Sterge Găuriri
Del Alternatic: Sterge Unelte
  
ESC Renunta și intoarce-te la Select
CTRL+S Salvează obiectul și iesi din Editor
\n" +" " + +#: flatcamGUI/FlatCAMGUI.py:1358 +msgid "Disable" +msgstr "Dezactivează" + +#: flatcamGUI/FlatCAMGUI.py:1360 +msgid "New" +msgstr "Nou" + +#: flatcamGUI/FlatCAMGUI.py:1361 +msgid "Geometry" +msgstr "Geometrie" + +#: flatcamGUI/FlatCAMGUI.py:1362 +msgid "Excellon" +msgstr "Excellon" + +#: flatcamGUI/FlatCAMGUI.py:1367 +msgid "Grids" +msgstr "Grid-uri" + +#: flatcamGUI/FlatCAMGUI.py:1369 +msgid "View" +msgstr "Vizualizare" + +#: flatcamGUI/FlatCAMGUI.py:1371 +msgid "Clear Plot" +msgstr "Sterge Afișare" + +#: flatcamGUI/FlatCAMGUI.py:1372 +msgid "Replot" +msgstr "Reafișare" + +#: flatcamGUI/FlatCAMGUI.py:1375 +msgid "Geo Editor" +msgstr "Editor Geometrii" + +#: flatcamGUI/FlatCAMGUI.py:1376 +msgid "Line" +msgstr "Linie" + +#: flatcamGUI/FlatCAMGUI.py:1377 +msgid "Rectangle" +msgstr "Patrulater" + +#: flatcamGUI/FlatCAMGUI.py:1378 flatcamGUI/FlatCAMGUI.py:4590 +#: flatcamGUI/ObjectUI.py:1431 +msgid "Cut" +msgstr "Tăiere" + +#: flatcamGUI/FlatCAMGUI.py:1380 flatcamGUI/FlatCAMGUI.py:1395 +#: flatcamTools/ToolMove.py:26 +msgid "Move" +msgstr "Mutare" + +#: flatcamGUI/FlatCAMGUI.py:1382 +msgid "Exc Editor" +msgstr "Editor EXC." + +#: flatcamGUI/FlatCAMGUI.py:1383 +msgid "Add Drill" +msgstr "Adaugă găurire" + +#: flatcamGUI/FlatCAMGUI.py:1385 +msgid "Copy Drill(s)" +msgstr "Copiaza Găurire" + +#: flatcamGUI/FlatCAMGUI.py:1391 +msgid "Save && Close Edit" +msgstr "Salvează && Inchide Edit" + +#: flatcamGUI/FlatCAMGUI.py:1416 +msgid "Print Preview" +msgstr "Preview tiparire" + +#: flatcamGUI/FlatCAMGUI.py:1417 +msgid "Print Code" +msgstr "Tipareste Cod" + +#: flatcamGUI/FlatCAMGUI.py:1418 +msgid "Find in Code" +msgstr "Cauta in Cod" + +#: flatcamGUI/FlatCAMGUI.py:1423 +msgid "Replace With" +msgstr "Inlocuieste cu" + +#: flatcamGUI/FlatCAMGUI.py:1427 flatcamGUI/FlatCAMGUI.py:4588 +#: flatcamGUI/FlatCAMGUI.py:5089 flatcamGUI/ObjectUI.py:1429 +msgid "All" +msgstr "Toate" + +#: flatcamGUI/FlatCAMGUI.py:1429 +msgid "" +"When checked it will replace all instances in the 'Find' box\n" +"with the text in the 'Replace' box.." +msgstr "" +"Când este bifat, va inlocui toate cuvintele gasite conform ce este in " +"'Cauta'\n" +"cu textul din casuta 'Inlocuieste'" + +#: flatcamGUI/FlatCAMGUI.py:1432 +msgid "Open Code" +msgstr "Deschide Cod" + +#: flatcamGUI/FlatCAMGUI.py:1433 +msgid "Save Code" +msgstr "Salvează Cod" + +#: flatcamGUI/FlatCAMGUI.py:1468 +msgid "" +"Relative neasurement.\n" +"Reference is last click position" +msgstr "" +"Masuratoare relativa.\n" +"Referința este poziţia ultimului click pe canvas." + +#: flatcamGUI/FlatCAMGUI.py:1474 +msgid "" +"Absolute neasurement.\n" +"Reference is (X=0, Y= 0) position" +msgstr "" +"Masuratoare absoluta.\n" +"Referința este originea (0, 0)." + +#: flatcamGUI/FlatCAMGUI.py:1641 +msgid "Add Drill Hole Array" +msgstr "Adaugă o arie de Găuriri" + +#: flatcamGUI/FlatCAMGUI.py:1653 +msgid "Select 'Esc'" +msgstr "Select" + +#: flatcamGUI/FlatCAMGUI.py:1678 +msgid "Copy Objects" +msgstr "Copiaza Obiecte" + +#: flatcamGUI/FlatCAMGUI.py:1680 +msgid "Delete Shape" +msgstr "Sterge forme geo" + +#: flatcamGUI/FlatCAMGUI.py:1685 +msgid "Move Objects" +msgstr "Muta Obiecte" + +#: flatcamGUI/FlatCAMGUI.py:2060 +msgid "" +"Please first select a geometry item to be cutted\n" +"then select the geometry item that will be cutted\n" +"out of the first item. In the end press ~X~ key or\n" +"the toolbar button." +msgstr "" +"Mai intai selectează o forma geometrică care trebuie taiata\n" +"apoi selectează forma geo. taietoare. La final apasa tasta ~X~ sau\n" +"butonul corespunzator din Toolbar." + +#: flatcamGUI/FlatCAMGUI.py:2067 flatcamGUI/FlatCAMGUI.py:2199 +#: flatcamGUI/FlatCAMGUI.py:2258 flatcamGUI/FlatCAMGUI.py:2278 +msgid "Warning" +msgstr "Atentie" + +#: flatcamGUI/FlatCAMGUI.py:2134 flatcamGUI/FlatCAMGUI.py:2328 +msgid "[WARNING_NOTCL]Cancelled." +msgstr "[WARNING_NOTCL] Anulat." + +#: flatcamGUI/FlatCAMGUI.py:2194 +msgid "" +"Please select geometry items \n" +"on which to perform Intersection Tool." +msgstr "" +"Selectează forma geometrică asupra careia să se\n" +"aplice Unealta Intersecţie." + +#: flatcamGUI/FlatCAMGUI.py:2253 +msgid "" +"Please select geometry items \n" +"on which to perform Substraction Tool." +msgstr "" +"Selectează forma geometrică asupra careia să se\n" +"aplice Unealta Substractie." + +#: flatcamGUI/FlatCAMGUI.py:2273 +msgid "" +"Please select geometry items \n" +"on which to perform union." +msgstr "" +"Selectează forma geometrică asupra careia să se\n" +"aplice Unealta Uniune." + +#: flatcamGUI/FlatCAMGUI.py:2345 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to delete." +msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru stergere." + +#: flatcamGUI/FlatCAMGUI.py:2412 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to copy." +msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru copiere." + +#: flatcamGUI/FlatCAMGUI.py:2458 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to move." +msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru mutare." + +#: flatcamGUI/FlatCAMGUI.py:2472 +msgid "New Tool ..." +msgstr "O noua Unealta ..." + +#: flatcamGUI/FlatCAMGUI.py:2473 +msgid "Enter a Tool Diameter:" +msgstr "Introdu un Diametru de Unealta:" + +#: flatcamGUI/FlatCAMGUI.py:2772 +msgid "Grid X value:" +msgstr "Valoarea Grid_X:" + +#: flatcamGUI/FlatCAMGUI.py:2774 +msgid "This is the Grid snap value on X axis." +msgstr "Aceasta este valoare pentru lipire pe Grid pe axa X." + +#: flatcamGUI/FlatCAMGUI.py:2779 +msgid "Grid Y value:" +msgstr "Valoarea Grid_Y:" + +#: flatcamGUI/FlatCAMGUI.py:2781 +msgid "This is the Grid snap value on Y axis." +msgstr "Aceasta este valoare pentru lipire pe Grid pe axa Y." + +#: flatcamGUI/FlatCAMGUI.py:2786 +msgid "Snap Max:" +msgstr "Lipire Max:" + +#: flatcamGUI/FlatCAMGUI.py:2791 +msgid "Workspace:" +msgstr "Spatiu de lucru:" + +#: flatcamGUI/FlatCAMGUI.py:2793 +msgid "" +"Draw a delimiting rectangle on canvas.\n" +"The purpose is to illustrate the limits for our work." +msgstr "" +"Desenează un patrulater care delimitează o asuprafata de lucru.\n" +"Scopul este de a ilustra limitele suprafetei noastre de lucru." + +#: flatcamGUI/FlatCAMGUI.py:2796 +msgid "Wk. format:" +msgstr "Format SL:" + +#: flatcamGUI/FlatCAMGUI.py:2798 +msgid "" +"Select the type of rectangle to be used on canvas,\n" +"as valid workspace." +msgstr "" +"Selectează tipul de patrulater care va fi desenat pe canvas,\n" +"pentru a delimita suprafata de lucru disponibila (SL)." + +#: flatcamGUI/FlatCAMGUI.py:2811 +msgid "Plot Fill:" +msgstr "Culoare Afișare:" + +#: flatcamGUI/FlatCAMGUI.py:2813 +msgid "" +"Set the fill color for plotted objects.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Setează culoarea pentru obiectele afisate.\n" +"Primii 6 digiti sunt culoarea efectiva și ultimii\n" +"doi sunt pentru nivelul de transparenţă (alfa)." + +#: flatcamGUI/FlatCAMGUI.py:2827 flatcamGUI/FlatCAMGUI.py:2877 +#: flatcamGUI/FlatCAMGUI.py:2927 +msgid "Alpha Level:" +msgstr "Nivel Alfa:" + +#: flatcamGUI/FlatCAMGUI.py:2829 +msgid "Set the fill transparency for plotted objects." +msgstr "Setează nivelul de transparenţa pentru obiectele afisate." + +#: flatcamGUI/FlatCAMGUI.py:2846 +msgid "Plot Line:" +msgstr "Culoare contur:" + +#: flatcamGUI/FlatCAMGUI.py:2848 +msgid "Set the line color for plotted objects." +msgstr "Setează culoarea conturului." + +#: flatcamGUI/FlatCAMGUI.py:2860 +msgid "Sel. Fill:" +msgstr "Culoare Selecţie:" + +#: flatcamGUI/FlatCAMGUI.py:2862 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from left to right.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Setează culoarea pentru forma de selectare in cazul\n" +"in care selectia se face de la stânga la dreapta.\n" +"Primii 6 digiti sunt culoarea efectiva și ultimii\n" +"doi sunt pentru nivelul de transparenţă (alfa)." + +#: flatcamGUI/FlatCAMGUI.py:2879 +msgid "Set the fill transparency for the 'left to right' selection box." +msgstr "" +"Setează transparenţa formei de selecţie când selectia\n" +"se face de la stânga la dreapta." + +#: flatcamGUI/FlatCAMGUI.py:2896 +msgid "Sel. Line:" +msgstr "Contur Selecţie:" + +#: flatcamGUI/FlatCAMGUI.py:2898 +msgid "Set the line color for the 'left to right' selection box." +msgstr "" +"Setează transparenţa conturului formei de selecţie\n" +"când selectia se face de la stânga la dreapta." + +#: flatcamGUI/FlatCAMGUI.py:2910 +msgid "Sel2. Fill:" +msgstr "Culoare Selecţie 2:" + +#: flatcamGUI/FlatCAMGUI.py:2912 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from right to left.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" +"Setează culoarea pentru forma de selectare in cazul\n" +"in care selectia se face de la dreapta la stânga.\n" +"Primii 6 digiti sunt culoarea efectiva și ultimii\n" +"doi sunt pentru nivelul de transparenţă (alfa)." + +#: flatcamGUI/FlatCAMGUI.py:2929 +msgid "Set the fill transparency for selection 'right to left' box." +msgstr "" +"Setează transparenţa formei de selecţie când selectia\n" +"se face de la dreapta la stânga." + +#: flatcamGUI/FlatCAMGUI.py:2946 +msgid "Sel2. Line:" +msgstr "Contur Selecţie 2:" + +#: flatcamGUI/FlatCAMGUI.py:2948 +msgid "Set the line color for the 'right to left' selection box." +msgstr "" +"Setează transparenţa conturului formei de selecţie\n" +"când selectia se face de la dreapta la stânga." + +#: flatcamGUI/FlatCAMGUI.py:2960 +msgid "Editor Draw:" +msgstr "Desen Editor:" + +#: flatcamGUI/FlatCAMGUI.py:2962 +msgid "Set the color for the shape." +msgstr "Setează culoarea pentru forma geometrică din Editor." + +#: flatcamGUI/FlatCAMGUI.py:2974 +msgid "Editor Draw Sel.:" +msgstr "Sel. Desen Editor:" + +#: flatcamGUI/FlatCAMGUI.py:2976 +msgid "Set the color of the shape when selected." +msgstr "" +"Setează culoarea formei geometrice in Editor\n" +"când se face o selecţie." + +#: flatcamGUI/FlatCAMGUI.py:3023 +msgid "GUI Settings" +msgstr "Setari GUI" + +#: flatcamGUI/FlatCAMGUI.py:3030 +msgid "Layout:" +msgstr "Amplasare:" + +#: flatcamGUI/FlatCAMGUI.py:3032 +msgid "" +"Select an layout for FlatCAM.\n" +"It is applied immediately." +msgstr "" +"Selectează un stil de amplasare a elementelor GUI in FlatCAM.\n" +"Se aplica imediat." + +#: flatcamGUI/FlatCAMGUI.py:3048 +msgid "Style:" +msgstr "Stil:" + +#: flatcamGUI/FlatCAMGUI.py:3050 +msgid "" +"Select an style for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" +"Selectează un stil pentru FlatCAM.\n" +"Se va aplica la urmatoarea pornire a aplicatiei." + +#: flatcamGUI/FlatCAMGUI.py:3061 +msgid "HDPI Support:" +msgstr "Suport H-DPI:" + +#: flatcamGUI/FlatCAMGUI.py:3063 +msgid "" +"Enable High DPI support for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" +"Activează capabilitatea de DPI cu valoare mare.\n" +"Util pentru monitoarele 4k.\n" +"Va fi aplicata la urmatorea pornire a aplicatiei." + +#: flatcamGUI/FlatCAMGUI.py:3076 +msgid "Clear GUI Settings:" +msgstr "Sterge setarile GUI:" + +#: flatcamGUI/FlatCAMGUI.py:3078 +msgid "" +"Clear the GUI settings for FlatCAM,\n" +"such as: layout, gui state, style, hdpi support etc." +msgstr "" +"Sterge setarile GUI pentru FlatCAM,\n" +"cum ar fi: amplasare, stare UI, suport HDPI sau traducerea." + +#: flatcamGUI/FlatCAMGUI.py:3081 +msgid "Clear" +msgstr "Sterge" + +#: flatcamGUI/FlatCAMGUI.py:3085 +msgid "Hover Shape:" +msgstr "Forma Hover:" + +#: flatcamGUI/FlatCAMGUI.py:3087 +msgid "" +"Enable display of a hover shape for FlatCAM objects.\n" +"It is displayed whenever the mouse cursor is hovering\n" +"over any kind of not-selected object." +msgstr "" +"Activează o forma când se tine mouse-ul deasupra unui obiect\n" +"in canvas-ul FlatCAM. Forma este afișată doar daca obiectul \n" +"nu este selectat." + +#: flatcamGUI/FlatCAMGUI.py:3128 +msgid "Are you sure you want to delete the GUI Settings? \n" +msgstr "Esti sigur că dorești să stergi setarile GUI?\n" + +#: flatcamGUI/FlatCAMGUI.py:3131 +msgid "Clear GUI Settings" +msgstr "Sterge Setarile GUI" + +#: flatcamGUI/FlatCAMGUI.py:3144 +msgid "[success] GUI settings deleted ..." +msgstr "[success] Setarile GUI au fost sterse ..." + +#: flatcamGUI/FlatCAMGUI.py:3151 +msgid "App Preferences" +msgstr "Preferințele Aplicatie" + +#: flatcamGUI/FlatCAMGUI.py:3157 +msgid "Units:" +msgstr "Unitati:" + +#: flatcamGUI/FlatCAMGUI.py:3158 +msgid "" +"The default value for FlatCAM units.\n" +"Whatever is selected here is set every time\n" +"FLatCAM is started." +msgstr "" +"Unitatea de masura pt FlatCAM.\n" +"Este setata la fiecare pornire a programului." + +#: flatcamGUI/FlatCAMGUI.py:3165 +msgid "APP. LEVEL:" +msgstr "Nivel aplic.:" + +#: flatcamGUI/FlatCAMGUI.py:3166 +msgid "" +"Choose the default level of usage for FlatCAM.\n" +"BASIC level -> reduced functionality, best for beginner's.\n" +"ADVANCED level -> full functionality.\n" +"\n" +"The choice here will influence the parameters in\n" +"the Selected Tab for all kinds of FlatCAM objects." +msgstr "" +"Nivelul default de utilizare pt FlatCAM.\n" +"Nivel BAZA -> functionalitate simplificata, potrivit pt incepatori\n" +"Nivel AVANSAT -> functionalitate completa.\n" +"\n" +"Alegerea efectuata aici va influenta ce aparamtri sunt disponibili\n" +"in Tab-ul SELECTAT dar și in alte parti ale FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:3171 flatcamGUI/FlatCAMGUI.py:3775 +msgid "Basic" +msgstr "Baza" + +#: flatcamGUI/FlatCAMGUI.py:3172 +msgid "Advanced" +msgstr "Avansat" + +#: flatcamGUI/FlatCAMGUI.py:3175 +msgid "Languages:" +msgstr "Traduceri:" + +#: flatcamGUI/FlatCAMGUI.py:3176 +msgid "Set the language used throughout FlatCAM." +msgstr "Setează limba folosita pentru textele din FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:3179 +msgid "Apply Language" +msgstr "Aplica Traducere" + +#: flatcamGUI/FlatCAMGUI.py:3182 +msgid "Shell at StartUp:" +msgstr "Shell la pornire:" + +#: flatcamGUI/FlatCAMGUI.py:3184 flatcamGUI/FlatCAMGUI.py:3189 +msgid "" +"Check this box if you want the shell to\n" +"start automatically at startup." +msgstr "" +"Bifează in cazul in care se doreste pornirea\n" +"automata a ferestrei Shell (linia de comanda)\n" +"la initializarea aplicatiei." + +#: flatcamGUI/FlatCAMGUI.py:3194 +msgid "Version Check:" +msgstr "Verificare versiune:" + +#: flatcamGUI/FlatCAMGUI.py:3196 flatcamGUI/FlatCAMGUI.py:3201 +msgid "" +"Check this box if you want to check\n" +"for a new version automatically at startup." +msgstr "" +"Bifează daca se doreste verificarea automata\n" +"daca exista o versiune mai noua,\n" +"la pornirea aplicatiei." + +#: flatcamGUI/FlatCAMGUI.py:3206 +msgid "Send Stats:" +msgstr "Statistici:" + +#: flatcamGUI/FlatCAMGUI.py:3208 flatcamGUI/FlatCAMGUI.py:3213 +msgid "" +"Check this box if you agree to send anonymous\n" +"stats automatically at startup, to help improve FlatCAM." +msgstr "" +"Bifează daca esti de acord ca aplicaţia să trimita la pornire\n" +"un set de informatii cu privire la modul in care folosești\n" +"aplicaţia. In acest fel dezvoltatorii vor sti unde să se focalizeze\n" +"in crearea de inbunatatiri." + +#: flatcamGUI/FlatCAMGUI.py:3220 +msgid "Pan Button:" +msgstr "Buton Pan (miscare):" + +#: flatcamGUI/FlatCAMGUI.py:3221 +msgid "" +"Select the mouse button to use for panning:\n" +"- MMB --> Middle Mouse Button\n" +"- RMB --> Right Mouse Button" +msgstr "" +"Selectează butonul folosit pentru 'miscare':\n" +"- MMB - butonul din mijloc al mouse-ului\n" +"- RMB - butonul in dreapta al mouse-ului." + +#: flatcamGUI/FlatCAMGUI.py:3224 +msgid "MMB" +msgstr "MMB" + +#: flatcamGUI/FlatCAMGUI.py:3225 +msgid "RMB" +msgstr "RMB" + +#: flatcamGUI/FlatCAMGUI.py:3228 +msgid "Multiple Sel:" +msgstr "Sel. multipla:" + +#: flatcamGUI/FlatCAMGUI.py:3229 +msgid "Select the key used for multiple selection." +msgstr "Selectează tasta folosita pentru selectia multipla." + +#: flatcamGUI/FlatCAMGUI.py:3230 +msgid "CTRL" +msgstr "CTRL" + +#: flatcamGUI/FlatCAMGUI.py:3231 +msgid "SHIFT" +msgstr "SHIFT" + +#: flatcamGUI/FlatCAMGUI.py:3234 +msgid "Project at StartUp:" +msgstr "Proiect la pornire:" + +#: flatcamGUI/FlatCAMGUI.py:3236 flatcamGUI/FlatCAMGUI.py:3241 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"to be shown automatically at startup." +msgstr "" +"Bifează aici daca dorești ca zona Notebook să fie\n" +"afișată automat la pornire." + +#: flatcamGUI/FlatCAMGUI.py:3246 +msgid "Project AutoHide:" +msgstr "Ascundere Proiect:" + +#: flatcamGUI/FlatCAMGUI.py:3248 flatcamGUI/FlatCAMGUI.py:3254 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"hide automatically when there are no objects loaded and\n" +"to show whenever a new object is created." +msgstr "" +"Bifează daca dorești ca zona Notebook să fie ascunsă automat\n" +"când nu sunt obiecte incarcate și să fie afișată automat\n" +"când un obiect nou este creat/incarcat." + +#: flatcamGUI/FlatCAMGUI.py:3260 +msgid "Enable ToolTips:" +msgstr "Activează ToolTip-uri:" + +#: flatcamGUI/FlatCAMGUI.py:3262 flatcamGUI/FlatCAMGUI.py:3267 +msgid "" +"Check this box if you want to have toolTips displayed\n" +"when hovering with mouse over items throughout the App." +msgstr "" +"Bifează daca dorești ca să fie afisate texte explicative când se\n" +"tine mouse-ul deasupra diverselor texte din FlatCAM." + +#: flatcamGUI/FlatCAMGUI.py:3301 +msgid "Save Compressed Project" +msgstr "Salvează Proiectul comprimat" + +#: flatcamGUI/FlatCAMGUI.py:3303 +msgid "" +"Whether to save a compressed or uncompressed project.\n" +"When checked it will save a compressed FlatCAM project." +msgstr "" +"Daca să se salveze proiectul in mod arhivat.\n" +"Când este bifat aici, se va salva o arhiva a proiectului\n" +"lucru care poate reduce dimensiunea semnificativ." + +#: flatcamGUI/FlatCAMGUI.py:3314 +msgid "Compression Level:" +msgstr "Nivel compresie:" + +#: flatcamGUI/FlatCAMGUI.py:3316 +msgid "" +"The level of compression used when saving\n" +"a FlatCAM project. Higher value means better compression\n" +"but require more RAM usage and more processing time." +msgstr "" +"Nivelul de compresie folosit când se salvează un proiect FlatCAM.\n" +"Valorile posibile sunt [0 ... 9]. Valoarea 0 inseamna compresie minimala\n" +"dar cu consum redus de resurse in timp ce valoarea 9 cere multa memorie RAM\n" +"și in plus, durează semnificativ mai mult." + +#: flatcamGUI/FlatCAMGUI.py:3342 flatcamGUI/FlatCAMGUI.py:3583 +#: flatcamGUI/FlatCAMGUI.py:4238 flatcamGUI/FlatCAMGUI.py:4562 +#: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:576 +#: flatcamGUI/ObjectUI.py:901 flatcamGUI/ObjectUI.py:1415 +msgid "Plot Options:" +msgstr "Opțiuni afișare:" + +#: flatcamGUI/FlatCAMGUI.py:3349 flatcamGUI/FlatCAMGUI.py:3595 +#: flatcamGUI/ObjectUI.py:577 +msgid "Solid" +msgstr "Solid" + +#: flatcamGUI/FlatCAMGUI.py:3351 flatcamGUI/ObjectUI.py:158 +msgid "Solid color polygons." +msgstr "Poligoane color solide." + +#: flatcamGUI/FlatCAMGUI.py:3356 +msgid "M-Color" +msgstr "M-Color" + +#: flatcamGUI/FlatCAMGUI.py:3358 flatcamGUI/ObjectUI.py:166 +msgid "Draw polygons in different colors." +msgstr "" +"Desenează poligoanele Gerber din multiple culori\n" +"alese in mod aleator." + +#: flatcamGUI/FlatCAMGUI.py:3363 flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:4242 flatcamGUI/ObjectUI.py:172 +msgid "Plot" +msgstr "Afisează" + +#: flatcamGUI/FlatCAMGUI.py:3365 flatcamGUI/FlatCAMGUI.py:4244 +#: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:617 +#: flatcamGUI/ObjectUI.py:947 flatcamGUI/ObjectUI.py:1502 +msgid "Plot (show) this object." +msgstr "Afisează (arata) acest obiect." + +#: flatcamGUI/FlatCAMGUI.py:3370 flatcamGUI/FlatCAMGUI.py:4251 +#: flatcamGUI/FlatCAMGUI.py:4598 +msgid "Circle Steps:" +msgstr "Aprox. Cerc" + +#: flatcamGUI/FlatCAMGUI.py:3372 +msgid "" +"The number of circle steps for Gerber \n" +"circular aperture linear approximation." +msgstr "" +"Numărul de segmente utilizate pentru\n" +"aproximarea lineara a aperturilor Gerber circulare." + +#: flatcamGUI/FlatCAMGUI.py:3387 +msgid "Gerber Options" +msgstr "Opțiuni Gerber" + +#: flatcamGUI/FlatCAMGUI.py:3391 flatcamGUI/ObjectUI.py:322 +msgid "Isolation Routing:" +msgstr "Izolare:" + +#: flatcamGUI/FlatCAMGUI.py:3393 flatcamGUI/ObjectUI.py:324 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut outside polygons." +msgstr "" +"Crează un obiect tip Geometrie cu trasee\n" +"care să fie taiate in afara poligoanelor,\n" +"urmarindu-le conturul." + +#: flatcamGUI/FlatCAMGUI.py:3404 flatcamGUI/FlatCAMGUI.py:3961 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:856 +#: flatcamGUI/ObjectUI.py:872 +msgid "Diameter of the cutting tool." +msgstr "Diametrul uneltei taietoare." + +#: flatcamGUI/FlatCAMGUI.py:3411 +msgid "Width (# passes):" +msgstr "Latime(# treceri):" + +#: flatcamGUI/FlatCAMGUI.py:3413 flatcamGUI/ObjectUI.py:346 +msgid "" +"Width of the isolation gap in\n" +"number (integer) of tool widths." +msgstr "" +"Lăţimea spatiului de izolare\n" +"in număr intreg de grosimi ale uneltei." + +#: flatcamGUI/FlatCAMGUI.py:3421 flatcamGUI/ObjectUI.py:354 +msgid "Pass overlap:" +msgstr "Suprapunere:" + +#: flatcamGUI/FlatCAMGUI.py:3423 flatcamGUI/ObjectUI.py:356 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means an overlap of 25%% from the tool diameter found " +"above." +msgstr "" +"Cat de mult (in fractii ale diametrului uneltei) să se suprapună trecerea " +"curentă\n" +"peste cea anterioară. \n" +"Exemplu:\n" +"O valoare de 0.25 reprezinta o suprapunere de 25%% din diametrul uneltei." + +#: flatcamGUI/FlatCAMGUI.py:3431 flatcamGUI/ObjectUI.py:366 +msgid "Milling Type:" +msgstr "Tip Frezare:" + +#: flatcamGUI/FlatCAMGUI.py:3433 flatcamGUI/ObjectUI.py:368 +msgid "" +"Milling type:\n" +"- climb / best for precision milling and to reduce tool usage\n" +"- conventional / useful when there is no backlash compensation" +msgstr "" +"Tipul de frezare:\n" +"- urcare -> potrivit pentru frezare de precizie și pt a reduce uzura " +"uneltei\n" +"- conventional -> pentru cazul când nu exista o compensare a 'backlash-ului'" + +#: flatcamGUI/FlatCAMGUI.py:3438 flatcamGUI/ObjectUI.py:373 +msgid "Climb" +msgstr "Urcare" + +#: flatcamGUI/FlatCAMGUI.py:3439 flatcamGUI/ObjectUI.py:374 +msgid "Conv." +msgstr "Conv." + +#: flatcamGUI/FlatCAMGUI.py:3443 +msgid "Combine Passes" +msgstr "Combina" + +#: flatcamGUI/FlatCAMGUI.py:3445 flatcamGUI/ObjectUI.py:380 +msgid "Combine all passes into one object" +msgstr "Combina toate trecerile intr-un singur obiect" + +#: flatcamGUI/FlatCAMGUI.py:3450 +msgid "Clear non-copper:" +msgstr "Curăță non-Cu:" + +#: flatcamGUI/FlatCAMGUI.py:3452 flatcamGUI/FlatCAMGUI.py:4774 +#: flatcamGUI/ObjectUI.py:457 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut all non-copper regions." +msgstr "" +"Crează un obiect tip Geometrie cu traiectorii unealta\n" +"care să curete de cupru toate zonele unde se doreste să nu \n" +"fie cupru." + +#: flatcamGUI/FlatCAMGUI.py:3461 flatcamGUI/FlatCAMGUI.py:3487 +#: flatcamGUI/ObjectUI.py:501 flatcamGUI/ObjectUI.py:535 +msgid "Boundary Margin:" +msgstr "Margine:" + +#: flatcamGUI/FlatCAMGUI.py:3463 flatcamGUI/ObjectUI.py:503 +msgid "" +"Specify the edge of the PCB\n" +"by drawing a box around all\n" +"objects with this minimum\n" +"distance." +msgstr "" +"Specificati marginea PCB-ului prin desenarea\n" +"unei forme patratice de jur imprejurul la toate obiectele\n" +"la o distanta minima cu valoarea din acest câmp." + +#: flatcamGUI/FlatCAMGUI.py:3473 flatcamGUI/FlatCAMGUI.py:3496 +msgid "Rounded corners" +msgstr "C. rotunjite" + +#: flatcamGUI/FlatCAMGUI.py:3475 +msgid "" +"Creates a Geometry objects with polygons\n" +"covering the copper-free areas of the PCB." +msgstr "" +"Crează un obiect tip Geometrie conținând poligoane\n" +"care acopera toate suprafetele libere de cupru ale PCB-ului." + +#: flatcamGUI/FlatCAMGUI.py:3481 flatcamGUI/ObjectUI.py:525 +msgid "Bounding Box:" +msgstr "Forma înconjurătoare::" + +#: flatcamGUI/FlatCAMGUI.py:3489 flatcamGUI/ObjectUI.py:537 +msgid "" +"Distance of the edges of the box\n" +"to the nearest polygon." +msgstr "" +"Distanta de la marginile formei înconjurătoare\n" +"pana la cel mai apropiat poligon." + +#: flatcamGUI/FlatCAMGUI.py:3498 flatcamGUI/ObjectUI.py:547 +msgid "" +"If the bounding box is \n" +"to have rounded corners\n" +"their radius is equal to\n" +"the margin." +msgstr "" +"Daca forma înconjurătoare să aibă colțuri rotunjite.\n" +"Raza acesor colțuri va fi egală cu parametrul Margine." + +#: flatcamGUI/FlatCAMGUI.py:3512 +msgid "Gerber Adv. Options" +msgstr "Opțiuni Av. Gerber" + +#: flatcamGUI/FlatCAMGUI.py:3516 +msgid "Advanced Param.:" +msgstr "Param. avansati.:" + +#: flatcamGUI/FlatCAMGUI.py:3518 +msgid "" +"A list of Gerber advanced parameters.\n" +"Those parameters are available only for\n" +"Advanced App. Level." +msgstr "" +"O lista de parametri Gerber avansati.\n" +"Acesti parametri sunt disponibili doar\n" +"când este selectat Nivelul Avansat pentru\n" +"aplicatie in Preferințe - > General" + +#: flatcamGUI/FlatCAMGUI.py:3528 flatcamGUI/ObjectUI.py:385 +msgid "\"Follow\"" +msgstr "\"Urmareste\"" + +#: flatcamGUI/FlatCAMGUI.py:3530 flatcamGUI/ObjectUI.py:387 +msgid "" +"Generate a 'Follow' geometry.\n" +"This means that it will cut through\n" +"the middle of the trace." +msgstr "" +"Generează o geometrie de tip 'urmaritor'.\n" +"Mai exact, in loc să se genereze un poligon se va genera o 'linie'.\n" +"In acest fel se taie prin mijlocul unui traseu și nu in jurul lui." + +#: flatcamGUI/FlatCAMGUI.py:3538 +msgid "Table Show/Hide" +msgstr "Arata/Ascunde Tabela" + +#: flatcamGUI/FlatCAMGUI.py:3540 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"Also, on hide, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"Comuta afișarea tabelei de aperturi Gerber.\n" +"când se ascunde aceasta, se vor sterge și toate\n" +"posibil afisatele marcaje ale aperturilor." + +#: flatcamGUI/FlatCAMGUI.py:3548 +msgid "Ap. Scale Factor:" +msgstr "Factor scalare ap.:" + +#: flatcamGUI/FlatCAMGUI.py:3550 flatcamGUI/ObjectUI.py:254 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" +"Schimba dimensiunea aperturilor selectate.\n" +"Factor cu care se multiplica geometriile\n" +"acestui obiect." + +#: flatcamGUI/FlatCAMGUI.py:3560 +msgid "Ap. Buffer Factor:" +msgstr "Factor bufer ap.:" + +#: flatcamGUI/FlatCAMGUI.py:3562 flatcamGUI/ObjectUI.py:275 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to expand/shrink\n" +"geometric features of this object." +msgstr "" +"Schimba dimensiunea aperturilor selectate.\n" +"Valoare cu care se mareste/micsorează\n" +"geometriile acestui obiect." + +#: flatcamGUI/FlatCAMGUI.py:3580 +msgid "Excellon General" +msgstr "Excellon General" + +#: flatcamGUI/FlatCAMGUI.py:3602 +msgid "Excellon Format:" +msgstr "Formatul Excellon" + +#: flatcamGUI/FlatCAMGUI.py:3604 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period.\n" +"\n" +"Possible presets:\n" +"\n" +"PROTEUS 3:3 MM LZ\n" +"DipTrace 5:2 MM TZ\n" +"DipTrace 4:3 MM LZ\n" +"\n" +"EAGLE 3:3 MM TZ\n" +"EAGLE 4:3 MM TZ\n" +"EAGLE 2:5 INCH TZ\n" +"EAGLE 3:5 INCH TZ\n" +"\n" +"ALTIUM 2:4 INCH LZ\n" +"Sprint Layout 2:4 INCH LZ\n" +"KiCAD 3:5 INCH TZ" +msgstr "" +"Fişierele de găurire NC drills numite generic Excellon\n" +"sunt fişiere care nu respecta clar un format.\n" +"Fiecare companie și-a aplicat propria viziune asa incat\n" +"s-a ajuns că nu se poate face o recunoastere automata\n" +"a formatului Excellon in fiecare caz.\n" +"Aici putem seta manual ce format ne asteptam să gasim,\n" +"când coordonatele nu sunt reprezentate cu\n" +"separator zecimal.\n" +"\n" +"Setari posibilie:\n" +"\n" +"PROTEUS 3:3 MM LZ\n" +"DipTrace 5:2 MM TZ\n" +"DipTrace 4:3 MM LZ\n" +"\n" +"EAGLE 3:3 MM TZ\n" +"EAGLE 4:3 MM TZ\n" +"EAGLE 2:5 INCH TZ\n" +"EAGLE 3:5 INCH TZ\n" +"\n" +"ALTIUM 2:4 INCH LZ\n" +"Sprint Layout 2:4 INCH LZ\n" +"KiCAD 3:5 INCH TZ" + +#: flatcamGUI/FlatCAMGUI.py:3629 +msgid "INCH:" +msgstr "Inch" + +#: flatcamGUI/FlatCAMGUI.py:3632 +msgid "Default values for INCH are 2:4" +msgstr "" +"Valorile default pentru Inch sunt 2:4\n" +"adica 2 parti intregi și 4 zecimale." + +#: flatcamGUI/FlatCAMGUI.py:3640 flatcamGUI/FlatCAMGUI.py:3673 +#: flatcamGUI/FlatCAMGUI.py:4150 +msgid "" +"This numbers signify the number of digits in\n" +"the whole part of Excellon coordinates." +msgstr "" +"Acest număr reprezinta numărul de digiti din partea\n" +"intreaga a coordonatelor Excellon." + +#: flatcamGUI/FlatCAMGUI.py:3654 flatcamGUI/FlatCAMGUI.py:3687 +#: flatcamGUI/FlatCAMGUI.py:4164 +msgid "" +"This numbers signify the number of digits in\n" +"the decimal part of Excellon coordinates." +msgstr "" +"Acest număr reprezinta numărul de digiti din partea\n" +"zecimala a coordonatelor Excellon." + +#: flatcamGUI/FlatCAMGUI.py:3662 +msgid "METRIC:" +msgstr "Metric" + +#: flatcamGUI/FlatCAMGUI.py:3665 +msgid "Default values for METRIC are 3:3" +msgstr "" +"Valorile default pentru Metric sunt 3:3\n" +"adica 3 parti intregi și 3 zecimale." + +#: flatcamGUI/FlatCAMGUI.py:3696 +msgid "Default Zeros:" +msgstr "Suprimare Zero:" + +#: flatcamGUI/FlatCAMGUI.py:3699 flatcamGUI/FlatCAMGUI.py:4199 +msgid "" +"This sets the type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"Aici se setează tipul de suprimare a zerourilor,\n" +"in cazul unui fişier Excellon.\n" +"LZ = zerourile din fata numărului sunt pastrate și\n" +"cele de la final sunt indepartate.\n" +"TZ = zerourile din fata numărului sunt indepartate și\n" +"cele de la final sunt pastrate.\n" +"(Invers fata de fişierele Gerber)." + +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:4206 +msgid "LZ" +msgstr "LZ" + +#: flatcamGUI/FlatCAMGUI.py:3708 flatcamGUI/FlatCAMGUI.py:4207 +msgid "TZ" +msgstr "TZ" + +#: flatcamGUI/FlatCAMGUI.py:3710 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"Aici se setează tipul de suprimare a zerourilor,\n" +"in cazul unui fişier Excellon.\n" +"Daca nu se poate face detectia automata la parsarea\n" +"fişierului Excellon, se folosesc aceste valori.\n" +"LZ = zerourile din fata numărului sunt pastrate și\n" +"cele de la final sunt indepartate.\n" +"TZ = zerourile din fata numărului sunt indepartate și\n" +"cele de la final sunt pastrate.\n" +"(Invers fata de fişierele Gerber)." + +#: flatcamGUI/FlatCAMGUI.py:3724 +msgid "Default Units:" +msgstr "Unitati Excellon:" + +#: flatcamGUI/FlatCAMGUI.py:3727 +msgid "" +"This sets the default units of Excellon files.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" +"Aceasta valoare este valoarea la care se recurge\n" +"in cazul in care nu se poate determina automat\n" +"atunci când se face parsarea fişierlui Excellon.\n" +"Unele fişiere de găurire (Excellon) nu au header\n" +"(unde se gasesc unitatile) și atunci se va folosi\n" +"aceasta valoare." + +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:4126 +msgid "INCH" +msgstr "Inch" + +#: flatcamGUI/FlatCAMGUI.py:3736 flatcamGUI/FlatCAMGUI.py:4127 +msgid "MM" +msgstr "MM" + +#: flatcamGUI/FlatCAMGUI.py:3738 +msgid "" +"This sets the units of Excellon files.\n" +"Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" +"Aceasta valoare este valoarea la care se recurge\n" +"in cazul in care nu se poate determina automat\n" +"atunci când se face parsarea fişierlui Excellon.\n" +"Unele fişiere de găurire (Excellon) nu au header\n" +"(unde se gasesc unitatile) și atunci se va folosi\n" +"aceasta valoare." + +#: flatcamGUI/FlatCAMGUI.py:3754 +msgid "Excellon Optimization:" +msgstr "Optimizarea traseului Excellon:" + +#: flatcamGUI/FlatCAMGUI.py:3761 +msgid "Algorithm: " +msgstr "Algoritm:" + +#: flatcamGUI/FlatCAMGUI.py:3764 flatcamGUI/FlatCAMGUI.py:3777 +msgid "" +"This sets the optimization type for the Excellon drill path.\n" +"If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" +"Guided Local Path is used. Default search time is 3sec.\n" +"Use set_sys excellon_search_time value Tcl Command to set other values.\n" +"If Basic is checked then Google OR-Tools Basic algorithm is used.\n" +"\n" +"If DISABLED, then FlatCAM works in 32bit mode and it uses \n" +"Travelling Salesman algorithm for path optimization." +msgstr "" +"Se setează tipul de optimizare pentru traiectoria parcursa între\n" +"găurile fişierului Excellon. Avand in vedere posibilul număr mare de găuri,\n" +"folosirea unei optimizari adecvate poate aduce un castig important in " +"viteza\n" +"de procesare CNC.\n" +"MH = algoritm Google OR Tools cu optimiz. ghidata local meta-heuristic.\n" +"Durata default pentru optimizare este de 3 secunde.\n" +"Basic = algoritm Google OR Tools cu optimiz. de baza.\n" +"\n" +"Daca ambele sunt dezactivate atunci rulam varainta de FlatCAM pe 32bit\n" +"care nu este compatibila cu pachetul OR Tools și in acest caz se foloseşte\n" +"algoritmul default: Travelling Salesman (vanzatorul ambulant)." + +#: flatcamGUI/FlatCAMGUI.py:3774 +msgid "MH" +msgstr "MH" + +#: flatcamGUI/FlatCAMGUI.py:3789 +msgid "Optimization Time: " +msgstr "Durata optimiz.:" + +#: flatcamGUI/FlatCAMGUI.py:3792 +msgid "" +"When OR-Tools Metaheuristic (MH) is enabled there is a\n" +"maximum threshold for how much time is spent doing the\n" +"path optimization. This max duration is set here.\n" +"In seconds." +msgstr "" +"Când se foloseşte optimziarea MH, aceasta valoare\n" +"reprezinta cat timp se sta pentru fiecare element in\n" +"incercarea de a afla calea optima." + +#: flatcamGUI/FlatCAMGUI.py:3833 +msgid "Excellon Options" +msgstr "Opțiuni Excellon" + +#: flatcamGUI/FlatCAMGUI.py:3836 flatcamGUI/ObjectUI.py:655 +msgid "Create CNC Job" +msgstr "Crează CNCJob" + +#: flatcamGUI/FlatCAMGUI.py:3838 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object." +msgstr "" +"Parametrii folositi pentru a crea un obiect FlatCAM tip CNCJob\n" +"din acest obiect Excellon." + +#: flatcamGUI/FlatCAMGUI.py:3846 flatcamGUI/FlatCAMGUI.py:4302 +#: flatcamGUI/FlatCAMGUI.py:5301 flatcamGUI/ObjectUI.py:666 +#: flatcamGUI/ObjectUI.py:1130 flatcamTools/ToolCalculators.py:108 +msgid "Cut Z:" +msgstr "Z tăiere:" + +#: flatcamGUI/FlatCAMGUI.py:3848 flatcamGUI/ObjectUI.py:668 +msgid "" +"Drill depth (negative)\n" +"below the copper surface." +msgstr "" +"Adâncimea de tăiere (valoare negativă).\n" +"Daca se foloseşte o val. pozitivă, aplicaţia\n" +"va incerca in mod automat să schimbe semnul." + +#: flatcamGUI/FlatCAMGUI.py:3855 flatcamGUI/FlatCAMGUI.py:4335 +#: flatcamGUI/ObjectUI.py:676 flatcamGUI/ObjectUI.py:1166 +msgid "Travel Z:" +msgstr "Z Deplasare:" + +#: flatcamGUI/FlatCAMGUI.py:3857 flatcamGUI/ObjectUI.py:678 +msgid "" +"Tool height when travelling\n" +"across the XY plane." +msgstr "" +"Înălţimea la care unealta se deplasează\n" +"in planul X-Y, fără a efectua taieri, adica\n" +"in afara materialului." + +#: flatcamGUI/FlatCAMGUI.py:3865 flatcamGUI/FlatCAMGUI.py:4345 +msgid "Tool change:" +msgstr "Schimbare unealta:" + +#: flatcamGUI/FlatCAMGUI.py:3867 flatcamGUI/FlatCAMGUI.py:4347 +#: flatcamGUI/ObjectUI.py:688 +msgid "" +"Include tool-change sequence\n" +"in G-Code (Pause for tool change)." +msgstr "" +"Include o secventa de schimbare unealta\n" +"in codul G-Code (pauza pentru schimbare unealta).\n" +"De obicei este folosita comanda G-Code M6." + +#: flatcamGUI/FlatCAMGUI.py:3874 flatcamGUI/FlatCAMGUI.py:4355 +msgid "Toolchange Z:" +msgstr "Z schimb. unealta:" + +#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/FlatCAMGUI.py:4357 +msgid "Toolchange Z position." +msgstr "" +"Înălţimea la care se efectuează schimbarea uneltei.\n" +"Poate reprezenta Înălţimea unde se gaseste un\n" +"'toolchanger' automat sau acolo unde utilizatorul\n" +"schimba unealta manual." + +#: flatcamGUI/FlatCAMGUI.py:3882 +msgid "Feedrate:" +msgstr "Feedrate:" + +#: flatcamGUI/FlatCAMGUI.py:3884 +msgid "" +"Tool speed while drilling\n" +"(in units per minute)." +msgstr "" +"Viteza cu care se misca unealta (burghiul) când se fac\n" +"operatii de găurire. In unitati pe minut." + +#: flatcamGUI/FlatCAMGUI.py:3892 +msgid "Spindle Speed:" +msgstr "Viteza Motor:" + +#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/FlatCAMGUI.py:4387 +#: flatcamGUI/ObjectUI.py:752 +msgid "" +"Speed of the spindle\n" +"in RPM (optional)" +msgstr "" +"Viteza cu care se roteste motorul ('Spindle').\n" +"In RPM (rotatii pe minut).\n" +"Acest parametru este optional și se poate lasa gol\n" +"daca nu se foloseşte." + +#: flatcamGUI/FlatCAMGUI.py:3902 flatcamGUI/FlatCAMGUI.py:4395 +#: flatcamGUI/ObjectUI.py:760 flatcamGUI/ObjectUI.py:1289 +msgid "Dwell:" +msgstr "Pauza:" + +#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/ObjectUI.py:762 flatcamGUI/ObjectUI.py:1292 +msgid "" +"Pause to allow the spindle to reach its\n" +"speed before cutting." +msgstr "" +"O pauza care permite motorului să ajunga la turatia specificata,\n" +"inainte de a incepe miscarea spre poziţia de tăiere (găurire)." + +#: flatcamGUI/FlatCAMGUI.py:3907 flatcamGUI/FlatCAMGUI.py:4400 +msgid "Duration:" +msgstr "Durata:" + +#: flatcamGUI/FlatCAMGUI.py:3909 flatcamGUI/FlatCAMGUI.py:4402 +#: flatcamGUI/ObjectUI.py:767 flatcamGUI/ObjectUI.py:1299 +msgid "Number of milliseconds for spindle to dwell." +msgstr "Timpul (ori secunde ori milisec) cat se sta in pauza." + +#: flatcamGUI/FlatCAMGUI.py:3921 flatcamGUI/FlatCAMGUI.py:4412 +#: flatcamGUI/ObjectUI.py:775 +msgid "Postprocessor:" +msgstr "Postprocesor:" + +#: flatcamGUI/FlatCAMGUI.py:3923 +msgid "" +"The postprocessor file that dictates\n" +"gcode output." +msgstr "" +"Un fişier care prelucrează codul G-Code astfel incat să\n" +"respecte un anumit format care să fie inteles de diverse\n" +"utilaje. Este responsabil de 'personalizarea' G-Code." + +#: flatcamGUI/FlatCAMGUI.py:3933 +msgid "Gcode: " +msgstr "G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:3935 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to drills." +msgstr "" +"Alege ce anume să fie folot ca sursa pentru generarea de GCode:\n" +"- Găuri\n" +"- Sloturi\n" +"- Ambele.\n" +"Când se alege Sloturi sau Ambele, sloturile vor fi convertite in serii de " +"găuri." + +#: flatcamGUI/FlatCAMGUI.py:3940 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:823 +msgid "Drills" +msgstr "Găuri" + +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:824 +msgid "Slots" +msgstr "Sloturi" + +#: flatcamGUI/FlatCAMGUI.py:3942 flatcamGUI/ObjectUI.py:825 +msgid "Both" +msgstr "Ambele" + +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:840 +msgid "Mill Holes" +msgstr "Frezare găuri" + +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:842 +msgid "Create Geometry for milling holes." +msgstr "Crează un obiect tip Geometrie pentru frezarea găurilor." + +#: flatcamGUI/FlatCAMGUI.py:3959 +msgid "Drill Tool dia:" +msgstr "Dia. Burghiu Găurire:" + +#: flatcamGUI/FlatCAMGUI.py:3966 +msgid "Slot Tool dia:" +msgstr "Dia. Freza Slot:" + +#: flatcamGUI/FlatCAMGUI.py:3968 +msgid "" +"Diameter of the cutting tool\n" +"when milling slots." +msgstr "Diametrul frezei când se frezează sloturile." + +#: flatcamGUI/FlatCAMGUI.py:3980 +msgid "Defaults" +msgstr "Val. Implicite" + +#: flatcamGUI/FlatCAMGUI.py:3993 +msgid "Excellon Adv. Options" +msgstr "Opțiuni Avans. Excellon" + +#: flatcamGUI/FlatCAMGUI.py:3999 flatcamGUI/FlatCAMGUI.py:4435 +msgid "Advanced Options:" +msgstr "Opțiuni avansate:" + +#: flatcamGUI/FlatCAMGUI.py:4001 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object that are shown when App Level is Advanced." +msgstr "" +"Parametri folositi pentru a crea un obiect CNCJob\n" +"pt acest obiect Excellon, parametri care sunt disponibili\n" +"doar in modul Avansat al aplicatiei." + +#: flatcamGUI/FlatCAMGUI.py:4009 +msgid "Offset Z:" +msgstr "Z ofset:" + +#: flatcamGUI/FlatCAMGUI.py:4011 flatcamGUI/ObjectUI.py:645 +msgid "" +"Some drill bits (the larger ones) need to drill deeper\n" +"to create the desired exit hole diameter due of the tip shape.\n" +"The value here can compensate the Cut Z parameter." +msgstr "" +"Unele burghie (in special cele cu diametru mai mare)\n" +"au nevoie să gaureasca mai adanc pentru a depasi conul\n" +"din vârful burghiului astfel incat diametrul găurii de iesire\n" +"să fie cel dorit.\n" +"Valoarea de aici efectuează o compensare asupr\n" +"parametrului >Z tăiere<." + +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/FlatCAMGUI.py:4446 +msgid "Toolchange X,Y:" +msgstr "X,Y schimb. unealta:" + +#: flatcamGUI/FlatCAMGUI.py:4020 flatcamGUI/FlatCAMGUI.py:4448 +msgid "Toolchange X,Y position." +msgstr "Poziţia X,Y in format (x,y) unde se face schimbarea uneltei." + +#: flatcamGUI/FlatCAMGUI.py:4026 flatcamGUI/FlatCAMGUI.py:4455 +#: flatcamGUI/ObjectUI.py:705 +msgid "Start move Z:" +msgstr "Z pornire:" + +#: flatcamGUI/FlatCAMGUI.py:4028 +msgid "" +"Height of the tool just after start.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Înălţimea uneltei imediat dupa ce se porneste operatia CNC.\n" +"Lasa casuta goala daca nu se foloseşte." + +#: flatcamGUI/FlatCAMGUI.py:4035 flatcamGUI/FlatCAMGUI.py:4465 +#: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1212 +msgid "End move Z:" +msgstr "Z oprire:" + +#: flatcamGUI/FlatCAMGUI.py:4037 flatcamGUI/FlatCAMGUI.py:4467 +msgid "" +"Height of the tool after\n" +"the last move at the end of the job." +msgstr "Înălţimea la care se parchează freza dupa ce se termina lucrul." + +#: flatcamGUI/FlatCAMGUI.py:4044 flatcamGUI/FlatCAMGUI.py:4475 +#: flatcamGUI/ObjectUI.py:736 +msgid "Feedrate Rapids:" +msgstr "Feedrate rapizi:" + +#: flatcamGUI/FlatCAMGUI.py:4046 flatcamGUI/ObjectUI.py:738 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Viteza de găurire, in unitati pe minut.\n" +"Corespunde comenzii G0 și este utila doar pentru\n" +"printerul 3D Marlin, implicit când se foloseşte fişierul\n" +"postprocesor: Marlin. Ignora aceasta parametru in rest." + +#: flatcamGUI/FlatCAMGUI.py:4057 flatcamGUI/FlatCAMGUI.py:4499 +#: flatcamGUI/ObjectUI.py:786 flatcamGUI/ObjectUI.py:1321 +msgid "Probe Z depth:" +msgstr "Z sonda:" + +#: flatcamGUI/FlatCAMGUI.py:4059 flatcamGUI/FlatCAMGUI.py:4501 +#: flatcamGUI/ObjectUI.py:788 flatcamGUI/ObjectUI.py:1324 +msgid "" +"The maximum depth that the probe is allowed\n" +"to probe. Negative value, in current units." +msgstr "" +"Adâncimea maxima la care este permis sondei să coboare.\n" +"Are o valoare negativă, in unitatile curente." + +#: flatcamGUI/FlatCAMGUI.py:4067 flatcamGUI/FlatCAMGUI.py:4509 +#: flatcamGUI/ObjectUI.py:798 flatcamGUI/ObjectUI.py:1335 +msgid "Feedrate Probe:" +msgstr "Feedrate sonda:" + +#: flatcamGUI/FlatCAMGUI.py:4069 flatcamGUI/FlatCAMGUI.py:4511 +#: flatcamGUI/ObjectUI.py:800 flatcamGUI/ObjectUI.py:1338 +msgid "The feedrate used while the probe is probing." +msgstr "Viteza sondei când aceasta coboara." + +#: flatcamGUI/FlatCAMGUI.py:4075 flatcamGUI/FlatCAMGUI.py:4518 +msgid "Fast Plunge:" +msgstr "Plonjare rapida:" + +#: flatcamGUI/FlatCAMGUI.py:4077 flatcamGUI/FlatCAMGUI.py:4520 +msgid "" +"By checking this, the vertical move from\n" +"Z_Toolchange to Z_move is done with G0,\n" +"meaning the fastest speed available.\n" +"WARNING: the move is done at Toolchange X,Y coords." +msgstr "" +"Prin bifarea de aici, miscarea de la Înălţimea unde se face schimbarea " +"uneltei\n" +"pana la Înălţimea unde se face deplasarea între taieri, se va face cu " +"comanda G0.\n" +"Aceasta inseamna că se va folosi viteza maxima disponibila.\n" +"\n" +"ATENTIE: miscarea aceasta pe verticala se face la coordonatele X, Y unde se " +"schimba\n" +"unealta. Daca aveti ceva plasat sub unealta ceva se va strica." + +#: flatcamGUI/FlatCAMGUI.py:4086 +msgid "Fast Retract:" +msgstr "Retragere rapida:" + +#: flatcamGUI/FlatCAMGUI.py:4088 +msgid "" +"Exit hole strategy.\n" +" - When uncheked, while exiting the drilled hole the drill bit\n" +"will travel slow, with set feedrate (G1), up to zero depth and then\n" +"travel as fast as possible (G0) to the Z Move (travel height).\n" +" - When checked the travel from Z cut (cut depth) to Z_move\n" +"(travel height) is done as fast as possible (G0) in one move." +msgstr "" +"Strategia de evacuare a găurii tocmai găurite.\n" +"- când nu este bifat, burghiul va iesi din gaura cu viteza feedrate " +"setata, \n" +"G1, pana ajunge la nivelul zero, ulterior ridicându-se pana la Înălţimea de " +"deplasare\n" +"cu viteza maxima G0\n" +"- când este bifat, burghiul se va deplasa de la adâncimea de tăiere pana la " +"adâncimea\n" +"de deplasare cu viteza maxima G0, intr-o singura miscare." + +#: flatcamGUI/FlatCAMGUI.py:4107 +msgid "Excellon Export" +msgstr "Export Excellon" + +#: flatcamGUI/FlatCAMGUI.py:4110 +msgid "Export Options:" +msgstr "Opțiuni Export::" + +#: flatcamGUI/FlatCAMGUI.py:4112 +msgid "" +"The parameters set here are used in the file exported\n" +"when using the File -> Export -> Export Excellon menu entry." +msgstr "" +"Acesti parametri listati aici sunt folositi atunci când\n" +"se exporta un fişier Excellon folosind:\n" +"File -> Exporta -> Exporta Excellon" + +#: flatcamGUI/FlatCAMGUI.py:4121 +msgid "Units:" +msgstr "Unitati:" + +#: flatcamGUI/FlatCAMGUI.py:4123 flatcamGUI/FlatCAMGUI.py:4129 +msgid "The units used in the Excellon file." +msgstr "Unitatile de masura folosite in fişierul Excellon." + +#: flatcamGUI/FlatCAMGUI.py:4135 +msgid "Int/Decimals:" +msgstr "Int/Zecimale:" + +#: flatcamGUI/FlatCAMGUI.py:4137 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period." +msgstr "" +"Fişierele NC, numite usual fişiere Excellon\n" +"sunt fişiere care pot fi gasite in diverse formate.\n" +"Aici se setează formatul Excellon când nu se utilizează\n" +"coordonate cu zecimale." + +#: flatcamGUI/FlatCAMGUI.py:4173 +msgid "Format:" +msgstr "Format:" + +#: flatcamGUI/FlatCAMGUI.py:4175 flatcamGUI/FlatCAMGUI.py:4185 +msgid "" +"Select the kind of coordinates format used.\n" +"Coordinates can be saved with decimal point or without.\n" +"When there is no decimal point, it is required to specify\n" +"the number of digits for integer part and the number of decimals.\n" +"Also it will have to be specified if LZ = leading zeros are kept\n" +"or TZ = trailing zeros are kept." +msgstr "" +"Selectati tipul formatului de coordonate folosit.\n" +"Coordonatele se pot salva cu punct zecimal sau fără.\n" +"Când nu se foloseşte punctul zecimal ca separator între\n" +"partea intreaga și partea zecimala, este necesar să se\n" +"specifice numărul de digiti folosit pentru partea intreaga\n" +"și numărul de digiti folosit pentru partea zecimala.\n" +"Trebuie specificat și modul in care sunt tratate zerourile:\n" +"- LZ = zerourile prefix sunt pastrate și cele sufix eliminate\n" +"- TZ = zerourile prefix sunt eliminate și cele sufix pastrate." + +#: flatcamGUI/FlatCAMGUI.py:4182 +msgid "Decimal" +msgstr "Cu dec." + +#: flatcamGUI/FlatCAMGUI.py:4183 +msgid "No-Decimal" +msgstr "Fără dec." + +#: flatcamGUI/FlatCAMGUI.py:4196 +msgid "Zeros:" +msgstr "Zero-uri:" + +#: flatcamGUI/FlatCAMGUI.py:4209 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" +"Acesta este tipul implicit de zero-uri Excellon.\n" +"- LZ = zerourile prefix sunt pastrate și cele sufix eliminate\n" +"- TZ = zerourile prefix sunt eliminate și cele sufix pastrate." + +#: flatcamGUI/FlatCAMGUI.py:4235 +msgid "Geometry General" +msgstr "Geometrie General" + +#: flatcamGUI/FlatCAMGUI.py:4253 +msgid "" +"The number of circle steps for Geometry \n" +"circle and arc shapes linear approximation." +msgstr "" +"Numărul de segmente utilizate pentru\n" +"aproximarea lineara a Geometriilor circulare." + +#: flatcamGUI/FlatCAMGUI.py:4261 +msgid "Tools" +msgstr "Unelte" + +#: flatcamGUI/FlatCAMGUI.py:4268 +msgid "Tool dia: " +msgstr "Dia Unealta:" + +#: flatcamGUI/FlatCAMGUI.py:4270 +msgid "" +"The diameter of the cutting\n" +"tool.." +msgstr "Diametrul uneltei taietoare ..." + +#: flatcamGUI/FlatCAMGUI.py:4285 +msgid "Geometry Options" +msgstr "Opțiuni Geometrie" + +#: flatcamGUI/FlatCAMGUI.py:4290 +msgid "Create CNC Job:" +msgstr "Crează CNCJob:" + +#: flatcamGUI/FlatCAMGUI.py:4292 +msgid "" +"Create a CNC Job object\n" +"tracing the contours of this\n" +"Geometry object." +msgstr "" +"Crează un obiect CNCJob care urmareste conturul\n" +"acestui obiect tip Geometrie." + +#: flatcamGUI/FlatCAMGUI.py:4304 flatcamGUI/ObjectUI.py:1133 +msgid "" +"Cutting depth (negative)\n" +"below the copper surface." +msgstr "" +"Adâncimea la care se taie sub suprafata de cupru.\n" +"Valoare negativă." + +#: flatcamGUI/FlatCAMGUI.py:4312 +msgid "Multidepth" +msgstr "MultiPas" + +#: flatcamGUI/FlatCAMGUI.py:4314 +msgid "Multidepth usage: True or False." +msgstr "" +"Daca se folosesc sau nu pasi multipli de tăiere\n" +"pentru a ajunge la adâncimea de tăiere." + +#: flatcamGUI/FlatCAMGUI.py:4319 +msgid "Depth/Pass:" +msgstr "Adanc./Trecere" + +#: flatcamGUI/FlatCAMGUI.py:4321 +msgid "" +"The depth to cut on each pass,\n" +"when multidepth is enabled.\n" +"It has positive value although\n" +"it is a fraction from the depth\n" +"which has negative value." +msgstr "" +"Adâncimea la care se taie la fiecare trecere,\n" +"atunci când >MultiPas< este folosit.\n" +"Valoarea este pozitivă desi reprezinta o fractie\n" +"a adancimii de tăiere care este o valoare negativă." + +#: flatcamGUI/FlatCAMGUI.py:4337 flatcamGUI/ObjectUI.py:1169 +msgid "" +"Height of the tool when\n" +"moving without cutting." +msgstr "" +"Înălţimea la care se misca unealta când nu taie,\n" +"deasupra materialului." + +#: flatcamGUI/FlatCAMGUI.py:4364 flatcamGUI/ObjectUI.py:1224 +msgid "Feed Rate X-Y:" +msgstr "Feedrate X-Y:" + +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/ObjectUI.py:1227 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute" +msgstr "" +"Viteza de tăiere in planul X-Y\n" +"in unitati pe minut." + +#: flatcamGUI/FlatCAMGUI.py:4374 +msgid "Feed Rate Z:" +msgstr "Feedrate Z:" + +#: flatcamGUI/FlatCAMGUI.py:4376 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute.\n" +"It is called also Plunge." +msgstr "" +"Viteza de tăiere in planul Z\n" +"in unitati pe minut.\n" +"Mai este numita și viteza de plonjare." + +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/ObjectUI.py:750 +#: flatcamGUI/ObjectUI.py:1276 +msgid "Spindle speed:" +msgstr "Viteza motor:" + +#: flatcamGUI/FlatCAMGUI.py:4414 +msgid "" +"The postprocessor file that dictates\n" +"Machine Code output." +msgstr "" +"Un fişier care prelucrează codul G-Code astfel incat să\n" +"respecte un anumit format care să fie inteles de diverse\n" +"utilaje. Este responsabil de 'personalizarea' G-Code." + +#: flatcamGUI/FlatCAMGUI.py:4430 +msgid "Geometry Adv. Options" +msgstr "Opțiuni Avans. Geometrie" + +#: flatcamGUI/FlatCAMGUI.py:4437 +msgid "" +"Parameters to create a CNC Job object\n" +"tracing the contours of a Geometry object." +msgstr "" +"Parametrii folositi pentru a crea un obiect CNCJob,\n" +"urmarind contururile unui obiect tip Geometrie." + +#: flatcamGUI/FlatCAMGUI.py:4457 +msgid "" +"Height of the tool just after starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Înălţimea uneltei la care se gaseste la inceputul lucrului.\n" +"Lasa câmpul gol daca nu folosești aceasta." + +#: flatcamGUI/FlatCAMGUI.py:4477 +msgid "" +"Cutting speed in the XY plane\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Viteza de tăiere in planul X-Y, in unitati pe minut,\n" +"in legatura cu comanda G00.\n" +"Este utila doar când se foloseşte cu un printer 3D Marlin,\n" +"pentru toate celelalte cazuri ignora acest parametru." + +#: flatcamGUI/FlatCAMGUI.py:4489 +msgid "Re-cut 1st pt." +msgstr "Re-tăiere 1-ul pt." + +#: flatcamGUI/FlatCAMGUI.py:4491 flatcamGUI/ObjectUI.py:1267 +msgid "" +"In order to remove possible\n" +"copper leftovers where first cut\n" +"meet with last cut, we generate an\n" +"extended cut over the first cut section." +msgstr "" +"Bifează daca se doreste o siguranta ca resturile de cupru\n" +"care pot ramane acolo unde se intalneste inceputul taierii\n" +"cu sfarsitul acesteia (este vorba de un contur), sunt eliminate\n" +"prin taierea peste acest punct." + +#: flatcamGUI/FlatCAMGUI.py:4530 +msgid "Seg. X size:" +msgstr "Dim. seg X." + +#: flatcamGUI/FlatCAMGUI.py:4532 +msgid "" +"The size of the trace segment on the X axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the X axis." +msgstr "" +"Dimensiunea segmentului de traseu pe axa X.\n" +"Folositor pentru auto-nivelare.\n" +"O valoare de 0 inseamnaca nu se face segmentare\n" +"pe axa X." + +#: flatcamGUI/FlatCAMGUI.py:4541 +msgid "Seg. Y size:" +msgstr "Dim. seg Y." + +#: flatcamGUI/FlatCAMGUI.py:4543 +msgid "" +"The size of the trace segment on the Y axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the Y axis." +msgstr "" +"Dimensiunea segmentului de traseu pe axa Y.\n" +"Folositor pentru auto-nivelare.\n" +"O valoare de 0 inseamnaca nu se face segmentare\n" +"pe axa Y." + +#: flatcamGUI/FlatCAMGUI.py:4559 +msgid "CNC Job General" +msgstr "CNCJob General" + +#: flatcamGUI/FlatCAMGUI.py:4572 flatcamGUI/ObjectUI.py:615 +#: flatcamGUI/ObjectUI.py:945 flatcamGUI/ObjectUI.py:1499 +msgid "Plot Object" +msgstr "Afisează" + +#: flatcamGUI/FlatCAMGUI.py:4579 +msgid "Plot kind:" +msgstr "Tip afișare:" + +#: flatcamGUI/FlatCAMGUI.py:4581 flatcamGUI/ObjectUI.py:1421 +msgid "" +"This selects the kind of geometries on the canvas to plot.\n" +"Those can be either of type 'Travel' which means the moves\n" +"above the work piece or it can be of type 'Cut',\n" +"which means the moves that cut into the material." +msgstr "" +"Aici se poate selecta tipul de afișare a geometriilor.\n" +"Acestea pot fi:\n" +"- Voiaj -> miscarile deasupra materialului\n" +"- Tăiere -> miscarile in material, tăiere\n" +"- Amandoua" + +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/ObjectUI.py:1430 +msgid "Travel" +msgstr "Voiaj" + +#: flatcamGUI/FlatCAMGUI.py:4600 +msgid "" +"The number of circle steps for GCode \n" +"circle and arc shapes linear approximation." +msgstr "" +"Numărul de segmente utilizate pentru\n" +"aproximarea lineara a reprezentarilor GCodului circular." + +#: flatcamGUI/FlatCAMGUI.py:4610 +msgid "" +"Diameter of the tool to be\n" +"rendered in the plot." +msgstr "Diametrul uneltei care să fie redat prin afișare." + +#: flatcamGUI/FlatCAMGUI.py:4618 +msgid "Coords dec.:" +msgstr "Coord. zec.:" + +#: flatcamGUI/FlatCAMGUI.py:4620 +msgid "" +"The number of decimals to be used for \n" +"the X, Y, Z coordinates in CNC code (GCODE, etc.)" +msgstr "" +"Numărul de zecimale care să fie folosit in \n" +"coordonatele X,Y,Z in codul CNC (GCode etc)." + +#: flatcamGUI/FlatCAMGUI.py:4628 +msgid "Feedrate dec.:" +msgstr "Feedrate zec.:" + +#: flatcamGUI/FlatCAMGUI.py:4630 +msgid "" +"The number of decimals to be used for \n" +"the Feedrate parameter in CNC code (GCODE, etc.)" +msgstr "" +"Numărul de zecimale care să fie folosit in \n" +"parametrul >Feedrate< in codul CNC (GCode etc)." + +#: flatcamGUI/FlatCAMGUI.py:4645 +msgid "CNC Job Options" +msgstr "Opțiuni CNCJob" + +#: flatcamGUI/FlatCAMGUI.py:4648 flatcamGUI/FlatCAMGUI.py:4689 +msgid "Export G-Code:" +msgstr "Exporta G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4650 flatcamGUI/FlatCAMGUI.py:4691 +#: flatcamGUI/ObjectUI.py:1535 +msgid "" +"Export and save G-Code to\n" +"make this object to a file." +msgstr "" +"Exporta și salvează codul G-Code intr-un fişier\n" +"care este salvat pe HDD." + +#: flatcamGUI/FlatCAMGUI.py:4656 +msgid "Prepend to G-Code:" +msgstr "Adaugă la inceputul G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4658 +msgid "" +"Type here any G-Code commands you would\n" +"like to add at the beginning of the G-Code file." +msgstr "" +"Adaugă aici orice comenzi G-Code care se doreste să fie\n" +"inserate la inceputul codului G-Code." + +#: flatcamGUI/FlatCAMGUI.py:4667 +msgid "Append to G-Code:" +msgstr "Adaugă la sfarsitul G-Code:" + +#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/ObjectUI.py:1557 +msgid "" +"Type here any G-Code commands you would\n" +"like to append to the generated file.\n" +"I.e.: M2 (End of program)" +msgstr "" +"Adaugă aici orice comenzi G-Code care se doreste să fie\n" +"inserate la sfarsitul codului G-Code." + +#: flatcamGUI/FlatCAMGUI.py:4686 +msgid "CNC Job Adv. Options" +msgstr "Opțiuni Avans. CNCJob" + +#: flatcamGUI/FlatCAMGUI.py:4697 flatcamGUI/ObjectUI.py:1575 +msgid "Toolchange G-Code:" +msgstr "G-Code pt schimb unealta:" + +#: flatcamGUI/FlatCAMGUI.py:4699 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro." +msgstr "" +"Adaugă aici orice comenzi G-Code care se doreste să fie\n" +"inserate in codul G-Code atunci când se intalneste comanda M6.\n" +"Comanda M6 este inlocuita.\n" +"Aceata va constitui un macro pentru schimbul uneltelor." + +#: flatcamGUI/FlatCAMGUI.py:4713 flatcamGUI/ObjectUI.py:1597 +msgid "Use Toolchange Macro" +msgstr "Fol. Macro schimb unealta" + +#: flatcamGUI/FlatCAMGUI.py:4715 flatcamGUI/ObjectUI.py:1600 +msgid "" +"Check this box if you want to use\n" +"a Custom Toolchange GCode (macro)." +msgstr "" +"Bifează aici daca dorești să folosești Macro pentru\n" +"schimb unelte." + +#: flatcamGUI/FlatCAMGUI.py:4727 flatcamGUI/ObjectUI.py:1616 +msgid "" +"A list of the FlatCAM variables that can be used\n" +"in the Toolchange event.\n" +"They have to be surrounded by the '%' symbol" +msgstr "" +"O lista de variabile FlatCAM care se pot folosi in evenimentul \n" +"de schimb al uneltei (când se intalneste comanda M6).\n" +"Este necesar să fie inconjurate de simbolul '%'." + +#: flatcamGUI/FlatCAMGUI.py:4734 flatcamGUI/ObjectUI.py:1624 +msgid "Parameters" +msgstr "Parametri" + +#: flatcamGUI/FlatCAMGUI.py:4737 flatcamGUI/ObjectUI.py:1627 +msgid "FlatCAM CNC parameters" +msgstr "Parametri FlatCAM CNC" + +#: flatcamGUI/FlatCAMGUI.py:4738 flatcamGUI/ObjectUI.py:1628 +msgid "tool = tool number" +msgstr "tool = numărul uneltei" + +#: flatcamGUI/FlatCAMGUI.py:4739 flatcamGUI/ObjectUI.py:1629 +msgid "tooldia = tool diameter" +msgstr "tooldia = dimaetrul uneltei" + +#: flatcamGUI/FlatCAMGUI.py:4740 flatcamGUI/ObjectUI.py:1630 +msgid "t_drills = for Excellon, total number of drills" +msgstr "t_drills = pt Excellom, numărul total de operatii găurire" + +#: flatcamGUI/FlatCAMGUI.py:4741 flatcamGUI/ObjectUI.py:1631 +msgid "x_toolchange = X coord for Toolchange" +msgstr "x_toolchange = coord. X pt schimb unealta" + +#: flatcamGUI/FlatCAMGUI.py:4742 flatcamGUI/ObjectUI.py:1632 +msgid "y_toolchange = Y coord for Toolchange" +msgstr "y_toolchange = coord. Y pt schimb unealta" + +#: flatcamGUI/FlatCAMGUI.py:4743 flatcamGUI/ObjectUI.py:1633 +msgid "z_toolchange = Z coord for Toolchange" +msgstr "z_toolchange = coord. Z pt schimb unealta" + +#: flatcamGUI/FlatCAMGUI.py:4744 +msgid "z_cut = Z depth for the cut" +msgstr "z_cut = Z adâncimea de tăiere" + +#: flatcamGUI/FlatCAMGUI.py:4745 +msgid "z_move = Z height for travel" +msgstr "z_move = Z Înălţimea deplasare" + +#: flatcamGUI/FlatCAMGUI.py:4746 flatcamGUI/ObjectUI.py:1636 +msgid "z_depthpercut = the step value for multidepth cut" +msgstr "z_depthpercut = pasul pentru taierea progresiva" + +#: flatcamGUI/FlatCAMGUI.py:4747 flatcamGUI/ObjectUI.py:1637 +msgid "spindlesspeed = the value for the spindle speed" +msgstr "spindlesspeed = valoarea viteza motor" + +#: flatcamGUI/FlatCAMGUI.py:4748 flatcamGUI/ObjectUI.py:1638 +msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" +msgstr "dwelltime = durata de asteptare ca motorul să ajunga la turatia setata" + +#: flatcamGUI/FlatCAMGUI.py:4769 +msgid "NCC Tool Options" +msgstr "Opțiuni Unealta NCC" + +#: flatcamGUI/FlatCAMGUI.py:4772 flatcamGUI/FlatCAMGUI.py:4873 +#: flatcamGUI/FlatCAMGUI.py:4943 flatcamGUI/FlatCAMGUI.py:5002 +#: flatcamGUI/FlatCAMGUI.py:5105 flatcamGUI/FlatCAMGUI.py:5166 +#: flatcamGUI/FlatCAMGUI.py:5365 flatcamGUI/FlatCAMGUI.py:5492 +msgid "Parameters:" +msgstr "Parametri:" + +#: flatcamGUI/FlatCAMGUI.py:4782 flatcamGUI/FlatCAMGUI.py:5503 +msgid "Tools dia:" +msgstr "Dia unealta:" + +#: flatcamGUI/FlatCAMGUI.py:4784 +msgid "Diameters of the cutting tools, separated by ','" +msgstr "Diametrele pentru unelte taietoare, separate cu virgula" + +#: flatcamGUI/FlatCAMGUI.py:4792 flatcamTools/ToolNonCopperClear.py:166 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be cleared are still \n" +"not cleared.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" +"Cat de mult (fractie) din diametrul uneltei să se suprapună la fiecare " +"trecere a uneltei.\n" +"Exemplu:\n" +"O valoare aici de 0.25 inseamna 25\\% din diametrul uneltei de mai sus..\n" +"\n" +"Ajustează valoarea incepand de la valori mici\n" +"și pe urma creste daca ariile care ar trebui >curățate< inca\n" +"nu sunt procesate.\n" +"Valori scazute = procesare rapida,executie rapida a PCB-ului.\n" +"Valori mari= procesare lenta cat și o executie la fel de lenta a PCB-ului,\n" +"datorita numărului mai mare de treceri-tăiere." + +#: flatcamGUI/FlatCAMGUI.py:4808 flatcamTools/ToolNonCopperClear.py:182 +msgid "Bounding box margin." +msgstr "Marginea pentru forma înconjurătoare." + +#: flatcamGUI/FlatCAMGUI.py:4817 flatcamTools/ToolNonCopperClear.py:191 +#: flatcamTools/ToolPaint.py:190 +msgid "" +"Algorithm for non-copper clearing:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed.
Line-based: Parallel " +"lines." +msgstr "" +"Algoritm pt curățare de cupru:
Standard: Pas fix spre interior." +"
Punct-samanta: De la punctul samanta, spre expterior.
Linii " +"drepte: Linii paralele." + +#: flatcamGUI/FlatCAMGUI.py:4849 flatcamTools/ToolNonCopperClear.py:223 +#: flatcamTools/ToolPaint.py:222 +msgid "Rest M.:" +msgstr "Rest M.:" + +#: flatcamGUI/FlatCAMGUI.py:4851 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool.\n" +"If not checked, use the standard algorithm." +msgstr "" +"Daca este bifat, foloste 'rest machining'.\n" +"Mai exact, se va curăța cuprul din afara traseelor,\n" +"folosind mai intai unealta cu diametrul cel mai mare\n" +"apoi folosindu-se progresiv unelte cu diametrul tot\n" +"mai mic, din cele disponibile in tabela de unelte, pt a\n" +"curăța zonele care nu s-au putut curăța cu unealta\n" +"precedenta.\n" +"Daca nu este bifat, foloseşte algoritmul standard." + +#: flatcamGUI/FlatCAMGUI.py:4870 +msgid "Cutout Tool Options" +msgstr "Opțiuni Unealta Decupare" + +#: flatcamGUI/FlatCAMGUI.py:4875 flatcamGUI/ObjectUI.py:473 +msgid "" +"Create toolpaths to cut around\n" +"the PCB and separate it from\n" +"the original board." +msgstr "" +"Crează taieturi de jur inprejurul PCB-ului,\n" +"lasand punţi pentru a separa PCB-ul de \n" +"placa din care a fost taiat." + +#: flatcamGUI/FlatCAMGUI.py:4894 +msgid "" +"Distance from objects at which\n" +"to draw the cutout." +msgstr "Distanta de obiecte la care să se deseneze forma taietoare." + +#: flatcamGUI/FlatCAMGUI.py:4901 flatcamTools/ToolCutOut.py:96 +msgid "Gap size:" +msgstr "Dim. punte:" + +#: flatcamGUI/FlatCAMGUI.py:4903 +msgid "" +"Size of the gaps in the toolpath\n" +"that will remain to hold the\n" +"board in place." +msgstr "" +"Dimensiunea punţilor in trecerile de tăiere\n" +"care vor mentine PCB-ul in pozitie, fără să cada\n" +"din placa 'mama' dupa decupare." + +#: flatcamGUI/FlatCAMGUI.py:4911 flatcamTools/ToolCutOut.py:125 +msgid "Gaps:" +msgstr "Punţi:" + +#: flatcamGUI/FlatCAMGUI.py:4913 +msgid "" +"Number of bridge gaps used for the cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" +"Numărul de punţi folosite in decupare.\n" +"Pot fi un număr maxim de 8 punţi aranjate in felul\n" +"urmator:\n" +"- lr = stânga -dreapta\n" +"- tb = sus - jos\n" +"- 4 = stânga -dreapta - sus - jos\n" +"- 2lr = 2* stânga - 2* dreapta\n" +"- 2tb = 2* sus - 2* jos\n" +"- 8 = 2* stânga - 2* dreapta - 2* sus - 2* jos" + +#: flatcamGUI/FlatCAMGUI.py:4940 +msgid "2Sided Tool Options" +msgstr "Opțiuni Unealta 2Fețe" + +#: flatcamGUI/FlatCAMGUI.py:4945 +msgid "" +"A tool to help in creating a double sided\n" +"PCB using alignment holes." +msgstr "" +"O unealta care ajuta in crearea de PCB-uri cu 2 fețe\n" +"folosind găuri de aliniere." + +#: flatcamGUI/FlatCAMGUI.py:4955 flatcamTools/ToolDblSided.py:235 +msgid "Drill diam.:" +msgstr "Dia gaura:" + +#: flatcamGUI/FlatCAMGUI.py:4957 flatcamTools/ToolDblSided.py:226 +#: flatcamTools/ToolDblSided.py:237 +msgid "Diameter of the drill for the alignment holes." +msgstr "Diametrul găurii pentru găurile de aliniere." + +#: flatcamGUI/FlatCAMGUI.py:4964 +msgid "X" +msgstr "X" + +#: flatcamGUI/FlatCAMGUI.py:4965 +msgid "Y" +msgstr "Y" + +#: flatcamGUI/FlatCAMGUI.py:4966 flatcamTools/ToolDblSided.py:120 +msgid "Mirror Axis:" +msgstr "Axe oglindire:" + +#: flatcamGUI/FlatCAMGUI.py:4968 flatcamTools/ToolDblSided.py:122 +msgid "Mirror vertically (X) or horizontally (Y)." +msgstr "Oglindeste vertical (X) sau orizontal (Y)." + +#: flatcamGUI/FlatCAMGUI.py:4977 +msgid "Point" +msgstr "Punct" + +#: flatcamGUI/FlatCAMGUI.py:4978 +msgid "Box" +msgstr "Forma" + +#: flatcamGUI/FlatCAMGUI.py:4979 flatcamTools/ToolDblSided.py:133 +msgid "Axis Ref:" +msgstr "Axa de ref.:" + +#: flatcamGUI/FlatCAMGUI.py:4981 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a Geometry object) in \n" +"the middle." +msgstr "" +"Axa de referinţă ar trebui să treaca printr-un punct ori să strabata\n" +" o forma (specificata un obiect tip Geometrie) prin mijloc." + +#: flatcamGUI/FlatCAMGUI.py:4997 +msgid "Paint Tool Options" +msgstr "Opțiuni Unealta Paint" + +#: flatcamGUI/FlatCAMGUI.py:5004 flatcamGUI/ObjectUI.py:1370 +msgid "" +"Creates tool paths to cover the\n" +"whole area of a polygon (remove\n" +"all copper). You will be asked\n" +"to click on the desired polygon." +msgstr "" +"Crează treceri taietoare pentru a acoperi\n" +"intreaga arie a unui poligon (pentru a indeparta\n" +"to cuprul, spre ex.). Când se actionează peste un\n" +"singur poligon se va cere să faceti click pe poligonul\n" +"dorit." + +#: flatcamGUI/FlatCAMGUI.py:5028 +msgid "" +"How much (fraction) of the tool\n" +"width to overlap each tool pass." +msgstr "" +"Cat de mult (o fractie din diametrul uneltei) din diametrul uneltei,\n" +"(lăţimea de tăiere) să se suprapună peste trecerea anterioară." + +#: flatcamGUI/FlatCAMGUI.py:5082 flatcamTools/ToolPaint.py:237 +msgid "Selection:" +msgstr "Selecţie:" + +#: flatcamGUI/FlatCAMGUI.py:5084 +msgid "How to select the polygons to paint." +msgstr "Cum să se selecteze poligoanele de pictat (paint)." + +#: flatcamGUI/FlatCAMGUI.py:5088 +msgid "Single" +msgstr "Unic" + +#: flatcamGUI/FlatCAMGUI.py:5102 +msgid "Film Tool Options" +msgstr "Opțiuni Unealta Film" + +#: flatcamGUI/FlatCAMGUI.py:5107 +msgid "" +"Create a PCB film from a Gerber or Geometry\n" +"FlatCAM object.\n" +"The file is saved in SVG format." +msgstr "" +"Crează un film PCB dintr-un obiect Gerber sau tip Geometrie.\n" +"Fişierul este salvat in format SVG." + +#: flatcamGUI/FlatCAMGUI.py:5116 +msgid "Pos" +msgstr "Pozitiv" + +#: flatcamGUI/FlatCAMGUI.py:5117 +msgid "Neg" +msgstr "Negativ" + +#: flatcamGUI/FlatCAMGUI.py:5118 flatcamTools/ToolFilm.py:116 +msgid "Film Type:" +msgstr "Tip film:" + +#: flatcamGUI/FlatCAMGUI.py:5120 flatcamTools/ToolFilm.py:118 +msgid "" +"Generate a Positive black film or a Negative film.\n" +"Positive means that it will print the features\n" +"with black on a white canvas.\n" +"Negative means that it will print the features\n" +"with white on a black canvas.\n" +"The Film format is SVG." +msgstr "" +"Generează un film negru Pozitiv sau un film Negativ.\n" +"Pozitiv = traseele vor fi negre pe un fundal alb.\n" +"Negativ = traseele vor fi albe pe un fundal negru.\n" +"Formatul fişierului pt filmul salvat este SVG." + +#: flatcamGUI/FlatCAMGUI.py:5131 flatcamTools/ToolFilm.py:130 +msgid "Border:" +msgstr "Bordura:" + +#: flatcamGUI/FlatCAMGUI.py:5133 flatcamTools/ToolFilm.py:132 +msgid "" +"Specify a border around the object.\n" +"Only for negative film.\n" +"It helps if we use as a Box Object the same \n" +"object as in Film Object. It will create a thick\n" +"black bar around the actual print allowing for a\n" +"better delimitation of the outline features which are of\n" +"white color like the rest and which may confound with the\n" +"surroundings if not for this border." +msgstr "" +"Specifica o bordura de jur imprejurul obiectului.\n" +"Doar pt filmele negative.\n" +"Ajuta daca folosim in Obiect Forma acelasi obiect ca in Obiect Film.\n" +"Va crea o bara solida neagra in jurul printului efectiv permitand o\n" +"delimitare exacta" + +#: flatcamGUI/FlatCAMGUI.py:5146 flatcamTools/ToolFilm.py:144 +msgid "Scale Stroke:" +msgstr "Scalează:" + +#: flatcamGUI/FlatCAMGUI.py:5148 flatcamTools/ToolFilm.py:146 +msgid "" +"Scale the line stroke thickness of each feature in the SVG file.\n" +"It means that the line that envelope each SVG feature will be thicker or " +"thinner,\n" +"therefore the fine features may be more affected by this parameter." +msgstr "" +"Scalează grosimea conturului fiecarui element din fişierul SVG.\n" +"Elementele mai mici vor fi afectate mai mult." + +#: flatcamGUI/FlatCAMGUI.py:5163 +msgid "Panelize Tool Options" +msgstr "Opțiuni Unealta Panelizare" + +#: flatcamGUI/FlatCAMGUI.py:5168 +msgid "" +"Create an object that contains an array of (x, y) elements,\n" +"each element is a copy of the source object spaced\n" +"at a X distance, Y distance of each other." +msgstr "" +"Crează un obiect care contine o arie de (linii, coloane) elemente,\n" +"unde fiecare element este o copie a obiectului sursa, separat la o\n" +"distanta X, Y unul de celalalt." + +#: flatcamGUI/FlatCAMGUI.py:5179 flatcamTools/ToolPanelize.py:113 +msgid "Spacing cols:" +msgstr "Sep. coloane:" + +#: flatcamGUI/FlatCAMGUI.py:5181 flatcamTools/ToolPanelize.py:115 +msgid "" +"Spacing between columns of the desired panel.\n" +"In current units." +msgstr "" +"Spatiul de separare între coloane.\n" +"In unitatile curente." + +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamTools/ToolPanelize.py:122 +msgid "Spacing rows:" +msgstr "Sep. linii:" + +#: flatcamGUI/FlatCAMGUI.py:5191 flatcamTools/ToolPanelize.py:124 +msgid "" +"Spacing between rows of the desired panel.\n" +"In current units." +msgstr "" +"Spatiul de separare între linii.\n" +"In unitatile curente." + +#: flatcamGUI/FlatCAMGUI.py:5199 flatcamTools/ToolPanelize.py:131 +msgid "Columns:" +msgstr "Coloane:" + +#: flatcamGUI/FlatCAMGUI.py:5201 flatcamTools/ToolPanelize.py:133 +msgid "Number of columns of the desired panel" +msgstr "Numărul de coloane ale panel-ului dorit." + +#: flatcamGUI/FlatCAMGUI.py:5208 flatcamTools/ToolPanelize.py:139 +msgid "Rows:" +msgstr "Linii:" + +#: flatcamGUI/FlatCAMGUI.py:5210 flatcamTools/ToolPanelize.py:141 +msgid "Number of rows of the desired panel" +msgstr "Numărul de linii ale panel-ului dorit." + +#: flatcamGUI/FlatCAMGUI.py:5216 +msgid "Gerber" +msgstr "Gerber" + +#: flatcamGUI/FlatCAMGUI.py:5217 +msgid "Geo" +msgstr "Geo" + +#: flatcamGUI/FlatCAMGUI.py:5218 flatcamTools/ToolPanelize.py:148 +msgid "Panel Type:" +msgstr "Tip panel:" + +#: flatcamGUI/FlatCAMGUI.py:5220 +msgid "" +"Choose the type of object for the panel object:\n" +"- Gerber\n" +"- Geometry" +msgstr "" +"Alege tipul obiectului panel:\n" +"- Gerber\n" +"- Geometrie" + +#: flatcamGUI/FlatCAMGUI.py:5229 +msgid "Constrain within:" +msgstr "Constrange:" + +#: flatcamGUI/FlatCAMGUI.py:5231 flatcamTools/ToolPanelize.py:160 +msgid "" +"Area define by DX and DY within to constrain the panel.\n" +"DX and DY values are in current units.\n" +"Regardless of how many columns and rows are desired,\n" +"the final panel will have as many columns and rows as\n" +"they fit completely within selected area." +msgstr "" +"Arie definita de Dx și Dy in care se constrange panel-ul.\n" +"Dx și Dy sunt valori in unitati curente.\n" +"Indiferent de cat de multe coloane și/sau linii sunt selectate mai sus\n" +"panelul final va contine numai acel număr de linii/coloane care se inscrie\n" +"complet in aria desemnata." + +#: flatcamGUI/FlatCAMGUI.py:5240 flatcamTools/ToolPanelize.py:169 +msgid "Width (DX):" +msgstr "Latime (Dx):" + +#: flatcamGUI/FlatCAMGUI.py:5242 flatcamTools/ToolPanelize.py:171 +msgid "" +"The width (DX) within which the panel must fit.\n" +"In current units." +msgstr "" +"Lăţimea (Dx) in care panelul trebuie să se inscrie.\n" +"In unitati curente." + +#: flatcamGUI/FlatCAMGUI.py:5249 flatcamTools/ToolPanelize.py:177 +msgid "Height (DY):" +msgstr "Inaltime (Dy):" + +#: flatcamGUI/FlatCAMGUI.py:5251 flatcamTools/ToolPanelize.py:179 +msgid "" +"The height (DY)within which the panel must fit.\n" +"In current units." +msgstr "" +"Înălţimea (Dy) in care panelul trebuie să se inscrie.\n" +"In unitati curente." + +#: flatcamGUI/FlatCAMGUI.py:5265 +msgid "Calculators Tool Options" +msgstr "Opțiuni Unealta Calculatoare" + +#: flatcamGUI/FlatCAMGUI.py:5268 +msgid "V-Shape Tool Calculator:" +msgstr "Calculator: Unealta V-shape" + +#: flatcamGUI/FlatCAMGUI.py:5270 +msgid "" +"Calculate the tool diameter for a given V-shape tool,\n" +"having the tip diameter, tip angle and\n" +"depth-of-cut as parameters." +msgstr "" +"Calculează diametrul pentru o unealta V-Shape data,\n" +"avand diametrul vârfului și unghiul la vârf cat și\n" +"adâncimea de tăiere, ca parametri." + +#: flatcamGUI/FlatCAMGUI.py:5281 flatcamTools/ToolCalculators.py:94 +msgid "Tip Diameter:" +msgstr "Dia vârf:" + +#: flatcamGUI/FlatCAMGUI.py:5283 +msgid "" +"This is the tool tip diameter.\n" +"It is specified by manufacturer." +msgstr "" +"Acesta este diametrul la vârf al uneltei.\n" +"Este specificat de producator." + +#: flatcamGUI/FlatCAMGUI.py:5291 +msgid "Tip angle:" +msgstr "Unghiul la vârf:" + +#: flatcamGUI/FlatCAMGUI.py:5293 +msgid "" +"This is the angle on the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" +"Acesta este unghiul la vârf al uneltei.\n" +"Este specificat de producator." + +#: flatcamGUI/FlatCAMGUI.py:5303 +msgid "" +"This is depth to cut into material.\n" +"In the CNCJob object it is the CutZ parameter." +msgstr "" +"Aceasta este adâncimea la care se taie in material.\n" +"In obiectul CNCJob este parametrul >Z tăiere<." + +#: flatcamGUI/FlatCAMGUI.py:5310 +msgid "ElectroPlating Calculator:" +msgstr "Calculator Electroplacare:" + +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolCalculators.py:152 +msgid "" +"This calculator is useful for those who plate the via/pad/drill holes,\n" +"using a method like grahite ink or calcium hypophosphite ink or palladium " +"chloride." +msgstr "" +"Acest calculator este util pentru aceia care plachează găuri/vias\n" +"folosind o metoda cum ar fi:\n" +"- cerneala grafitate (carbon)\n" +"- clorura paladiu\n" +"- hipofosfit de calciu" + +#: flatcamGUI/FlatCAMGUI.py:5322 flatcamTools/ToolCalculators.py:161 +msgid "Board Length:" +msgstr "Lung. placii:" + +#: flatcamGUI/FlatCAMGUI.py:5324 flatcamTools/ToolCalculators.py:165 +msgid "This is the board length. In centimeters." +msgstr "" +"Aceasta este lungimea PCB-ului.\n" +"In centimetri. " + +#: flatcamGUI/FlatCAMGUI.py:5330 flatcamTools/ToolCalculators.py:167 +msgid "Board Width:" +msgstr "Lat. placii:" + +#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCalculators.py:171 +msgid "This is the board width.In centimeters." +msgstr "" +"Aceasta este lăţimea PCB-ului.\n" +"In centimetri. " + +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolCalculators.py:173 +msgid "Current Density:" +msgstr "Densitate I:" + +#: flatcamGUI/FlatCAMGUI.py:5340 flatcamTools/ToolCalculators.py:177 +msgid "" +"Current density to pass through the board. \n" +"In Amps per Square Feet ASF." +msgstr "" +"Densitatea de curent care să treaca prin placa.\n" +"In ASF (amperi pe picior la patrat)." + +#: flatcamGUI/FlatCAMGUI.py:5346 flatcamTools/ToolCalculators.py:181 +msgid "Copper Growth:" +msgstr "Grosime Cu:" + +#: flatcamGUI/FlatCAMGUI.py:5349 flatcamTools/ToolCalculators.py:185 +msgid "" +"How thick the copper growth is intended to be.\n" +"In microns." +msgstr "" +"Cat de gros se doreste să fie stratul de cupru depus.\n" +"In microni." + +#: flatcamGUI/FlatCAMGUI.py:5362 +msgid "Transform Tool Options" +msgstr "Opțiuni Unealta Transformare" + +#: flatcamGUI/FlatCAMGUI.py:5367 +msgid "" +"Various transformations that can be applied\n" +"on a FlatCAM object." +msgstr "" +"Diverse transformari care pot fi aplicate\n" +"asupra unui obiect FlatCAM. Cum ar fi:\n" +"- rotatie,\n" +"- scalare,\n" +"- ofset,\n" +"- deformare\n" +"- oglindire" + +#: flatcamGUI/FlatCAMGUI.py:5377 +msgid "Rotate Angle:" +msgstr "Unghi Rotatie:" + +#: flatcamGUI/FlatCAMGUI.py:5379 +msgid "Angle for rotation. In degrees." +msgstr "Unnghiul pentru rotatie. In grade." + +#: flatcamGUI/FlatCAMGUI.py:5386 +msgid "Skew_X angle:" +msgstr "Unghi Deform_X:" + +#: flatcamGUI/FlatCAMGUI.py:5388 +msgid "Angle for Skew/Shear on X axis. In degrees." +msgstr "Unghiul pentru deformare pe axa X. In grade." + +#: flatcamGUI/FlatCAMGUI.py:5395 +msgid "Skew_Y angle:" +msgstr "Unghi Deform_Y:" + +#: flatcamGUI/FlatCAMGUI.py:5397 +msgid "Angle for Skew/Shear on Y axis. In degrees." +msgstr "Unghiul pentru deformare pe axa Y. In grade." + +#: flatcamGUI/FlatCAMGUI.py:5404 +msgid "Scale_X factor:" +msgstr "Factor Scal_X:" + +#: flatcamGUI/FlatCAMGUI.py:5406 +msgid "Factor for scaling on X axis." +msgstr "Factor de scalare pe axa X." + +#: flatcamGUI/FlatCAMGUI.py:5413 +msgid "Scale_Y factor:" +msgstr "Factor Scal_Y:" + +#: flatcamGUI/FlatCAMGUI.py:5415 +msgid "Factor for scaling on Y axis." +msgstr "Factor de scalare pe axa Y." + +#: flatcamGUI/FlatCAMGUI.py:5423 +msgid "" +"Scale the selected object(s)\n" +"using the Scale_X factor for both axis." +msgstr "" +"Scalează obiectele selectate folosind\n" +"Factor Scal_X pentru ambele axe." + +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolTransform.py:210 +msgid "" +"Scale the selected object(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected objects when unchecked." +msgstr "" +"Scalează obiectele selectate folosind\n" +"originea ca referinţă atunci când este bifat.\n" +"Când nu este bifat, foloseşte ca referinţă\n" +"centrul formei inconjuatoare care cuprinde\n" +"toate obiectele selectate." + +#: flatcamGUI/FlatCAMGUI.py:5440 +msgid "Offset_X val:" +msgstr "Ofset_X:" + +#: flatcamGUI/FlatCAMGUI.py:5442 +msgid "Distance to offset on X axis. In current units." +msgstr "Distanta la care se face ofset pe axa X. In unitatile curente." + +#: flatcamGUI/FlatCAMGUI.py:5449 +msgid "Offset_Y val:" +msgstr "Ofset_Y:" + +#: flatcamGUI/FlatCAMGUI.py:5451 +msgid "Distance to offset on Y axis. In current units." +msgstr "Distanta la care se face ofset pe axa Y. In unitatile curente." + +#: flatcamGUI/FlatCAMGUI.py:5457 +msgid "Mirror Reference" +msgstr "Referinţă Oglindire" + +#: flatcamGUI/FlatCAMGUI.py:5459 flatcamTools/ToolTransform.py:314 +msgid "" +"Flip the selected object(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" +"Oglindeste obiectele selectate in jurul punctului\n" +"de referinţă.\n" +"\n" +"Coordonatele punctului se pot obtine prin click pe \n" +"canvas simultan cu apasarea tastei SHIFT.\n" +"Apoi apasa pe butonul >Adaugă< pentru a insera\n" +"coordonatele.\n" +"Alternativ se pot introduce coordonatele manual,\n" +"in forma (x, y).\n" +"La final apasa butonul de oglindire pe axa dorita. " + +#: flatcamGUI/FlatCAMGUI.py:5470 +msgid " Mirror Ref. Point:" +msgstr "Pt. Ref. Oglindire:" + +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamTools/ToolTransform.py:327 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y and" +msgstr "" +"Coordonatele in format (x, y) ale punctului de referinţă pentru\n" +"oglindire.\n" +"X din (x,y) se va folosi când se face oglindirea pe axa X\n" +"Y din (x,y) se va folosi când se face oglindirea pe axa Y." + +#: flatcamGUI/FlatCAMGUI.py:5489 +msgid "SolderPaste Tool Options" +msgstr "Opțiuni Unealta Pasta Fludor" + +#: flatcamGUI/FlatCAMGUI.py:5494 +msgid "" +"A tool to create GCode for dispensing\n" +"solder paste onto a PCB." +msgstr "" +"O unealta care crează cod G-Code pentru dispensarea de pasta de fludor\n" +"pe padurile unui PCB." + +#: flatcamGUI/FlatCAMGUI.py:5505 +msgid "Diameters of nozzle tools, separated by ','" +msgstr "Diametrele uneltelor (nozzle), separate prin virgula." + +#: flatcamGUI/FlatCAMGUI.py:5512 +msgid "New Nozzle Dia:" +msgstr "Nou Dia::" + +#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolSolderPaste.py:103 +msgid "Diameter for the new Nozzle tool to add in the Tool Table" +msgstr "" +"Valoarea pentru diametrul unei noi unelte (nozzle) pentru adaugare in Tabela " +"de Unelte" + +#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolSolderPaste.py:166 +msgid "Z Dispense Start:" +msgstr "Z start disp.:" + +#: flatcamGUI/FlatCAMGUI.py:5524 flatcamTools/ToolSolderPaste.py:168 +msgid "The height (Z) when solder paste dispensing starts." +msgstr "Înălţimea (Z) când incepe dispensarea de pasta de fludor." + +#: flatcamGUI/FlatCAMGUI.py:5531 flatcamTools/ToolSolderPaste.py:174 +msgid "Z Dispense:" +msgstr "Z disp.:" + +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamTools/ToolSolderPaste.py:176 +msgid "The height (Z) when doing solder paste dispensing." +msgstr "Înălţimea (Z) in timp ce se face dispensarea de pasta de fludor." + +#: flatcamGUI/FlatCAMGUI.py:5540 flatcamTools/ToolSolderPaste.py:183 +msgid "Z Dispense Stop:" +msgstr "Z stop disp.:" + +#: flatcamGUI/FlatCAMGUI.py:5542 flatcamTools/ToolSolderPaste.py:185 +msgid "The height (Z) when solder paste dispensing stops." +msgstr "Înălţimea (Z) când se opreste dispensarea de pasta de fludor." + +#: flatcamGUI/FlatCAMGUI.py:5549 flatcamTools/ToolSolderPaste.py:191 +msgid "Z Travel:" +msgstr "Z deplasare:" + +#: flatcamGUI/FlatCAMGUI.py:5551 flatcamTools/ToolSolderPaste.py:193 +msgid "" +"The height (Z) for travel between pads\n" +"(without dispensing solder paste)." +msgstr "" +"Înălţimea (Z) când se face deplasare între pad-uri.\n" +"(fără dispensare de pasta de fludor)." + +#: flatcamGUI/FlatCAMGUI.py:5559 flatcamTools/ToolSolderPaste.py:200 +msgid "Z Toolchange:" +msgstr "Z schimb. unealta:" + +#: flatcamGUI/FlatCAMGUI.py:5561 flatcamTools/ToolSolderPaste.py:202 +msgid "The height (Z) for tool (nozzle) change." +msgstr "Înălţimea (Z) când se schimba unealta (nozzle-ul)." + +#: flatcamGUI/FlatCAMGUI.py:5568 flatcamTools/ToolSolderPaste.py:208 +msgid "XY Toolchange:" +msgstr "XY schimb unealta:" + +#: flatcamGUI/FlatCAMGUI.py:5570 flatcamTools/ToolSolderPaste.py:210 +msgid "" +"The X,Y location for tool (nozzle) change.\n" +"The format is (x, y) where x and y are real numbers." +msgstr "" +"Coordonatele X, Y pentru schimbarea uneltei (nozzle).\n" +"Formatul este (x,y) unde x și y sunt numere Reale." + +#: flatcamGUI/FlatCAMGUI.py:5578 flatcamTools/ToolSolderPaste.py:217 +msgid "Feedrate X-Y:" +msgstr "Feedrate X-Y:" + +#: flatcamGUI/FlatCAMGUI.py:5580 flatcamTools/ToolSolderPaste.py:219 +msgid "Feedrate (speed) while moving on the X-Y plane." +msgstr "Viteza de deplasare a uneltei când se deplasează in planul X-Y." + +#: flatcamGUI/FlatCAMGUI.py:5587 flatcamTools/ToolSolderPaste.py:225 +msgid "Feedrate Z:" +msgstr "Feedrate Z:" + +#: flatcamGUI/FlatCAMGUI.py:5589 flatcamTools/ToolSolderPaste.py:227 +msgid "" +"Feedrate (speed) while moving vertically\n" +"(on Z plane)." +msgstr "" +"Viteza de deplasare a uneltei când se misca in plan vertical (planul Z)." + +#: flatcamGUI/FlatCAMGUI.py:5597 flatcamTools/ToolSolderPaste.py:234 +msgid "Feedrate Z Dispense:" +msgstr "Feedrate Z disp.:" + +#: flatcamGUI/FlatCAMGUI.py:5599 flatcamTools/ToolSolderPaste.py:236 +msgid "" +"Feedrate (speed) while moving up vertically\n" +" to Dispense position (on Z plane)." +msgstr "" +"Viteza de deplasare la miscarea pe verticala spre\n" +"poziţia de dispensare (in planul Z)." + +#: flatcamGUI/FlatCAMGUI.py:5607 flatcamTools/ToolSolderPaste.py:243 +msgid "Spindle Speed FWD:" +msgstr "Viteza motor inainte:" + +#: flatcamGUI/FlatCAMGUI.py:5609 flatcamTools/ToolSolderPaste.py:245 +msgid "" +"The dispenser speed while pushing solder paste\n" +"through the dispenser nozzle." +msgstr "" +"Viteza motorului de dispensare in timp ce impinge pasta de fludor\n" +"prin orificiul uneltei de dispensare." + +#: flatcamGUI/FlatCAMGUI.py:5617 flatcamTools/ToolSolderPaste.py:252 +msgid "Dwell FWD:" +msgstr "Pauza dupa disp.:" + +#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolSolderPaste.py:254 +msgid "Pause after solder dispensing." +msgstr "Pauza dupa dispensarea de pasta de fludor." + +#: flatcamGUI/FlatCAMGUI.py:5626 flatcamTools/ToolSolderPaste.py:260 +msgid "Spindle Speed REV:" +msgstr "Viteza motor reverse:" + +#: flatcamGUI/FlatCAMGUI.py:5628 flatcamTools/ToolSolderPaste.py:262 +msgid "" +"The dispenser speed while retracting solder paste\n" +"through the dispenser nozzle." +msgstr "" +"Viteza motorului de dispensare in timp ce retrage pasta de fludor\n" +"prin orificiul uneltei de dispensare." + +#: flatcamGUI/FlatCAMGUI.py:5636 flatcamTools/ToolSolderPaste.py:269 +msgid "Dwell REV:" +msgstr "Pauza dupa rev:" + +#: flatcamGUI/FlatCAMGUI.py:5638 flatcamTools/ToolSolderPaste.py:271 +msgid "" +"Pause after solder paste dispenser retracted,\n" +"to allow pressure equilibrium." +msgstr "" +"Pauza dupa ce pasta de fludor a fost retrasă,\n" +"necesară pt a ajunge la un echilibru al presiunilor." + +#: flatcamGUI/FlatCAMGUI.py:5645 flatcamTools/ToolSolderPaste.py:277 +msgid "PostProcessors:" +msgstr "Postprocesoare:" + +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolSolderPaste.py:279 +msgid "Files that control the GCode generation." +msgstr "Fişiere care controlează generarea codului G-Code." + +#: flatcamGUI/FlatCAMGUI.py:5677 flatcamGUI/FlatCAMGUI.py:5683 +msgid "Idle." +msgstr "Inactiv." + +#: flatcamGUI/FlatCAMGUI.py:5707 +msgid "Application started ..." +msgstr "Aplicaţia a pornit ..." + +#: flatcamGUI/FlatCAMGUI.py:5708 +msgid "Hello!" +msgstr "Buna!" + +#: flatcamGUI/ObjectUI.py:33 +msgid "FlatCAM Object" +msgstr "Obiect FlatCAM" + +#: flatcamGUI/ObjectUI.py:58 +msgid "" +"BASIC is suitable for a beginner. Many parameters\n" +"are hidden from the user in this mode.\n" +"ADVANCED mode will make available all parameters.\n" +"\n" +"To change the application LEVEL, go to:\n" +"Edit -> Preferences -> General and check:\n" +"'APP. LEVEL' radio button." +msgstr "" +"Modul Baza este potrivit pt incepatori. Multi parametri sunt\n" +"ascunsi de user in acest mod.\n" +"Modul Avansat face disponibili toti parametrii programului.\n" +"\n" +"Pt a schimba modul de lucru al aplicatiei mergi in:\n" +"Edit -> Preferințe -> General și bifează:\n" +"butonul radio: >Nivel App<" + +#: flatcamGUI/ObjectUI.py:79 +msgid "Scale:" +msgstr "Scalează:" + +#: flatcamGUI/ObjectUI.py:81 +msgid "Change the size of the object." +msgstr "Schimba dimensiunea obiectului." + +#: flatcamGUI/ObjectUI.py:89 +msgid "Factor:" +msgstr "Factor:" + +#: flatcamGUI/ObjectUI.py:91 +msgid "" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" +"Factor cu care se multiplica \n" +"caracteristicile geometrice ale\n" +"acestui obiect." + +#: flatcamGUI/ObjectUI.py:102 +msgid "Perform scaling operation." +msgstr "Efectuează operatia de scalare." + +#: flatcamGUI/ObjectUI.py:108 +msgid "Offset:" +msgstr "Ofset:" + +#: flatcamGUI/ObjectUI.py:110 +msgid "Change the position of this object." +msgstr "Schimba poziţia acestui obiect." + +#: flatcamGUI/ObjectUI.py:117 +msgid "Vector:" +msgstr "Vector:" + +#: flatcamGUI/ObjectUI.py:119 +msgid "" +"Amount by which to move the object\n" +"in the x and y axes in (x, y) format." +msgstr "" +"Valoare cu cat să se deplaseze obiectul\n" +"pe axele X și /sau Y in formatul (x,y)." + +#: flatcamGUI/ObjectUI.py:129 +msgid "Perform the offset operation." +msgstr "Efectuează operatia de Ofset." + +#: flatcamGUI/ObjectUI.py:143 +msgid "Gerber Object" +msgstr "Obiect Gerber" + +#: flatcamGUI/ObjectUI.py:156 +msgid "Solid " +msgstr "Solid" + +#: flatcamGUI/ObjectUI.py:164 +msgid "M-Color " +msgstr "M-Color " + +#: flatcamGUI/ObjectUI.py:182 flatcamGUI/ObjectUI.py:588 +#: flatcamGUI/ObjectUI.py:907 flatcamGUI/ObjectUI.py:1437 +msgid "Name:" +msgstr "Nume:" + +#: flatcamGUI/ObjectUI.py:192 +msgid "Apertures:" +msgstr "Aperturi:" + +#: flatcamGUI/ObjectUI.py:194 +msgid "Apertures Table for the Gerber Object." +msgstr "Tabela de aperturi pt obiectul Gerber." + +#: flatcamGUI/ObjectUI.py:203 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"Comuta afișarea tabelei de aperturi Gerber.\n" +"Când se debifează, toate marcajele aperturilor\n" +"care sutn curent afisate, vor fi sterse." + +#: flatcamGUI/ObjectUI.py:214 +msgid "Mark All" +msgstr "Marc. Toate" + +#: flatcamGUI/ObjectUI.py:216 +msgid "" +"When checked it will display all the apertures.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" +"Când este bifat se vor afisa toate aperturile.\n" +"Când este debifat se vor sterge toate marcajele de aperturi." + +#: flatcamGUI/ObjectUI.py:228 +msgid "Code" +msgstr "Cod" + +#: flatcamGUI/ObjectUI.py:228 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 +msgid "Type" +msgstr "Tip" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Size" +msgstr "Dimens." + +#: flatcamGUI/ObjectUI.py:228 +msgid "Dim" +msgstr "Dim" + +#: flatcamGUI/ObjectUI.py:232 +msgid "Index" +msgstr "Index" + +#: flatcamGUI/ObjectUI.py:234 +msgid "Aperture Code" +msgstr "Cod" + +#: flatcamGUI/ObjectUI.py:236 +msgid "Type of aperture: circular, rectangle, macros etc" +msgstr "" +"Tipul aperturilor:\n" +"- circular\n" +"- patrulater\n" +"- macro-uri\n" +"etc" + +#: flatcamGUI/ObjectUI.py:238 +msgid "Aperture Size:" +msgstr "Dim. aper." + +#: flatcamGUI/ObjectUI.py:240 +msgid "" +"Aperture Dimensions:\n" +" - (width, height) for R, O type.\n" +" - (dia, nVertices) for P type" +msgstr "" +"Dimensiunile aperturilor:\n" +"- (latime, inaltime) pt tipurile R, O.\n" +"- (diametru, nVertices) pt tipul P" + +#: flatcamGUI/ObjectUI.py:244 +msgid "Mark the aperture instances on canvas." +msgstr "Marchează aperturile pe canvas." + +#: flatcamGUI/ObjectUI.py:252 +msgid "Scale Factor:" +msgstr "Factor scalare:" + +#: flatcamGUI/ObjectUI.py:267 +msgid "Perform scaling operation on the selected apertures." +msgstr "Efectuează operatia de scalare pt aperturile selectate." + +#: flatcamGUI/ObjectUI.py:273 +msgid "Buffer Factor:" +msgstr "Factor bufer:" + +#: flatcamGUI/ObjectUI.py:286 +msgid "Buffer" +msgstr "Bufer" + +#: flatcamGUI/ObjectUI.py:288 +msgid "Perform buffer operation on the selected apertures." +msgstr "Efectuează operatia de bufer pt aperturile selectate." + +#: flatcamGUI/ObjectUI.py:296 +msgid "Generate new Gerber Object:" +msgstr "Crează un nou obiect Gerber::" + +#: flatcamGUI/ObjectUI.py:298 +msgid "Will generate a new Gerber object from the changed apertures." +msgstr "Va crea un nou obiect tip Gerber din aperturile modificate." + +#: flatcamGUI/ObjectUI.py:304 +msgid "Go" +msgstr "Fă!" + +#: flatcamGUI/ObjectUI.py:306 +msgid "" +"Will generate a new Gerber object from the changed apertures.\n" +"This new object can then be isolated etc." +msgstr "" +"Va genera un nou obiect Gerber din aperturile modificate.\n" +"Acest nou obiect poate fi izolat etc." + +#: flatcamGUI/ObjectUI.py:333 +msgid "" +"Diameter of the cutting tool.\n" +"If you want to have an isolation path\n" +"inside the actual shape of the Gerber\n" +"feature, use a negative value for\n" +"this parameter." +msgstr "" +"Diametrul uneltei taietoare.\n" +"Daca se doreste să se aibă o trecere de izolatie\n" +"in interiorul poligonului Gerber (traseu), foloseşte\n" +"o valoare negativă pt acest parametru." + +#: flatcamGUI/ObjectUI.py:344 +msgid "Passes:" +msgstr "Treceri:" + +#: flatcamGUI/ObjectUI.py:378 +msgid "Combine" +msgstr "Combina" + +#: flatcamGUI/ObjectUI.py:394 +msgid "Generate Isolation Geometry:" +msgstr "Creează Geometrie de Izolare:" + +#: flatcamGUI/ObjectUI.py:396 +msgid "" +"Create a Geometry object with toolpaths to cut \n" +"isolation outside, inside or on both sides of the\n" +"object. For a Gerber object outside means outside\n" +"of the Gerber feature and inside means inside of\n" +"the Gerber feature, if possible at all. This means\n" +"that only if the Gerber feature has openings inside, they\n" +"will be isolated. If what is wanted is to cut isolation\n" +"inside the actual Gerber feature, use a negative tool\n" +"diameter above." +msgstr "" +"Crează un obiect Geometrie cu treceri taietoare pentru\n" +"a efectua o izolare in afară, in interior sau pe ambele parti\n" +"ale obiectului.\n" +"Pt un Gerber >in afară< inseamna in exteriorul elem. Gerber\n" +"(traseu, zona etc) iar >in interior< inseamna efectiv in interiorul\n" +"acelui elem. Gerber (daca poate fi posibil)." + +#: flatcamGUI/ObjectUI.py:415 +msgid "FULL Geo" +msgstr "Geo Full" + +#: flatcamGUI/ObjectUI.py:417 +msgid "" +"Create the Geometry Object\n" +"for isolation routing. It contains both\n" +"the interiors and exteriors geometry." +msgstr "" +"Crează un obiect Geometrie pt izolare.\n" +"Contine atat geometriile exterioare cat și\n" +"pe cele interioare." + +#: flatcamGUI/ObjectUI.py:426 +msgid "Ext Geo" +msgstr "Geo Ext" + +#: flatcamGUI/ObjectUI.py:428 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the exteriors geometry." +msgstr "" +"Crează obiectul Geometrie\n" +"pt izolare conținând doar\n" +"geometriile de exterior." + +#: flatcamGUI/ObjectUI.py:435 +msgid "Int Geo" +msgstr "Geo Int" + +#: flatcamGUI/ObjectUI.py:437 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the interiors geometry." +msgstr "" +"Crează obiectul Geometrie\n" +"pt izolare conținând doar\n" +"geometriile de interior." + +#: flatcamGUI/ObjectUI.py:455 +msgid "Clear N-copper:" +msgstr "Curăță Non-Cu:" + +#: flatcamGUI/ObjectUI.py:465 flatcamTools/ToolNonCopperClear.py:239 +msgid "" +"Create the Geometry Object\n" +"for non-copper routing." +msgstr "" +"Crează un obiect Geometrie\n" +"pt rutare non-cupru (adica pt\n" +"curățare zone de cupru)." + +#: flatcamGUI/ObjectUI.py:471 +msgid "Board cutout:" +msgstr "Decupare PCB:" + +#: flatcamGUI/ObjectUI.py:479 +msgid "Cutout Tool" +msgstr "Unealta Decupare" + +#: flatcamGUI/ObjectUI.py:481 +msgid "" +"Generate the geometry for\n" +"the board cutout." +msgstr "" +"Generează un obiect Geometrie\n" +"pt decuparea PCB." + +#: flatcamGUI/ObjectUI.py:487 +msgid "Non-copper regions:" +msgstr "Regiuni fără Cu.:" + +#: flatcamGUI/ObjectUI.py:489 +msgid "" +"Create polygons covering the\n" +"areas without copper on the PCB.\n" +"Equivalent to the inverse of this\n" +"object. Can be used to remove all\n" +"copper from a specified region." +msgstr "" +"Crează poligoane acopering zonele fără\n" +"cupru de pe PCB. Echivalent cu inversul\n" +"obiectului sursa. Poate fi folosit pt a indeparta\n" +"cuprul din zona specificata." + +#: flatcamGUI/ObjectUI.py:514 flatcamGUI/ObjectUI.py:545 +msgid "Rounded Geo" +msgstr "Geo rotunjita" + +#: flatcamGUI/ObjectUI.py:516 +msgid "Resulting geometry will have rounded corners." +msgstr "" +"Obiectul Geometrie rezultat \n" +"va avea colțurile rotunjite." + +#: flatcamGUI/ObjectUI.py:521 flatcamGUI/ObjectUI.py:555 +#: flatcamTools/ToolCutOut.py:159 flatcamTools/ToolCutOut.py:179 +#: flatcamTools/ToolCutOut.py:230 flatcamTools/ToolSolderPaste.py:127 +msgid "Generate Geo" +msgstr "Crează Geo" + +#: flatcamGUI/ObjectUI.py:527 +msgid "" +"Create a geometry surrounding the Gerber object.\n" +"Square shape." +msgstr "" +"Generează un obiect tip Geometrie care va inconjura\n" +"obiectul Gerber. Forma patratica (rectangulara)." + +#: flatcamGUI/ObjectUI.py:557 +msgid "Generate the Geometry object." +msgstr "Generează obiectul Geometrie." + +#: flatcamGUI/ObjectUI.py:568 +msgid "Excellon Object" +msgstr "Obiect Excellon" + +#: flatcamGUI/ObjectUI.py:579 +msgid "Solid circles." +msgstr "Cercuri solide." + +#: flatcamGUI/ObjectUI.py:607 flatcamGUI/ObjectUI.py:926 +msgid "Tools Table" +msgstr "Tabela Unelte" + +#: flatcamGUI/ObjectUI.py:628 +msgid "Offset Z" +msgstr "Ofset Z:" + +#: flatcamGUI/ObjectUI.py:632 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn in the Machine Code." +msgstr "" +"Acesta este numărul uneltei.\n" +"Când se foloseşte optiunea de pauza pt schimb unealta,\n" +"la evenim. de schimb unealta, va aparea sub forma T1, T2, etc\n" +"in codul masina CNC." + +#: flatcamGUI/ObjectUI.py:636 flatcamGUI/ObjectUI.py:972 +#: flatcamTools/ToolNonCopperClear.py:96 flatcamTools/ToolPaint.py:94 +msgid "" +"Tool Diameter. It's value (in current FlatCAM units) \n" +"is the cut width into the material." +msgstr "" +"Diametrul uneltei. Valoarea să (in unitati curente)\n" +"reprezinta lăţimea taieturii in material." + +#: flatcamGUI/ObjectUI.py:639 +msgid "" +"The number of Drill holes. Holes that are drilled with\n" +"a drill bit." +msgstr "" +"Numărul de găuri. Sunt găuri efectuate prin\n" +"operatii de găurire efectuate cu un burghiu." + +#: flatcamGUI/ObjectUI.py:642 +msgid "" +"The number of Slot holes. Holes that are created by\n" +"milling them with an endmill bit." +msgstr "" +"Numărul de sloturi. Sunt găuri efectuate\n" +"prin op. de frezare cu o freza." + +#: flatcamGUI/ObjectUI.py:649 +msgid "Toggle display of the drills for the current tool." +msgstr "Comuta afișarea găurilor pt unealta curentă." + +#: flatcamGUI/ObjectUI.py:657 +msgid "" +"Create a CNC Job object\n" +"for this drill object." +msgstr "" +"Crează un obiect CNCJob din\n" +"acest obiect." + +#: flatcamGUI/ObjectUI.py:686 flatcamGUI/ObjectUI.py:1186 +msgid "Tool change" +msgstr "Schimb unealta" + +#: flatcamGUI/ObjectUI.py:694 flatcamGUI/ObjectUI.py:1179 +msgid "Tool change Z:" +msgstr "Z schimb unealta:" + +#: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1182 +msgid "" +"Z-axis position (height) for\n" +"tool change." +msgstr "Înălţimea, pe axa Z, pentru schimbul uneltei." + +#: flatcamGUI/ObjectUI.py:707 +msgid "" +"Tool height just before starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" +"Înălţimea uneltei la inceputul lucrului.\n" +"Seterge aceasta valoare daca nu este folosita." + +#: flatcamGUI/ObjectUI.py:717 +msgid "" +"Z-axis position (height) for\n" +"the last move." +msgstr "Înălţimea, pe axa Z, la finalul lucrului." + +#: flatcamGUI/ObjectUI.py:725 +msgid "Feedrate (Plunge):" +msgstr "Feedrate (Plonjare):" + +#: flatcamGUI/ObjectUI.py:727 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for linear move G01." +msgstr "" +"Viteza uneltei când se face găuriea\n" +"(in unitati pe minut).\n" +"Aceasta este miscarea lineara G01." + +#: flatcamGUI/ObjectUI.py:777 +msgid "" +"The json file that dictates\n" +"gcode output." +msgstr "" +"Fişierul care dictează codul G-Code \n" +"generat. In format JSON." + +#: flatcamGUI/ObjectUI.py:809 +msgid "" +"Select from the Tools Table above\n" +"the tools you want to include." +msgstr "" +"Selectează din Tabela de Unelte de mai sus,\n" +"uneltele care trebuie incluse." + +#: flatcamGUI/ObjectUI.py:816 +msgid "Type: " +msgstr "Tip:" + +#: flatcamGUI/ObjectUI.py:818 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to a series of drills." +msgstr "" +"Alege ce să folosești pentru generarea de G-Code:\n" +"- Găuri\n" +"- Sloturi\n" +"- Ambele\n" +"Când se alege >Sloturi< sau >Ambele<, sloturile\n" +"vor fi convertite intr-o serie de găuriri." + +#: flatcamGUI/ObjectUI.py:833 +msgid "Create GCode" +msgstr "Crează GCode" + +#: flatcamGUI/ObjectUI.py:835 +msgid "Generate the CNC Job." +msgstr "Generează un obiect CNCJob." + +#: flatcamGUI/ObjectUI.py:847 +msgid "" +"Select from the Tools Table above\n" +" the hole dias that are to be milled." +msgstr "" +"Selecteaa din Tabela de Unelte de mai sus\n" +"acele găuri care vor fi frezate." + +#: flatcamGUI/ObjectUI.py:854 +msgid "Drills Tool dia:" +msgstr "Dia. Burghiu:" + +#: flatcamGUI/ObjectUI.py:861 +msgid "Mill Drills Geo" +msgstr "Geo pt frezare găuri" + +#: flatcamGUI/ObjectUI.py:863 +msgid "" +"Create the Geometry Object\n" +"for milling DRILLS toolpaths." +msgstr "" +"Crează un obiect tip Geometrie pt.\n" +"frezarea rutelor create din Găuri." + +#: flatcamGUI/ObjectUI.py:870 +msgid "Slots Tool dia:" +msgstr "Dia freza:" + +#: flatcamGUI/ObjectUI.py:877 +msgid "Mill Slots Geo" +msgstr "Geo pt. frezare sloturi" + +#: flatcamGUI/ObjectUI.py:879 +msgid "" +"Create the Geometry Object\n" +"for milling SLOTS toolpaths." +msgstr "" +"Crează un obiect tip Geometrie pt.\n" +"frezarea rutelor create din Sloturi." + +#: flatcamGUI/ObjectUI.py:897 +msgid "Geometry Object" +msgstr "Obiect Geometrie" + +#: flatcamGUI/ObjectUI.py:928 +msgid "" +"Tools in this Geometry object used for cutting.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V). \n" +"When V-shaped is selected the 'Type' entry is automatically \n" +"set to Isolation, the CutZ parameter in the UI form is\n" +"grayed out and Cut Z is automatically calculated from the newly \n" +"showed UI form entries named V-Tip Dia and V-Tip Angle." +msgstr "" +"Uneltele din acest obiect Geometrie folosit pentru tăiere.\n" +"Intrarea >Ofset< va seta un ofset pentru tăiere.\n" +"Acesta poate fi Inauntru, In afară, Pe cale și Personalizat.\n" +"Intrarea >Tip< este doar informativa și permite să stim intentia\n" +"pentru care folosim unealta aleasa.\n" +"Poate să fie Grosier, Finisare și Izolatie.\n" +"Intrarea >Tip unealta< (TU) poate fi: Circular (cu unul sau mai\n" +"multi dinti C1 ...C4), rotunda (B) sau cu vârf V-Shape (V).\n" +"\n" +"Când V-shape este selectat atunci și >Tip< este automat setat \n" +"in 'Izolare', prametrul >Z tăiere< din UI este dezactivat (gri) pt că\n" +"este acum calculat automat din doi noi parametri care sunt afisati:\n" +"- V-Dia \n" +"- V-unghi" + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "Dia" +msgstr "Dia" + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "TT" +msgstr "TU" + +#: flatcamGUI/ObjectUI.py:966 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn" +msgstr "" +"Acesta este numărul uneltei.\n" +"Când se foloseşte optiunea de pauza pt schimb unealta,\n" +"la evenim. de schimb unealta, va aparea sub forma T1, T2, etc\n" +"in codul masina CNC." + +#: flatcamGUI/ObjectUI.py:977 +msgid "" +"The value for the Offset can be:\n" +"- Path -> There is no offset, the tool cut will be done through the geometry " +"line.\n" +"- In(side) -> The tool cut will follow the geometry inside. It will create a " +"'pocket'.\n" +"- Out(side) -> The tool cut will follow the geometry line on the outside." +msgstr "" +"Valorile pt Ofset pot fi:\n" +"- Pe cale -> Ofsetul este zero, tăietura va fi efectuatat pe linia " +"geometrică\n" +"- În(ăuntru) -> Tăietura va urma geometria pe interior. Va crea un " +"'buzunar'\n" +"- Afară-> Tăietura va urma geometria pe exterior" + +#: flatcamGUI/ObjectUI.py:984 +msgid "" +"The (Operation) Type has only informative value. Usually the UI form " +"values \n" +"are choosed based on the operation type and this will serve as a reminder.\n" +"Can be 'Roughing', 'Finishing' or 'Isolation'.\n" +"For Roughing we may choose a lower Feedrate and multiDepth cut.\n" +"For Finishing we may choose a higher Feedrate, without multiDepth.\n" +"For Isolation we need a lower Feedrate as it use a milling bit with a fine " +"tip." +msgstr "" +"Tipul (operatiei efectuate cu unealta) are doar o valoare informativa. De " +"obicei\n" +"valorile din UI sunt alese bazate pe tipul operatiei și acesta ne serveste " +"ca și\n" +"notificare. Poate să fie: Grosier, Finisare sau Izolare.\n" +"Grosier -> putem alege de ex un feedrate scazut și tăiere in mai multe " +"etape.\n" +"Finisare -> alegem un feedrate mai mare și tăiere dintr-o singura operatie\n" +"Izolare -> avem nevoie de un feedrate scazut pt ca se foloseşte o freza cu " +"un\n" +"vârf fin, ascutit." + +#: flatcamGUI/ObjectUI.py:993 +msgid "" +"The Tool Type (TT) can be:\n" +"- Circular with 1 ... 4 teeth -> it is informative only. Being circular the " +"cut width in material\n" +"is exactly the tool diameter.\n" +"- Ball -> informative only and make reference to the Ball type endmill.\n" +"- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable " +"two additional UI form\n" +"fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust " +"the Z-Cut parameter such\n" +"as the cut width into material will be equal with the value in the Tool " +"Diameter column of this table.\n" +"Choosing the V-Shape Tool Type automatically will select the Operation Type " +"as Isolation." +msgstr "" +"Tipul Uneltei (TU) poate fi:\n" +"- Circular cu 1 ... 4 dinti -> are aspect informativ. Lăţimea de tăiere este " +"exact diametrul uneltei.\n" +"- Rotund (ball) -> val. informativa și face referinţă la tipul de freza " +"Ball\n" +"- V-Shape -> produce modificari in UI. Va dezactiva parametrul >Z tăiere< " +"deoarece acesta va fi\n" +"calculat automat din valorile >V-dia< și >V-unghi, parametri care sunt acum " +"afisati in UI, cat și din\n" +"lăţimea de tăiere in material care este de fapt valoarea diametrului " +"uneltei.\n" +"Alegerea tipului V-Shape (forma in V) va selecta automat Tipul de Operatie " +"ca Izolare." + +#: flatcamGUI/ObjectUI.py:1004 +msgid "" +"Plot column. It is visible only for MultiGeo geometries, meaning geometries " +"that holds the geometry\n" +"data into the tools. For those geometries, deleting the tool will delete the " +"geometry data also,\n" +"so be WARNED. From the checkboxes on each row it can be enabled/disabled the " +"plot on canvas\n" +"for the corresponding tool." +msgstr "" +"Coloana de afișare. Este vizibila doar pentru obiecte Geometrie de tip " +"MultiGeo, ceea ce inseamna că\n" +"obiectul stochează datele geometrice in variabilele unelte. \n" +"\n" +"ATENTIE: Pentru aceste obiecte, stergerea unei unelte conduce automat și la " +"stergerea \n" +"datelor geometrice asociate. Din checkbox-urile asociate, fiecarei unelte i " +"se poate activa/dezactiva\n" +"afișarea in canvas." + +#: flatcamGUI/ObjectUI.py:1017 +msgid "Tool Offset:" +msgstr "Ofset unealta:" + +#: flatcamGUI/ObjectUI.py:1020 +msgid "" +"The value to offset the cut when \n" +"the Offset type selected is 'Offset'.\n" +"The value can be positive for 'outside'\n" +"cut and negative for 'inside' cut." +msgstr "" +"Valoarea cu care se face ofset când tipul de ofset selectat\n" +"este >Ofset<. Aceasta valoare poate fi pozitivă pentru un ofset\n" +"in exterior sau poate fi negativă pentru un ofset in interior." + +#: flatcamGUI/ObjectUI.py:1043 +msgid "Tool Dia:" +msgstr "Dia unealta:" + +#: flatcamGUI/ObjectUI.py:1062 flatcamTools/ToolNonCopperClear.py:135 +#: flatcamTools/ToolPaint.py:133 +msgid "" +"Add a new tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" +"Adaugă o noua unelata in Tabela de Unelte,\n" +"cu diametrul specificat mai sus." + +#: flatcamGUI/ObjectUI.py:1070 +msgid "" +"Copy a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" +"Copiaza o selecţie de unelte in Tabela de Unelte prin\n" +"selectarea unei linii (sau mai multe) in Tabela de Unelte." + +#: flatcamGUI/ObjectUI.py:1078 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" +"Sterge o selecţie de unelte in Tabela de Unelte prin\n" +"selectarea unei linii (sau mai multe) in Tabela de Unelte." + +#: flatcamGUI/ObjectUI.py:1094 +msgid "Tool Data" +msgstr "Date Unealta" + +#: flatcamGUI/ObjectUI.py:1097 +msgid "" +"The data used for creating GCode.\n" +"Each tool store it's own set of such data." +msgstr "" +"Datele folosite pentru crearea codului GCode.\n" +"Fiecare unealta stochează un subset de asemenea date." + +#: flatcamGUI/ObjectUI.py:1107 +msgid "V-Tip Dia:" +msgstr "V-dia:" + +#: flatcamGUI/ObjectUI.py:1110 +msgid "The tip diameter for V-Shape Tool" +msgstr "" +"Diametrul la vârf al uneltei tip V-Shape.\n" +"Forma in V." + +#: flatcamGUI/ObjectUI.py:1118 +msgid "V-Tip Angle:" +msgstr "V-unghi:" + +#: flatcamGUI/ObjectUI.py:1121 +msgid "" +"The tip angle for V-Shape Tool.\n" +"In degree." +msgstr "" +"Unghiul la vârf pentru unealta tip V-Shape. \n" +"In grade." + +#: flatcamGUI/ObjectUI.py:1142 +msgid "Multi-Depth:" +msgstr "Multi-Pas:" + +#: flatcamGUI/ObjectUI.py:1145 +msgid "" +"Use multiple passes to limit\n" +"the cut depth in each pass. Will\n" +"cut multiple times until Cut Z is\n" +"reached.\n" +"To the right, input the depth of \n" +"each pass (positive value)." +msgstr "" +"Foloseşte multiple treceri, rute, pentru\n" +"a limita adâncimea de tăiere pentru fiecare\n" +"trecere. Se va taie de multiple ori pana când\n" +"este atinsa valoarea param. >Z tăiere<.\n" +"In dreapta, introdu adâncimea de tăiere\n" +"pentru fiecare trecere (valoare pozitivă)." + +#: flatcamGUI/ObjectUI.py:1158 +msgid "Depth of each pass (positive)." +msgstr "" +"Adâncimea pentru fiecare trecere.\n" +"Valoare pozitivă, in unitatile curente." + +#: flatcamGUI/ObjectUI.py:1189 +msgid "" +"Include tool-change sequence\n" +"in the Machine Code (Pause for tool change)." +msgstr "" +"Include o secventa de schimb unealta in \n" +"codul masina CNC. O pauza pentru schimbul\n" +"uneltei (M6)." + +#: flatcamGUI/ObjectUI.py:1215 +msgid "" +"This is the height (Z) at which the CNC\n" +"will go as the last move." +msgstr "" +"Aceasta este înălţimea Z, la care CNC-ul \n" +"va fi parcat la finalul de lucru." + +#: flatcamGUI/ObjectUI.py:1236 +msgid "Feed Rate Z (Plunge):" +msgstr "Feedrate Z (Plonjare):" + +#: flatcamGUI/ObjectUI.py:1239 +msgid "" +"Cutting speed in the Z\n" +"plane in units per minute" +msgstr "" +"Viteza de tăiere in planul Z.\n" +"In unitati pe minut." + +#: flatcamGUI/ObjectUI.py:1248 +msgid "Feed Rate Rapids:" +msgstr "Feedrate rapizi:" + +#: flatcamGUI/ObjectUI.py:1251 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" +"Viteza de găurire, in unitati pe minut.\n" +"Corespunde comenzii G0 și este utila doar pentru\n" +"printerul 3D Marlin, implicit când se foloseşte fişierul\n" +"postprocesor: Marlin. Ignora aceasta parametru in rest." + +#: flatcamGUI/ObjectUI.py:1264 +msgid "Cut over 1st pt" +msgstr "Re-tăiere 1-ul pt." + +#: flatcamGUI/ObjectUI.py:1279 +msgid "" +"Speed of the spindle in RPM (optional).\n" +"If LASER postprocessor is used,\n" +"this value is the power of laser." +msgstr "" +"Viteza motorului in RPM (optional).\n" +"Daca postprocesorul Laser este folosit,\n" +"valoarea să este puterea laserului." + +#: flatcamGUI/ObjectUI.py:1308 +msgid "PostProcessor:" +msgstr "Postprocesor:" + +#: flatcamGUI/ObjectUI.py:1311 +msgid "" +"The Postprocessor file that dictates\n" +"the Machine Code (like GCode, RML, HPGL) output." +msgstr "" +"Fişierul postprocesor care controlează generarea\n" +"codului masina CNC (GCode, RML, HPGL) care \n" +"mai apoi este salvat." + +#: flatcamGUI/ObjectUI.py:1349 +msgid "" +"Add at least one tool in the tool-table.\n" +"Click the header to select all, or Ctrl + LMB\n" +"for custom selection of tools." +msgstr "" +"Adaugă cel putin o unealta in Tabela de Unelte.\n" +"Click pe header pentru selectarea tuturora asu CTRL + LMB click\n" +"pentru o selecţie personalizata de unelte." + +#: flatcamGUI/ObjectUI.py:1356 +msgid "Generate" +msgstr "Generează" + +#: flatcamGUI/ObjectUI.py:1359 +msgid "Generate the CNC Job object." +msgstr "Generează un obiect CNCJob." + +#: flatcamGUI/ObjectUI.py:1367 +msgid "Paint Area:" +msgstr "Unealta Paint" + +#: flatcamGUI/ObjectUI.py:1382 +msgid "Launch Paint Tool in Tools Tab." +msgstr "" +"Lansează unealta FlatCAM numita Paint și\n" +"o instalează in Tab-ul Unealta." + +#: flatcamGUI/ObjectUI.py:1399 +msgid "CNC Job Object" +msgstr "Obiect CNCJob" + +#: flatcamGUI/ObjectUI.py:1418 +msgid "Plot kind:" +msgstr "Afișare:" + +#: flatcamGUI/ObjectUI.py:1443 +msgid "Travelled dist.:" +msgstr "Distanta:" + +#: flatcamGUI/ObjectUI.py:1446 flatcamGUI/ObjectUI.py:1453 +msgid "" +"This is the total travelled distance on X-Y plane.\n" +"In current units." +msgstr "" +"Aceasta este distanta totala parcursa in planul X-Y.\n" +"In unitatile curente." + +#: flatcamGUI/ObjectUI.py:1481 +msgid "CNC Tools Table" +msgstr "Tabela Unelte CNC" + +#: flatcamGUI/ObjectUI.py:1484 +msgid "" +"Tools in this CNCJob object used for cutting.\n" +"The tool diameter is used for plotting on canvas.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V)." +msgstr "" +"Unelete folosite in acest obiect CNCJob pentru tăiere.\n" +"Diametrul uneltei este folosit pentru afișarea pe canvas.\n" +"Coloanele sunt:\n" +"- 'Ofset' -> poate fi in interior, in exterior, pe cale sau personalizat.\n" +"- 'Tipul' -> este doar informativ și poate fi: Grosier, Finisaj, Izolatie\n" +"- 'Tipul uneltei' -> poate fi circular cu 1 ... 4 dinti, tip bila sau V-" +"Shape\n" +"(cu forma in V)." + +#: flatcamGUI/ObjectUI.py:1518 +msgid "P" +msgstr "P" + +#: flatcamGUI/ObjectUI.py:1524 +msgid "Update Plot" +msgstr "Actualiz. afișare" + +#: flatcamGUI/ObjectUI.py:1526 +msgid "Update the plot." +msgstr "Actualizează afișarea obiectelor." + +#: flatcamGUI/ObjectUI.py:1533 +msgid "Export CNC Code:" +msgstr "Exporta codul masina CNC:" + +#: flatcamGUI/ObjectUI.py:1541 +msgid "Prepend to CNC Code:" +msgstr "Adaugă la inceput in codul G-Code:" + +#: flatcamGUI/ObjectUI.py:1544 +msgid "" +"Type here any G-Code commands you would\n" +"like to add to the beginning of the generated file." +msgstr "" +"Plasează aici acele comenzi GCode care se doreste să fie\n" +"adaugate la inceputul codului masina CNC." + +#: flatcamGUI/ObjectUI.py:1554 +msgid "Append to CNC Code" +msgstr "Adaugă la sfarsit in codul G-Code:" + +#: flatcamGUI/ObjectUI.py:1578 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro.\n" +"The FlatCAM variables are surrounded by '%' symbol.\n" +"\n" +"WARNING: it can be used only with a postprocessor file\n" +"that has 'toolchange_custom' in it's name and this is built\n" +"having as template the 'Toolchange Custom' posprocessor file." +msgstr "" +"Plasează aici acele comenzi G-Code care se doreste să fie executate\n" +"atunci când evenimentul de tip Schimb Unealta este intalnit.\n" +"Aceasta va constitui un Macro pentru schimbare unealta.\n" +"Variabilele FlatCAM folosite aici sunt inconjurate de simbolul %.\n" +"\n" +"ATENTIE:\n" +"poate fi folosit doar cu un fişier postprocesor care contine " +"'toolchange_custom'\n" +"in numele sau." + +#: flatcamGUI/ObjectUI.py:1634 +msgid "z_cut = depth where to cut" +msgstr "z_cut = adâncimea de tăiere" + +#: flatcamGUI/ObjectUI.py:1635 +msgid "z_move = height where to travel" +msgstr "z_move = Înălţimea deplasare" + +#: flatcamGUI/ObjectUI.py:1656 +msgid "View CNC Code" +msgstr "Vizualiz. codul CNC" + +#: flatcamGUI/ObjectUI.py:1659 +msgid "" +"Opens TAB to view/modify/print G-Code\n" +"file." +msgstr "" +"Deschide un nou tab pentru a vizualiza, modifica\n" +"sau tipari codul G-Code." + +#: flatcamGUI/ObjectUI.py:1665 +msgid "Save CNC Code" +msgstr "Salvează codul CNC" + +#: flatcamGUI/ObjectUI.py:1668 +msgid "" +"Opens dialog to save G-Code\n" +"file." +msgstr "" +"Deshide o fereastra dialog pentru salvarea codului\n" +"G-Code intr-un fişier." + +#: flatcamTools/ToolCalculators.py:24 +msgid "Calculators" +msgstr "Calculatoare" + +#: flatcamTools/ToolCalculators.py:25 +msgid "V-Shape Tool Calculator" +msgstr "Calculator Unealta V-Shape" + +#: flatcamTools/ToolCalculators.py:26 +msgid "Units Calculator" +msgstr "Calculator Unitati" + +#: flatcamTools/ToolCalculators.py:27 +msgid "ElectroPlating Calculator" +msgstr "Calculator ElectroPlacare" + +#: flatcamTools/ToolCalculators.py:68 +msgid "Here you enter the value to be converted from INCH to MM" +msgstr "Valorile pentru conversie din INCH in MM" + +#: flatcamTools/ToolCalculators.py:73 +msgid "Here you enter the value to be converted from MM to INCH" +msgstr "Valorile pentru conversie din MM in INCH" + +#: flatcamTools/ToolCalculators.py:98 +msgid "" +"This is the diameter of the tool tip.\n" +"The manufacturer specifies it." +msgstr "" +"Acesta este diametrul uneltei la vârf.\n" +"Producatorul il specifica in foaia de catalog." + +#: flatcamTools/ToolCalculators.py:101 +msgid "Tip Angle:" +msgstr "V-Unghi:" + +#: flatcamTools/ToolCalculators.py:105 +msgid "" +"This is the angle of the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" +"Acesta este unghiul uneltei la vârf.\n" +"Producatorul il specifica in foaia de catalog." + +#: flatcamTools/ToolCalculators.py:112 +msgid "" +"This is the depth to cut into the material.\n" +"In the CNCJob is the CutZ parameter." +msgstr "" +"Acest param. este adâncimea de tăiere in material.\n" +"In obiectul CNCJob este parametrul >Z tăiere<." + +#: flatcamTools/ToolCalculators.py:115 +msgid "Tool Diameter:" +msgstr "Dia unealta:" + +#: flatcamTools/ToolCalculators.py:119 +msgid "" +"This is the tool diameter to be entered into\n" +"FlatCAM Gerber section.\n" +"In the CNCJob section it is called >Tool dia<." +msgstr "" +"Acesta este diametrul uneltei care trebuie introdus in\n" +"sectiunea FlatCAM Gerber.\n" +"In sectiunea CNCJob este numit >Dia unealta<." + +#: flatcamTools/ToolCalculators.py:131 flatcamTools/ToolCalculators.py:214 +msgid "Calculate" +msgstr "Calculează" + +#: flatcamTools/ToolCalculators.py:134 +msgid "" +"Calculate either the Cut Z or the effective tool diameter,\n" +" depending on which is desired and which is known. " +msgstr "" +"Calculează ori valorea >Z tăiere< ori valoarea efectiva a diametrului " +"uneltei,\n" +"depinzand de care dintre acestea este cunoscuta." + +#: flatcamTools/ToolCalculators.py:190 +msgid "Current Value:" +msgstr "Intensitate:" + +#: flatcamTools/ToolCalculators.py:194 +msgid "" +"This is the current intensity value\n" +"to be set on the Power Supply. In Amps." +msgstr "" +"Intensitatea curentului electric care se va seta\n" +"in sursa de alimentare. In Amperi." + +#: flatcamTools/ToolCalculators.py:198 +msgid "Time:" +msgstr "Durata:" + +#: flatcamTools/ToolCalculators.py:202 +msgid "" +"This is the calculated time required for the procedure.\n" +"In minutes." +msgstr "" +"TImpul necesar (calculat) pentru\n" +"efectuarea procedurii. In minute." + +#: flatcamTools/ToolCalculators.py:217 +msgid "" +"Calculate the current intensity value and the procedure time,\n" +" depending on the parameters above" +msgstr "" +"Calculează intensitatea curentului cat și durata procedurii\n" +"in functie de parametrii de mai sus." + +#: flatcamTools/ToolCutOut.py:17 +msgid "Cutout PCB" +msgstr "Decupare PCB" + +#: flatcamTools/ToolCutOut.py:53 +msgid "Obj Type:" +msgstr "Tip obiect:" + +#: flatcamTools/ToolCutOut.py:55 +msgid "" +"Specify the type of object to be cutout.\n" +"It can be of type: Gerber or Geometry.\n" +"What is selected here will dictate the kind\n" +"of objects that will populate the 'Object' combobox." +msgstr "" +"Specifica obiectul care va fi decupat.\n" +"Poate fi de tip: Gerber sau Geometrie.\n" +"Ce se va selecta aici va controla tipul de \n" +"obiecte care vor aparea in combobox-ul\n" +"numit >Obiect<." + +#: flatcamTools/ToolCutOut.py:69 flatcamTools/ToolPanelize.py:71 +msgid "Object:" +msgstr "Obiect:" + +#: flatcamTools/ToolCutOut.py:71 +msgid "Object to be cutout. " +msgstr "Obiectul FlatCAM care va fi decupat." + +#: flatcamTools/ToolCutOut.py:79 +msgid "" +"Diameter of the tool used to cutout\n" +"the PCB shape out of the surrounding material." +msgstr "" +"Diametrul uneltei folosita pt decuparea\n" +"PCB-ului din materialului inconjurator." + +#: flatcamTools/ToolCutOut.py:88 +msgid "" +"Margin over bounds. A positive value here\n" +"will make the cutout of the PCB further from\n" +"the actual PCB border" +msgstr "" +"Marginea (zona de siguranta). O val. pozitivă\n" +"va face decuparea distantat cu aceasta valoare \n" +"fata de PCB-ul efectiv." + +#: flatcamTools/ToolCutOut.py:98 +msgid "" +"The size of the bridge gaps in the cutout\n" +"used to keep the board connected to\n" +"the surrounding material (the one \n" +"from which the PCB is cutout)." +msgstr "" +"Dimenisunea punţilor in decupaj care servesc\n" +"in a mentine atasat PCB-ul la materialul de unde \n" +"este decupat." + +#: flatcamTools/ToolCutOut.py:114 +msgid "A. Automatic Bridge Gaps" +msgstr "A. Punţi realiz. automat" + +#: flatcamTools/ToolCutOut.py:116 +msgid "This section handle creation of automatic bridge gaps." +msgstr "" +"Aceasta sectiune va permite crearea in mod automat\n" +"a pana la 8 punţi." + +#: flatcamTools/ToolCutOut.py:127 +msgid "" +"Number of gaps used for the Automatic cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" +"Numărul de punţi folosite in decupare.\n" +"Pot fi un număr maxim de 8 punţi aranjate in felul\n" +"urmator:\n" +"- lr = stânga -dreapta\n" +"- tb = sus - jos\n" +"- 4 = stânga -dreapta - sus - jos\n" +"- 2lr = 2* stânga - 2* dreapta\n" +"- 2tb = 2* sus - 2* jos\n" +"- 8 = 2* stânga - 2* dreapta - 2* sus - 2* jos" + +#: flatcamTools/ToolCutOut.py:150 +msgid "FreeForm:" +msgstr "Forma libera:" + +#: flatcamTools/ToolCutOut.py:152 +msgid "" +"The cutout shape can be of ny shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" +"Decupajul poate avea orice forma.\n" +"Folositor când PCB-ul are o forma neregulata." + +#: flatcamTools/ToolCutOut.py:161 +msgid "" +"Cutout the selected object.\n" +"The cutout shape can be of any shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" +"Decupează obiectul selectat.\n" +"Forma decupajului poate avea orice forma.\n" +"Folositor când PCB-ul are o forma neregulata." + +#: flatcamTools/ToolCutOut.py:170 +msgid "Rectangular:" +msgstr "Patrulater:" + +#: flatcamTools/ToolCutOut.py:172 +msgid "" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" +"Forma decupajului va fi mereu de forma\n" +"patratica și va fi forma înconjurătoare a\n" +"obiectului FlatCAM decupat." + +#: flatcamTools/ToolCutOut.py:181 +msgid "" +"Cutout the selected object.\n" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" +"Decupează obiectul selectat.\n" +"Forma decupajului este tot timpul dreptunghiulara.." + +#: flatcamTools/ToolCutOut.py:189 +msgid "B. Manual Bridge Gaps" +msgstr "B. Punţi realiz. manual" + +#: flatcamTools/ToolCutOut.py:191 +msgid "" +"This section handle creation of manual bridge gaps.\n" +"This is done by mouse clicking on the perimeter of the\n" +"Geometry object that is used as a cutout object. " +msgstr "" +"Permite realizarea de punţi de sustinere in mod manual.\n" +"Se apasa butonul corepsunzator și apoi click cu mouse-ul\n" +"pe perimetrul formei de decupaj. Daca se face simultan cu\n" +"apasarea tastei CTRL, operatia se va repeta automat pana când\n" +"se va apasa tasta 'Escape'." + +#: flatcamTools/ToolCutOut.py:207 +msgid "Geo Obj:" +msgstr "Obiect Geo:" + +#: flatcamTools/ToolCutOut.py:209 +msgid "Geometry object used to create the manual cutout." +msgstr "Obiect tip Geometrie folosit pentru crearea decupajului manual." + +#: flatcamTools/ToolCutOut.py:220 +msgid "Manual Geo:" +msgstr "Geo manual:" + +#: flatcamTools/ToolCutOut.py:222 flatcamTools/ToolCutOut.py:232 +msgid "" +"If the object to be cutout is a Gerber\n" +"first create a Geometry that surrounds it,\n" +"to be used as the cutout, if one doesn't exist yet.\n" +"Select the source Gerber file in the top object combobox." +msgstr "" +"Daca obiectul care se decupează este un obiect Gerber,\n" +"atunci mai intai crează un obiect Geometrie care il inconjoara\n" +"urmarindu-i forma.\n" +"Selectează obiectul sursa Gerber in combobox-ul de mai sus,\n" +"numit >Obiect<." + +#: flatcamTools/ToolCutOut.py:242 +msgid "Manual Add Bridge Gaps:" +msgstr "Adaugă punţi manual:" + +#: flatcamTools/ToolCutOut.py:244 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material." +msgstr "" +"Folosind click LMB se crează punţi de sustinere a PCB-ului\n" +"de materialul din care este decupat." + +#: flatcamTools/ToolCutOut.py:251 +msgid "Generate Gap" +msgstr "Generează Punte" + +#: flatcamTools/ToolCutOut.py:253 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material.\n" +"The LMB click has to be done on the perimeter of\n" +"the Geometry object used as a cutout geometry." +msgstr "" +"Permite realizarea de punţi de sustinere in mod manual.\n" +"Se apasa butonul corepsunzator și apoi click cu mouse-ul\n" +"pe perimetrul formei de decupaj. Daca se face simultan cu\n" +"apasarea tastei CTRL, operatia se va repeta automat pana când\n" +"se va apasa tasta 'Escape'." + +#: flatcamTools/ToolCutOut.py:329 flatcamTools/ToolCutOut.py:468 +#: flatcamTools/ToolNonCopperClear.py:659 flatcamTools/ToolPaint.py:757 +#: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve object: %s" +msgstr "[ERROR_NOTCL] Nu s-a putut incarca obiectul: %s" + +#: flatcamTools/ToolCutOut.py:333 +msgid "" +"[ERROR_NOTCL]There is no object selected for Cutout.\n" +"Select one and try again." +msgstr "" +"[ERROR_NOTCL] Nu este nici-un obiect selectat pentru decupaj.\n" +"Selectează unul și încearcă din nou." + +#: flatcamTools/ToolCutOut.py:349 +msgid "" +"[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" +"[WARNING_NOTCL] Diametrul uneltei este zero. Schimba-l intr-o val. pozitivă " +"Reala." + +#: flatcamTools/ToolCutOut.py:359 flatcamTools/ToolCutOut.py:496 +#: flatcamTools/ToolCutOut.py:721 +msgid "" +"[WARNING_NOTCL] Margin value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Valoarea marginii lipseste sau este in format gresit. Adaugă " +"din nou și reîncearcă." + +#: flatcamTools/ToolCutOut.py:370 flatcamTools/ToolCutOut.py:507 +#: flatcamTools/ToolCutOut.py:616 +msgid "" +"[WARNING_NOTCL] Gap size value is missing or wrong format. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Valoarea dimensiunii punte lipseste sau este in format " +"gresit. Adaugă din nou și reîncearcă." + +#: flatcamTools/ToolCutOut.py:377 flatcamTools/ToolCutOut.py:514 +msgid "[WARNING_NOTCL] Number of gaps value is missing. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Numărul de punţi lipseste sau este in format gresit. Adaugă " +"din nou și reîncearcă." + +#: flatcamTools/ToolCutOut.py:381 flatcamTools/ToolCutOut.py:518 +msgid "" +"[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 " +"or 8. Fill in a correct value and retry. " +msgstr "" +"[WARNING_NOTCL] Valoarea punţilor poate fi numai una dintre: 'lr', 'tb', " +"'2lr', '2tb', 4 or 8. Adaugă o valoare permisa și reîncearcă." + +#: flatcamTools/ToolCutOut.py:386 flatcamTools/ToolCutOut.py:523 +msgid "" +"[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" +"Optionally, this Multi-geo Geometry can be converted to Single-geo " +"Geometry,\n" +"and after that perform Cutout." +msgstr "" +"[ERROR] Operatia de decupaj nu se poate efectua cu un obiect Geometrie tip " +"MultiGeo.\n" +"Se poate insa converti MultiGeo in tip SingleGeo și apoi se poate efectua " +"decupajul." + +#: flatcamTools/ToolCutOut.py:452 flatcamTools/ToolCutOut.py:586 +msgid "[success] Any form CutOut operation finished." +msgstr "[success] Operatia de decupaj cu forma libera s-a terminat." + +#: flatcamTools/ToolCutOut.py:472 flatcamTools/ToolPaint.py:761 +#: flatcamTools/ToolPanelize.py:299 +#, python-format +msgid "[ERROR_NOTCL]Object not found: %s" +msgstr "[ERROR_NOTCL] Obiectul nu a fost gasit: %s" + +#: flatcamTools/ToolCutOut.py:486 flatcamTools/ToolCutOut.py:606 +#: flatcamTools/ToolCutOut.py:711 +msgid "" +"[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" +"[ERROR_NOTCL]Diametrul uneltei este zero. Schimba intr-o valoare pozitivă " +"Reala." + +#: flatcamTools/ToolCutOut.py:591 +msgid "" +"Click on the selected geometry object perimeter to create a bridge gap ..." +msgstr "" +"Click pe perimetrul obiectului tip Geometrie selectat\n" +"pentru a crea o punte separatoare." + +#: flatcamTools/ToolCutOut.py:632 +msgid "Making manual bridge gap..." +msgstr "Se generează o punte separatoare in mod manual..." + +#: flatcamTools/ToolCutOut.py:655 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Geoemtry object: %s" +msgstr "[ERROR_NOTCL] Nu s-a putut incarca obiectul Geometrie: %s" + +#: flatcamTools/ToolCutOut.py:659 +#, python-format +msgid "[ERROR_NOTCL]Geometry object for manual cutout not found: %s" +msgstr "" +"[ERROR_NOTCL] Obiectul Geometrie pentru decupaj manual nu este gasit: %s" + +#: flatcamTools/ToolCutOut.py:669 +msgid "[success] Added manual Bridge Gap." +msgstr "[success] O punte a fost adaugata in mod manual." + +#: flatcamTools/ToolCutOut.py:686 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Gerber object: %s" +msgstr "[ERROR_NOTCL] Nu s-a putut incarca obiectul Gerbert: %s" + +#: flatcamTools/ToolCutOut.py:690 +msgid "" +"[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" +"Select one and try again." +msgstr "Obiectul Gerber pentru decupaj manual nu este gasit: %s" + +#: flatcamTools/ToolCutOut.py:695 +msgid "" +"[ERROR_NOTCL]The selected object has to be of Gerber type.\n" +"Select a Gerber file and try again." +msgstr "[ERROR_NOTCL] Obiectul selectat trebuie să fie de tip Gerber." + +#: flatcamTools/ToolDblSided.py:18 +msgid "2-Sided PCB" +msgstr "2-fețe PCB" + +#: flatcamTools/ToolDblSided.py:52 flatcamTools/ToolDblSided.py:76 +#: flatcamTools/ToolDblSided.py:100 +msgid "Mirror" +msgstr "Oglindeste" + +#: flatcamTools/ToolDblSided.py:54 flatcamTools/ToolDblSided.py:78 +#: flatcamTools/ToolDblSided.py:102 +msgid "" +"Mirrors (flips) the specified object around \n" +"the specified axis. Does not create a new \n" +"object, but modifies it." +msgstr "" +"Oglindeste obiectul specificat pe axa specificata.\n" +"Nu crează un obiect nou ci il modifica." + +#: flatcamTools/ToolDblSided.py:73 +msgid "Excellon Object to be mirrored." +msgstr "Obiectul Excellon care va fi oglindit." + +#: flatcamTools/ToolDblSided.py:97 +msgid "Geometry Obj to be mirrored." +msgstr "Obiectul Geometrie care va fi oglindit." + +#: flatcamTools/ToolDblSided.py:135 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a FlatCAM object) through \n" +"the center." +msgstr "" +"Axa de referinţă ar trebui să treacă printr-un punct ori să strabata\n" +" o forma (obiect FlatCAM) prin mijloc." + +#: flatcamTools/ToolDblSided.py:152 +msgid "Point/Box Reference:" +msgstr "Referința Punct/ Container:" + +#: flatcamTools/ToolDblSided.py:154 +msgid "" +"If 'Point' is selected above it store the coordinates (x, y) through which\n" +"the mirroring axis passes.\n" +"If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or " +"Geo).\n" +"Through the center of this object pass the mirroring axis selected above." +msgstr "" +"Daca 'Punct' este selectat mai sus, atunci va stoca coordonatele (x,y) prin " +"care\n" +"axa de oglindire trece.\n" +"Daca 'Container' este selectat mai sus atunci va fi disponibila aici o lista " +"de obiecte\n" +"FlatCAM: Gerber, Excellon sau Geometrie. Prin mijocul geometric al acestor " +"obiecte\n" +"va trece axa de oglindire selectata mai sus." + +#: flatcamTools/ToolDblSided.py:162 +msgid "" +"Add the coordinates in format (x, y) through which the mirroring " +"axis \n" +" selected in 'MIRROR AXIS' pass.\n" +"The (x, y) coordinates are captured by pressing SHIFT key\n" +"and left mouse button click on canvas or you can enter the coords manually." +msgstr "" +"Adaugă coordonatele in formatul (x, y) ale punctului prin care trece\n" +"axa de oglindire selectata mai sus.\n" +"Coordonatele (x,y) pot fi obtinute prin combinatia tasta SHIFT + click mouse " +"pe\n" +"canvas sau le puteti introduce manual." + +#: flatcamTools/ToolDblSided.py:182 +msgid "Gerber Reference Box Object" +msgstr "Obiectul container al Gerber de referinţă" + +#: flatcamTools/ToolDblSided.py:183 +msgid "Excellon Reference Box Object" +msgstr "Obiectul container al Excellon de referinţă" + +#: flatcamTools/ToolDblSided.py:184 +msgid "Geometry Reference Box Object" +msgstr "Obiectul container al Geo de referinţă" + +#: flatcamTools/ToolDblSided.py:193 +msgid "Alignment Drill Coordinates:" +msgstr "Dia. găuri de aliniere" + +#: flatcamTools/ToolDblSided.py:195 +msgid "" +"Alignment holes (x1, y1), (x2, y2), ... on one side of the mirror axis. For " +"each set of (x, y) coordinates\n" +"entered here, a pair of drills will be created:\n" +"\n" +"- one drill at the coordinates from the field\n" +"- one drill in mirror position over the axis selected above in the 'Mirror " +"Axis'." +msgstr "" +"Găuri de aliniere in formatul unei liste: (x1, y1), (x2, y2) samd.\n" +"Pentru fiecare punct din lista de mai sus (cu coord. (x,y) )\n" +"un alt punct va fi creat in oglinda.\n" +"- un punct cu coord. specificate\n" +"- un punct cu coord. in poziţia oglindita pe axa selectata mai sus" + +#: flatcamTools/ToolDblSided.py:210 +msgid "" +"Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" +"on one side of the mirror axis.\n" +"\n" +"The coordinates set can be obtained:\n" +"- press SHIFT key and left mouse clicking on canvas. Then click Add.\n" +"- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the " +"field.\n" +"- press SHIFT key and left mouse clicking on canvas. Then RMB click in the " +"field and click Paste.\n" +"- by entering the coords manually in the format: (x1, y1), (x2, y2), ..." +msgstr "" +"Adăugă coordonatele pt găurile de aliniere in formatul: (x1,y1), (x2,y2) " +"samd\n" +"\n" +"Coordonatele pot fi obtinute prin urmatoarele metoda:\n" +"- apasare tasta SHIFT + click mouse pe canvas. Apoi apasa butonul 'Adaugă'.\n" +"- apasare tasta SHIFT + click mouse pe canvas. Apoi CTRL + V combo in câmpul " +"de editare\n" +"- apasare tasta SHIFT + click mouse pe canvas. Apoi click dreapta și Paste " +"in câmpul de edit.\n" +"- se intorduc manual in formatul (x1,y1), (x2,y2) ..." + +#: flatcamTools/ToolDblSided.py:224 +msgid "Alignment Drill Diameter" +msgstr "Dia. găuri de aliniere" + +#: flatcamTools/ToolDblSided.py:247 +msgid "Create Excellon Object" +msgstr "Crează un obiect Excellon." + +#: flatcamTools/ToolDblSided.py:249 +msgid "" +"Creates an Excellon Object containing the\n" +"specified alignment holes and their mirror\n" +"images." +msgstr "" +"Crează un obiect Excellon care contine găurile\n" +"de aliniere specificate cat și cele in oglinda." + +#: flatcamTools/ToolDblSided.py:255 +msgid "Reset" +msgstr "Reset" + +#: flatcamTools/ToolDblSided.py:257 +msgid "Resets all the fields." +msgstr "Resetează toate câmpurile cu informatii." + +#: flatcamTools/ToolDblSided.py:302 +msgid "2-Sided Tool" +msgstr "Unealta 2-fețe" + +#: flatcamTools/ToolDblSided.py:327 +msgid "" +"[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates are " +"missing. Add them and retry." +msgstr "" +"[WARNING_NOTCL] Referința 'Punct' este selectata dar coordonatele sale " +"lipsesc. Adăugă-le is încearcă din nou." + +#: flatcamTools/ToolDblSided.py:346 +msgid "" +"[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry." +msgstr "" +"[WARNING_NOTCL] Nici-un obiect container nu este incarcat. Incarca unul și " +"încearcă din nou." + +#: flatcamTools/ToolDblSided.py:368 +msgid "" +"[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry." +msgstr "" +"[WARNING_NOTCL] Val. pt dia burghiu lipseste sau este in format gresit. " +"Adaugă una și încearcă din nou." + +#: flatcamTools/ToolDblSided.py:375 +msgid "" +"[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them " +"and retry." +msgstr "" +"[WARNING_NOTCL] Nu exista coord. pentru găurile de aliniere. Adaugă-le și " +"încearcă din nou." + +#: flatcamTools/ToolDblSided.py:397 +msgid "[success] Excellon object with alignment drills created..." +msgstr "" +"[success] Obiectul Excellon conținând găurile de aliniere a fost creat ..." + +#: flatcamTools/ToolDblSided.py:406 +msgid "[WARNING_NOTCL] There is no Gerber object loaded ..." +msgstr "[WARNING_NOTCL] Nu este nici-un obiect Gerber incarcat ..." + +#: flatcamTools/ToolDblSided.py:410 flatcamTools/ToolDblSided.py:453 +#: flatcamTools/ToolDblSided.py:497 +msgid "" +"[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored." +msgstr "" +"[ERROR_NOTCL]Doar obiectele de tip Geometrie, Excellon și Gerber pot fi " +"oglindite ..." + +#: flatcamTools/ToolDblSided.py:420 +msgid "" +"[WARNING_NOTCL] 'Point' coordinates missing. Using Origin (0, 0) as " +"mirroring reference." +msgstr "" +"[WARNING_NOTCL] Coord. 'Punct'-ului lipsesc. Se folosesc coord. punctului " +"Origine (0,0) ca ref. pt oglindire." + +#: flatcamTools/ToolDblSided.py:430 flatcamTools/ToolDblSided.py:474 +#: flatcamTools/ToolDblSided.py:511 +msgid "[WARNING_NOTCL] There is no Box object loaded ..." +msgstr "[WARNING_NOTCL] Nu este incarcat nici-un obiect container ..." + +#: flatcamTools/ToolDblSided.py:440 +#, python-format +msgid "[success] Gerber %s was mirrored..." +msgstr "[success]Obiectul Gerberr %s a fost oglindit..." + +#: flatcamTools/ToolDblSided.py:449 +msgid "[WARNING_NOTCL] There is no Excellon object loaded ..." +msgstr "[WARNING_NOTCL] Nici-un obiect tip Excellon nu este incarcat ..." + +#: flatcamTools/ToolDblSided.py:464 +msgid "" +"[WARNING_NOTCL] There are no Point coordinates in the Point field. Add " +"coords and try again ..." +msgstr "" +"[WARNING_NOTCL] Nu exista coord. in câmpul 'Punct'. Adaugă coord. și " +"încearcă din nou..." + +#: flatcamTools/ToolDblSided.py:484 +#, python-format +msgid "[success] Excellon %s was mirrored..." +msgstr "[success] Obiectul Excellon %s a fost oglindit..." + +#: flatcamTools/ToolDblSided.py:493 +msgid "[WARNING_NOTCL] There is no Geometry object loaded ..." +msgstr "[WARNING_NOTCL] Nici-un obiect tip Geometrie nu este incarcat ..." + +#: flatcamTools/ToolDblSided.py:521 +#, python-format +msgid "[success] Geometry %s was mirrored..." +msgstr "[success] Obiectul Geometrie %s a fost oglindit..." + +#: flatcamTools/ToolFilm.py:25 +msgid "Film PCB" +msgstr "Film PCB" + +#: flatcamTools/ToolFilm.py:56 flatcamTools/ToolImage.py:53 +#: flatcamTools/ToolPanelize.py:56 +msgid "Object Type:" +msgstr "Tip Obiect:" + +#: flatcamTools/ToolFilm.py:58 +msgid "" +"Specify the type of object for which to create the film.\n" +"The object can be of type: Gerber or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Film Object combobox." +msgstr "" +"Specificati tipul de obiect pt care se va crea filmul.\n" +"Obiectul poate avea tipul: Gerber sau Geometrie.\n" +"Selectia facuta aici controlează ce obiecte vor fi \n" +"gasite in combobox-ul >Obiect Film<." + +#: flatcamTools/ToolFilm.py:71 +msgid "Film Object:" +msgstr "Obiect Film:" + +#: flatcamTools/ToolFilm.py:73 +msgid "Object for which to create the film." +msgstr "Obiectul pt care se crează filmul." + +#: flatcamTools/ToolFilm.py:89 flatcamTools/ToolPanelize.py:89 +msgid "Box Type:" +msgstr "Tip container:" + +#: flatcamTools/ToolFilm.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"film creation. It can be: Gerber or Geometry type.The selection here decide " +"the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" +"Specificati tipul obiectului care să fie folosit ca și container\n" +"pt crearea filmului. Poate fi de tipul Geometrie sau Gerber.\n" +"Selectia facuta aici controlează ce obiecte vor fi \n" +"gasite in combobox-ul >Container<." + +#: flatcamTools/ToolFilm.py:104 flatcamTools/ToolPanelize.py:104 +msgid "Box Object:" +msgstr "Container:" + +#: flatcamTools/ToolFilm.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object for which we create the film.\n" +"Usually it is the PCB outline but it can be also the\n" +"same object for which the film is created." +msgstr "" +"Obiectul care este folosit ca și container pentru crearea filmului.\n" +"De obicei este conturul PCB dar se poate folosi și obiectul pt care\n" +"se crează filmul." + +#: flatcamTools/ToolFilm.py:157 +msgid "Save Film" +msgstr "Salveaa filmul" + +#: flatcamTools/ToolFilm.py:159 +msgid "" +"Create a Film for the selected object, within\n" +"the specified box. Does not create a new \n" +" FlatCAM object, but directly save it in SVG format\n" +"which can be opened with Inkscape." +msgstr "" +"Crează un film pt obiectul selectat, in cadrul obiectului\n" +"container selectat. Nu crează un obiect nou FlatCAM ci\n" +"salvează pe HDD un fişier in format SVG care poate fi \n" +"deschis și prelucrat mai departe cu Inkscape." + +#: flatcamTools/ToolFilm.py:225 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry." +msgstr "" +"[ERROR_NOTCL] Nici-un obiect FlaCAM nu este selectat. Incarca un obiect pt " +"Film și încearcă din nou." + +#: flatcamTools/ToolFilm.py:231 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry." +msgstr "" +"[ERROR_NOTCL] Nici-un obiect FlaCAM nu este selectat. Incarca un obiect " +"container și încearcă din nou." + +#: flatcamTools/ToolFilm.py:255 +msgid "Generating Film ..." +msgstr "Se generează Film-ul ..." + +#: flatcamTools/ToolFilm.py:260 flatcamTools/ToolFilm.py:264 +msgid "Export SVG positive" +msgstr "Exporta SVG pozitiv" + +#: flatcamTools/ToolFilm.py:269 +msgid "[WARNING_NOTCL]Export SVG positive cancelled." +msgstr "[WARNING_NOTCL] Exportul unui fişier SVG pozitiv este anulat." + +#: flatcamTools/ToolFilm.py:276 flatcamTools/ToolFilm.py:280 +msgid "Export SVG negative" +msgstr "Exporta SVG negativ" + +#: flatcamTools/ToolFilm.py:285 +msgid "[WARNING_NOTCL]Export SVG negative cancelled." +msgstr "[WARNING_NOTCL] Exportul unui fişier SVG negativ este anulat." + +#: flatcamTools/ToolImage.py:25 +msgid "Image as Object" +msgstr "Imagine ca Obiect" + +#: flatcamTools/ToolImage.py:31 +msgid "Image to PCB" +msgstr "Imagine -> PCB" + +#: flatcamTools/ToolImage.py:55 +msgid "" +"Specify the type of object to create from the image.\n" +"It can be of type: Gerber or Geometry." +msgstr "" +"Specifica tipul de obiect care se vrea a fi creat din imagine.\n" +"Tipul sau poate să fie ori Gerber ori Geometrie." + +#: flatcamTools/ToolImage.py:63 +msgid "DPI value:" +msgstr "Val. DPI:" + +#: flatcamTools/ToolImage.py:65 +msgid "Specify a DPI value for the image." +msgstr "Specifica o valoare DPI pt imagine." + +#: flatcamTools/ToolImage.py:72 +msgid "Level of detail" +msgstr "Nivel Detaliu" + +#: flatcamTools/ToolImage.py:81 +msgid "Image type" +msgstr "Tip imagine" + +#: flatcamTools/ToolImage.py:83 +msgid "" +"Choose a method for the image interpretation.\n" +"B/W means a black & white image. Color means a colored image." +msgstr "" +"Alege o metoda de interpretare a imaginii.\n" +"B/W = imagine alb-negru\n" +"Color = imagine in culori" + +#: flatcamTools/ToolImage.py:90 flatcamTools/ToolImage.py:103 +#: flatcamTools/ToolImage.py:114 flatcamTools/ToolImage.py:125 +msgid "Mask value" +msgstr "Val. masca" + +#: flatcamTools/ToolImage.py:92 +msgid "" +"Mask for monochrome image.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry.\n" +"0 means no detail and 255 means everything \n" +"(which is totally black)." +msgstr "" +"Masca pt imaginile monocrome.\n" +"Ia valori in intervalul [0 ... 255]\n" +"Decide nivelul de detalii care să fie\n" +"incluse in obiectul rezultat.\n" +"0 = nici-un detaliu\n" +"255 = include totul (ceeace ce inseamna\n" +"negru complet)." + +#: flatcamTools/ToolImage.py:105 +msgid "" +"Mask for RED color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Masca pt culoarea ROSU.\n" +"Ia valori in intervalul [0 ... 255].\n" +"Decide nivelul de detalii care să fie\n" +"incluse in obiectul rezultat." + +#: flatcamTools/ToolImage.py:116 +msgid "" +"Mask for GREEN color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Masca pt culoarea VERDE.\n" +"Ia valori in intervalul [0 ... 255].\n" +"Decide nivelul de detalii care să fie\n" +"incluse in obiectul rezultat." + +#: flatcamTools/ToolImage.py:127 +msgid "" +"Mask for BLUE color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" +"Masca pt culoarea ALBASTRU.\n" +"Ia valori in intervalul [0 ... 255].\n" +"Decide nivelul de detalii care să fie\n" +"incluse in obiectul rezultat." + +#: flatcamTools/ToolImage.py:139 +msgid "Import image" +msgstr "Importa imagine" + +#: flatcamTools/ToolImage.py:141 +msgid "Open a image of raster type and then import it in FlatCAM." +msgstr "Deschide o imagine tip raster și importa aceasta in FlatCAM." + +#: flatcamTools/ToolImage.py:170 +msgid "Image Tool" +msgstr "Unealta Imagine" + +#: flatcamTools/ToolImage.py:200 flatcamTools/ToolImage.py:203 +msgid "Import IMAGE" +msgstr "Importa Imagine" + +#: flatcamTools/ToolMeasurement.py:26 +msgid "Measurement" +msgstr "Masuratoare" + +#: flatcamTools/ToolMeasurement.py:47 +msgid "Start" +msgstr "Start" + +#: flatcamTools/ToolMeasurement.py:47 flatcamTools/ToolMeasurement.py:50 +msgid "Coords" +msgstr "Coordonate:" + +#: flatcamTools/ToolMeasurement.py:48 flatcamTools/ToolMeasurement.py:99 +msgid "This is measuring Start point coordinates." +msgstr "Coordonatele punctului de Start." + +#: flatcamTools/ToolMeasurement.py:50 +msgid "Stop" +msgstr "Stop" + +#: flatcamTools/ToolMeasurement.py:51 flatcamTools/ToolMeasurement.py:104 +msgid "This is the measuring Stop point coordinates." +msgstr "Coordonatele punctului de Stop." + +#: flatcamTools/ToolMeasurement.py:54 flatcamTools/ToolMeasurement.py:109 +msgid "This is the distance measured over the X axis." +msgstr "Distanta masurata pe axa X." + +#: flatcamTools/ToolMeasurement.py:57 flatcamTools/ToolMeasurement.py:115 +msgid "This is the distance measured over the Y axis." +msgstr "Distanta masurata pe axa Y." + +#: flatcamTools/ToolMeasurement.py:59 +msgid "DISTANCE" +msgstr "DISTANTA:" + +#: flatcamTools/ToolMeasurement.py:60 flatcamTools/ToolMeasurement.py:121 +msgid "This is the point to point Euclidian distance." +msgstr "Distanta euclidiana de la punct la punct." + +#: flatcamTools/ToolMeasurement.py:63 flatcamTools/ToolMeasurement.py:70 +#: flatcamTools/ToolMeasurement.py:77 flatcamTools/ToolMeasurement.py:84 +#: flatcamTools/ToolMeasurement.py:91 +msgid "Those are the units in which the distance is measured." +msgstr "Unitatile de masura in care se masoara distanta." + +#: flatcamTools/ToolMeasurement.py:124 +msgid "Measure" +msgstr "Masoara:" + +#: flatcamTools/ToolMeasurement.py:183 +msgid "Meas. Tool" +msgstr "Unealta Masur." + +#: flatcamTools/ToolMeasurement.py:276 +msgid "MEASURING: Click on the Start point ..." +msgstr "Masoara: Click pe punctul de Start ..." + +#: flatcamTools/ToolMeasurement.py:305 +msgid "MEASURING: Click on the Destination point ..." +msgstr "Masoara: Click pe punctul Destinatie..." + +#: flatcamTools/ToolMeasurement.py:326 +#, python-brace-format +msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" +msgstr "Masoara: Rrezultat D(x) = {d_x} | D(y) = {d_y} | Distanta = {d_z}" + +#: flatcamTools/ToolMove.py:81 +msgid "MOVE: Click on the Start point ..." +msgstr "MUTARE: Click pe punctul de Start ..." + +#: flatcamTools/ToolMove.py:88 +msgid "[WARNING_NOTCL] MOVE action cancelled. No object(s) to move." +msgstr "" +"[WARNING_NOTCL] Actiunea de Mutare a fost anulata. Nu sunt obiecte care să " +"fie mutate ..." + +#: flatcamTools/ToolMove.py:110 +msgid "MOVE: Click on the Destination point ..." +msgstr "MUTARE: Click pe punctul Destinatie..." + +#: flatcamTools/ToolMove.py:128 +msgid "Moving ..." +msgstr "In miscare ..." + +#: flatcamTools/ToolMove.py:135 +msgid "[WARNING_NOTCL] No object(s) selected." +msgstr "[WARNING_NOTCL] Nu sunt obiecte selectate." + +#: flatcamTools/ToolMove.py:158 +#, python-format +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> %s" +msgstr "[ERROR_NOTCL] ToolMove.on_left_click() --> %s" + +#: flatcamTools/ToolMove.py:164 +#, python-format +msgid "[success]%s object was moved ..." +msgstr "[success] Obiectul %s a fost mutat ..." + +#: flatcamTools/ToolMove.py:174 +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> Error when mouse left click." +msgstr "" +"[ERROR_NOTCL] ToolMove.on_left_click() --> Eroare când se face click cu " +"butonul mouse stânga." + +#: flatcamTools/ToolMove.py:202 +msgid "[WARNING_NOTCL]Move action cancelled." +msgstr "[WARNING_NOTCL] Actiunea de mutare a fost anulata." + +#: flatcamTools/ToolMove.py:214 +msgid "[WARNING_NOTCL]Object(s) not selected" +msgstr "[WARNING_NOTCL] Obiectele nu sunt selectate." + +#: flatcamTools/ToolNonCopperClear.py:25 +msgid "Non-Copper Clearing" +msgstr "Curățăre Non-Cu" + +#: flatcamTools/ToolNonCopperClear.py:63 +msgid "Gerber object to be cleared of excess copper. " +msgstr "Obiectul Gerber care să fie curățat de cuprul in exces." + +#: flatcamTools/ToolNonCopperClear.py:73 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for copper clearing." +msgstr "" +"Un număr de unelte din care algoritmul va alege\n" +"pe acelea care vor fi folosite pentru curățarea de Cu." + +#: flatcamTools/ToolNonCopperClear.py:88 +msgid "" +"This is the Tool Number.\n" +"Non copper clearing will start with the tool with the biggest \n" +"diameter, continuing until there are no more tools.\n" +"Only tools that create NCC clearing geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" +"Numărul uneltei.\n" +"Curățarea de cupru va incepe cu unealta cu diametrul cel mai mare\n" +"continuand ulterior cu cele cu dia mai mic pana numai sunt unelte\n" +"sau s-a terminat procesul.\n" +"Doar uneltele care efectiv au creat geometrie vor fi prezente in obiectul\n" +"final. Aceasta deaorece unele unelte nu vor putea genera geometrie." + +#: flatcamTools/ToolNonCopperClear.py:100 flatcamTools/ToolPaint.py:98 +msgid "" +"The Tool Type (TT) can be:
- Circular with 1 ... 4 teeth -> it is " +"informative only. Being circular,
the cut width in material is exactly " +"the tool diameter.
- Ball -> informative only and make reference " +"to the Ball type endmill.
- V-Shape -> it will disable de Z-Cut " +"parameter in the resulting geometry UI form and enable two additional UI " +"form fields in the resulting geometry: V-Tip Dia and V-Tip Angle. Adjusting " +"those two values will adjust the Z-Cut parameter such as the cut width into " +"material will be equal with the value in the Tool Diameter column of this " +"table.
Choosing the V-Shape Tool Type automatically will select " +"the Operation Type in the resulting geometry as Isolation." +msgstr "" +"Tipul uneltei (TU) poate fi::
- Circular cu 1 ... 4 dinti -> doar " +"informativ. prin forma sa circulara,
lăţimea de tăiere este tot una cu " +"diametrul sau
- Bila -> informativ și face referire la frezele cu " +"cap rotund.
- V-Shape -> va dezactiva parametrul >Z tăiere< " +"deoarece acesta este acum calculat și va afisa 2 noi parametri in UI: V_dia " +"și V_unghi. Ajustarea acestor parametri va modifica param. calculat >Z " +"tăiere< a.i lăţimea de tăiere in material va fi egală cu valoarea >Dia " +"unealta< din coloana tabelei de Unelte.
Alegerea tipului V-Shape " +"va selecta automat Tipul Operatiei ca fiind Izolare." + +#: flatcamTools/ToolNonCopperClear.py:119 flatcamTools/ToolPaint.py:117 +msgid "Tool Dia" +msgstr "Dia Unealta" + +#: flatcamTools/ToolNonCopperClear.py:121 +msgid "Diameter for the new tool to add in the Tool Table" +msgstr "Diametrul pentru noua unealta care să fie adaugata in Tabela de Unelte" + +#: flatcamTools/ToolNonCopperClear.py:147 flatcamTools/ToolPaint.py:145 +#: flatcamTools/ToolSolderPaste.py:123 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row(s) in the Tool Table." +msgstr "" +"Sterge o selecţie de unelte in Tabela de Unelte,\n" +"efectuata prin selectia liniilot din Tabela de Unelte." + +#: flatcamTools/ToolNonCopperClear.py:225 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"If not checked, use the standard algorithm." +msgstr "" +"Daca este bifat foloseşte strategia de curățare tip 'rest'.\n" +"Curățarea de cupru va incepe cu unealta cu diametrul cel mai mare\n" +"continuand ulterior cu cele cu dia mai mic pana numai sunt unelte\n" +"sau s-a terminat procesul.\n" +"Doar uneltele care efectiv au creat geometrie vor fi prezente in obiectul\n" +"final. Aceasta deaorece unele unelte nu vor putea genera geometrie.\n" +"Daca nu este bifat, foloseşte algoritmul standard." + +#: flatcamTools/ToolNonCopperClear.py:237 +msgid "Generate Geometry" +msgstr "Genereza Geometrie" + +#: flatcamTools/ToolNonCopperClear.py:483 flatcamTools/ToolPaint.py:543 +#: flatcamTools/ToolSolderPaste.py:760 +msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." +msgstr "" +"[WARNING_NOTCL] Introduce diametrul unei unelte pt a fi adaugata, in format " +"Real." + +#: flatcamTools/ToolNonCopperClear.py:511 flatcamTools/ToolPaint.py:567 +msgid "[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table." +msgstr "" +"[WARNING_NOTCL] Adaugarea unei unelte noi este anulata. Unealta exista deja " +"in Tabela de Unelte." + +#: flatcamTools/ToolNonCopperClear.py:516 flatcamTools/ToolPaint.py:572 +msgid "[success] New tool added to Tool Table." +msgstr "[success] O noua unealta a fost adaugata in Tabela de Unelte." + +#: flatcamTools/ToolNonCopperClear.py:549 +msgid "[ERROR_NOTCL] Wrong value format entered, use a number." +msgstr "[ERROR_NOTCL] O valoare gresita a fost introdusa. Foloseşte un număr." + +#: flatcamTools/ToolNonCopperClear.py:558 flatcamTools/ToolPaint.py:615 +msgid "[success] Tool from Tool Table was edited." +msgstr "[success] O unealta din Tabela de Unelte a fost editata." + +#: flatcamTools/ToolNonCopperClear.py:569 flatcamTools/ToolPaint.py:626 +#: flatcamTools/ToolSolderPaste.py:846 +msgid "" +"[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " +"Table." +msgstr "" +"[WARNING_NOTCL] Editare esuata. Noua valoare pt diametrul uneltei este deja " +"in Tabela de Unelte." + +#: flatcamTools/ToolNonCopperClear.py:608 flatcamTools/ToolPaint.py:723 +msgid "[WARNING_NOTCL]Delete failed. Select a tool to delete." +msgstr "[WARNING_NOTCL] Stergere esuata. Selectează o unealta pt stergere." + +#: flatcamTools/ToolNonCopperClear.py:613 flatcamTools/ToolPaint.py:728 +msgid "[success] Tool(s) deleted from Tool Table." +msgstr "[success] Au fost sterse unelte din Tabela de Unelte." + +#: flatcamTools/ToolNonCopperClear.py:666 +msgid "[ERROR_NOTCL]No Gerber file available." +msgstr "[ERROR_NOTCL] Nici-un fiser Gerber nu este disponibil." + +#: flatcamTools/ToolNonCopperClear.py:704 +#: flatcamTools/ToolNonCopperClear.py:826 +msgid "Clearing Non-Copper areas." +msgstr "Se curăță PCB-ul de cuprul in exces." + +#: flatcamTools/ToolNonCopperClear.py:722 +#, python-format +msgid "[success] Non-Copper Clearing with ToolDia = %s started." +msgstr "[success] Curățarea de Cupru in exces cu Dia Unealta = %s a inceput." + +#: flatcamTools/ToolNonCopperClear.py:791 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" +msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" + +#: flatcamTools/ToolNonCopperClear.py:796 +msgid "[success] NCC Tool finished." +msgstr "[success] Unealta NCC s-a terminat." + +#: flatcamTools/ToolNonCopperClear.py:798 +msgid "" +"[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " +"cleared. Check the result." +msgstr "" +"[WARNING_NOTCL] Unealta NCC a terminat lucrul dar unele zone PCB nu au putut " +"fi curățate de Cu. Verifică rezultatul." + +#: flatcamTools/ToolNonCopperClear.py:844 +#, python-format +msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." +msgstr "[success] Curățarea de Cupru tip Rest cu dia unealta = %s a inceput.." + +#: flatcamTools/ToolNonCopperClear.py:942 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" +msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" + +#: flatcamTools/ToolNonCopperClear.py:950 +msgid "" +"[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " +"settings." +msgstr "" +"[ERROR_NOTCL] Unealta NCC a termiant lucrul dar nu a putut curăța de Cu " +"obiectul cu setarile curente." + +#: flatcamTools/ToolPaint.py:24 +msgid "Paint Area" +msgstr "Unealta Paint" + +#: flatcamTools/ToolPaint.py:60 +msgid "Geometry:" +msgstr "Geometrie:" + +#: flatcamTools/ToolPaint.py:62 +msgid "Geometry object to be painted. " +msgstr "Obiectul tip Geometrie care să fie 'pictat'" + +#: flatcamTools/ToolPaint.py:71 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for painting." +msgstr "" +"O suma de unelte din care algoritmul va alege pe acelea\n" +"care vor fi folosite pentru 'pictare'." + +#: flatcamTools/ToolPaint.py:86 +msgid "" +"This is the Tool Number.\n" +"Painting will start with the tool with the biggest diameter,\n" +"continuing until there are no more tools.\n" +"Only tools that create painting geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" +"Numărul uneltei.\n" +"'Pictarea' va incepe cu unealta cu diametrul cel mai mare\n" +"continuand ulterior cu cele cu dia mai mic pana numai sunt unelte\n" +"sau s-a terminat procesul.\n" +"Doar uneltele care efectiv au creat geometrie vor fi prezente in obiectul\n" +"final. Aceasta deaorece unele unelte nu vor putea genera geometrie." + +#: flatcamTools/ToolPaint.py:119 +msgid "Diameter for the new tool." +msgstr "Diametrul pt noua unealta." + +#: flatcamTools/ToolPaint.py:224 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"\n" +"If not checked, use the standard algorithm." +msgstr "" +"Daca este bifat, foloste 'rest machining'.\n" +"Mai exact, se va curăța cuprul din afara traseelor,\n" +"folosind mai intai unealta cu diametrul cel mai mare\n" +"apoi folosindu-se progresiv unelte cu diametrul tot\n" +"mai mic, din cele disponibile in tabela de unelte, pt a\n" +"curăța zonele care nu s-au putut curăța cu unealta\n" +"precedenta.\n" +"Daca nu este bifat, foloseşte algoritmul standard." + +#: flatcamTools/ToolPaint.py:239 +msgid "" +"How to select the polygons to paint.
Options:
- Single: left " +"mouse click on the polygon to be painted.
- All: paint all " +"polygons." +msgstr "" +"Cum să se selecteze poligoanele de 'pictat.
Opțiuni:
- Unic: " +"click mouse pe poligonul de 'pictat'.
- Toate: 'pictează' toate " +"poligoanele." + +#: flatcamTools/ToolPaint.py:254 +msgid "Create Paint Geometry" +msgstr "Crează un obiect Geometrie tip 'Paint'" + +#: flatcamTools/ToolPaint.py:256 +msgid "" +"After clicking here, click inside
the polygon you wish to be painted if " +"Single is selected.
If All is selected then the Paint will " +"start after click.
A new Geometry object with the tool
paths will be " +"created." +msgstr "" +"Dupa ce se apasa pe acest buton
fa click pe poligonul care trebuie " +"'pictat' daca Unic este selectat.
Daca Toate este " +"selectat, operatia de 'pictare' va incepe imediat dupa click.
Un nou " +"obiect Geometrie va fi creat." + +#: flatcamTools/ToolPaint.py:732 +msgid "geometry_on_paint_button" +msgstr "geometry_on_paint_button" + +#: flatcamTools/ToolPaint.py:735 flatcamTools/ToolPaint.py:780 +msgid "[WARNING_NOTCL]Click inside the desired polygon." +msgstr "" +"[WARNING_NOTCL] Click in interiorul poligonului care se doreste să fie " +"'pictat'." + +#: flatcamTools/ToolPaint.py:767 +msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." +msgstr "[ERROR_NOTCL] Nu se poate face 'pictare' pe geometrii MultiGeo ..." + +#: flatcamTools/ToolPaint.py:789 flatcamTools/ToolPaint.py:992 +msgid "Painting polygon..." +msgstr "Se 'pictează' un poligon..." + +#: flatcamTools/ToolPaint.py:840 +msgid "[WARNING] No polygon found." +msgstr "[WARNING] Nu s-a gasit nici-un poligon." + +#: flatcamTools/ToolPaint.py:843 +msgid "Painting polygon." +msgstr "Se 'pictează' un poligon." + +#: flatcamTools/ToolPaint.py:885 +msgid "[ERROR_NOTCL] Geometry could not be painted completely" +msgstr "[ERROR_NOTCL] Geometria nu a putut să fie 'pictata' complet." + +#: flatcamTools/ToolPaint.py:911 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different strategy of paint\n" +"%s" +msgstr "" +"[ERROR] Nu s-a putut face operatia de 'pictare'. Incearcă o combinatie " +"diferita de parametri. Sau o strategie diferita de 'pictare'.\n" +"%s" + +#: flatcamTools/ToolPaint.py:953 +#, python-format +msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" +msgstr "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" + +#: flatcamTools/ToolPaint.py:959 flatcamTools/ToolPaint.py:1251 +msgid "Polygon Paint started ..." +msgstr "Paint pt poligon a inceput ..." + +#: flatcamTools/ToolPaint.py:1107 flatcamTools/ToolPaint.py:1196 +#, python-format +msgid "" +"[ERROR] Could not do Paint All. Try a different combination of parameters. " +"Or a different Method of paint\n" +"%s" +msgstr "" +"[ERROR] Nu s-a putut efectua op. 'Paint' pt toate poligoanele. Incearcă o " +"combinatie diferita de parametri. Sau încearcă o alta metoda de 'pictat'\n" +"%s" + +#: flatcamTools/ToolPaint.py:1131 +msgid "" +"[ERROR] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" +"[ERROR] Nu exista nici-o Geometrie rezultata din 'pictare' in acest fişier.\n" +"De obicei inseamna că diametrul uneltei este prea mare pentru elemetele " +"geometrice.\n" +"Schimba parametrii de 'pictare' și încearcă din nou." + +#: flatcamTools/ToolPaint.py:1140 +msgid "[success] Paint All Done." +msgstr "[success] 'Paint' pt toate poligoanele a fost efectuata." + +#: flatcamTools/ToolPaint.py:1226 +msgid "" +"[ERROR_NOTCL] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" +"[ERROR_NOTCL] Nu exista o geometrie 'pictata' in acest fişier.\n" +"De obicei aceasta inseamna că diametrul uneltei este prea mare \n" +"pt a fi folosit in obiectul Geometrie de 'pictat'.\n" +"Schimba parametrii de 'pictat' și încearcă din nou." + +#: flatcamTools/ToolPaint.py:1235 +msgid "[success] Paint All with Rest-Machining done." +msgstr "" +"[success] 'Paint' pentru toate poligoanele cu strategia Rest a fost " +"efectuata." + +#: flatcamTools/ToolPanelize.py:25 +msgid "Panelize PCB" +msgstr "Panelizează PCB" + +#: flatcamTools/ToolPanelize.py:58 +msgid "" +"Specify the type of object to be panelized\n" +"It can be of type: Gerber, Excellon or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Object combobox." +msgstr "" +"Specifica tipul de obiect care va fi panelizat.\n" +"Poate fi de tipul: Gerber, Excellon sau Geometrie.\n" +"Selectia facuta aici va dicta tipul de obiecte care se vor\n" +"regasi in combobox-ul >Obiect<." + +#: flatcamTools/ToolPanelize.py:73 +msgid "" +"Object to be panelized. This means that it will\n" +"be duplicated in an array of rows and columns." +msgstr "" +"Obiectul care va fi panelizat.\n" +"Acesta va fi multiplicat intr-o arie\n" +"de linii și coloane." + +#: flatcamTools/ToolPanelize.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"panelization. It can be: Gerber or Geometry type.\n" +"The selection here decide the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" +"Tipul de obiect care va fi folosit ca și container pt panelizare.\n" +"Poate fi de tiul: Gerber sau Geometrie.\n" +"Selectia facuta aici va dicta tipul de obiecte care se vor\n" +"regasi in combobox-ul >Container<." + +#: flatcamTools/ToolPanelize.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object that is to be panelized." +msgstr "" +"Obiectul care este folosit ca și container \n" +"pt obiectul care va fi panelizat." + +#: flatcamTools/ToolPanelize.py:150 +msgid "" +"Choose the type of object for the panel object:\n" +"- Geometry\n" +"- Gerber" +msgstr "" +"Alege tipul de obiect care va fi creat pt obiectul panelizat:\n" +"- Geometrie\n" +"-Gerber" + +#: flatcamTools/ToolPanelize.py:158 +msgid "Constrain panel within:" +msgstr "Mentine panelul in:" + +#: flatcamTools/ToolPanelize.py:192 +msgid "Panelize Object" +msgstr "Panelizează obiectul" + +#: flatcamTools/ToolPanelize.py:194 +msgid "" +"Panelize the specified object around the specified box.\n" +"In other words it creates multiple copies of the source object,\n" +"arranged in a 2D array of rows and columns." +msgstr "" +"Se panelizează obiectul conform containerului selectat.\n" +"Cu alte cuvinte se crează copii multiple ale obiectului sursa,\n" +"aranjate intr-o arie 2D de linii și coloane." + +#: flatcamTools/ToolPanelize.py:311 +#, python-format +msgid "[WARNING]No object Box. Using instead %s" +msgstr "[WARNING] Nu exista container. Se foloseşte in schimb %s" + +#: flatcamTools/ToolPanelize.py:392 +msgid "" +"[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive " +"integer." +msgstr "" +"[ERROR_NOTCL] Val. coloane sau linii este zero. Schimba aceasta val. intr-un " +"număr pozitiv intreg." + +#: flatcamTools/ToolPanelize.py:417 flatcamTools/ToolPanelize.py:526 +msgid "Generating panel ... Please wait." +msgstr "Se generează panelul ... Va rugam asteptati!" + +#: flatcamTools/ToolPanelize.py:520 +msgid "[success]Panel done..." +msgstr "[success] Panel executat ..." + +#: flatcamTools/ToolPanelize.py:523 +#, python-brace-format +msgid "" +"[WARNING] Too big for the constrain area. Final panel has {col} columns and " +"{row} rows" +msgstr "" +"[WARNING] Prea mare pt aria desemnata. Panelul final are {col} coloane și " +"{row} linii" + +#: flatcamTools/ToolPanelize.py:531 +msgid "[success]Panel created successfully." +msgstr "[success] Panel creat cu succes." + +#: flatcamTools/ToolProperties.py:103 +msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." +msgstr "" +"[ERROR_NOTCL] Unealta Proprietati nu a fost afișată. Nici-un obiect nu este " +"selectat." + +#: flatcamTools/ToolProperties.py:110 +msgid "[success] Object Properties are displayed." +msgstr "[success] Proprietatile obiectului sunt afisate in Tab-ul Unealta." + +#: flatcamTools/ToolProperties.py:111 +msgid "Properties Tool" +msgstr "Unealta Proprietati" + +#: flatcamTools/ToolShell.py:69 +msgid "...proccessing..." +msgstr "...in procesare..." + +#: flatcamTools/ToolShell.py:71 +#, python-format +msgid "...proccessing... [%s]" +msgstr "...in procesare... [%s]" + +#: flatcamTools/ToolSolderPaste.py:37 +msgid "Solder Paste Tool" +msgstr "Unealta DispensorPF" + +#: flatcamTools/ToolSolderPaste.py:65 +msgid "Gerber Solder paste object. " +msgstr "Obiect Gerber cu masca pt dispensarea de pasta de fludor." + +#: flatcamTools/ToolSolderPaste.py:72 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for dispensing solder paste." +msgstr "" +"Un număr de unelte (nozzle) din care algoritmul va alege pe acelea\n" +"care vor fi folosite pentru dispensarea pastei de fludor." + +#: flatcamTools/ToolSolderPaste.py:87 +msgid "" +"This is the Tool Number.\n" +"The solder dispensing will start with the tool with the biggest \n" +"diameter, continuing until there are no more Nozzle tools.\n" +"If there are no longer tools but there are still pads not covered\n" +" with solder paste, the app will issue a warning message box." +msgstr "" +"Numărul Uneltei.\n" +"Dispensarea de pasta de fludor va incepe cu unealta care are dia\n" +"cel mai mare și va continua pana numai sunt unelte Nozzle disponibile\n" +"sau procesul s-a terminat.\n" +"Daca numai sunt unelte dar mai sunt inca paduri neacoperite de pasta de \n" +"fludor, aplicaţia va afisa un mesaj de avertizare in Status Bar." + +#: flatcamTools/ToolSolderPaste.py:94 +msgid "" +"Nozzle tool Diameter. It's value (in current FlatCAM units)\n" +"is the width of the solder paste dispensed." +msgstr "" +"Diametrul uneltei Nozzle. Valoarea sa (in unitati de maura curente)\n" +"este lăţimea cantiatii de pasta de fludor dispensata." + +#: flatcamTools/ToolSolderPaste.py:101 +msgid "New Nozzle Tool" +msgstr "Unealta noua" + +#: flatcamTools/ToolSolderPaste.py:117 +msgid "" +"Add a new nozzle tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" +"Adaugă o unealta nou tip Nozzle in Tabela de Unelte\n" +"cu diametrul specificat mai sus," + +#: flatcamTools/ToolSolderPaste.py:129 +msgid "Generate solder paste dispensing geometry." +msgstr "Generează un obiect Geometrie pt dispensarea de pasta de fludor." + +#: flatcamTools/ToolSolderPaste.py:142 +msgid "STEP 1" +msgstr "PAS 1" + +#: flatcamTools/ToolSolderPaste.py:144 +msgid "" +"First step is to select a number of nozzle tools for usage\n" +"and then optionally modify the GCode parameters bellow." +msgstr "" +"Primul pas este să se efectueza o selecţie de unelte Nozzl pt \n" +"utilizare și apoi in mod optional, să se modifice parametrii\n" +"GCode de mai jos." + +#: flatcamTools/ToolSolderPaste.py:147 +msgid "" +"Select tools.\n" +"Modify parameters." +msgstr "" +"Selectează unelte.\n" +"Modifica parametri." + +#: flatcamTools/ToolSolderPaste.py:290 +msgid "Generate GCode" +msgstr "Genereaa GCode" + +#: flatcamTools/ToolSolderPaste.py:292 +msgid "" +"Generate GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" +"Generează GCode pt dispensarea\n" +"de pasta de fludor pe padurile PCB." + +#: flatcamTools/ToolSolderPaste.py:308 +msgid "STEP 2:" +msgstr "PAS 2:" + +#: flatcamTools/ToolSolderPaste.py:310 +msgid "" +"Second step is to create a solder paste dispensing\n" +"geometry out of an Solder Paste Mask Gerber file." +msgstr "" +"Al 2-lea pas este să se creeze un obiect Geometrie pt dispensarea\n" +"de pasta de fludor, dintr-un fişier Gerber cu datele mastii de plasare\n" +"a pastei de fludor." + +#: flatcamTools/ToolSolderPaste.py:326 +msgid "Geo Result:" +msgstr "Rezultat Geo:" + +#: flatcamTools/ToolSolderPaste.py:328 +msgid "" +"Geometry Solder Paste object.\n" +"The name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" +"Obiect Geometrie pt dispensare pasta de fludor.\n" +"Numele obiectului trebuie să se termine obligatoriu\n" +"in: '_solderpaste'." + +#: flatcamTools/ToolSolderPaste.py:337 +msgid "STEP 3:" +msgstr "PAS 3:" + +#: flatcamTools/ToolSolderPaste.py:339 +msgid "" +"Third step is to select a solder paste dispensing geometry,\n" +"and then generate a CNCJob object.\n" +"\n" +"REMEMBER: if you want to create a CNCJob with new parameters,\n" +"first you need to generate a geometry with those new params,\n" +"and only after that you can generate an updated CNCJob." +msgstr "" +"Al 3-lea pas este selectia unei geometrii de dispensare a pastei de fludor\n" +"urmata de generarea unui obiect tip CNCJob.\n" +"\n" +"ATENTIE: daca se doreste crearea un ui obiect CNCJob cu param. noi,\n" +"mai intai trebuie generat obiectul Geometrie cu acei parametri noi și abia\n" +"apoi se poate genera un obiect CNCJob actualizat." + +#: flatcamTools/ToolSolderPaste.py:359 +msgid "CNC Result:" +msgstr "Rezultat CNC:" + +#: flatcamTools/ToolSolderPaste.py:361 +msgid "" +"CNCJob Solder paste object.\n" +"In order to enable the GCode save section,\n" +"the name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" +"Obiect CNCJob pt dispensare pasta de fludor.\n" +"Pt a activa sectiunea de Salvare GCode,\n" +"numele obiectului trebuie să se termine obligatoriu in:\n" +"'_solderpaste'." + +#: flatcamTools/ToolSolderPaste.py:371 +msgid "View GCode" +msgstr "Vizualiz. GCode" + +#: flatcamTools/ToolSolderPaste.py:373 +msgid "" +"View the generated GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" +"Vizualizează codul GCode generat pt dispensarea de \n" +"pasta de fludor pe padurile PCB-ului." + +#: flatcamTools/ToolSolderPaste.py:377 +msgid "Save GCode" +msgstr "Salvează GCode" + +#: flatcamTools/ToolSolderPaste.py:379 +msgid "" +"Save the generated GCode for Solder Paste dispensing\n" +"on PCB pads, to a file." +msgstr "" +"Salvează codul GCode generat pt dispensare pasta de fludor\n" +"pe padurile unui PCB, intr-un fişier pe HDD." + +#: flatcamTools/ToolSolderPaste.py:383 +msgid "STEP 4:" +msgstr "PAS 4:" + +#: flatcamTools/ToolSolderPaste.py:385 +msgid "" +"Fourth step (and last) is to select a CNCJob made from \n" +"a solder paste dispensing geometry, and then view/save it's GCode." +msgstr "" +"Al 4-lea pas (ultimul) este să se selecteze un obiect CNCJob realizat\n" +"dintr-un obiect Geometrie pt dispensarea de pasta de fludor, apoi \n" +"avand posibilitatea de a vizualiza continutul acestuia sau de a-l salva\n" +"intr-un fişier GCode pe HDD." + +#: flatcamTools/ToolSolderPaste.py:413 +msgid "Delete Object" +msgstr "Sterge Obiectul" + +#: flatcamTools/ToolSolderPaste.py:788 +msgid "" +"[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." +msgstr "" +"[WARNING_NOTCL] Adaugarea unei unelte Nozzle a fost anulata. Unealta exista " +"deja in Tabela de Unelte." + +#: flatcamTools/ToolSolderPaste.py:793 +msgid "[success] New Nozzle tool added to Tool Table." +msgstr "[success] A fsot adaugata o noua unealta Nozzle in Tabela de Unelte." + +#: flatcamTools/ToolSolderPaste.py:835 +msgid "[success] Nozzle tool from Tool Table was edited." +msgstr "[success] Unealta Nozzle din Tabela de Unelte a fost editata." + +#: flatcamTools/ToolSolderPaste.py:891 +msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." +msgstr "" +"[WARNING_NOTCL] Stergerea a esuat. Selectează o unealta Nozzle pt a o sterge." + +#: flatcamTools/ToolSolderPaste.py:896 +msgid "[success] Nozzle tool(s) deleted from Tool Table." +msgstr "[success] Uneltele (nozzle) au fost sterse din Tabela de Unelte." + +#: flatcamTools/ToolSolderPaste.py:951 +msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." +msgstr "" +"[WARNING_NOTCL] Nu este incarcat un obiect Gerber cu informatia mastii pt " +"pasta de fludor." + +#: flatcamTools/ToolSolderPaste.py:968 +msgid "Creating Solder Paste dispensing geometry." +msgstr "Se creează Geometrie pt dispensare pasta de fludor." + +#: flatcamTools/ToolSolderPaste.py:980 +msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." +msgstr "[WARNING_NOTCL] Nu sunt unelte Nozzle in Tabela de Unelte." + +#: flatcamTools/ToolSolderPaste.py:1106 flatcamTools/ToolSolderPaste.py:1161 +msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." +msgstr "[ERROR_NOTCL] Anulat. Fişier gol, nu are date geometrice." + +#: flatcamTools/ToolSolderPaste.py:1109 +msgid "[success] Solder Paste geometry generated successfully..." +msgstr "" +"[success] Obiectul Geometrie pt dispens. pasta de fludor a fost generat cu " +"succes ..." + +#: flatcamTools/ToolSolderPaste.py:1115 +msgid "" +"[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " +"diameters..." +msgstr "" +"[WARNING_NOTCL] Cel putin unele pad-uri nu au pasta de fludor datorita " +"diametrelor uneltelor (nozzle) ne adecvate." + +#: flatcamTools/ToolSolderPaste.py:1129 +msgid "Generating Solder Paste dispensing geometry..." +msgstr "Se generează Geometria de dispensare a pastei de fludor ..." + +#: flatcamTools/ToolSolderPaste.py:1149 +msgid "[WARNING_NOTCL] There is no Geometry object available." +msgstr "[WARNING_NOTCL] Nu exista obiect Geometrie disponibil." + +#: flatcamTools/ToolSolderPaste.py:1153 +msgid "" +"[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " +"geometry." +msgstr "" +"[WARNING_NOTCL] Acest obiect Geometrie nu poate fi procesat Nu este o " +"Geometrie tip solder_paste_tool." + +#: flatcamTools/ToolSolderPaste.py:1258 +#, python-format +msgid "[success] ToolSolderPaste CNCjob created: %s" +msgstr "[success] Obiectul CNCJob tip solder_paste_tool a fost creat: %s" + +#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 +#: flatcamTools/ToolSolderPaste.py:1345 +msgid "" +"[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " +"solder_paste_tool CNCJob object." +msgstr "" +"[WARNING_NOTCL] Acest obiect CNCJob nu poate fi procesat. Nu este un obiect " +"CNCJob tip 'solder_paste_tool'" + +#: flatcamTools/ToolSolderPaste.py:1317 +msgid "[ERROR_NOTCL] No Gcode in the object..." +msgstr "[ERROR_NOTCL] Nu exista cod GCode in acest obiect ..." + +#: flatcamTools/ToolSolderPaste.py:1326 +#, python-format +msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" +msgstr "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" + +#: flatcamTools/ToolSolderPaste.py:1355 +msgid "Export GCode ..." +msgstr "Exporta GCode ..." + +#: flatcamTools/ToolSolderPaste.py:1363 +msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." +msgstr "[WARNING_NOTCL] Exportul codului masina CNC a fost anulat ..." + +#: flatcamTools/ToolSolderPaste.py:1393 +#, python-format +msgid "[success] Solder paste dispenser GCode file saved to: %s" +msgstr "" +"[success] Fişierul GCode pt dispensare pasta de fludor este salvat in: %s" + +#: flatcamTools/ToolTransform.py:23 +msgid "Object Transform" +msgstr "Transformare Obiect" + +#: flatcamTools/ToolTransform.py:84 +msgid "" +"Rotate the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" +"Roteste obiectele selectate.\n" +"Punctul de referinţă este mijlocul \n" +"formei înconjurătoare pt toate obiectele." + +#: flatcamTools/ToolTransform.py:120 flatcamTools/ToolTransform.py:138 +msgid "" +"Skew/shear the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" +"Deformează obiectele selectate.\n" +"Punctul de referinţă este mijlocul \n" +"formei înconjurătoare pt toate obiectele." + +#: flatcamTools/ToolTransform.py:176 flatcamTools/ToolTransform.py:193 +msgid "" +"Scale the selected object(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" +"Scalează obiectele selectate.\n" +"Punctul de referinţă depinde de\n" +"starea checkbox-ului >Referința Scalare<." + +#: flatcamTools/ToolTransform.py:202 +msgid "" +"Scale the selected object(s)\n" +"using the Scale Factor X for both axis." +msgstr "" +"Scalează obiectele selectate\n" +"folosind Factor X de scalare pentru\n" +"ambele axe." + +#: flatcamTools/ToolTransform.py:250 flatcamTools/ToolTransform.py:267 +msgid "" +"Offset the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects.\n" +msgstr "" +"Deplasează obiectele selectate.\n" +"Punctul de referinţă este mijlocul formei înconjurătoare\n" +"pentru toate obiectele selectate.\n" + +#: flatcamTools/ToolTransform.py:297 flatcamTools/ToolTransform.py:305 +msgid "" +"Flip the selected object(s) over the X axis.\n" +"Does not create a new object.\n" +" " +msgstr "" +"Oglindeste obiectele selectate pe axa X.\n" +"Nu crează un obiect nou." + +#: flatcamTools/ToolTransform.py:637 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to rotate!" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat. Selectează un obiect pentru " +"a fi Rotit!" + +#: flatcamTools/ToolTransform.py:665 +msgid "CNCJob objects can't be rotated." +msgstr "Obiectele tip CNCJob nu pot fi Rotite." + +#: flatcamTools/ToolTransform.py:674 +msgid "[success]Rotate done ..." +msgstr "[success] Rotatie executata ..." + +#: flatcamTools/ToolTransform.py:689 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to flip!" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat. Selectează un obiect pentru " +"a fi Oglindit!" + +#: flatcamTools/ToolTransform.py:724 +msgid "CNCJob objects can't be mirrored/flipped." +msgstr "Obiectele tip CNCJob nu pot fi Oglindite." + +#: flatcamTools/ToolTransform.py:735 +msgid "[success]Flip on the Y axis done ..." +msgstr "[success] Oglindire pe axa Y executata ..." + +#: flatcamTools/ToolTransform.py:745 +msgid "[success]Flip on the X axis done ..." +msgstr "[success] Oglindire pe axa X executata ..." + +#: flatcamTools/ToolTransform.py:759 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat. Selectează un obiect pentru " +"a fi Deformat!" + +#: flatcamTools/ToolTransform.py:781 +msgid "CNCJob objects can't be skewed." +msgstr "Obiectele tip CNCJob nu pot fi deformate." + +#: flatcamTools/ToolTransform.py:793 +#, python-format +msgid "[success]Skew on the %s axis done ..." +msgstr "[success] Oglindire pe axa %s executata ..." + +#: flatcamTools/ToolTransform.py:808 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to scale!" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat. Selectează un obiect pentru " +"a fi Scalat!" + +#: flatcamTools/ToolTransform.py:841 +msgid "CNCJob objects can't be scaled." +msgstr "Obiectele tip CNCJob nu pot fi scalate." + +#: flatcamTools/ToolTransform.py:861 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to offset!" +msgstr "" +"[WARNING_NOTCL] Nici-un obiect nu este selectat. Selectează un obiect pentru " +"a fi Deplasat!" + +#: flatcamTools/ToolTransform.py:882 +msgid "CNCJob objects can't be offseted." +msgstr "Obiectele tip CNCJob nu pot fi deplasate." + +#: flatcamTools/ToolTransform.py:894 +#, python-format +msgid "[success]Offset on the %s axis done ..." +msgstr "[success] Deplasarea de axa %s executata." + +#~ msgid "" +#~ "How much (fraction) of the tool width to overlap each tool pass.\n" +#~ "Example:\n" +#~ "A value here of 0.25 means 25\\% from the tool diameter found above.\n" +#~ "\n" +#~ "Adjust the value starting with lower values\n" +#~ "and increasing it if areas that should be painted are still \n" +#~ "not painted.\n" +#~ "Lower values = faster processing, faster execution on PCB.\n" +#~ "Higher values = slow processing and slow execution on CNC\n" +#~ "due of too many paths." +#~ msgstr "" +#~ "Cat de mult (fractie) din diametrul uneltei sa se suprapuna la fiecare " +#~ "trecere a uneltei.\n" +#~ "Exemplu:\n" +#~ "O valoare aici de 0.25 inseamna 25\\% din diametrul uneltei de mai sus.\n" +#~ "\n" +#~ "Ajusteaza valoarea incepand de la valori mici si pe urma creste daca " +#~ "ariile care ar trebui\n" +#~ " >pictate< inca nu sunt procesate.\n" +#~ "Valori scazute = procesare rapida,executie rapida a PCB-ului.\n" +#~ "Valori mari= procesare lenta cat si o executie la fel de lenta a PCB-" +#~ "ului,\n" +#~ "datorita numarului mai mare de treceri-taiere." + +#, fuzzy +#~| msgid "z_toolchange = Z coord for Toolchange" +#~ msgid "z_cut = Z coord for Toolchange" +#~ msgstr "z_toolchange = Z coord for Toolchange" + +#, fuzzy +#~| msgid "z_toolchange = Z coord for Toolchange" +#~ msgid "z_move = Z coord for Toolchange" +#~ msgstr "z_toolchange = Z coord for Toolchange" + +#~ msgid "%s/Project_%s" +#~ msgstr "%s/Proiect_%s" + +#~ msgid "tool_tab" +#~ msgstr "tool_tab" diff --git a/locale_template/strings.pot b/locale_template/strings.pot new file mode 100644 index 00000000..e9fc6095 --- /dev/null +++ b/locale_template/strings.pot @@ -0,0 +1,8526 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2019-03-17 23:12+0200\n" +"PO-Revision-Date: 2019-03-17 23:10+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n" +"%100<=19) ? 1 : 2);\n" +"X-Poedit-Basepath: ../../..\n" +"X-Poedit-SearchPath-0: .\n" + +#: FlatCAMApp.py:844 +msgid "[ERROR] Could not find the Language files. The App strings are missing." +msgstr "" + +#: FlatCAMApp.py:1672 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +msgid "Open cancelled." +msgstr "" + +#: FlatCAMApp.py:1686 +msgid "Open Config file failed." +msgstr "" + +#: FlatCAMApp.py:1871 +msgid "" +"[WARNING_NOTCL] Editing a MultiGeo Geometry is not possible for the moment." +msgstr "" + +#: FlatCAMApp.py:1892 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to edit." +msgstr "" + +#: FlatCAMApp.py:1903 +msgid "[WARNING_NOTCL]Editor is activated ..." +msgstr "" + +#: FlatCAMApp.py:1942 +msgid "[WARNING] Object empty after edit." +msgstr "" + +#: FlatCAMApp.py:1951 +msgid "[WARNING_NOTCL]Select a Geometry or Excellon Object to update." +msgstr "" + +#: FlatCAMApp.py:1964 +#, python-format +msgid "[selected] %s is updated, returning to App..." +msgstr "" + +#: FlatCAMApp.py:2287 +msgid "[ERROR] Could not load defaults file." +msgstr "" + +#: FlatCAMApp.py:2299 +msgid "[ERROR] Failed to parse defaults file." +msgstr "" + +#: FlatCAMApp.py:2320 FlatCAMApp.py:2323 +msgid "Import FlatCAM Preferences" +msgstr "" + +#: FlatCAMApp.py:2328 +msgid "[WARNING_NOTCL]FlatCAM preferences import cancelled." +msgstr "" + +#: FlatCAMApp.py:2336 FlatCAMApp.py:2810 +msgid "[ERROR_NOTCL] Could not load defaults file." +msgstr "" + +#: FlatCAMApp.py:2344 FlatCAMApp.py:2819 +msgid "[ERROR_NOTCL] Failed to parse defaults file." +msgstr "" + +#: FlatCAMApp.py:2347 +#, python-format +msgid "[success]Imported Defaults from %s" +msgstr "" + +#: FlatCAMApp.py:2357 FlatCAMApp.py:2361 +msgid "Export FlatCAM Preferences" +msgstr "" + +#: FlatCAMApp.py:2367 +msgid "[WARNING_NOTCL]FlatCAM preferences export cancelled." +msgstr "" + +#: FlatCAMApp.py:2383 +msgid "[ERROR_NOTCL]Could not load defaults file." +msgstr "" + +#: FlatCAMApp.py:2402 FlatCAMApp.py:2833 +msgid "[ERROR_NOTCL] Failed to write defaults to file." +msgstr "" + +#: FlatCAMApp.py:2454 +msgid "[ERROR_NOTCL]Failed to open recent files file for writing." +msgstr "" + +#: FlatCAMApp.py:2539 camlib.py:4229 +msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" +msgstr "" + +#: FlatCAMApp.py:2540 +#, python-brace-format +msgid "" +"Object ({kind}) failed because: {error} \n" +"\n" +msgstr "" + +#: FlatCAMApp.py:2560 +msgid "Converting units to " +msgstr "" + +#: FlatCAMApp.py:2618 FlatCAMApp.py:2621 FlatCAMApp.py:2624 FlatCAMApp.py:2627 +#, python-brace-format +msgid "" +"[selected]{kind} created/selected: {name}" +msgstr "" + +#: FlatCAMApp.py:2865 +msgid "[success]Defaults saved." +msgstr "" + +#: FlatCAMApp.py:2886 +msgid "[ERROR_NOTCL] Could not load factory defaults file." +msgstr "" + +#: FlatCAMApp.py:2895 +msgid "[ERROR_NOTCL] Failed to parse factory defaults file." +msgstr "" + +#: FlatCAMApp.py:2909 +msgid "[ERROR_NOTCL] Failed to write factory defaults to file." +msgstr "" + +#: FlatCAMApp.py:2913 +msgid "Factory defaults saved." +msgstr "" + +#: FlatCAMApp.py:2918 +msgid "" +"There are files/objects modified in FlatCAM. \n" +"Do you want to Save the project?" +msgstr "" + +#: FlatCAMApp.py:2921 FlatCAMApp.py:5190 +msgid "Save changes" +msgstr "" + +#: FlatCAMApp.py:2981 +msgid "" +"[ERROR] Failed join. The Geometry objects are of different types.\n" +"At least one is MultiGeo type and the other is SingleGeo type. A possibility " +"is to convert from one to another and retry joining \n" +"but in the case of converting from MultiGeo to SingleGeo, informations may " +"be lost and the result may not be what was expected. \n" +"Check the generated GCODE." +msgstr "" + +#: FlatCAMApp.py:3022 +msgid "[ERROR_NOTCL]Failed. Excellon joining works only on Excellon objects." +msgstr "" + +#: FlatCAMApp.py:3044 +msgid "[ERROR_NOTCL]Failed. Gerber joining works only on Gerber objects." +msgstr "" + +#: FlatCAMApp.py:3059 FlatCAMApp.py:3084 +msgid "[ERROR_NOTCL]Failed. Select a Geometry Object and try again." +msgstr "" + +#: FlatCAMApp.py:3063 FlatCAMApp.py:3088 +#, python-format +msgid "[ERROR_NOTCL]Expected a FlatCAMGeometry, got %s" +msgstr "" + +#: FlatCAMApp.py:3076 +msgid "[success] A Geometry object was converted to MultiGeo type." +msgstr "" + +#: FlatCAMApp.py:3102 +msgid "[success] A Geometry object was converted to SingleGeo type." +msgstr "" + +#: FlatCAMApp.py:3286 +#, python-format +msgid "[success]Converted units to %s" +msgstr "" + +#: FlatCAMApp.py:3297 +msgid "[WARNING_NOTCL]Units conversion cancelled." +msgstr "" + +#: FlatCAMApp.py:3862 +msgid "Open file" +msgstr "" + +#: FlatCAMApp.py:3913 FlatCAMApp.py:3918 +msgid "Export G-Code ..." +msgstr "" + +#: FlatCAMApp.py:3921 +msgid "[WARNING_NOTCL]Export Code cancelled." +msgstr "" + +#: FlatCAMApp.py:3931 +msgid "[WARNING] No such file or directory" +msgstr "" + +#: FlatCAMApp.py:3938 +#, python-format +msgid "Saved to: %s" +msgstr "" + +#: FlatCAMApp.py:4001 FlatCAMApp.py:4033 FlatCAMApp.py:4044 FlatCAMApp.py:4055 +#: flatcamTools/ToolNonCopperClear.py:487 flatcamTools/ToolSolderPaste.py:764 +msgid "" +"[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " +"format." +msgstr "" + +#: FlatCAMApp.py:4006 FlatCAMApp.py:4038 FlatCAMApp.py:4049 FlatCAMApp.py:4060 +#: flatcamGUI/FlatCAMGUI.py:2484 +msgid "[WARNING_NOTCL] Adding Tool cancelled ..." +msgstr "" + +#: FlatCAMApp.py:4009 +msgid "" +"Adding Tool works only when Advanced is checked.\n" +"Go to Preferences -> General - Show Advanced Options." +msgstr "" + +#: FlatCAMApp.py:4114 +msgid "Object(s) deleted ..." +msgstr "" + +#: FlatCAMApp.py:4118 +msgid "Failed. No object(s) selected..." +msgstr "" + +#: FlatCAMApp.py:4120 +msgid "Save the work in Editor and try again ..." +msgstr "" + +#: FlatCAMApp.py:4133 +msgid "Click to set the origin ..." +msgstr "" + +#: FlatCAMApp.py:4145 +msgid "Jump to ..." +msgstr "" + +#: FlatCAMApp.py:4146 +msgid "Enter the coordinates in format X,Y:" +msgstr "" + +#: FlatCAMApp.py:4153 +msgid "Wrong coordinates. Enter coordinates in format: X,Y" +msgstr "" + +#: FlatCAMApp.py:4168 +msgid "Done." +msgstr "" + +#: FlatCAMApp.py:4300 +msgid "[success] Origin set ..." +msgstr "" + +#: FlatCAMApp.py:4318 +msgid "Preferences" +msgstr "" + +#: FlatCAMApp.py:4338 +msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." +msgstr "" + +#: FlatCAMApp.py:4363 +msgid "[success] Flip on Y axis done." +msgstr "" + +#: FlatCAMApp.py:4365 FlatCAMApp.py:4405 FlatCAMEditor.py:1340 +#: flatcamTools/ToolTransform.py:750 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." +msgstr "" + +#: FlatCAMApp.py:4378 +msgid "[WARNING_NOTCL] No object selected to Flip on X axis." +msgstr "" + +#: FlatCAMApp.py:4403 +msgid "[success] Flip on X axis done." +msgstr "" + +#: FlatCAMApp.py:4418 +msgid "[WARNING_NOTCL] No object selected to Rotate." +msgstr "" + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Transform" +msgstr "" + +#: FlatCAMApp.py:4421 FlatCAMApp.py:4466 FlatCAMApp.py:4497 +msgid "Enter the Angle value:" +msgstr "" + +#: FlatCAMApp.py:4451 +msgid "[success] Rotation done." +msgstr "" + +#: FlatCAMApp.py:4453 FlatCAMEditor.py:1283 flatcamTools/ToolTransform.py:678 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." +msgstr "" + +#: FlatCAMApp.py:4464 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." +msgstr "" + +#: FlatCAMApp.py:4485 +msgid "[success] Skew on X axis done." +msgstr "" + +#: FlatCAMApp.py:4495 +msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." +msgstr "" + +#: FlatCAMApp.py:4516 +msgid "[success] Skew on Y axis done." +msgstr "" + +#: FlatCAMApp.py:4612 FlatCAMApp.py:4639 +msgid "" +"[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " +"format." +msgstr "" + +#: FlatCAMApp.py:4618 +msgid "[success] New Grid added ..." +msgstr "" + +#: FlatCAMApp.py:4621 +msgid "[WARNING_NOTCL] Grid already exists ..." +msgstr "" + +#: FlatCAMApp.py:4624 +msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." +msgstr "" + +#: FlatCAMApp.py:4646 +msgid "[ERROR_NOTCL] Grid Value does not exist ..." +msgstr "" + +#: FlatCAMApp.py:4649 +msgid "[success] Grid Value deleted ..." +msgstr "" + +#: FlatCAMApp.py:4652 +msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." +msgstr "" + +#: FlatCAMApp.py:4691 +msgid "[WARNING_NOTCL]No object selected to copy it's name" +msgstr "" + +#: FlatCAMApp.py:4695 +msgid "Name copied on clipboard ..." +msgstr "" + +#: FlatCAMApp.py:4990 FlatCAMApp.py:4993 FlatCAMApp.py:4996 FlatCAMApp.py:4999 +#: FlatCAMApp.py:5013 FlatCAMApp.py:5016 FlatCAMApp.py:5019 FlatCAMApp.py:5022 +#: FlatCAMApp.py:5061 FlatCAMApp.py:5064 FlatCAMApp.py:5067 FlatCAMApp.py:5070 +#: ObjectCollection.py:696 ObjectCollection.py:699 ObjectCollection.py:702 +#: ObjectCollection.py:705 +#, python-brace-format +msgid "[selected]{name} selected" +msgstr "" + +#: FlatCAMApp.py:5187 +msgid "" +"There are files/objects opened in FlatCAM.\n" +"Creating a New project will delete them.\n" +"Do you want to Save the project?" +msgstr "" + +#: FlatCAMApp.py:5205 +msgid "[success] New Project created..." +msgstr "" + +#: FlatCAMApp.py:5286 +msgid "" +"[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." +msgstr "" + +#: FlatCAMApp.py:5293 +msgid "" +"[WARNING_NOTCL] There is no selected object for which to see it's source " +"file code." +msgstr "" + +#: FlatCAMApp.py:5297 FlatCAMApp.py:6728 FlatCAMObj.py:5398 +msgid "Code Editor" +msgstr "" + +#: FlatCAMApp.py:5310 +#, python-format +msgid "[ERROR]App.on_view_source() -->%s" +msgstr "" + +#: FlatCAMApp.py:5348 FlatCAMApp.py:5351 flatcamGUI/FlatCAMGUI.py:541 +#: flatcamGUI/FlatCAMGUI.py:1590 +msgid "Open Gerber" +msgstr "" + +#: FlatCAMApp.py:5356 +msgid "[WARNING_NOTCL] Open Gerber cancelled." +msgstr "" + +#: FlatCAMApp.py:5377 FlatCAMApp.py:5380 flatcamGUI/FlatCAMGUI.py:542 +#: flatcamGUI/FlatCAMGUI.py:1591 +msgid "Open Excellon" +msgstr "" + +#: FlatCAMApp.py:5385 +msgid "[WARNING_NOTCL]Open Excellon cancelled." +msgstr "" + +#: FlatCAMApp.py:5407 FlatCAMApp.py:5410 +msgid "Open G-Code" +msgstr "" + +#: FlatCAMApp.py:5415 +msgid "[WARNING_NOTCL]Open G-Code cancelled." +msgstr "" + +#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 +msgid "Open Project" +msgstr "" + +#: FlatCAMApp.py:5444 +msgid "[WARNING_NOTCL]Open Project cancelled." +msgstr "" + +#: FlatCAMApp.py:5463 FlatCAMApp.py:5466 +msgid "Open Configuration File" +msgstr "" + +#: FlatCAMApp.py:5470 +msgid "[WARNING_NOTCL]Open Config cancelled." +msgstr "" + +#: FlatCAMApp.py:5485 FlatCAMApp.py:5682 FlatCAMApp.py:7588 FlatCAMApp.py:7608 +#: FlatCAMApp.py:7629 FlatCAMApp.py:7651 +msgid "[WARNING_NOTCL] No object selected." +msgstr "" + +#: FlatCAMApp.py:5486 FlatCAMApp.py:5683 +msgid "Please Select a Geometry object to export" +msgstr "" + +#: FlatCAMApp.py:5497 +msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." +msgstr "" + +#: FlatCAMApp.py:5510 FlatCAMApp.py:5514 +msgid "Export SVG" +msgstr "" + +#: FlatCAMApp.py:5519 +msgid "[WARNING_NOTCL]Export SVG cancelled." +msgstr "" + +#: FlatCAMApp.py:5533 +msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" +msgstr "" + +#: FlatCAMApp.py:5539 FlatCAMApp.py:5543 +msgid "Export PNG Image" +msgstr "" + +#: FlatCAMApp.py:5548 +msgid "Export PNG cancelled." +msgstr "" + +#: FlatCAMApp.py:5565 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." +msgstr "" + +#: FlatCAMApp.py:5570 +msgid "" +"[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." +msgstr "" + +#: FlatCAMApp.py:5582 +msgid "Save Gerber source file" +msgstr "" + +#: FlatCAMApp.py:5587 +msgid "[WARNING_NOTCL] Save Gerber source file cancelled." +msgstr "" + +#: FlatCAMApp.py:5604 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Excellon object to " +"export." +msgstr "" + +#: FlatCAMApp.py:5609 FlatCAMApp.py:5648 +msgid "" +"[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." +msgstr "" + +#: FlatCAMApp.py:5617 FlatCAMApp.py:5621 +msgid "Save Excellon source file" +msgstr "" + +#: FlatCAMApp.py:5626 +msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." +msgstr "" + +#: FlatCAMApp.py:5643 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an Excellon object to " +"export." +msgstr "" + +#: FlatCAMApp.py:5656 FlatCAMApp.py:5660 +msgid "Export Excellon" +msgstr "" + +#: FlatCAMApp.py:5665 +msgid "[WARNING_NOTCL]Export Excellon cancelled." +msgstr "" + +#: FlatCAMApp.py:5693 +msgid "[ERROR_NOTCL] Only Geometry objects can be used." +msgstr "" + +#: FlatCAMApp.py:5706 FlatCAMApp.py:5710 +msgid "Export DXF" +msgstr "" + +#: FlatCAMApp.py:5715 +msgid "[WARNING_NOTCL] Export DXF cancelled." +msgstr "" + +#: FlatCAMApp.py:5733 FlatCAMApp.py:5736 +msgid "Import SVG" +msgstr "" + +#: FlatCAMApp.py:5744 +msgid "[WARNING_NOTCL] Open SVG cancelled." +msgstr "" + +#: FlatCAMApp.py:5763 FlatCAMApp.py:5766 +msgid "Import DXF" +msgstr "" + +#: FlatCAMApp.py:5774 +msgid "[WARNING_NOTCL]Open DXF cancelled." +msgstr "" + +#: FlatCAMApp.py:5792 FlatCAMApp.py:5795 +msgid "Open TCL script" +msgstr "" + +#: FlatCAMApp.py:5803 +msgid "[WARNING_NOTCL]Open TCL script cancelled." +msgstr "" + +#: FlatCAMApp.py:5851 FlatCAMApp.py:5855 +msgid "Save Project As ..." +msgstr "" + +#: FlatCAMApp.py:5852 +#, python-brace-format +msgid "{l_save}/Project_{date}" +msgstr "" + +#: FlatCAMApp.py:5860 +msgid "[WARNING_NOTCL] Save Project cancelled." +msgstr "" + +#: FlatCAMApp.py:5905 +msgid "Exporting SVG" +msgstr "" + +#: FlatCAMApp.py:5938 FlatCAMApp.py:6043 FlatCAMApp.py:6157 +#, python-format +msgid "[success] SVG file exported to %s" +msgstr "" + +#: FlatCAMApp.py:5969 FlatCAMApp.py:6089 +#, python-format +msgid "[WARNING_NOTCL]No object Box. Using instead %s" +msgstr "" + +#: FlatCAMApp.py:6046 FlatCAMApp.py:6160 +msgid "Generating Film ... Please wait." +msgstr "" + +#: FlatCAMApp.py:6307 +#, python-format +msgid "[success] Excellon file exported to %s" +msgstr "" + +#: FlatCAMApp.py:6314 +msgid "Exporting Excellon" +msgstr "" + +#: FlatCAMApp.py:6319 FlatCAMApp.py:6326 +msgid "[ERROR_NOTCL] Could not export Excellon file." +msgstr "" + +#: FlatCAMApp.py:6365 +#, python-format +msgid "[success] DXF file exported to %s" +msgstr "" + +#: FlatCAMApp.py:6371 +msgid "Exporting DXF" +msgstr "" + +#: FlatCAMApp.py:6376 FlatCAMApp.py:6383 +msgid "[[WARNING_NOTCL]] Could not export DXF file." +msgstr "" + +#: FlatCAMApp.py:6403 FlatCAMApp.py:6445 FlatCAMApp.py:6486 +msgid "" +"[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " +"Gerber are supported" +msgstr "" + +#: FlatCAMApp.py:6413 +msgid "Importing SVG" +msgstr "" + +#: FlatCAMApp.py:6424 FlatCAMApp.py:6466 FlatCAMApp.py:6506 FlatCAMApp.py:6582 +#: FlatCAMApp.py:6649 FlatCAMApp.py:6714 +#, python-format +msgid "[success] Opened: %s" +msgstr "" + +#: FlatCAMApp.py:6455 +msgid "Importing DXF" +msgstr "" + +#: FlatCAMApp.py:6494 +msgid "Importing Image" +msgstr "" + +#: FlatCAMApp.py:6535 FlatCAMApp.py:6537 +#, python-format +msgid "[ERROR_NOTCL] Failed to open file: %s" +msgstr "" + +#: FlatCAMApp.py:6540 +#, python-brace-format +msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" +msgstr "" + +#: FlatCAMApp.py:6546 FlatCAMEditor.py:5802 FlatCAMObj.py:4104 +msgid "[ERROR] An internal error has ocurred. See shell.\n" +msgstr "" + +#: FlatCAMApp.py:6555 +msgid "" +"[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." +msgstr "" + +#: FlatCAMApp.py:6563 +msgid "Opening Gerber" +msgstr "" + +#: FlatCAMApp.py:6573 +msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." +msgstr "" + +#: FlatCAMApp.py:6608 +msgid "[ERROR_NOTCL] This is not Excellon file." +msgstr "" + +#: FlatCAMApp.py:6611 +#, python-format +msgid "[ERROR_NOTCL] Cannot open file: %s" +msgstr "" + +#: FlatCAMApp.py:6616 +msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" +msgstr "" + +#: FlatCAMApp.py:6632 +#, python-format +msgid "[ERROR_NOTCL] No geometry found in file: %s" +msgstr "" + +#: FlatCAMApp.py:6635 +msgid "Opening Excellon." +msgstr "" + +#: FlatCAMApp.py:6642 +msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." +msgstr "" + +#: FlatCAMApp.py:6681 +#, python-format +msgid "[ERROR_NOTCL] Failed to open %s" +msgstr "" + +#: FlatCAMApp.py:6691 +msgid "[ERROR_NOTCL] This is not GCODE" +msgstr "" + +#: FlatCAMApp.py:6697 +msgid "Opening G-Code." +msgstr "" + +#: FlatCAMApp.py:6705 +msgid "" +"[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n" +" Attempting to create a FlatCAM CNCJob Object from G-Code file failed during " +"processing" +msgstr "" + +#: FlatCAMApp.py:6745 +#, python-format +msgid "[ERROR_NOTCL] Failed to open config file: %s" +msgstr "" + +#: FlatCAMApp.py:6770 FlatCAMApp.py:6787 +#, python-format +msgid "[ERROR_NOTCL] Failed to open project file: %s" +msgstr "" + +#: FlatCAMApp.py:6777 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse project file: %s" +msgstr "" + +#: FlatCAMApp.py:6813 +#, python-format +msgid "[success] Project loaded from: %s" +msgstr "" + +#: FlatCAMApp.py:6943 +msgid "Available commands:\n" +msgstr "" + +#: FlatCAMApp.py:6945 +msgid "" +"\n" +"\n" +"Type help for usage.\n" +" Example: help open_gerber" +msgstr "" + +#: FlatCAMApp.py:7093 +msgid "Shows list of commands." +msgstr "" + +#: FlatCAMApp.py:7146 +msgid "[ERROR_NOTCL] Failed to load recent item list." +msgstr "" + +#: FlatCAMApp.py:7153 +msgid "[ERROR_NOTCL] Failed to parse recent item list." +msgstr "" + +#: FlatCAMApp.py:7214 flatcamGUI/FlatCAMGUI.py:856 +msgid "Shortcut Key List" +msgstr "" + +#: FlatCAMApp.py:7221 +msgid "" +"\n" +"

Selected Tab - Choose an Item from " +"Project Tab

\n" +"\n" +"

Details:
\n" +"The normal flow when working in FlatCAM is the following:

\n" +"\n" +"
    \n" +"\t
  1. Loat/Import a Gerber, Excellon, Gcode, " +"DXF, Raster Image or SVG file into FlatCAM using either the menu's, " +"toolbars, key shortcuts or even dragging and dropping the files on the GUI." +"
    \n" +"\t
    \n" +"\tYou can also load a FlatCAM project by double clicking on " +"the project file, drag & drop of the file into the FLATCAM GUI or " +"through the menu/toolbar links offered within the app.

    \n" +"\t 
  2. \n" +"\t
  3. Once an object is available in the " +"Project Tab, by selecting it and then focusing on SELECTED TAB (more simpler is to double click the object name in the Project Tab), " +"SELECTED TAB will be updated with the object properties " +"according to it's kind: Gerber, Excellon, Geometry or CNCJob object.
    \n" +"\t
    \n" +"\tIf the selection of the object is done on the canvas by single click " +"instead, and the SELECTED TAB is in focus, again the object " +"properties will be displayed into the Selected Tab. Alternatively, double " +"clicking on the object on the canvas will bring the SELECTED TAB and populate it even if it was out of focus.
    \n" +"\t
    \n" +"\tYou can change the parameters in this screen and the flow direction is " +"like this:
    \n" +"\t
    \n" +"\tGerber/Excellon Object -> Change Param -> Generate " +"Geometry -> Geometry Object -> Add tools (change " +"param in Selected Tab) -> Generate CNCJob -> CNCJob Object -> Verify GCode (through Edit CNC Code) and/or append/prepend to " +"GCode (again, done in SELECTED TAB) -> Save GCode
  4. \n" +"
\n" +"\n" +"

A list of key shortcuts is available " +"through an menu entry in Help -> Shortcuts List or " +"through it's own key shortcut: F3.

\n" +"\n" +" " +msgstr "" + +#: FlatCAMApp.py:7325 +msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." +msgstr "" + +#: FlatCAMApp.py:7332 +msgid "[ERROR_NOTCL] Could not parse information about latest version." +msgstr "" + +#: FlatCAMApp.py:7342 +msgid "[success] FlatCAM is up to date!" +msgstr "" + +#: FlatCAMApp.py:7347 +msgid "Newer Version Available" +msgstr "" + +#: FlatCAMApp.py:7348 +msgid "" +"There is a newer version of FlatCAM available for download:\n" +"\n" +msgstr "" + +#: FlatCAMApp.py:7350 +msgid "info" +msgstr "" + +#: FlatCAMApp.py:7369 +msgid "[success]All plots disabled." +msgstr "" + +#: FlatCAMApp.py:7375 +msgid "[success]All non selected plots disabled." +msgstr "" + +#: FlatCAMApp.py:7381 +msgid "[success]All plots enabled." +msgstr "" + +#: FlatCAMApp.py:7491 +msgid "Saving FlatCAM Project" +msgstr "" + +#: FlatCAMApp.py:7512 FlatCAMApp.py:7543 +#, python-format +msgid "[success] Project saved to: %s" +msgstr "" + +#: FlatCAMApp.py:7530 +#, python-format +msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." +msgstr "" + +#: FlatCAMApp.py:7537 +#, python-format +msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." +msgstr "" + +#: FlatCAMApp.py:7545 +#, python-format +msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." +msgstr "" + +#: FlatCAMEditor.py:76 +msgid "Buffer distance:" +msgstr "" + +#: FlatCAMEditor.py:77 +msgid "Buffer corner:" +msgstr "" + +#: FlatCAMEditor.py:79 +msgid "" +"There are 3 types of corners:\n" +" - 'Round': the corner is rounded for exterior buffer.\n" +" - 'Square:' the corner is met in a sharp angle for exterior buffer.\n" +" - 'Beveled:' the corner is a line that directly connects the features " +"meeting in the corner" +msgstr "" + +#: FlatCAMEditor.py:85 +msgid "Round" +msgstr "" + +#: FlatCAMEditor.py:86 +msgid "Square" +msgstr "" + +#: FlatCAMEditor.py:87 +msgid "Beveled" +msgstr "" + +#: FlatCAMEditor.py:94 +msgid "Buffer Interior" +msgstr "" + +#: FlatCAMEditor.py:96 +msgid "Buffer Exterior" +msgstr "" + +#: FlatCAMEditor.py:102 +msgid "Full Buffer" +msgstr "" + +#: FlatCAMEditor.py:123 FlatCAMEditor.py:2623 +msgid "Buffer Tool" +msgstr "" + +#: FlatCAMEditor.py:134 FlatCAMEditor.py:151 FlatCAMEditor.py:168 +#: FlatCAMEditor.py:2641 FlatCAMEditor.py:2667 FlatCAMEditor.py:2693 +msgid "" +"[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " +"retry." +msgstr "" + +#: FlatCAMEditor.py:416 flatcamGUI/FlatCAMGUI.py:3402 +#: flatcamGUI/FlatCAMGUI.py:4608 flatcamGUI/FlatCAMGUI.py:4884 +#: flatcamGUI/FlatCAMGUI.py:5015 flatcamGUI/ObjectUI.py:331 +msgid "Tool dia:" +msgstr "" + +#: FlatCAMEditor.py:418 flatcamGUI/FlatCAMGUI.py:5017 +msgid "" +"Diameter of the tool to\n" +"be used in the operation." +msgstr "" + +#: FlatCAMEditor.py:427 flatcamGUI/FlatCAMGUI.py:4790 +#: flatcamGUI/FlatCAMGUI.py:5026 flatcamTools/ToolNonCopperClear.py:164 +#: flatcamTools/ToolPaint.py:160 +msgid "Overlap:" +msgstr "" + +#: FlatCAMEditor.py:429 flatcamTools/ToolPaint.py:162 +#, python-format +#| msgid "" +#| "How much (fraction) of the tool width to overlap each tool pass.\n" +#| "Example:\n" +#| "A value here of 0.25 means 25%% from the tool diameter found above.\n" +#| "\n" +#| "Adjust the value starting with lower values\n" +#| "and increasing it if areas that should be painted are still \n" +#| "not painted.\n" +#| "Lower values = faster processing, faster execution on PCB.\n" +#| "Higher values = slow processing and slow execution on CNC\n" +#| "due of too many paths." +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be painted are still \n" +"not painted.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" + +#: FlatCAMEditor.py:445 flatcamGUI/FlatCAMGUI.py:4806 +#: flatcamGUI/FlatCAMGUI.py:4892 flatcamGUI/FlatCAMGUI.py:5036 +#: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:180 +#: flatcamTools/ToolPaint.py:177 +msgid "Margin:" +msgstr "" + +#: FlatCAMEditor.py:447 flatcamGUI/FlatCAMGUI.py:5038 +#: flatcamTools/ToolPaint.py:179 +msgid "" +"Distance by which to avoid\n" +"the edges of the polygon to\n" +"be painted." +msgstr "" + +#: FlatCAMEditor.py:456 flatcamGUI/FlatCAMGUI.py:4815 +#: flatcamGUI/FlatCAMGUI.py:5047 flatcamTools/ToolNonCopperClear.py:189 +#: flatcamTools/ToolPaint.py:188 +msgid "Method:" +msgstr "" + +#: FlatCAMEditor.py:458 flatcamGUI/FlatCAMGUI.py:5049 +msgid "" +"Algorithm to paint the polygon:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed." +msgstr "" + +#: FlatCAMEditor.py:464 flatcamGUI/FlatCAMGUI.py:4824 +#: flatcamGUI/FlatCAMGUI.py:5055 +msgid "Standard" +msgstr "" + +#: FlatCAMEditor.py:465 flatcamGUI/FlatCAMGUI.py:4825 +#: flatcamGUI/FlatCAMGUI.py:5056 +msgid "Seed-based" +msgstr "" + +#: FlatCAMEditor.py:466 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:5057 +msgid "Straight lines" +msgstr "" + +#: FlatCAMEditor.py:471 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:5062 flatcamTools/ToolNonCopperClear.py:205 +#: flatcamTools/ToolPaint.py:204 +msgid "Connect:" +msgstr "" + +#: FlatCAMEditor.py:473 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:5064 flatcamTools/ToolNonCopperClear.py:207 +#: flatcamTools/ToolPaint.py:206 +msgid "" +"Draw lines between resulting\n" +"segments to minimize tool lifts." +msgstr "" + +#: FlatCAMEditor.py:480 flatcamGUI/FlatCAMGUI.py:4840 +#: flatcamGUI/FlatCAMGUI.py:5072 flatcamTools/ToolNonCopperClear.py:214 +#: flatcamTools/ToolPaint.py:213 +msgid "Contour:" +msgstr "" + +#: FlatCAMEditor.py:482 flatcamGUI/FlatCAMGUI.py:4842 +#: flatcamGUI/FlatCAMGUI.py:5074 flatcamTools/ToolNonCopperClear.py:216 +#: flatcamTools/ToolPaint.py:215 +msgid "" +"Cut around the perimeter of the polygon\n" +"to trim rough edges." +msgstr "" + +#: FlatCAMEditor.py:494 +msgid "Paint" +msgstr "" + +#: FlatCAMEditor.py:512 flatcamGUI/FlatCAMGUI.py:575 +#: flatcamGUI/FlatCAMGUI.py:1624 flatcamGUI/ObjectUI.py:1379 +#: flatcamTools/ToolPaint.py:340 +msgid "Paint Tool" +msgstr "" + +#: FlatCAMEditor.py:548 +msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." +msgstr "" + +#: FlatCAMEditor.py:559 flatcamTools/ToolCutOut.py:343 +#: flatcamTools/ToolCutOut.py:481 flatcamTools/ToolCutOut.py:601 +#: flatcamTools/ToolCutOut.py:706 flatcamTools/ToolDblSided.py:363 +msgid "" +"[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and " +"retry." +msgstr "" + +#: FlatCAMEditor.py:570 +msgid "" +"[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." +msgstr "" + +#: FlatCAMEditor.py:582 +msgid "" +"[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " +"retry." +msgstr "" + +#: FlatCAMEditor.py:591 FlatCAMEditor.py:2648 FlatCAMEditor.py:2674 +#: FlatCAMEditor.py:2700 flatcamTools/ToolNonCopperClear.py:806 +#: flatcamTools/ToolProperties.py:104 +msgid "Tools" +msgstr "" + +#: FlatCAMEditor.py:602 FlatCAMEditor.py:975 flatcamGUI/FlatCAMGUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:1635 flatcamTools/ToolTransform.py:398 +msgid "Transform Tool" +msgstr "" + +#: FlatCAMEditor.py:603 FlatCAMEditor.py:664 flatcamTools/ToolTransform.py:24 +#: flatcamTools/ToolTransform.py:82 +msgid "Rotate" +msgstr "" + +#: FlatCAMEditor.py:604 flatcamTools/ToolTransform.py:25 +msgid "Skew/Shear" +msgstr "" + +#: FlatCAMEditor.py:605 flatcamGUI/ObjectUI.py:100 flatcamGUI/ObjectUI.py:265 +#: flatcamTools/ToolTransform.py:26 +msgid "Scale" +msgstr "" + +#: FlatCAMEditor.py:606 flatcamTools/ToolTransform.py:27 +msgid "Mirror (Flip)" +msgstr "" + +#: FlatCAMEditor.py:607 flatcamGUI/ObjectUI.py:127 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 flatcamTools/ToolTransform.py:28 +msgid "Offset" +msgstr "" + +#: FlatCAMEditor.py:618 +#, python-format +msgid "Editor %s" +msgstr "" + +#: FlatCAMEditor.py:650 FlatCAMEditor.py:4851 FlatCAMEditor.py:4887 +#: flatcamTools/ToolTransform.py:68 +msgid "Angle:" +msgstr "" + +#: FlatCAMEditor.py:652 flatcamTools/ToolTransform.py:70 +msgid "" +"Angle for Rotation action, in degrees.\n" +"Float number between -360 and 359.\n" +"Positive numbers for CW motion.\n" +"Negative numbers for CCW motion." +msgstr "" + +#: FlatCAMEditor.py:666 +msgid "" +"Rotate the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" + +#: FlatCAMEditor.py:689 flatcamTools/ToolTransform.py:107 +msgid "Angle X:" +msgstr "" + +#: FlatCAMEditor.py:691 FlatCAMEditor.py:709 flatcamTools/ToolTransform.py:109 +#: flatcamTools/ToolTransform.py:127 +msgid "" +"Angle for Skew action, in degrees.\n" +"Float number between -360 and 359." +msgstr "" + +#: FlatCAMEditor.py:700 flatcamTools/ToolTransform.py:118 +msgid "Skew X" +msgstr "" + +#: FlatCAMEditor.py:702 FlatCAMEditor.py:720 +msgid "" +"Skew/shear the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes." +msgstr "" + +#: FlatCAMEditor.py:707 flatcamTools/ToolTransform.py:125 +msgid "Angle Y:" +msgstr "" + +#: FlatCAMEditor.py:718 flatcamTools/ToolTransform.py:136 +msgid "Skew Y" +msgstr "" + +#: FlatCAMEditor.py:746 flatcamTools/ToolTransform.py:164 +msgid "Factor X:" +msgstr "" + +#: FlatCAMEditor.py:748 flatcamTools/ToolTransform.py:166 +msgid "Factor for Scale action over X axis." +msgstr "" + +#: FlatCAMEditor.py:756 flatcamTools/ToolTransform.py:174 +msgid "Scale X" +msgstr "" + +#: FlatCAMEditor.py:758 FlatCAMEditor.py:775 +msgid "" +"Scale the selected shape(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" + +#: FlatCAMEditor.py:763 flatcamTools/ToolTransform.py:181 +msgid "Factor Y:" +msgstr "" + +#: FlatCAMEditor.py:765 flatcamTools/ToolTransform.py:183 +msgid "Factor for Scale action over Y axis." +msgstr "" + +#: FlatCAMEditor.py:773 flatcamTools/ToolTransform.py:191 +msgid "Scale Y" +msgstr "" + +#: FlatCAMEditor.py:782 flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamTools/ToolTransform.py:200 +msgid "Link" +msgstr "" + +#: FlatCAMEditor.py:784 +msgid "" +"Scale the selected shape(s)\n" +"using the Scale Factor X for both axis." +msgstr "" + +#: FlatCAMEditor.py:790 flatcamGUI/FlatCAMGUI.py:5429 +#: flatcamTools/ToolTransform.py:208 +msgid "Scale Reference" +msgstr "" + +#: FlatCAMEditor.py:792 +msgid "" +"Scale the selected shape(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected shapes when unchecked." +msgstr "" + +#: FlatCAMEditor.py:820 flatcamTools/ToolTransform.py:238 +msgid "Value X:" +msgstr "" + +#: FlatCAMEditor.py:822 flatcamTools/ToolTransform.py:240 +msgid "Value for Offset action on X axis." +msgstr "" + +#: FlatCAMEditor.py:830 flatcamTools/ToolTransform.py:248 +msgid "Offset X" +msgstr "" + +#: FlatCAMEditor.py:832 FlatCAMEditor.py:850 +msgid "" +"Offset the selected shape(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected shapes.\n" +msgstr "" + +#: FlatCAMEditor.py:838 flatcamTools/ToolTransform.py:255 +msgid "Value Y:" +msgstr "" + +#: FlatCAMEditor.py:840 flatcamTools/ToolTransform.py:257 +msgid "Value for Offset action on Y axis." +msgstr "" + +#: FlatCAMEditor.py:848 flatcamTools/ToolTransform.py:265 +msgid "Offset Y" +msgstr "" + +#: FlatCAMEditor.py:879 flatcamTools/ToolTransform.py:295 +msgid "Flip on X" +msgstr "" + +#: FlatCAMEditor.py:881 FlatCAMEditor.py:889 +msgid "" +"Flip the selected shape(s) over the X axis.\n" +"Does not create a new shape." +msgstr "" + +#: FlatCAMEditor.py:887 flatcamTools/ToolTransform.py:303 +msgid "Flip on Y" +msgstr "" + +#: FlatCAMEditor.py:896 flatcamTools/ToolTransform.py:312 +msgid "Ref Pt" +msgstr "" + +#: FlatCAMEditor.py:898 +msgid "" +"Flip the selected shape(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" + +#: FlatCAMEditor.py:910 flatcamTools/ToolTransform.py:325 +msgid "Point:" +msgstr "" + +#: FlatCAMEditor.py:912 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y." +msgstr "" + +#: FlatCAMEditor.py:922 flatcamGUI/ObjectUI.py:1059 +#: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 +#: flatcamTools/ToolNonCopperClear.py:133 flatcamTools/ToolPaint.py:131 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolTransform.py:337 +msgid "Add" +msgstr "" + +#: FlatCAMEditor.py:924 flatcamTools/ToolTransform.py:339 +msgid "" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. Then click Add button to insert." +msgstr "" + +#: FlatCAMEditor.py:1039 +msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." +msgstr "" + +#: FlatCAMEditor.py:1060 flatcamTools/ToolTransform.py:468 +msgid "[ERROR_NOTCL]Wrong value format entered for Rotate, use a number." +msgstr "" + +#: FlatCAMEditor.py:1097 flatcamTools/ToolTransform.py:502 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew X, use a number." +msgstr "" + +#: FlatCAMEditor.py:1118 flatcamTools/ToolTransform.py:520 +msgid "[ERROR_NOTCL]Wrong value format entered for Skew Y, use a number." +msgstr "" + +#: FlatCAMEditor.py:1139 flatcamTools/ToolTransform.py:538 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale X, use a number." +msgstr "" + +#: FlatCAMEditor.py:1176 flatcamTools/ToolTransform.py:572 +msgid "[ERROR_NOTCL]Wrong value format entered for Scale Y, use a number." +msgstr "" + +#: FlatCAMEditor.py:1208 flatcamTools/ToolTransform.py:601 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset X, use a number." +msgstr "" + +#: FlatCAMEditor.py:1229 flatcamTools/ToolTransform.py:619 +msgid "[ERROR_NOTCL]Wrong value format entered for Offset Y, use a number." +msgstr "" + +#: FlatCAMEditor.py:1247 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" +msgstr "" + +#: FlatCAMEditor.py:1250 flatcamTools/ToolTransform.py:640 +msgid "Appying Rotate" +msgstr "" + +#: FlatCAMEditor.py:1278 +msgid "[success] Done. Rotate completed." +msgstr "" + +#: FlatCAMEditor.py:1294 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" +msgstr "" + +#: FlatCAMEditor.py:1297 flatcamTools/ToolTransform.py:692 +msgid "Applying Flip" +msgstr "" + +#: FlatCAMEditor.py:1327 +msgid "[success] Flip on the Y axis done ..." +msgstr "" + +#: FlatCAMEditor.py:1330 +msgid "[success] Flip on the X axis done ..." +msgstr "" + +#: FlatCAMEditor.py:1349 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" +msgstr "" + +#: FlatCAMEditor.py:1352 flatcamTools/ToolTransform.py:762 +msgid "Applying Skew" +msgstr "" + +#: FlatCAMEditor.py:1377 +#, python-format +msgid "[success] Skew on the %s axis done ..." +msgstr "" + +#: FlatCAMEditor.py:1381 flatcamTools/ToolTransform.py:797 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." +msgstr "" + +#: FlatCAMEditor.py:1392 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" +msgstr "" + +#: FlatCAMEditor.py:1395 flatcamTools/ToolTransform.py:811 +msgid "Applying Scale" +msgstr "" + +#: FlatCAMEditor.py:1428 flatcamTools/ToolTransform.py:849 +#, python-format +msgid "[success] Scale on the %s axis done ..." +msgstr "" + +#: FlatCAMEditor.py:1431 flatcamTools/ToolTransform.py:852 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." +msgstr "" + +#: FlatCAMEditor.py:1440 +msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" +msgstr "" + +#: FlatCAMEditor.py:1443 flatcamTools/ToolTransform.py:864 +msgid "Applying Offset" +msgstr "" + +#: FlatCAMEditor.py:1467 +#, python-format +msgid "[success] Offset on the %s axis done ..." +msgstr "" + +#: FlatCAMEditor.py:1471 flatcamTools/ToolTransform.py:898 +#, python-format +msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." +msgstr "" + +#: FlatCAMEditor.py:1475 +msgid "Rotate ..." +msgstr "" + +#: FlatCAMEditor.py:1476 FlatCAMEditor.py:1533 FlatCAMEditor.py:1550 +msgid "Enter an Angle Value (degrees):" +msgstr "" + +#: FlatCAMEditor.py:1485 +msgid "[success] Geometry shape rotate done..." +msgstr "" + +#: FlatCAMEditor.py:1490 +msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." +msgstr "" + +#: FlatCAMEditor.py:1496 +msgid "Offset on X axis ..." +msgstr "" + +#: FlatCAMEditor.py:1497 FlatCAMEditor.py:1516 +#, python-format +msgid "Enter a distance Value (%s):" +msgstr "" + +#: FlatCAMEditor.py:1506 +msgid "[success] Geometry shape offset on X axis done..." +msgstr "" + +#: FlatCAMEditor.py:1510 +msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." +msgstr "" + +#: FlatCAMEditor.py:1515 +msgid "Offset on Y axis ..." +msgstr "" + +#: FlatCAMEditor.py:1525 +msgid "[success] Geometry shape offset on Y axis done..." +msgstr "" + +#: FlatCAMEditor.py:1529 +msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." +msgstr "" + +#: FlatCAMEditor.py:1532 +msgid "Skew on X axis ..." +msgstr "" + +#: FlatCAMEditor.py:1542 +msgid "[success] Geometry shape skew on X axis done..." +msgstr "" + +#: FlatCAMEditor.py:1546 +msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." +msgstr "" + +#: FlatCAMEditor.py:1549 +msgid "Skew on Y axis ..." +msgstr "" + +#: FlatCAMEditor.py:1559 +msgid "[success] Geometry shape skew on Y axis done..." +msgstr "" + +#: FlatCAMEditor.py:1563 +msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." +msgstr "" + +#: FlatCAMEditor.py:1894 FlatCAMEditor.py:1933 +msgid "Click on CENTER ..." +msgstr "" + +#: FlatCAMEditor.py:1901 +msgid "Click on Circle perimeter point to complete ..." +msgstr "" + +#: FlatCAMEditor.py:1925 +msgid "[success]Done. Adding Circle completed." +msgstr "" + +#: FlatCAMEditor.py:1952 +msgid "Click on Start arc point ..." +msgstr "" + +#: FlatCAMEditor.py:1956 +msgid "Click on End arc point to complete ..." +msgstr "" + +#: FlatCAMEditor.py:2111 +msgid "[success]Done. Arc completed." +msgstr "" + +#: FlatCAMEditor.py:2123 +msgid "Click on 1st corner ..." +msgstr "" + +#: FlatCAMEditor.py:2163 +msgid "Click on 1st point ..." +msgstr "" + +#: FlatCAMEditor.py:2170 +msgid "Click on next Point or click Right mouse button to complete ..." +msgstr "" + +#: FlatCAMEditor.py:2193 +msgid "[success]Done. Polygon completed." +msgstr "" + +#: FlatCAMEditor.py:2212 +msgid "[success]Done. Path completed." +msgstr "" + +#: FlatCAMEditor.py:2472 FlatCAMEditor.py:4034 +msgid "[WARNING_NOTCL] Move cancelled. No shape selected." +msgstr "" + +#: FlatCAMEditor.py:2476 +msgid "Click on reference point." +msgstr "" + +#: FlatCAMEditor.py:2479 +msgid "Click on destination point." +msgstr "" + +#: FlatCAMEditor.py:2510 +msgid "[success]Done. Geometry(s) Move completed." +msgstr "" + +#: FlatCAMEditor.py:2555 +msgid "[success]Done. Geometry(s) Copy completed." +msgstr "" + +#: FlatCAMEditor.py:2567 +msgid "Click on the Destination point..." +msgstr "" + +#: FlatCAMEditor.py:2581 +#, python-format +msgid "" +"[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " +"supported. Error: %s" +msgstr "" + +#: FlatCAMEditor.py:2591 +msgid "[success]Done. Adding Text completed." +msgstr "" + +#: FlatCAMEditor.py:2619 +msgid "Create buffer geometry ..." +msgstr "" + +#: FlatCAMEditor.py:2630 FlatCAMEditor.py:2656 FlatCAMEditor.py:2682 +msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." +msgstr "" + +#: FlatCAMEditor.py:2652 +msgid "[success]Done. Buffer Tool completed." +msgstr "" + +#: FlatCAMEditor.py:2678 +msgid "[success]Done. Buffer Int Tool completed." +msgstr "" + +#: FlatCAMEditor.py:2704 +msgid "[success]Done. Buffer Ext Tool completed." +msgstr "" + +#: FlatCAMEditor.py:2737 +msgid "Create Paint geometry ..." +msgstr "" + +#: FlatCAMEditor.py:2751 +msgid "Shape transformations ..." +msgstr "" + +#: FlatCAMEditor.py:2776 +msgid "[WARNING_NOTCL] To add a drill first select a tool" +msgstr "" + +#: FlatCAMEditor.py:2785 FlatCAMEditor.py:2875 FlatCAMEditor.py:3148 +#: FlatCAMEditor.py:3173 +msgid "Click on target location ..." +msgstr "" + +#: FlatCAMEditor.py:2825 +msgid "[success]Done. Drill added." +msgstr "" + +#: FlatCAMEditor.py:2867 +msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" +msgstr "" + +#: FlatCAMEditor.py:2892 +msgid "Click on the Drill Circular Array Start position" +msgstr "" + +#: FlatCAMEditor.py:2914 +msgid "" +"[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " +"separator." +msgstr "" + +#: FlatCAMEditor.py:2917 +msgid "[ERROR_NOTCL] The value is mistyped. Check the value." +msgstr "" + +#: FlatCAMEditor.py:3010 +msgid "[WARNING_NOTCL]Too many drills for the selected spacing angle." +msgstr "" + +#: FlatCAMEditor.py:3027 +msgid "[success]Done. Drill Array added." +msgstr "" + +#: FlatCAMEditor.py:3038 +msgid "Click on the Drill(s) to resize ..." +msgstr "" + +#: FlatCAMEditor.py:3058 +msgid "" +"[ERROR_NOTCL]Resize drill(s) failed. Please enter a diameter for resize." +msgstr "" + +#: FlatCAMEditor.py:3130 +msgid "[success]Done. Drill Resize completed." +msgstr "" + +#: FlatCAMEditor.py:3150 +msgid "Click on reference location ..." +msgstr "" + +#: FlatCAMEditor.py:3205 +msgid "[success]Done. Drill(s) Move completed." +msgstr "" + +#: FlatCAMEditor.py:3258 +msgid "[success]Done. Drill(s) copied." +msgstr "" + +#: FlatCAMEditor.py:3908 flatcamGUI/FlatCAMGUI.py:2114 +#: flatcamGUI/FlatCAMGUI.py:2126 +msgid "[success]Done." +msgstr "" + +#: FlatCAMEditor.py:4041 +msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." +msgstr "" + +#: FlatCAMEditor.py:4048 flatcamGUI/FlatCAMGUI.py:2406 +#: flatcamGUI/FlatCAMGUI.py:2418 flatcamGUI/FlatCAMGUI.py:2452 +msgid "Click on target point." +msgstr "" + +#: FlatCAMEditor.py:4289 +msgid "" +"[WARNING_NOTCL]A selection of at least 2 geo items is required to do " +"Intersection." +msgstr "" + +#: FlatCAMEditor.py:4327 FlatCAMEditor.py:4364 FlatCAMEditor.py:4436 +msgid "" +"[ERROR_NOTCL]Negative buffer value is not accepted. Use Buffer interior to " +"generate an 'inside' shape" +msgstr "" + +#: FlatCAMEditor.py:4335 FlatCAMEditor.py:4373 FlatCAMEditor.py:4444 +msgid "[WARNING_NOTCL] Nothing selected for buffering." +msgstr "" + +#: FlatCAMEditor.py:4339 FlatCAMEditor.py:4377 FlatCAMEditor.py:4448 +msgid "[WARNING_NOTCL] Invalid distance for buffering." +msgstr "" + +#: FlatCAMEditor.py:4349 FlatCAMEditor.py:4457 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a different buffer value." +msgstr "" + +#: FlatCAMEditor.py:4357 +msgid "[success]Full buffer geometry created." +msgstr "" + +#: FlatCAMEditor.py:4386 +msgid "" +"[ERROR_NOTCL]Failed, the result is empty. Choose a smaller buffer value." +msgstr "" + +#: FlatCAMEditor.py:4398 FlatCAMEditor.py:4469 +msgid "[success]Exterior buffer geometry created." +msgstr "" + +#: FlatCAMEditor.py:4533 +msgid "[WARNING_NOTCL]Nothing selected for painting." +msgstr "" + +#: FlatCAMEditor.py:4539 +msgid "[WARNING] Invalid value for {}" +msgstr "" + +#: FlatCAMEditor.py:4545 +msgid "" +"[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " +"(100%)." +msgstr "" + +#: FlatCAMEditor.py:4604 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different method of Paint\n" +"%s" +msgstr "" + +#: FlatCAMEditor.py:4615 +msgid "[success] Paint done." +msgstr "" + +#: FlatCAMEditor.py:4647 +msgid "Excellon Editor" +msgstr "" + +#: FlatCAMEditor.py:4654 +msgid "Name:" +msgstr "" + +#: FlatCAMEditor.py:4674 flatcamTools/ToolNonCopperClear.py:71 +#: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 +msgid "Tools Table" +msgstr "" + +#: FlatCAMEditor.py:4676 flatcamGUI/ObjectUI.py:609 +msgid "" +"Tools in this Excellon object\n" +"when are used for drilling." +msgstr "" + +#: FlatCAMEditor.py:4685 FlatCAMEditor.py:5745 FlatCAMObj.py:2203 +#: FlatCAMObj.py:2297 FlatCAMObj.py:2408 flatcamGUI/ObjectUI.py:627 +#: flatcamTools/ToolNonCopperClear.py:82 flatcamTools/ToolPaint.py:80 +#: flatcamTools/ToolSolderPaste.py:81 +msgid "Diameter" +msgstr "" + +#: FlatCAMEditor.py:4693 +msgid "Add/Delete Tool" +msgstr "" + +#: FlatCAMEditor.py:4695 +msgid "" +"Add/Delete a tool to the tool list\n" +"for this Excellon object." +msgstr "" + +#: FlatCAMEditor.py:4703 flatcamTools/ToolCutOut.py:77 +msgid "Tool Dia:" +msgstr "" + +#: FlatCAMEditor.py:4705 flatcamGUI/ObjectUI.py:1046 +msgid "Diameter for the new tool" +msgstr "" + +#: FlatCAMEditor.py:4714 +msgid "Add Tool" +msgstr "" + +#: FlatCAMEditor.py:4716 +msgid "" +"Add a new tool to the tool list\n" +"with the diameter specified above." +msgstr "" + +#: FlatCAMEditor.py:4726 +msgid "Delete Tool" +msgstr "" + +#: FlatCAMEditor.py:4728 +msgid "" +"Delete a tool in the tool list\n" +"by selecting a row in the tool table." +msgstr "" + +#: FlatCAMEditor.py:4746 +msgid "Resize Drill(s)" +msgstr "" + +#: FlatCAMEditor.py:4748 +msgid "Resize a drill or a selection of drills." +msgstr "" + +#: FlatCAMEditor.py:4755 +msgid "Resize Dia:" +msgstr "" + +#: FlatCAMEditor.py:4757 +msgid "Diameter to resize to." +msgstr "" + +#: FlatCAMEditor.py:4765 +msgid "Resize" +msgstr "" + +#: FlatCAMEditor.py:4767 +msgid "Resize drill(s)" +msgstr "" + +#: FlatCAMEditor.py:4789 flatcamGUI/FlatCAMGUI.py:1384 +msgid "Add Drill Array" +msgstr "" + +#: FlatCAMEditor.py:4791 +msgid "Add an array of drills (linear or circular array)" +msgstr "" + +#: FlatCAMEditor.py:4797 +msgid "" +"Select the type of drills array to create.\n" +"It can be Linear X(Y) or Circular" +msgstr "" + +#: FlatCAMEditor.py:4800 +msgid "Linear" +msgstr "" + +#: FlatCAMEditor.py:4801 +msgid "Circular" +msgstr "" + +#: FlatCAMEditor.py:4808 +msgid "Nr of drills:" +msgstr "" + +#: FlatCAMEditor.py:4810 +msgid "Specify how many drills to be in the array." +msgstr "" + +#: FlatCAMEditor.py:4827 FlatCAMEditor.py:4872 +msgid "Direction:" +msgstr "" + +#: FlatCAMEditor.py:4829 +msgid "" +"Direction on which the linear array is oriented:\n" +"- 'X' - horizontal axis \n" +"- 'Y' - vertical axis or \n" +"- 'Angle' - a custom angle for the array inclination" +msgstr "" + +#: FlatCAMEditor.py:4838 +msgid "Angle" +msgstr "" + +#: FlatCAMEditor.py:4842 +msgid "Pitch:" +msgstr "" + +#: FlatCAMEditor.py:4844 +msgid "Pitch = Distance between elements of the array." +msgstr "" + +#: FlatCAMEditor.py:4853 +msgid "" +"Angle at which the linear array is placed.\n" +"The precision is of max 2 decimals.\n" +"Min value is: -359.99 degrees.\n" +"Max value is: 360.00 degrees." +msgstr "" + +#: FlatCAMEditor.py:4874 +msgid "" +"Direction for circular array.Can be CW = clockwise or CCW = counter " +"clockwise." +msgstr "" + +#: FlatCAMEditor.py:4889 +msgid "Angle at which each element in circular array is placed." +msgstr "" + +#: FlatCAMEditor.py:5210 FlatCAMObj.py:1725 +msgid "Total Drills" +msgstr "" + +#: FlatCAMEditor.py:5242 FlatCAMObj.py:1751 +msgid "Total Slots" +msgstr "" + +#: FlatCAMEditor.py:5316 FlatCAMObj.py:1958 FlatCAMObj.py:3221 +#: FlatCAMObj.py:3527 FlatCAMObj.py:3714 FlatCAMObj.py:3727 FlatCAMObj.py:3844 +#: FlatCAMObj.py:4252 FlatCAMObj.py:4485 FlatCAMObj.py:4891 +#: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 +#: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 +#: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 +#: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 +#: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:478 +#: flatcamTools/ToolNonCopperClear.py:625 +#: flatcamTools/ToolNonCopperClear.py:637 flatcamTools/ToolPaint.py:537 +#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:833 flatcamTools/ToolPaint.py:988 +#: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 +#: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 +#: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 +#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +msgid "[ERROR_NOTCL]Wrong value format entered, use a number." +msgstr "" + +#: FlatCAMEditor.py:5329 +msgid "" +"[WARNING_NOTCL]Tool already in the original or actual tool list.\n" +"Save and reedit Excellon if you need to add this tool. " +msgstr "" + +#: FlatCAMEditor.py:5338 flatcamGUI/FlatCAMGUI.py:2481 +#, python-brace-format +msgid "[success]Added new tool with dia: {dia} {units}" +msgstr "" + +#: FlatCAMEditor.py:5369 +msgid "[WARNING_NOTCL]Select a tool in Tool Table" +msgstr "" + +#: FlatCAMEditor.py:5402 +#, python-brace-format +msgid "[success]Deleted tool with dia: {del_dia} {units}" +msgstr "" + +#: FlatCAMEditor.py:5799 +msgid "" +"[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " +"creation." +msgstr "" + +#: FlatCAMEditor.py:5808 +msgid "Creating Excellon." +msgstr "" + +#: FlatCAMEditor.py:5817 +msgid "[success]Excellon editing finished." +msgstr "" + +#: FlatCAMEditor.py:5834 +msgid "[WARNING_NOTCL]Cancelled. There is no Tool/Drill selected" +msgstr "" + +#: FlatCAMEditor.py:6316 +msgid "[success]Done. Drill(s) deleted." +msgstr "" + +#: FlatCAMEditor.py:6386 +msgid "Click on the circular array Center position" +msgstr "" + +#: FlatCAMObj.py:193 +#, python-brace-format +msgid "[success]Name changed from {old} to {new}" +msgstr "" + +#: FlatCAMObj.py:532 FlatCAMObj.py:1886 FlatCAMObj.py:3149 FlatCAMObj.py:5296 +msgid "Basic" +msgstr "" + +#: FlatCAMObj.py:544 FlatCAMObj.py:1902 FlatCAMObj.py:3171 FlatCAMObj.py:5302 +msgid "Advanced" +msgstr "" + +#: FlatCAMObj.py:899 FlatCAMObj.py:954 +#, python-format +msgid "[success]Isolation geometry created: %s" +msgstr "" + +#: FlatCAMObj.py:1029 +msgid "" +"[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." +msgstr "" + +#: FlatCAMObj.py:1044 FlatCAMObj.py:1079 +msgid "" +"[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " +"again." +msgstr "" + +#: FlatCAMObj.py:1064 +msgid "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." +msgstr "" + +#: FlatCAMObj.py:1136 +msgid "Generating Gerber" +msgstr "" + +#: FlatCAMObj.py:1144 +msgid "[ERROR_NOTCL] Cretion of Gerber failed." +msgstr "" + +#: FlatCAMObj.py:1151 +#, python-format +msgid "[success] Created: %s" +msgstr "" + +#: FlatCAMObj.py:1271 +msgid "Plotting Apertures" +msgstr "" + +#: FlatCAMObj.py:2182 FlatCAMObj.py:2273 FlatCAMObj.py:2388 +msgid "" +"[ERROR_NOTCL]Please select one or more tools from the list and try again." +msgstr "" + +#: FlatCAMObj.py:2189 +msgid "" +"[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled." +msgstr "" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Tool_nr" +msgstr "" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Drills_Nr" +msgstr "" + +#: FlatCAMObj.py:2203 FlatCAMObj.py:2297 FlatCAMObj.py:2408 +msgid "Slots_Nr" +msgstr "" + +#: FlatCAMObj.py:2283 +msgid "" +"[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." +msgstr "" + +#: FlatCAMObj.py:2446 FlatCAMObj.py:4140 FlatCAMObj.py:4351 FlatCAMObj.py:4666 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"z_pdepth\"] or self." +"options[\"z_pdepth\"]" +msgstr "" + +#: FlatCAMObj.py:2458 FlatCAMObj.py:4152 FlatCAMObj.py:4363 FlatCAMObj.py:4678 +msgid "" +"[ERROR_NOTCL]Wrong value format for self.defaults[\"feedrate_probe\"] or " +"self.options[\"feedrate_probe\"]" +msgstr "" + +#: FlatCAMObj.py:2490 FlatCAMObj.py:4553 FlatCAMObj.py:4558 FlatCAMObj.py:4704 +msgid "Generating CNC Code" +msgstr "" + +#: FlatCAMObj.py:2516 FlatCAMObj.py:4850 camlib.py:4929 camlib.py:5365 +#: camlib.py:5636 +msgid "" +"[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " +"format (x, y) \n" +"but now there is only one value, not two. " +msgstr "" + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3105 FlatCAMObj.py:3390 +msgid "Path" +msgstr "" + +#: FlatCAMObj.py:2863 +msgid "In" +msgstr "" + +#: FlatCAMObj.py:2863 +msgid "Out" +msgstr "" + +#: FlatCAMObj.py:2863 FlatCAMObj.py:3186 FlatCAMObj.py:3759 +msgid "Custom" +msgstr "" + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3770 FlatCAMObj.py:3771 FlatCAMObj.py:3780 +msgid "Iso" +msgstr "" + +#: FlatCAMObj.py:2864 FlatCAMObj.py:3107 FlatCAMObj.py:3392 +msgid "Rough" +msgstr "" + +#: FlatCAMObj.py:2864 +msgid "Finish" +msgstr "" + +#: FlatCAMObj.py:3142 flatcamGUI/FlatCAMGUI.py:463 +#: flatcamGUI/FlatCAMGUI.py:1388 flatcamGUI/ObjectUI.py:1067 +msgid "Copy" +msgstr "" + +#: FlatCAMObj.py:3144 flatcamGUI/FlatCAMGUI.py:464 +#: flatcamGUI/FlatCAMGUI.py:1389 flatcamGUI/ObjectUI.py:1075 +#: flatcamTools/ToolNonCopperClear.py:145 flatcamTools/ToolPaint.py:143 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +msgid "Delete" +msgstr "" + +#: FlatCAMObj.py:3362 +msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." +msgstr "" + +#: FlatCAMObj.py:3437 +msgid "[success] Tool added in Tool Table." +msgstr "" + +#: FlatCAMObj.py:3442 +msgid "[ERROR_NOTCL]Default Tool added. Wrong value format entered." +msgstr "" + +#: FlatCAMObj.py:3472 FlatCAMObj.py:3482 +msgid "[WARNING_NOTCL]Failed. Select a tool to copy." +msgstr "" + +#: FlatCAMObj.py:3511 +msgid "[success] Tool was copied in Tool Table." +msgstr "" + +#: FlatCAMObj.py:3544 +msgid "[success] Tool was edited in Tool Table." +msgstr "" + +#: FlatCAMObj.py:3575 FlatCAMObj.py:3585 +msgid "[WARNING_NOTCL]Failed. Select a tool to delete." +msgstr "" + +#: FlatCAMObj.py:3609 +msgid "[success] Tool was deleted in Tool Table." +msgstr "" + +#: FlatCAMObj.py:4023 +#, python-format +msgid "" +"[WARNING_NOTCL]This Geometry can't be processed because it is %s geometry." +msgstr "" + +#: FlatCAMObj.py:4040 +msgid "[ERROR_NOTCL]Wrong Tool Dia value format entered, use a number." +msgstr "" + +#: FlatCAMObj.py:4067 +msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." +msgstr "" + +#: FlatCAMObj.py:4105 +#, python-format +msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" +msgstr "" + +#: FlatCAMObj.py:4261 FlatCAMObj.py:4494 +msgid "" +"[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" +"Add a Tool Offset or change the Offset Type." +msgstr "" + +#: FlatCAMObj.py:4375 +msgid "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." +msgstr "" + +#: FlatCAMObj.py:4737 FlatCAMObj.py:4747 camlib.py:3229 camlib.py:3238 +msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." +msgstr "" + +#: FlatCAMObj.py:4785 +msgid "[success]Geometry Scale done." +msgstr "" + +#: FlatCAMObj.py:4802 camlib.py:3300 +msgid "" +"[ERROR_NOTCL]An (x,y) pair of values are needed. Probable you entered only " +"one value in the Offset field." +msgstr "" + +#: FlatCAMObj.py:4822 +msgid "[success]Geometry Offset done." +msgstr "" + +#: FlatCAMObj.py:5364 FlatCAMObj.py:5369 flatcamTools/ToolSolderPaste.py:1360 +msgid "Export Machine Code ..." +msgstr "" + +#: FlatCAMObj.py:5375 +msgid "[WARNING_NOTCL]Export Machine Code cancelled ..." +msgstr "" + +#: FlatCAMObj.py:5386 +#, python-format +msgid "[success] Machine Code file saved to: %s" +msgstr "" + +#: FlatCAMObj.py:5417 +#, python-format +msgid "[ERROR]FlatCAMCNNJob.on_modifygcode_button_click() -->%s" +msgstr "" + +#: FlatCAMObj.py:5523 +#, python-format +msgid "" +"[WARNING_NOTCL]This CNCJob object can't be processed because it is a %s " +"CNCJob object." +msgstr "" + +#: FlatCAMObj.py:5576 +msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" +msgstr "" + +#: FlatCAMObj.py:5589 +msgid "" +"[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " +"empty." +msgstr "" + +#: FlatCAMObj.py:5596 +msgid "[success] Toolchange G-code was replaced by a custom code." +msgstr "" + +#: FlatCAMObj.py:5611 flatcamTools/ToolSolderPaste.py:1389 +msgid "[WARNING_NOTCL] No such file or directory" +msgstr "" + +#: FlatCAMObj.py:5630 FlatCAMObj.py:5642 +msgid "" +"[WARNING_NOTCL] The used postprocessor file has to have in it's name: " +"'toolchange_custom'" +msgstr "" + +#: FlatCAMObj.py:5648 +msgid "[ERROR] There is no postprocessor file." +msgstr "" + +#: ObjectCollection.py:402 +#, python-brace-format +msgid "Object renamed from {old} to {new}" +msgstr "" + +#: ObjectCollection.py:736 +#, python-format +msgid "[ERROR] Cause of error: %s" +msgstr "" + +#: camlib.py:200 +msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." +msgstr "" + +#: camlib.py:1387 +msgid "[success]Object was mirrored ..." +msgstr "" + +#: camlib.py:1389 +msgid "[ERROR_NOTCL] Failed to mirror. No object selected" +msgstr "" + +#: camlib.py:1425 +msgid "[success]Object was rotated ..." +msgstr "" + +#: camlib.py:1427 +msgid "[ERROR_NOTCL] Failed to rotate. No object selected" +msgstr "" + +#: camlib.py:1461 +msgid "[success]Object was skewed ..." +msgstr "" + +#: camlib.py:1463 +msgid "[ERROR_NOTCL] Failed to skew. No object selected" +msgstr "" + +#: camlib.py:2647 camlib.py:2727 +#, python-format +msgid "[WARNING] Coordinates missing, line ignored: %s" +msgstr "" + +#: camlib.py:2648 camlib.py:2728 +msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" +msgstr "" + +#: camlib.py:2696 +#, python-format +msgid "" +"[ERROR] Region does not have enough points. File will be processed but there " +"are parser errors. Line number: %s" +msgstr "" + +#: camlib.py:3051 +#, python-format +msgid "" +"[ERROR]Gerber Parser ERROR.\n" +"%s:" +msgstr "" + +#: camlib.py:3267 +msgid "[success]Gerber Scale done." +msgstr "" + +#: camlib.py:3324 +msgid "[success]Gerber Offset done." +msgstr "" + +#: camlib.py:3700 +#, python-format +msgid "[ERROR_NOTCL] This is GCODE mark: %s" +msgstr "" + +#: camlib.py:4230 +#, python-brace-format +msgid "" +"[ERROR] Excellon Parser error.\n" +"Parsing Failed. Line {l_nr}: {line}\n" +msgstr "" + +#: camlib.py:4307 +msgid "" +"[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " +"not having a tool associated.\n" +"Check the resulting GCode." +msgstr "" + +#: camlib.py:4843 +#, python-format +msgid "[ERROR] There is no such parameter: %s" +msgstr "" + +#: camlib.py:4908 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"drill into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative. Check the resulting " +"CNC code (Gcode etc)." +msgstr "" + +#: camlib.py:4915 camlib.py:5388 camlib.py:5659 +#, python-format +msgid "" +"[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" +msgstr "" + +#: camlib.py:5131 camlib.py:5226 camlib.py:5277 +msgid "[ERROR_NOTCL]The loaded Excellon file has no drills ..." +msgstr "" + +#: camlib.py:5231 +msgid "[ERROR_NOTCL] Wrong optimization type selected." +msgstr "" + +#: camlib.py:5376 camlib.py:5647 +msgid "" +"[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " +"combinations of other parameters." +msgstr "" + +#: camlib.py:5381 camlib.py:5652 +msgid "" +"[WARNING] The Cut Z parameter has positive value. It is the depth value to " +"cut into material.\n" +"The Cut Z parameter needs to have a negative value, assuming it is a typo " +"therefore the app will convert the value to negative.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" + +#: camlib.py:5393 camlib.py:5664 +msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." +msgstr "" + +#: camlib.py:5397 camlib.py:5668 +msgid "" +"[WARNING] The Travel Z parameter has negative value. It is the height value " +"to travel between cuts.\n" +"The Z Travel parameter needs to have a positive value, assuming it is a typo " +"therefore the app will convert the value to positive.Check the resulting CNC " +"code (Gcode etc)." +msgstr "" + +#: camlib.py:5404 camlib.py:5675 +#, python-format +msgid "" +"[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" +msgstr "" + +#: camlib.py:5534 +#, python-format +msgid "[ERROR]Expected a Geometry, got %s" +msgstr "" + +#: camlib.py:5540 +msgid "" +"[ERROR_NOTCL]Trying to generate a CNC Job from a Geometry object without " +"solid_geometry." +msgstr "" + +#: camlib.py:5579 +msgid "" +"[ERROR_NOTCL]The Tool Offset value is too negative to use for the " +"current_geometry.\n" +"Raise the value (in module) and try again." +msgstr "" + +#: camlib.py:5801 +msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:50 +msgid "&File" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:55 +msgid "&New Project ...\tCTRL+N" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:57 +msgid "Will create a new, blank project" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:62 +msgid "&New" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:65 +msgid "Geometry\tN" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:67 +msgid "Will create a new, empty Geometry Object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:69 +msgid "Excellon\tL" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:71 +msgid "Will create a new, empty Excellon Object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:74 +msgid "Open" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:79 +msgid "Open &Gerber ...\tCTRL+G" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:86 +msgid "Open &Excellon ...\tCTRL+E" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:91 +msgid "Open G-&Code ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:95 +msgid "Open &Project ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:101 +msgid "Open Config ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:105 +msgid "Recent files" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:111 +msgid "Run Script ...\tSHIFT+S" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:114 +msgid "" +"Will run the opened Tcl Script thus\n" +"enabling the automation of certain\n" +"functions of FlatCAM." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:124 +msgid "Import" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:126 +msgid "&SVG as Geometry Object ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:129 +msgid "&SVG as Gerber Object ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:134 +msgid "&DXF as Geometry Object ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:137 +msgid "&DXF as Gerber Object ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:142 +msgid "Export" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:145 +msgid "Export &SVG ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:148 +msgid "Export DXF ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:153 +msgid "Export &PNG ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:155 +msgid "" +"Will export an image in PNG format,\n" +"the saved image will contain the visual \n" +"information currently in FlatCAM Plot Area." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:163 +msgid "Export &Excellon ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:166 +msgid "" +"Will export an Excellon Object as Excellon file,\n" +"the coordinates format, the file units and zeros\n" +"are set in Preferences -> Excellon Export." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:177 +msgid "Save &Defaults" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:183 flatcamGUI/FlatCAMGUI.py:465 +msgid "Save" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:185 +msgid "&Save Project ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:190 +msgid "Save Project &As ...\tCTRL+S" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:194 +msgid "Save Project C&opy ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:202 +msgid "E&xit" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:208 +msgid "&Edit" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:211 +msgid "Edit Object\tE" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:212 +msgid "Save && Close Editor\tCTRL+S" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:220 +msgid "Conversion" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:222 +msgid "&Join Geo/Gerber/Exc -> Geo" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:224 +msgid "" +"Merge a selection of objects, which can be of type:\n" +"- Gerber\n" +"- Excellon\n" +"- Geometry\n" +"into a new combo Geometry object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:231 +msgid "Join Excellon(s) -> Excellon" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:233 +msgid "Merge a selection of Excellon objects into a new combo Excellon object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:236 +msgid "Join Gerber(s) -> Gerber" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:238 +msgid "Merge a selection of Gerber objects into a new combo Gerber object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:243 +msgid "Convert Single to MultiGeo" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:245 +msgid "" +"Will convert a Geometry object from single_geometry type\n" +"to a multi_geometry type." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:249 +msgid "Convert Multi to SingleGeo" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:251 +msgid "" +"Will convert a Geometry object from multi_geometry type\n" +"to a single_geometry type." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:258 +msgid "&Copy Object\tCTRL+C" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:260 +msgid "Copy as &Geom" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:263 +msgid "&Delete\tDEL" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:267 +msgid "Se&t Origin\tO" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:268 +msgid "Jump to Location\tJ" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:273 +msgid "Toggle Units\tQ" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:275 +msgid "&Select All\tCTRL+A" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:279 +msgid "&Preferences\tSHIFT+P" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:282 +msgid "&Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:297 +msgid "&Rotate Selection\tSHIFT+(R)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:302 +msgid "&Skew on X axis\tSHIFT+X" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:304 +msgid "S&kew on Y axis\tSHIFT+Y" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:309 +msgid "Flip on &X axis\tX" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:311 +msgid "Flip on &Y axis\tY" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:316 +msgid "View source\tALT+S" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:321 +msgid "&View" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:322 +msgid "Enable all plots\tALT+1" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:324 +msgid "Disable all plots\tALT+2" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:326 +msgid "Disable non-selected\tALT+3" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:329 +msgid "&Zoom Fit\tV" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:330 +msgid "&Zoom In\t-" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:331 +msgid "&Zoom Out\t=" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:335 +msgid "Toggle Code Editor\tCTRL+E" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:338 +msgid "&Toggle FullScreen\tALT+F10" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:340 +msgid "&Toggle Plot Area\tCTRL+F10" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:342 +msgid "&Toggle Project/Sel/Tool\t`" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:345 +msgid "&Toggle Grid Snap\tG" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:347 +msgid "&Toggle Axis\tSHIFT+G" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:350 +msgid "Toggle Workspace\tSHIFT+W" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:354 +msgid "&Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:356 +msgid "&Command Line\tS" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:359 +msgid "&Help" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:360 +msgid "Help\tF1" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:361 +msgid "FlatCAM.org" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:364 +msgid "Shortcuts List\tF3" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:365 +msgid "YouTube Channel\tF4" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:367 +msgid "About" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:378 +msgid "Add Circle\tO" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:380 +msgid "Add Arc\tA" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:383 +msgid "Add Rectangle\tR" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:386 +msgid "Add Polygon\tN" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:388 +msgid "Add Path\tP" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:390 +msgid "Add Text\tT" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:393 +msgid "Polygon Union\tU" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:395 +msgid "Polygon Intersection\tE" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:397 +msgid "Polygon Subtraction\tS" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:401 +msgid "Cut Path\tX" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:403 +msgid "Copy Geom\tC" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:405 +msgid "Delete Shape\tDEL" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:408 +msgid "Move\tM" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:410 +msgid "Buffer Tool\tB" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:413 +msgid "Paint Tool\tI" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:416 +msgid "Transform Tool\tALT+R" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:420 +msgid "Toggle Corner Snap\tK" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:423 +msgid ">Excellon Editor<" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:427 +msgid "Add Drill Array\tA" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:429 +msgid "Add Drill\tD" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:433 +msgid "Resize Drill(S)\tR" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:435 +msgid "Copy\tC" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:437 +msgid "Delete\tDEL" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:442 +msgid "Move Drill(s)\tM" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:456 +msgid "Enable Plot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:457 +msgid "Disable Plot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:459 +msgid "Generate CNC" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:460 +msgid "View Source" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:462 flatcamGUI/FlatCAMGUI.py:1390 +msgid "Edit" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:468 flatcamGUI/FlatCAMGUI.py:1396 +#: flatcamTools/ToolProperties.py:25 +msgid "Properties" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:497 +msgid "File Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:501 +msgid "Edit Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:505 +msgid "View Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:509 +msgid "Shell Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:513 +msgid "Tools Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:517 +msgid "Excellon Editor Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:521 +msgid "Geometry Editor Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:525 +msgid "Grid Toolbar" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:544 flatcamGUI/FlatCAMGUI.py:1593 +msgid "Open project" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:545 flatcamGUI/FlatCAMGUI.py:1594 +msgid "Save project" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:548 flatcamGUI/FlatCAMGUI.py:1597 +msgid "New Blank Geometry" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:549 flatcamGUI/FlatCAMGUI.py:1598 +msgid "New Blank Excellon" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:551 flatcamGUI/FlatCAMGUI.py:1600 +msgid "Editor" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:553 flatcamGUI/FlatCAMGUI.py:1602 +msgid "Save Object and close the Editor" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:557 flatcamGUI/FlatCAMGUI.py:1606 +msgid "&Delete" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:560 flatcamGUI/FlatCAMGUI.py:1609 +msgid "&Replot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:561 flatcamGUI/FlatCAMGUI.py:1610 +msgid "&Clear plot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:562 flatcamGUI/FlatCAMGUI.py:1611 +msgid "Zoom In" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:563 flatcamGUI/FlatCAMGUI.py:1612 +msgid "Zoom Out" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:564 flatcamGUI/FlatCAMGUI.py:1370 +#: flatcamGUI/FlatCAMGUI.py:1613 +msgid "Zoom Fit" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:569 flatcamGUI/FlatCAMGUI.py:1618 +msgid "&Command Line" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:572 flatcamGUI/FlatCAMGUI.py:1621 +msgid "2Sided Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:573 flatcamGUI/FlatCAMGUI.py:1622 +msgid "&Cutout Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:574 flatcamGUI/FlatCAMGUI.py:1623 +#: flatcamGUI/ObjectUI.py:463 flatcamTools/ToolNonCopperClear.py:283 +msgid "NCC Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:578 flatcamGUI/FlatCAMGUI.py:1627 +msgid "Panel Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:579 flatcamGUI/FlatCAMGUI.py:1628 +#: flatcamTools/ToolFilm.py:204 +msgid "Film Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:580 flatcamGUI/FlatCAMGUI.py:1630 +msgid "SolderPaste Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:583 flatcamGUI/FlatCAMGUI.py:1634 +msgid "Calculators Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:587 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1638 +msgid "Select" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:588 flatcamGUI/FlatCAMGUI.py:1639 +msgid "Add Drill Hole" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:591 flatcamGUI/FlatCAMGUI.py:1642 +msgid "Resize Drill" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:594 flatcamGUI/FlatCAMGUI.py:1645 +msgid "Copy Drill" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:595 flatcamGUI/FlatCAMGUI.py:1647 +msgid "Delete Drill" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1650 +msgid "Move Drill" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:602 flatcamGUI/FlatCAMGUI.py:1654 +msgid "Add Circle" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1655 +msgid "Add Arc" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1657 +msgid "Add Rectangle" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:608 flatcamGUI/FlatCAMGUI.py:1660 +msgid "Add Path" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1662 +msgid "Add Polygon" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1664 +msgid "Add Text" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:612 flatcamGUI/FlatCAMGUI.py:1666 +msgid "Add Buffer" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1667 +msgid "Paint Shape" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1670 +msgid "Polygon Union" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1672 +msgid "Polygon Intersection" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1674 +msgid "Polygon Subtraction" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1677 +msgid "Cut Path" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:624 +msgid "Copy Shape(s)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:627 +msgid "Delete Shape '-'" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1682 +msgid "Transformations" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:631 +msgid "Move Objects " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1691 +msgid "Snap to grid" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1694 +msgid "Grid X snapping distance" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1699 +msgid "Grid Y snapping distance" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1705 +msgid "" +"When active, value on Grid_X\n" +"is copied to the Grid_Y value." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1711 +msgid "Snap to corner" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:661 flatcamGUI/FlatCAMGUI.py:1715 +#: flatcamGUI/FlatCAMGUI.py:2787 +msgid "Max. magnet distance" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:675 flatcamGUI/FlatCAMGUI.py:1364 +msgid "Project" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:684 +msgid "Selected" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:691 +msgid "Tool" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:703 flatcamGUI/FlatCAMGUI.py:711 +msgid "Plot Area" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:735 +msgid "General" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:744 +msgid "APP. DEFAULTS" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:745 +msgid "PROJ. OPTIONS " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:756 +msgid "GERBER" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:765 +msgid "EXCELLON" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:774 +msgid "GEOMETRY" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:784 +msgid "CNC-JOB" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:793 +msgid "TOOLS" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:810 +msgid "Import Preferences" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:813 +msgid "" +"Import a full set of FlatCAM settings from a file\n" +"previously saved on HDD.\n" +"\n" +"FlatCAM automatically save a 'factory_defaults' file\n" +"on the first start. Do not delete that file." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:820 +msgid "Export Preferences" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:823 +msgid "" +"Export a full set of FlatCAM settings in a file\n" +"that is saved on HDD." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:828 +msgid "Open Pref Folder" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:831 +msgid "Open the folder where FlatCAM save the preferences files." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:839 +msgid "Save Preferences" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:842 +msgid "" +"Save the current settings in the 'current_defaults' file\n" +"which is the file storing the working default preferences." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:868 +msgid "" +"General Shortcut list
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
F3\n" +"  SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected Tab " +"or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'=' Zoom Out
'-' Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area (Left " +"Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" +" \n" +" " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1145 +msgid "" +"Editor Shortcut list
\n" +"
\n" +" GEOMETRY EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Draw an Arc
B Buffer Tool
C Copy Geo Item
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
\n" +"
\n" +"
\n" +" EXCELLON EDITOR
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
A\n" +"  Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
\n" +" " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1358 +msgid "Disable" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1360 +msgid "New" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1361 +msgid "Geometry" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1362 +msgid "Excellon" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1367 +msgid "Grids" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1369 +msgid "View" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1371 +msgid "Clear Plot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1372 +msgid "Replot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1375 +msgid "Geo Editor" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1376 +msgid "Line" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1377 +msgid "Rectangle" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1378 flatcamGUI/FlatCAMGUI.py:4590 +#: flatcamGUI/ObjectUI.py:1431 +msgid "Cut" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1380 flatcamGUI/FlatCAMGUI.py:1395 +#: flatcamTools/ToolMove.py:26 +msgid "Move" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1382 +msgid "Exc Editor" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1383 +msgid "Add Drill" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1385 +msgid "Copy Drill(s)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1391 +msgid "Save && Close Edit" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1416 +msgid "Print Preview" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1417 +msgid "Print Code" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1418 +msgid "Find in Code" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1423 +msgid "Replace With" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1427 flatcamGUI/FlatCAMGUI.py:4588 +#: flatcamGUI/FlatCAMGUI.py:5089 flatcamGUI/ObjectUI.py:1429 +msgid "All" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1429 +msgid "" +"When checked it will replace all instances in the 'Find' box\n" +"with the text in the 'Replace' box.." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1432 +msgid "Open Code" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1433 +msgid "Save Code" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1468 +msgid "" +"Relative neasurement.\n" +"Reference is last click position" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1474 +msgid "" +"Absolute neasurement.\n" +"Reference is (X=0, Y= 0) position" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1641 +msgid "Add Drill Hole Array" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1653 +msgid "Select 'Esc'" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1678 +msgid "Copy Objects" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1680 +msgid "Delete Shape" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:1685 +msgid "Move Objects" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2060 +msgid "" +"Please first select a geometry item to be cutted\n" +"then select the geometry item that will be cutted\n" +"out of the first item. In the end press ~X~ key or\n" +"the toolbar button." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2067 flatcamGUI/FlatCAMGUI.py:2199 +#: flatcamGUI/FlatCAMGUI.py:2258 flatcamGUI/FlatCAMGUI.py:2278 +msgid "Warning" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2134 flatcamGUI/FlatCAMGUI.py:2328 +msgid "[WARNING_NOTCL]Cancelled." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2194 +msgid "" +"Please select geometry items \n" +"on which to perform Intersection Tool." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2253 +msgid "" +"Please select geometry items \n" +"on which to perform Substraction Tool." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2273 +msgid "" +"Please select geometry items \n" +"on which to perform union." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2345 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to delete." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2412 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to copy." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2458 +msgid "[WARNING_NOTCL]Cancelled. Nothing selected to move." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2472 +msgid "New Tool ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2473 +msgid "Enter a Tool Diameter:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2772 +msgid "Grid X value:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2774 +msgid "This is the Grid snap value on X axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2779 +msgid "Grid Y value:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2781 +msgid "This is the Grid snap value on Y axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2786 +msgid "Snap Max:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2791 +msgid "Workspace:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2793 +msgid "" +"Draw a delimiting rectangle on canvas.\n" +"The purpose is to illustrate the limits for our work." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2796 +msgid "Wk. format:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2798 +msgid "" +"Select the type of rectangle to be used on canvas,\n" +"as valid workspace." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2811 +msgid "Plot Fill:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2813 +msgid "" +"Set the fill color for plotted objects.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2827 flatcamGUI/FlatCAMGUI.py:2877 +#: flatcamGUI/FlatCAMGUI.py:2927 +msgid "Alpha Level:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2829 +msgid "Set the fill transparency for plotted objects." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2846 +msgid "Plot Line:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2848 +msgid "Set the line color for plotted objects." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2860 +msgid "Sel. Fill:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2862 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from left to right.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2879 +msgid "Set the fill transparency for the 'left to right' selection box." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2896 +msgid "Sel. Line:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2898 +msgid "Set the line color for the 'left to right' selection box." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2910 +msgid "Sel2. Fill:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2912 +msgid "" +"Set the fill color for the selection box\n" +"in case that the selection is done from right to left.\n" +"First 6 digits are the color and the last 2\n" +"digits are for alpha (transparency) level." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2929 +msgid "Set the fill transparency for selection 'right to left' box." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2946 +msgid "Sel2. Line:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2948 +msgid "Set the line color for the 'right to left' selection box." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2960 +msgid "Editor Draw:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2962 +msgid "Set the color for the shape." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2974 +msgid "Editor Draw Sel.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:2976 +msgid "Set the color of the shape when selected." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3023 +msgid "GUI Settings" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3030 +msgid "Layout:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3032 +msgid "" +"Select an layout for FlatCAM.\n" +"It is applied immediately." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3048 +msgid "Style:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3050 +msgid "" +"Select an style for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3061 +msgid "HDPI Support:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3063 +msgid "" +"Enable High DPI support for FlatCAM.\n" +"It will be applied at the next app start." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3076 +msgid "Clear GUI Settings:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3078 +msgid "" +"Clear the GUI settings for FlatCAM,\n" +"such as: layout, gui state, style, hdpi support etc." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3081 +msgid "Clear" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3085 +msgid "Hover Shape:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3087 +msgid "" +"Enable display of a hover shape for FlatCAM objects.\n" +"It is displayed whenever the mouse cursor is hovering\n" +"over any kind of not-selected object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3128 +msgid "Are you sure you want to delete the GUI Settings? \n" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3131 +msgid "Clear GUI Settings" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3144 +msgid "[success] GUI settings deleted ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3151 +msgid "App Preferences" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3157 +msgid "Units:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3158 +msgid "" +"The default value for FlatCAM units.\n" +"Whatever is selected here is set every time\n" +"FLatCAM is started." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3165 +msgid "APP. LEVEL:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3166 +msgid "" +"Choose the default level of usage for FlatCAM.\n" +"BASIC level -> reduced functionality, best for beginner's.\n" +"ADVANCED level -> full functionality.\n" +"\n" +"The choice here will influence the parameters in\n" +"the Selected Tab for all kinds of FlatCAM objects." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3171 flatcamGUI/FlatCAMGUI.py:3775 +msgid "Basic" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3172 +msgid "Advanced" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3175 +msgid "Languages:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3176 +msgid "Set the language used throughout FlatCAM." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3179 +msgid "Apply Language" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3182 +msgid "Shell at StartUp:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3184 flatcamGUI/FlatCAMGUI.py:3189 +msgid "" +"Check this box if you want the shell to\n" +"start automatically at startup." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3194 +msgid "Version Check:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3196 flatcamGUI/FlatCAMGUI.py:3201 +msgid "" +"Check this box if you want to check\n" +"for a new version automatically at startup." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3206 +msgid "Send Stats:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3208 flatcamGUI/FlatCAMGUI.py:3213 +msgid "" +"Check this box if you agree to send anonymous\n" +"stats automatically at startup, to help improve FlatCAM." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3220 +msgid "Pan Button:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3221 +msgid "" +"Select the mouse button to use for panning:\n" +"- MMB --> Middle Mouse Button\n" +"- RMB --> Right Mouse Button" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3224 +msgid "MMB" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3225 +msgid "RMB" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3228 +msgid "Multiple Sel:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3229 +msgid "Select the key used for multiple selection." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3230 +msgid "CTRL" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3231 +msgid "SHIFT" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3234 +msgid "Project at StartUp:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3236 flatcamGUI/FlatCAMGUI.py:3241 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"to be shown automatically at startup." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3246 +msgid "Project AutoHide:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3248 flatcamGUI/FlatCAMGUI.py:3254 +msgid "" +"Check this box if you want the project/selected/tool tab area to\n" +"hide automatically when there are no objects loaded and\n" +"to show whenever a new object is created." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3260 +msgid "Enable ToolTips:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3262 flatcamGUI/FlatCAMGUI.py:3267 +msgid "" +"Check this box if you want to have toolTips displayed\n" +"when hovering with mouse over items throughout the App." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3301 +msgid "Save Compressed Project" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3303 +msgid "" +"Whether to save a compressed or uncompressed project.\n" +"When checked it will save a compressed FlatCAM project." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3314 +msgid "Compression Level:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3316 +msgid "" +"The level of compression used when saving\n" +"a FlatCAM project. Higher value means better compression\n" +"but require more RAM usage and more processing time." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3342 flatcamGUI/FlatCAMGUI.py:3583 +#: flatcamGUI/FlatCAMGUI.py:4238 flatcamGUI/FlatCAMGUI.py:4562 +#: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:576 +#: flatcamGUI/ObjectUI.py:901 flatcamGUI/ObjectUI.py:1415 +msgid "Plot Options:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3349 flatcamGUI/FlatCAMGUI.py:3595 +#: flatcamGUI/ObjectUI.py:577 +msgid "Solid" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3351 flatcamGUI/ObjectUI.py:158 +msgid "Solid color polygons." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3356 +msgid "M-Color" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3358 flatcamGUI/ObjectUI.py:166 +msgid "Draw polygons in different colors." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3363 flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:4242 flatcamGUI/ObjectUI.py:172 +msgid "Plot" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3365 flatcamGUI/FlatCAMGUI.py:4244 +#: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:617 +#: flatcamGUI/ObjectUI.py:947 flatcamGUI/ObjectUI.py:1502 +msgid "Plot (show) this object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3370 flatcamGUI/FlatCAMGUI.py:4251 +#: flatcamGUI/FlatCAMGUI.py:4598 +msgid "Circle Steps:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3372 +msgid "" +"The number of circle steps for Gerber \n" +"circular aperture linear approximation." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3387 +msgid "Gerber Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3391 flatcamGUI/ObjectUI.py:322 +msgid "Isolation Routing:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3393 flatcamGUI/ObjectUI.py:324 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut outside polygons." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3404 flatcamGUI/FlatCAMGUI.py:3961 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:856 +#: flatcamGUI/ObjectUI.py:872 +msgid "Diameter of the cutting tool." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3411 +msgid "Width (# passes):" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3413 flatcamGUI/ObjectUI.py:346 +msgid "" +"Width of the isolation gap in\n" +"number (integer) of tool widths." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3421 flatcamGUI/ObjectUI.py:354 +msgid "Pass overlap:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3423 flatcamGUI/ObjectUI.py:356 +#, python-format +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means an overlap of 25%% from the tool diameter found " +"above." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3431 flatcamGUI/ObjectUI.py:366 +msgid "Milling Type:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3433 flatcamGUI/ObjectUI.py:368 +msgid "" +"Milling type:\n" +"- climb / best for precision milling and to reduce tool usage\n" +"- conventional / useful when there is no backlash compensation" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3438 flatcamGUI/ObjectUI.py:373 +msgid "Climb" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3439 flatcamGUI/ObjectUI.py:374 +msgid "Conv." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3443 +msgid "Combine Passes" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3445 flatcamGUI/ObjectUI.py:380 +msgid "Combine all passes into one object" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3450 +msgid "Clear non-copper:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3452 flatcamGUI/FlatCAMGUI.py:4774 +#: flatcamGUI/ObjectUI.py:457 +msgid "" +"Create a Geometry object with\n" +"toolpaths to cut all non-copper regions." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3461 flatcamGUI/FlatCAMGUI.py:3487 +#: flatcamGUI/ObjectUI.py:501 flatcamGUI/ObjectUI.py:535 +msgid "Boundary Margin:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3463 flatcamGUI/ObjectUI.py:503 +msgid "" +"Specify the edge of the PCB\n" +"by drawing a box around all\n" +"objects with this minimum\n" +"distance." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3473 flatcamGUI/FlatCAMGUI.py:3496 +msgid "Rounded corners" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3475 +msgid "" +"Creates a Geometry objects with polygons\n" +"covering the copper-free areas of the PCB." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3481 flatcamGUI/ObjectUI.py:525 +msgid "Bounding Box:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3489 flatcamGUI/ObjectUI.py:537 +msgid "" +"Distance of the edges of the box\n" +"to the nearest polygon." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3498 flatcamGUI/ObjectUI.py:547 +msgid "" +"If the bounding box is \n" +"to have rounded corners\n" +"their radius is equal to\n" +"the margin." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3512 +msgid "Gerber Adv. Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3516 +msgid "Advanced Param.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3518 +msgid "" +"A list of Gerber advanced parameters.\n" +"Those parameters are available only for\n" +"Advanced App. Level." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3528 flatcamGUI/ObjectUI.py:385 +msgid "\"Follow\"" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3530 flatcamGUI/ObjectUI.py:387 +msgid "" +"Generate a 'Follow' geometry.\n" +"This means that it will cut through\n" +"the middle of the trace." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3538 +msgid "Table Show/Hide" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3540 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"Also, on hide, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3548 +msgid "Ap. Scale Factor:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3550 flatcamGUI/ObjectUI.py:254 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3560 +msgid "Ap. Buffer Factor:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3562 flatcamGUI/ObjectUI.py:275 +msgid "" +"Change the size of the selected apertures.\n" +"Factor by which to expand/shrink\n" +"geometric features of this object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3580 +msgid "Excellon General" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3602 +msgid "Excellon Format:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3604 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period.\n" +"\n" +"Possible presets:\n" +"\n" +"PROTEUS 3:3 MM LZ\n" +"DipTrace 5:2 MM TZ\n" +"DipTrace 4:3 MM LZ\n" +"\n" +"EAGLE 3:3 MM TZ\n" +"EAGLE 4:3 MM TZ\n" +"EAGLE 2:5 INCH TZ\n" +"EAGLE 3:5 INCH TZ\n" +"\n" +"ALTIUM 2:4 INCH LZ\n" +"Sprint Layout 2:4 INCH LZ\n" +"KiCAD 3:5 INCH TZ" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3629 +msgid "INCH:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3632 +msgid "Default values for INCH are 2:4" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3640 flatcamGUI/FlatCAMGUI.py:3673 +#: flatcamGUI/FlatCAMGUI.py:4150 +msgid "" +"This numbers signify the number of digits in\n" +"the whole part of Excellon coordinates." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3654 flatcamGUI/FlatCAMGUI.py:3687 +#: flatcamGUI/FlatCAMGUI.py:4164 +msgid "" +"This numbers signify the number of digits in\n" +"the decimal part of Excellon coordinates." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3662 +msgid "METRIC:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3665 +msgid "Default values for METRIC are 3:3" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3696 +msgid "Default Zeros:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3699 flatcamGUI/FlatCAMGUI.py:4199 +msgid "" +"This sets the type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:4206 +msgid "LZ" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3708 flatcamGUI/FlatCAMGUI.py:4207 +msgid "TZ" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3710 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3724 +msgid "Default Units:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3727 +msgid "" +"This sets the default units of Excellon files.\n" +"If it is not detected in the parsed file the value here\n" +"will be used.Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:4126 +msgid "INCH" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3736 flatcamGUI/FlatCAMGUI.py:4127 +msgid "MM" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3738 +msgid "" +"This sets the units of Excellon files.\n" +"Some Excellon files don't have an header\n" +"therefore this parameter will be used." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3754 +msgid "Excellon Optimization:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3761 +msgid "Algorithm: " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3764 flatcamGUI/FlatCAMGUI.py:3777 +msgid "" +"This sets the optimization type for the Excellon drill path.\n" +"If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" +"Guided Local Path is used. Default search time is 3sec.\n" +"Use set_sys excellon_search_time value Tcl Command to set other values.\n" +"If Basic is checked then Google OR-Tools Basic algorithm is used.\n" +"\n" +"If DISABLED, then FlatCAM works in 32bit mode and it uses \n" +"Travelling Salesman algorithm for path optimization." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3774 +msgid "MH" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3789 +msgid "Optimization Time: " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3792 +msgid "" +"When OR-Tools Metaheuristic (MH) is enabled there is a\n" +"maximum threshold for how much time is spent doing the\n" +"path optimization. This max duration is set here.\n" +"In seconds." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3833 +msgid "Excellon Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3836 flatcamGUI/ObjectUI.py:655 +msgid "Create CNC Job" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3838 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3846 flatcamGUI/FlatCAMGUI.py:4302 +#: flatcamGUI/FlatCAMGUI.py:5301 flatcamGUI/ObjectUI.py:666 +#: flatcamGUI/ObjectUI.py:1130 flatcamTools/ToolCalculators.py:108 +msgid "Cut Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3848 flatcamGUI/ObjectUI.py:668 +msgid "" +"Drill depth (negative)\n" +"below the copper surface." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3855 flatcamGUI/FlatCAMGUI.py:4335 +#: flatcamGUI/ObjectUI.py:676 flatcamGUI/ObjectUI.py:1166 +msgid "Travel Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3857 flatcamGUI/ObjectUI.py:678 +msgid "" +"Tool height when travelling\n" +"across the XY plane." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3865 flatcamGUI/FlatCAMGUI.py:4345 +msgid "Tool change:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3867 flatcamGUI/FlatCAMGUI.py:4347 +#: flatcamGUI/ObjectUI.py:688 +msgid "" +"Include tool-change sequence\n" +"in G-Code (Pause for tool change)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3874 flatcamGUI/FlatCAMGUI.py:4355 +msgid "Toolchange Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/FlatCAMGUI.py:4357 +msgid "Toolchange Z position." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3882 +msgid "Feedrate:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3884 +msgid "" +"Tool speed while drilling\n" +"(in units per minute)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3892 +msgid "Spindle Speed:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/FlatCAMGUI.py:4387 +#: flatcamGUI/ObjectUI.py:752 +msgid "" +"Speed of the spindle\n" +"in RPM (optional)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3902 flatcamGUI/FlatCAMGUI.py:4395 +#: flatcamGUI/ObjectUI.py:760 flatcamGUI/ObjectUI.py:1289 +msgid "Dwell:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/ObjectUI.py:762 flatcamGUI/ObjectUI.py:1292 +msgid "" +"Pause to allow the spindle to reach its\n" +"speed before cutting." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3907 flatcamGUI/FlatCAMGUI.py:4400 +msgid "Duration:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3909 flatcamGUI/FlatCAMGUI.py:4402 +#: flatcamGUI/ObjectUI.py:767 flatcamGUI/ObjectUI.py:1299 +msgid "Number of milliseconds for spindle to dwell." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3921 flatcamGUI/FlatCAMGUI.py:4412 +#: flatcamGUI/ObjectUI.py:775 +msgid "Postprocessor:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3923 +msgid "" +"The postprocessor file that dictates\n" +"gcode output." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3933 +msgid "Gcode: " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3935 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to drills." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3940 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:823 +msgid "Drills" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:627 +#: flatcamGUI/ObjectUI.py:824 +msgid "Slots" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3942 flatcamGUI/ObjectUI.py:825 +msgid "Both" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:840 +msgid "Mill Holes" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:842 +msgid "Create Geometry for milling holes." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3959 +msgid "Drill Tool dia:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3966 +msgid "Slot Tool dia:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3968 +msgid "" +"Diameter of the cutting tool\n" +"when milling slots." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3980 +msgid "Defaults" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3993 +msgid "Excellon Adv. Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3999 flatcamGUI/FlatCAMGUI.py:4435 +msgid "Advanced Options:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4001 +msgid "" +"Parameters used to create a CNC Job object\n" +"for this drill object that are shown when App Level is Advanced." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4009 +msgid "Offset Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4011 flatcamGUI/ObjectUI.py:645 +msgid "" +"Some drill bits (the larger ones) need to drill deeper\n" +"to create the desired exit hole diameter due of the tip shape.\n" +"The value here can compensate the Cut Z parameter." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/FlatCAMGUI.py:4446 +msgid "Toolchange X,Y:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4020 flatcamGUI/FlatCAMGUI.py:4448 +msgid "Toolchange X,Y position." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4026 flatcamGUI/FlatCAMGUI.py:4455 +#: flatcamGUI/ObjectUI.py:705 +msgid "Start move Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4028 +msgid "" +"Height of the tool just after start.\n" +"Delete the value if you don't need this feature." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4035 flatcamGUI/FlatCAMGUI.py:4465 +#: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1212 +msgid "End move Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4037 flatcamGUI/FlatCAMGUI.py:4467 +msgid "" +"Height of the tool after\n" +"the last move at the end of the job." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4044 flatcamGUI/FlatCAMGUI.py:4475 +#: flatcamGUI/ObjectUI.py:736 +msgid "Feedrate Rapids:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4046 flatcamGUI/ObjectUI.py:738 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4057 flatcamGUI/FlatCAMGUI.py:4499 +#: flatcamGUI/ObjectUI.py:786 flatcamGUI/ObjectUI.py:1321 +msgid "Probe Z depth:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4059 flatcamGUI/FlatCAMGUI.py:4501 +#: flatcamGUI/ObjectUI.py:788 flatcamGUI/ObjectUI.py:1324 +msgid "" +"The maximum depth that the probe is allowed\n" +"to probe. Negative value, in current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4067 flatcamGUI/FlatCAMGUI.py:4509 +#: flatcamGUI/ObjectUI.py:798 flatcamGUI/ObjectUI.py:1335 +msgid "Feedrate Probe:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4069 flatcamGUI/FlatCAMGUI.py:4511 +#: flatcamGUI/ObjectUI.py:800 flatcamGUI/ObjectUI.py:1338 +msgid "The feedrate used while the probe is probing." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4075 flatcamGUI/FlatCAMGUI.py:4518 +msgid "Fast Plunge:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4077 flatcamGUI/FlatCAMGUI.py:4520 +msgid "" +"By checking this, the vertical move from\n" +"Z_Toolchange to Z_move is done with G0,\n" +"meaning the fastest speed available.\n" +"WARNING: the move is done at Toolchange X,Y coords." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4086 +msgid "Fast Retract:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4088 +msgid "" +"Exit hole strategy.\n" +" - When uncheked, while exiting the drilled hole the drill bit\n" +"will travel slow, with set feedrate (G1), up to zero depth and then\n" +"travel as fast as possible (G0) to the Z Move (travel height).\n" +" - When checked the travel from Z cut (cut depth) to Z_move\n" +"(travel height) is done as fast as possible (G0) in one move." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4107 +msgid "Excellon Export" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4110 +msgid "Export Options:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4112 +msgid "" +"The parameters set here are used in the file exported\n" +"when using the File -> Export -> Export Excellon menu entry." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4121 +msgid "Units:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4123 flatcamGUI/FlatCAMGUI.py:4129 +msgid "The units used in the Excellon file." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4135 +msgid "Int/Decimals:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4137 +msgid "" +"The NC drill files, usually named Excellon files\n" +"are files that can be found in different formats.\n" +"Here we set the format used when the provided\n" +"coordinates are not using period." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4173 +msgid "Format:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4175 flatcamGUI/FlatCAMGUI.py:4185 +msgid "" +"Select the kind of coordinates format used.\n" +"Coordinates can be saved with decimal point or without.\n" +"When there is no decimal point, it is required to specify\n" +"the number of digits for integer part and the number of decimals.\n" +"Also it will have to be specified if LZ = leading zeros are kept\n" +"or TZ = trailing zeros are kept." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4182 +msgid "Decimal" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4183 +msgid "No-Decimal" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4196 +msgid "Zeros:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4209 +msgid "" +"This sets the default type of Excellon zeros.\n" +"If LZ then Leading Zeros are kept and\n" +"Trailing Zeros are removed.\n" +"If TZ is checked then Trailing Zeros are kept\n" +"and Leading Zeros are removed." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4235 +msgid "Geometry General" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4253 +msgid "" +"The number of circle steps for Geometry \n" +"circle and arc shapes linear approximation." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4261 +msgid "Tools" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4268 +msgid "Tool dia: " +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4270 +msgid "" +"The diameter of the cutting\n" +"tool.." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4285 +msgid "Geometry Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4290 +msgid "Create CNC Job:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4292 +msgid "" +"Create a CNC Job object\n" +"tracing the contours of this\n" +"Geometry object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4304 flatcamGUI/ObjectUI.py:1133 +msgid "" +"Cutting depth (negative)\n" +"below the copper surface." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4312 +msgid "Multidepth" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4314 +msgid "Multidepth usage: True or False." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4319 +msgid "Depth/Pass:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4321 +msgid "" +"The depth to cut on each pass,\n" +"when multidepth is enabled.\n" +"It has positive value although\n" +"it is a fraction from the depth\n" +"which has negative value." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4337 flatcamGUI/ObjectUI.py:1169 +msgid "" +"Height of the tool when\n" +"moving without cutting." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4364 flatcamGUI/ObjectUI.py:1224 +msgid "Feed Rate X-Y:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/ObjectUI.py:1227 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4374 +msgid "Feed Rate Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4376 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute.\n" +"It is called also Plunge." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/ObjectUI.py:750 +#: flatcamGUI/ObjectUI.py:1276 +msgid "Spindle speed:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4414 +msgid "" +"The postprocessor file that dictates\n" +"Machine Code output." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4430 +msgid "Geometry Adv. Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4437 +msgid "" +"Parameters to create a CNC Job object\n" +"tracing the contours of a Geometry object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4457 +msgid "" +"Height of the tool just after starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4477 +msgid "" +"Cutting speed in the XY plane\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4489 +msgid "Re-cut 1st pt." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4491 flatcamGUI/ObjectUI.py:1267 +msgid "" +"In order to remove possible\n" +"copper leftovers where first cut\n" +"meet with last cut, we generate an\n" +"extended cut over the first cut section." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4530 +msgid "Seg. X size:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4532 +msgid "" +"The size of the trace segment on the X axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the X axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4541 +msgid "Seg. Y size:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4543 +msgid "" +"The size of the trace segment on the Y axis.\n" +"Useful for auto-leveling.\n" +"A value of 0 means no segmentation on the Y axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4559 +msgid "CNC Job General" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4572 flatcamGUI/ObjectUI.py:615 +#: flatcamGUI/ObjectUI.py:945 flatcamGUI/ObjectUI.py:1499 +msgid "Plot Object" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4579 +msgid "Plot kind:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4581 flatcamGUI/ObjectUI.py:1421 +msgid "" +"This selects the kind of geometries on the canvas to plot.\n" +"Those can be either of type 'Travel' which means the moves\n" +"above the work piece or it can be of type 'Cut',\n" +"which means the moves that cut into the material." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/ObjectUI.py:1430 +msgid "Travel" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4600 +msgid "" +"The number of circle steps for GCode \n" +"circle and arc shapes linear approximation." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4610 +msgid "" +"Diameter of the tool to be\n" +"rendered in the plot." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4618 +msgid "Coords dec.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4620 +msgid "" +"The number of decimals to be used for \n" +"the X, Y, Z coordinates in CNC code (GCODE, etc.)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4628 +msgid "Feedrate dec.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4630 +msgid "" +"The number of decimals to be used for \n" +"the Feedrate parameter in CNC code (GCODE, etc.)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4645 +msgid "CNC Job Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4648 flatcamGUI/FlatCAMGUI.py:4689 +msgid "Export G-Code:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4650 flatcamGUI/FlatCAMGUI.py:4691 +#: flatcamGUI/ObjectUI.py:1535 +msgid "" +"Export and save G-Code to\n" +"make this object to a file." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4656 +msgid "Prepend to G-Code:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4658 +msgid "" +"Type here any G-Code commands you would\n" +"like to add at the beginning of the G-Code file." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4667 +msgid "Append to G-Code:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/ObjectUI.py:1557 +msgid "" +"Type here any G-Code commands you would\n" +"like to append to the generated file.\n" +"I.e.: M2 (End of program)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4686 +msgid "CNC Job Adv. Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4697 flatcamGUI/ObjectUI.py:1575 +msgid "Toolchange G-Code:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4699 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4713 flatcamGUI/ObjectUI.py:1597 +msgid "Use Toolchange Macro" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4715 flatcamGUI/ObjectUI.py:1600 +msgid "" +"Check this box if you want to use\n" +"a Custom Toolchange GCode (macro)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4727 flatcamGUI/ObjectUI.py:1616 +msgid "" +"A list of the FlatCAM variables that can be used\n" +"in the Toolchange event.\n" +"They have to be surrounded by the '%' symbol" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4734 flatcamGUI/ObjectUI.py:1624 +msgid "Parameters" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4737 flatcamGUI/ObjectUI.py:1627 +msgid "FlatCAM CNC parameters" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4738 flatcamGUI/ObjectUI.py:1628 +msgid "tool = tool number" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4739 flatcamGUI/ObjectUI.py:1629 +msgid "tooldia = tool diameter" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4740 flatcamGUI/ObjectUI.py:1630 +msgid "t_drills = for Excellon, total number of drills" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4741 flatcamGUI/ObjectUI.py:1631 +msgid "x_toolchange = X coord for Toolchange" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4742 flatcamGUI/ObjectUI.py:1632 +msgid "y_toolchange = Y coord for Toolchange" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4743 flatcamGUI/ObjectUI.py:1633 +msgid "z_toolchange = Z coord for Toolchange" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4744 +msgid "z_cut = Z depth for the cut" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4745 +msgid "z_move = Z height for travel" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4746 flatcamGUI/ObjectUI.py:1636 +msgid "z_depthpercut = the step value for multidepth cut" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4747 flatcamGUI/ObjectUI.py:1637 +msgid "spindlesspeed = the value for the spindle speed" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4748 flatcamGUI/ObjectUI.py:1638 +msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4769 +msgid "NCC Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4772 flatcamGUI/FlatCAMGUI.py:4873 +#: flatcamGUI/FlatCAMGUI.py:4943 flatcamGUI/FlatCAMGUI.py:5002 +#: flatcamGUI/FlatCAMGUI.py:5105 flatcamGUI/FlatCAMGUI.py:5166 +#: flatcamGUI/FlatCAMGUI.py:5365 flatcamGUI/FlatCAMGUI.py:5492 +msgid "Parameters:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4782 flatcamGUI/FlatCAMGUI.py:5503 +msgid "Tools dia:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4784 +msgid "Diameters of the cutting tools, separated by ','" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4792 flatcamTools/ToolNonCopperClear.py:166 +#, python-format +#| msgid "" +#| "How much (fraction) of the tool width to overlap each tool pass.\n" +#| "Example:\n" +#| "A value here of 0.25 means 25\\% from the tool diameter found above.\n" +#| "\n" +#| "Adjust the value starting with lower values\n" +#| "and increasing it if areas that should be cleared are still \n" +#| "not cleared.\n" +#| "Lower values = faster processing, faster execution on PCB.\n" +#| "Higher values = slow processing and slow execution on CNC\n" +#| "due of too many paths." +msgid "" +"How much (fraction) of the tool width to overlap each tool pass.\n" +"Example:\n" +"A value here of 0.25 means 25% from the tool diameter found above.\n" +"\n" +"Adjust the value starting with lower values\n" +"and increasing it if areas that should be cleared are still \n" +"not cleared.\n" +"Lower values = faster processing, faster execution on PCB.\n" +"Higher values = slow processing and slow execution on CNC\n" +"due of too many paths." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4808 flatcamTools/ToolNonCopperClear.py:182 +msgid "Bounding box margin." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4817 flatcamTools/ToolNonCopperClear.py:191 +#: flatcamTools/ToolPaint.py:190 +msgid "" +"Algorithm for non-copper clearing:
Standard: Fixed step inwards." +"
Seed-based: Outwards from seed.
Line-based: Parallel " +"lines." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4849 flatcamTools/ToolNonCopperClear.py:223 +#: flatcamTools/ToolPaint.py:222 +msgid "Rest M.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4851 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool.\n" +"If not checked, use the standard algorithm." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4870 +msgid "Cutout Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4875 flatcamGUI/ObjectUI.py:473 +msgid "" +"Create toolpaths to cut around\n" +"the PCB and separate it from\n" +"the original board." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4894 +msgid "" +"Distance from objects at which\n" +"to draw the cutout." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4901 flatcamTools/ToolCutOut.py:96 +msgid "Gap size:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4903 +msgid "" +"Size of the gaps in the toolpath\n" +"that will remain to hold the\n" +"board in place." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4911 flatcamTools/ToolCutOut.py:125 +msgid "Gaps:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4913 +msgid "" +"Number of bridge gaps used for the cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4940 +msgid "2Sided Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4945 +msgid "" +"A tool to help in creating a double sided\n" +"PCB using alignment holes." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4955 flatcamTools/ToolDblSided.py:235 +msgid "Drill diam.:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4957 flatcamTools/ToolDblSided.py:226 +#: flatcamTools/ToolDblSided.py:237 +msgid "Diameter of the drill for the alignment holes." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4964 +msgid "X" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4965 +msgid "Y" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4966 flatcamTools/ToolDblSided.py:120 +msgid "Mirror Axis:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4968 flatcamTools/ToolDblSided.py:122 +msgid "Mirror vertically (X) or horizontally (Y)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4977 +msgid "Point" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4978 +msgid "Box" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4979 flatcamTools/ToolDblSided.py:133 +msgid "Axis Ref:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4981 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a Geometry object) in \n" +"the middle." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:4997 +msgid "Paint Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5004 flatcamGUI/ObjectUI.py:1370 +msgid "" +"Creates tool paths to cover the\n" +"whole area of a polygon (remove\n" +"all copper). You will be asked\n" +"to click on the desired polygon." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5028 +msgid "" +"How much (fraction) of the tool\n" +"width to overlap each tool pass." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5082 flatcamTools/ToolPaint.py:237 +msgid "Selection:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5084 +msgid "How to select the polygons to paint." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5088 +msgid "Single" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5102 +msgid "Film Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5107 +msgid "" +"Create a PCB film from a Gerber or Geometry\n" +"FlatCAM object.\n" +"The file is saved in SVG format." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5116 +msgid "Pos" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5117 +msgid "Neg" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5118 flatcamTools/ToolFilm.py:116 +msgid "Film Type:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5120 flatcamTools/ToolFilm.py:118 +msgid "" +"Generate a Positive black film or a Negative film.\n" +"Positive means that it will print the features\n" +"with black on a white canvas.\n" +"Negative means that it will print the features\n" +"with white on a black canvas.\n" +"The Film format is SVG." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5131 flatcamTools/ToolFilm.py:130 +msgid "Border:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5133 flatcamTools/ToolFilm.py:132 +msgid "" +"Specify a border around the object.\n" +"Only for negative film.\n" +"It helps if we use as a Box Object the same \n" +"object as in Film Object. It will create a thick\n" +"black bar around the actual print allowing for a\n" +"better delimitation of the outline features which are of\n" +"white color like the rest and which may confound with the\n" +"surroundings if not for this border." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5146 flatcamTools/ToolFilm.py:144 +msgid "Scale Stroke:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5148 flatcamTools/ToolFilm.py:146 +msgid "" +"Scale the line stroke thickness of each feature in the SVG file.\n" +"It means that the line that envelope each SVG feature will be thicker or " +"thinner,\n" +"therefore the fine features may be more affected by this parameter." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5163 +msgid "Panelize Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5168 +msgid "" +"Create an object that contains an array of (x, y) elements,\n" +"each element is a copy of the source object spaced\n" +"at a X distance, Y distance of each other." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5179 flatcamTools/ToolPanelize.py:113 +msgid "Spacing cols:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5181 flatcamTools/ToolPanelize.py:115 +msgid "" +"Spacing between columns of the desired panel.\n" +"In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamTools/ToolPanelize.py:122 +msgid "Spacing rows:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5191 flatcamTools/ToolPanelize.py:124 +msgid "" +"Spacing between rows of the desired panel.\n" +"In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5199 flatcamTools/ToolPanelize.py:131 +msgid "Columns:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5201 flatcamTools/ToolPanelize.py:133 +msgid "Number of columns of the desired panel" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5208 flatcamTools/ToolPanelize.py:139 +msgid "Rows:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5210 flatcamTools/ToolPanelize.py:141 +msgid "Number of rows of the desired panel" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5216 +msgid "Gerber" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5217 +msgid "Geo" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5218 flatcamTools/ToolPanelize.py:148 +msgid "Panel Type:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5220 +msgid "" +"Choose the type of object for the panel object:\n" +"- Gerber\n" +"- Geometry" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5229 +msgid "Constrain within:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5231 flatcamTools/ToolPanelize.py:160 +msgid "" +"Area define by DX and DY within to constrain the panel.\n" +"DX and DY values are in current units.\n" +"Regardless of how many columns and rows are desired,\n" +"the final panel will have as many columns and rows as\n" +"they fit completely within selected area." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5240 flatcamTools/ToolPanelize.py:169 +msgid "Width (DX):" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5242 flatcamTools/ToolPanelize.py:171 +msgid "" +"The width (DX) within which the panel must fit.\n" +"In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5249 flatcamTools/ToolPanelize.py:177 +msgid "Height (DY):" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5251 flatcamTools/ToolPanelize.py:179 +msgid "" +"The height (DY)within which the panel must fit.\n" +"In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5265 +msgid "Calculators Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5268 +msgid "V-Shape Tool Calculator:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5270 +msgid "" +"Calculate the tool diameter for a given V-shape tool,\n" +"having the tip diameter, tip angle and\n" +"depth-of-cut as parameters." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5281 flatcamTools/ToolCalculators.py:94 +msgid "Tip Diameter:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5283 +msgid "" +"This is the tool tip diameter.\n" +"It is specified by manufacturer." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5291 +msgid "Tip angle:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5293 +msgid "" +"This is the angle on the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5303 +msgid "" +"This is depth to cut into material.\n" +"In the CNCJob object it is the CutZ parameter." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5310 +msgid "ElectroPlating Calculator:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolCalculators.py:152 +msgid "" +"This calculator is useful for those who plate the via/pad/drill holes,\n" +"using a method like grahite ink or calcium hypophosphite ink or palladium " +"chloride." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5322 flatcamTools/ToolCalculators.py:161 +msgid "Board Length:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5324 flatcamTools/ToolCalculators.py:165 +msgid "This is the board length. In centimeters." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5330 flatcamTools/ToolCalculators.py:167 +msgid "Board Width:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCalculators.py:171 +msgid "This is the board width.In centimeters." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolCalculators.py:173 +msgid "Current Density:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5340 flatcamTools/ToolCalculators.py:177 +msgid "" +"Current density to pass through the board. \n" +"In Amps per Square Feet ASF." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5346 flatcamTools/ToolCalculators.py:181 +msgid "Copper Growth:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5349 flatcamTools/ToolCalculators.py:185 +msgid "" +"How thick the copper growth is intended to be.\n" +"In microns." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5362 +msgid "Transform Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5367 +msgid "" +"Various transformations that can be applied\n" +"on a FlatCAM object." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5377 +msgid "Rotate Angle:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5379 +msgid "Angle for rotation. In degrees." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5386 +msgid "Skew_X angle:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5388 +msgid "Angle for Skew/Shear on X axis. In degrees." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5395 +msgid "Skew_Y angle:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5397 +msgid "Angle for Skew/Shear on Y axis. In degrees." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5404 +msgid "Scale_X factor:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5406 +msgid "Factor for scaling on X axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5413 +msgid "Scale_Y factor:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5415 +msgid "Factor for scaling on Y axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5423 +msgid "" +"Scale the selected object(s)\n" +"using the Scale_X factor for both axis." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolTransform.py:210 +msgid "" +"Scale the selected object(s)\n" +"using the origin reference when checked,\n" +"and the center of the biggest bounding box\n" +"of the selected objects when unchecked." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5440 +msgid "Offset_X val:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5442 +msgid "Distance to offset on X axis. In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5449 +msgid "Offset_Y val:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5451 +msgid "Distance to offset on Y axis. In current units." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5457 +msgid "Mirror Reference" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5459 flatcamTools/ToolTransform.py:314 +msgid "" +"Flip the selected object(s)\n" +"around the point in Point Entry Field.\n" +"\n" +"The point coordinates can be captured by\n" +"left click on canvas together with pressing\n" +"SHIFT key. \n" +"Then click Add button to insert coordinates.\n" +"Or enter the coords in format (x, y) in the\n" +"Point Entry field and click Flip on X(Y)" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5470 +msgid " Mirror Ref. Point:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamTools/ToolTransform.py:327 +msgid "" +"Coordinates in format (x, y) used as reference for mirroring.\n" +"The 'x' in (x, y) will be used when using Flip on X and\n" +"the 'y' in (x, y) will be used when using Flip on Y and" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5489 +msgid "SolderPaste Tool Options" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5494 +msgid "" +"A tool to create GCode for dispensing\n" +"solder paste onto a PCB." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5505 +msgid "Diameters of nozzle tools, separated by ','" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5512 +msgid "New Nozzle Dia:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolSolderPaste.py:103 +msgid "Diameter for the new Nozzle tool to add in the Tool Table" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolSolderPaste.py:166 +msgid "Z Dispense Start:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5524 flatcamTools/ToolSolderPaste.py:168 +msgid "The height (Z) when solder paste dispensing starts." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5531 flatcamTools/ToolSolderPaste.py:174 +msgid "Z Dispense:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamTools/ToolSolderPaste.py:176 +msgid "The height (Z) when doing solder paste dispensing." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5540 flatcamTools/ToolSolderPaste.py:183 +msgid "Z Dispense Stop:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5542 flatcamTools/ToolSolderPaste.py:185 +msgid "The height (Z) when solder paste dispensing stops." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5549 flatcamTools/ToolSolderPaste.py:191 +msgid "Z Travel:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5551 flatcamTools/ToolSolderPaste.py:193 +msgid "" +"The height (Z) for travel between pads\n" +"(without dispensing solder paste)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5559 flatcamTools/ToolSolderPaste.py:200 +msgid "Z Toolchange:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5561 flatcamTools/ToolSolderPaste.py:202 +msgid "The height (Z) for tool (nozzle) change." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5568 flatcamTools/ToolSolderPaste.py:208 +msgid "XY Toolchange:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5570 flatcamTools/ToolSolderPaste.py:210 +msgid "" +"The X,Y location for tool (nozzle) change.\n" +"The format is (x, y) where x and y are real numbers." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5578 flatcamTools/ToolSolderPaste.py:217 +msgid "Feedrate X-Y:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5580 flatcamTools/ToolSolderPaste.py:219 +msgid "Feedrate (speed) while moving on the X-Y plane." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5587 flatcamTools/ToolSolderPaste.py:225 +msgid "Feedrate Z:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5589 flatcamTools/ToolSolderPaste.py:227 +msgid "" +"Feedrate (speed) while moving vertically\n" +"(on Z plane)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5597 flatcamTools/ToolSolderPaste.py:234 +msgid "Feedrate Z Dispense:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5599 flatcamTools/ToolSolderPaste.py:236 +msgid "" +"Feedrate (speed) while moving up vertically\n" +" to Dispense position (on Z plane)." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5607 flatcamTools/ToolSolderPaste.py:243 +msgid "Spindle Speed FWD:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5609 flatcamTools/ToolSolderPaste.py:245 +msgid "" +"The dispenser speed while pushing solder paste\n" +"through the dispenser nozzle." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5617 flatcamTools/ToolSolderPaste.py:252 +msgid "Dwell FWD:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolSolderPaste.py:254 +msgid "Pause after solder dispensing." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5626 flatcamTools/ToolSolderPaste.py:260 +msgid "Spindle Speed REV:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5628 flatcamTools/ToolSolderPaste.py:262 +msgid "" +"The dispenser speed while retracting solder paste\n" +"through the dispenser nozzle." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5636 flatcamTools/ToolSolderPaste.py:269 +msgid "Dwell REV:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5638 flatcamTools/ToolSolderPaste.py:271 +msgid "" +"Pause after solder paste dispenser retracted,\n" +"to allow pressure equilibrium." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5645 flatcamTools/ToolSolderPaste.py:277 +msgid "PostProcessors:" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolSolderPaste.py:279 +msgid "Files that control the GCode generation." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5677 flatcamGUI/FlatCAMGUI.py:5683 +msgid "Idle." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5707 +msgid "Application started ..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:5708 +msgid "Hello!" +msgstr "" + +#: flatcamGUI/ObjectUI.py:33 +msgid "FlatCAM Object" +msgstr "" + +#: flatcamGUI/ObjectUI.py:58 +msgid "" +"BASIC is suitable for a beginner. Many parameters\n" +"are hidden from the user in this mode.\n" +"ADVANCED mode will make available all parameters.\n" +"\n" +"To change the application LEVEL, go to:\n" +"Edit -> Preferences -> General and check:\n" +"'APP. LEVEL' radio button." +msgstr "" + +#: flatcamGUI/ObjectUI.py:79 +msgid "Scale:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:81 +msgid "Change the size of the object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:89 +msgid "Factor:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:91 +msgid "" +"Factor by which to multiply\n" +"geometric features of this object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:102 +msgid "Perform scaling operation." +msgstr "" + +#: flatcamGUI/ObjectUI.py:108 +msgid "Offset:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:110 +msgid "Change the position of this object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:117 +msgid "Vector:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:119 +msgid "" +"Amount by which to move the object\n" +"in the x and y axes in (x, y) format." +msgstr "" + +#: flatcamGUI/ObjectUI.py:129 +msgid "Perform the offset operation." +msgstr "" + +#: flatcamGUI/ObjectUI.py:143 +msgid "Gerber Object" +msgstr "" + +#: flatcamGUI/ObjectUI.py:156 +msgid "Solid " +msgstr "" + +#: flatcamGUI/ObjectUI.py:164 +msgid "M-Color " +msgstr "" + +#: flatcamGUI/ObjectUI.py:182 flatcamGUI/ObjectUI.py:588 +#: flatcamGUI/ObjectUI.py:907 flatcamGUI/ObjectUI.py:1437 +msgid "Name:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:192 +msgid "Apertures:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:194 +msgid "Apertures Table for the Gerber Object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:203 +msgid "" +"Toggle the display of the Gerber Apertures Table.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" + +#: flatcamGUI/ObjectUI.py:214 +msgid "Mark All" +msgstr "" + +#: flatcamGUI/ObjectUI.py:216 +msgid "" +"When checked it will display all the apertures.\n" +"When unchecked, it will delete all mark shapes\n" +"that are drawn on canvas." +msgstr "" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Code" +msgstr "" + +#: flatcamGUI/ObjectUI.py:228 flatcamGUI/ObjectUI.py:959 +#: flatcamGUI/ObjectUI.py:1517 +msgid "Type" +msgstr "" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Size" +msgstr "" + +#: flatcamGUI/ObjectUI.py:228 +msgid "Dim" +msgstr "" + +#: flatcamGUI/ObjectUI.py:232 +msgid "Index" +msgstr "" + +#: flatcamGUI/ObjectUI.py:234 +msgid "Aperture Code" +msgstr "" + +#: flatcamGUI/ObjectUI.py:236 +msgid "Type of aperture: circular, rectangle, macros etc" +msgstr "" + +#: flatcamGUI/ObjectUI.py:238 +msgid "Aperture Size:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:240 +msgid "" +"Aperture Dimensions:\n" +" - (width, height) for R, O type.\n" +" - (dia, nVertices) for P type" +msgstr "" + +#: flatcamGUI/ObjectUI.py:244 +msgid "Mark the aperture instances on canvas." +msgstr "" + +#: flatcamGUI/ObjectUI.py:252 +msgid "Scale Factor:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:267 +msgid "Perform scaling operation on the selected apertures." +msgstr "" + +#: flatcamGUI/ObjectUI.py:273 +msgid "Buffer Factor:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:286 +msgid "Buffer" +msgstr "" + +#: flatcamGUI/ObjectUI.py:288 +msgid "Perform buffer operation on the selected apertures." +msgstr "" + +#: flatcamGUI/ObjectUI.py:296 +msgid "Generate new Gerber Object:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:298 +msgid "Will generate a new Gerber object from the changed apertures." +msgstr "" + +#: flatcamGUI/ObjectUI.py:304 +msgid "Go" +msgstr "" + +#: flatcamGUI/ObjectUI.py:306 +msgid "" +"Will generate a new Gerber object from the changed apertures.\n" +"This new object can then be isolated etc." +msgstr "" + +#: flatcamGUI/ObjectUI.py:333 +msgid "" +"Diameter of the cutting tool.\n" +"If you want to have an isolation path\n" +"inside the actual shape of the Gerber\n" +"feature, use a negative value for\n" +"this parameter." +msgstr "" + +#: flatcamGUI/ObjectUI.py:344 +msgid "Passes:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:378 +msgid "Combine" +msgstr "" + +#: flatcamGUI/ObjectUI.py:394 +msgid "Generate Isolation Geometry:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:396 +msgid "" +"Create a Geometry object with toolpaths to cut \n" +"isolation outside, inside or on both sides of the\n" +"object. For a Gerber object outside means outside\n" +"of the Gerber feature and inside means inside of\n" +"the Gerber feature, if possible at all. This means\n" +"that only if the Gerber feature has openings inside, they\n" +"will be isolated. If what is wanted is to cut isolation\n" +"inside the actual Gerber feature, use a negative tool\n" +"diameter above." +msgstr "" + +#: flatcamGUI/ObjectUI.py:415 +msgid "FULL Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:417 +msgid "" +"Create the Geometry Object\n" +"for isolation routing. It contains both\n" +"the interiors and exteriors geometry." +msgstr "" + +#: flatcamGUI/ObjectUI.py:426 +msgid "Ext Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:428 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the exteriors geometry." +msgstr "" + +#: flatcamGUI/ObjectUI.py:435 +msgid "Int Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:437 +msgid "" +"Create the Geometry Object\n" +"for isolation routing containing\n" +"only the interiors geometry." +msgstr "" + +#: flatcamGUI/ObjectUI.py:455 +msgid "Clear N-copper:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:465 flatcamTools/ToolNonCopperClear.py:239 +msgid "" +"Create the Geometry Object\n" +"for non-copper routing." +msgstr "" + +#: flatcamGUI/ObjectUI.py:471 +msgid "Board cutout:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:479 +msgid "Cutout Tool" +msgstr "" + +#: flatcamGUI/ObjectUI.py:481 +msgid "" +"Generate the geometry for\n" +"the board cutout." +msgstr "" + +#: flatcamGUI/ObjectUI.py:487 +msgid "Non-copper regions:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:489 +msgid "" +"Create polygons covering the\n" +"areas without copper on the PCB.\n" +"Equivalent to the inverse of this\n" +"object. Can be used to remove all\n" +"copper from a specified region." +msgstr "" + +#: flatcamGUI/ObjectUI.py:514 flatcamGUI/ObjectUI.py:545 +msgid "Rounded Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:516 +msgid "Resulting geometry will have rounded corners." +msgstr "" + +#: flatcamGUI/ObjectUI.py:521 flatcamGUI/ObjectUI.py:555 +#: flatcamTools/ToolCutOut.py:159 flatcamTools/ToolCutOut.py:179 +#: flatcamTools/ToolCutOut.py:230 flatcamTools/ToolSolderPaste.py:127 +msgid "Generate Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:527 +msgid "" +"Create a geometry surrounding the Gerber object.\n" +"Square shape." +msgstr "" + +#: flatcamGUI/ObjectUI.py:557 +msgid "Generate the Geometry object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:568 +msgid "Excellon Object" +msgstr "" + +#: flatcamGUI/ObjectUI.py:579 +msgid "Solid circles." +msgstr "" + +#: flatcamGUI/ObjectUI.py:607 flatcamGUI/ObjectUI.py:926 +msgid "Tools Table" +msgstr "" + +#: flatcamGUI/ObjectUI.py:628 +msgid "Offset Z" +msgstr "" + +#: flatcamGUI/ObjectUI.py:632 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn in the Machine Code." +msgstr "" + +#: flatcamGUI/ObjectUI.py:636 flatcamGUI/ObjectUI.py:972 +#: flatcamTools/ToolNonCopperClear.py:96 flatcamTools/ToolPaint.py:94 +msgid "" +"Tool Diameter. It's value (in current FlatCAM units) \n" +"is the cut width into the material." +msgstr "" + +#: flatcamGUI/ObjectUI.py:639 +msgid "" +"The number of Drill holes. Holes that are drilled with\n" +"a drill bit." +msgstr "" + +#: flatcamGUI/ObjectUI.py:642 +msgid "" +"The number of Slot holes. Holes that are created by\n" +"milling them with an endmill bit." +msgstr "" + +#: flatcamGUI/ObjectUI.py:649 +msgid "Toggle display of the drills for the current tool." +msgstr "" + +#: flatcamGUI/ObjectUI.py:657 +msgid "" +"Create a CNC Job object\n" +"for this drill object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:686 flatcamGUI/ObjectUI.py:1186 +msgid "Tool change" +msgstr "" + +#: flatcamGUI/ObjectUI.py:694 flatcamGUI/ObjectUI.py:1179 +msgid "Tool change Z:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1182 +msgid "" +"Z-axis position (height) for\n" +"tool change." +msgstr "" + +#: flatcamGUI/ObjectUI.py:707 +msgid "" +"Tool height just before starting the work.\n" +"Delete the value if you don't need this feature." +msgstr "" + +#: flatcamGUI/ObjectUI.py:717 +msgid "" +"Z-axis position (height) for\n" +"the last move." +msgstr "" + +#: flatcamGUI/ObjectUI.py:725 +msgid "Feedrate (Plunge):" +msgstr "" + +#: flatcamGUI/ObjectUI.py:727 +msgid "" +"Tool speed while drilling\n" +"(in units per minute).\n" +"This is for linear move G01." +msgstr "" + +#: flatcamGUI/ObjectUI.py:777 +msgid "" +"The json file that dictates\n" +"gcode output." +msgstr "" + +#: flatcamGUI/ObjectUI.py:809 +msgid "" +"Select from the Tools Table above\n" +"the tools you want to include." +msgstr "" + +#: flatcamGUI/ObjectUI.py:816 +msgid "Type: " +msgstr "" + +#: flatcamGUI/ObjectUI.py:818 +msgid "" +"Choose what to use for GCode generation:\n" +"'Drills', 'Slots' or 'Both'.\n" +"When choosing 'Slots' or 'Both', slots will be\n" +"converted to a series of drills." +msgstr "" + +#: flatcamGUI/ObjectUI.py:833 +msgid "Create GCode" +msgstr "" + +#: flatcamGUI/ObjectUI.py:835 +msgid "Generate the CNC Job." +msgstr "" + +#: flatcamGUI/ObjectUI.py:847 +msgid "" +"Select from the Tools Table above\n" +" the hole dias that are to be milled." +msgstr "" + +#: flatcamGUI/ObjectUI.py:854 +msgid "Drills Tool dia:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:861 +msgid "Mill Drills Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:863 +msgid "" +"Create the Geometry Object\n" +"for milling DRILLS toolpaths." +msgstr "" + +#: flatcamGUI/ObjectUI.py:870 +msgid "Slots Tool dia:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:877 +msgid "Mill Slots Geo" +msgstr "" + +#: flatcamGUI/ObjectUI.py:879 +msgid "" +"Create the Geometry Object\n" +"for milling SLOTS toolpaths." +msgstr "" + +#: flatcamGUI/ObjectUI.py:897 +msgid "Geometry Object" +msgstr "" + +#: flatcamGUI/ObjectUI.py:928 +msgid "" +"Tools in this Geometry object used for cutting.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V). \n" +"When V-shaped is selected the 'Type' entry is automatically \n" +"set to Isolation, the CutZ parameter in the UI form is\n" +"grayed out and Cut Z is automatically calculated from the newly \n" +"showed UI form entries named V-Tip Dia and V-Tip Angle." +msgstr "" + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "Dia" +msgstr "" + +#: flatcamGUI/ObjectUI.py:959 flatcamGUI/ObjectUI.py:1517 +msgid "TT" +msgstr "" + +#: flatcamGUI/ObjectUI.py:966 +msgid "" +"This is the Tool Number.\n" +"When ToolChange is checked, on toolchange event this value\n" +"will be showed as a T1, T2 ... Tn" +msgstr "" + +#: flatcamGUI/ObjectUI.py:977 +msgid "" +"The value for the Offset can be:\n" +"- Path -> There is no offset, the tool cut will be done through the geometry " +"line.\n" +"- In(side) -> The tool cut will follow the geometry inside. It will create a " +"'pocket'.\n" +"- Out(side) -> The tool cut will follow the geometry line on the outside." +msgstr "" + +#: flatcamGUI/ObjectUI.py:984 +msgid "" +"The (Operation) Type has only informative value. Usually the UI form " +"values \n" +"are choosed based on the operation type and this will serve as a reminder.\n" +"Can be 'Roughing', 'Finishing' or 'Isolation'.\n" +"For Roughing we may choose a lower Feedrate and multiDepth cut.\n" +"For Finishing we may choose a higher Feedrate, without multiDepth.\n" +"For Isolation we need a lower Feedrate as it use a milling bit with a fine " +"tip." +msgstr "" + +#: flatcamGUI/ObjectUI.py:993 +msgid "" +"The Tool Type (TT) can be:\n" +"- Circular with 1 ... 4 teeth -> it is informative only. Being circular the " +"cut width in material\n" +"is exactly the tool diameter.\n" +"- Ball -> informative only and make reference to the Ball type endmill.\n" +"- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable " +"two additional UI form\n" +"fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust " +"the Z-Cut parameter such\n" +"as the cut width into material will be equal with the value in the Tool " +"Diameter column of this table.\n" +"Choosing the V-Shape Tool Type automatically will select the Operation Type " +"as Isolation." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1004 +msgid "" +"Plot column. It is visible only for MultiGeo geometries, meaning geometries " +"that holds the geometry\n" +"data into the tools. For those geometries, deleting the tool will delete the " +"geometry data also,\n" +"so be WARNED. From the checkboxes on each row it can be enabled/disabled the " +"plot on canvas\n" +"for the corresponding tool." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1017 +msgid "Tool Offset:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1020 +msgid "" +"The value to offset the cut when \n" +"the Offset type selected is 'Offset'.\n" +"The value can be positive for 'outside'\n" +"cut and negative for 'inside' cut." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1043 +msgid "Tool Dia:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1062 flatcamTools/ToolNonCopperClear.py:135 +#: flatcamTools/ToolPaint.py:133 +msgid "" +"Add a new tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1070 +msgid "" +"Copy a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1078 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row in the Tool Table." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1094 +msgid "Tool Data" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1097 +msgid "" +"The data used for creating GCode.\n" +"Each tool store it's own set of such data." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1107 +msgid "V-Tip Dia:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1110 +msgid "The tip diameter for V-Shape Tool" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1118 +msgid "V-Tip Angle:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1121 +msgid "" +"The tip angle for V-Shape Tool.\n" +"In degree." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1142 +msgid "Multi-Depth:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1145 +msgid "" +"Use multiple passes to limit\n" +"the cut depth in each pass. Will\n" +"cut multiple times until Cut Z is\n" +"reached.\n" +"To the right, input the depth of \n" +"each pass (positive value)." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1158 +msgid "Depth of each pass (positive)." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1189 +msgid "" +"Include tool-change sequence\n" +"in the Machine Code (Pause for tool change)." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1215 +msgid "" +"This is the height (Z) at which the CNC\n" +"will go as the last move." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1236 +msgid "Feed Rate Z (Plunge):" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1239 +msgid "" +"Cutting speed in the Z\n" +"plane in units per minute" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1248 +msgid "Feed Rate Rapids:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1251 +msgid "" +"Cutting speed in the XY\n" +"plane in units per minute\n" +"(in units per minute).\n" +"This is for the rapid move G00.\n" +"It is useful only for Marlin,\n" +"ignore for any other cases." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1264 +msgid "Cut over 1st pt" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1279 +msgid "" +"Speed of the spindle in RPM (optional).\n" +"If LASER postprocessor is used,\n" +"this value is the power of laser." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1308 +msgid "PostProcessor:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1311 +msgid "" +"The Postprocessor file that dictates\n" +"the Machine Code (like GCode, RML, HPGL) output." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1349 +msgid "" +"Add at least one tool in the tool-table.\n" +"Click the header to select all, or Ctrl + LMB\n" +"for custom selection of tools." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1356 +msgid "Generate" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1359 +msgid "Generate the CNC Job object." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1367 +msgid "Paint Area:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1382 +msgid "Launch Paint Tool in Tools Tab." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1399 +msgid "CNC Job Object" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1418 +msgid "Plot kind:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1443 +msgid "Travelled dist.:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1446 flatcamGUI/ObjectUI.py:1453 +msgid "" +"This is the total travelled distance on X-Y plane.\n" +"In current units." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1481 +msgid "CNC Tools Table" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1484 +msgid "" +"Tools in this CNCJob object used for cutting.\n" +"The tool diameter is used for plotting on canvas.\n" +"The 'Offset' entry will set an offset for the cut.\n" +"'Offset' can be inside, outside, on path (none) and custom.\n" +"'Type' entry is only informative and it allow to know the \n" +"intent of using the current tool. \n" +"It can be Rough(ing), Finish(ing) or Iso(lation).\n" +"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n" +"ball(B), or V-Shaped(V)." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1518 +msgid "P" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1524 +msgid "Update Plot" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1526 +msgid "Update the plot." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1533 +msgid "Export CNC Code:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1541 +msgid "Prepend to CNC Code:" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1544 +msgid "" +"Type here any G-Code commands you would\n" +"like to add to the beginning of the generated file." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1554 +msgid "Append to CNC Code" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1578 +msgid "" +"Type here any G-Code commands you would\n" +"like to be executed when Toolchange event is encountered.\n" +"This will constitute a Custom Toolchange GCode,\n" +"or a Toolchange Macro.\n" +"The FlatCAM variables are surrounded by '%' symbol.\n" +"\n" +"WARNING: it can be used only with a postprocessor file\n" +"that has 'toolchange_custom' in it's name and this is built\n" +"having as template the 'Toolchange Custom' posprocessor file." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1634 +msgid "z_cut = depth where to cut" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1635 +msgid "z_move = height where to travel" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1656 +msgid "View CNC Code" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1659 +msgid "" +"Opens TAB to view/modify/print G-Code\n" +"file." +msgstr "" + +#: flatcamGUI/ObjectUI.py:1665 +msgid "Save CNC Code" +msgstr "" + +#: flatcamGUI/ObjectUI.py:1668 +msgid "" +"Opens dialog to save G-Code\n" +"file." +msgstr "" + +#: flatcamTools/ToolCalculators.py:24 +msgid "Calculators" +msgstr "" + +#: flatcamTools/ToolCalculators.py:25 +msgid "V-Shape Tool Calculator" +msgstr "" + +#: flatcamTools/ToolCalculators.py:26 +msgid "Units Calculator" +msgstr "" + +#: flatcamTools/ToolCalculators.py:27 +msgid "ElectroPlating Calculator" +msgstr "" + +#: flatcamTools/ToolCalculators.py:68 +msgid "Here you enter the value to be converted from INCH to MM" +msgstr "" + +#: flatcamTools/ToolCalculators.py:73 +msgid "Here you enter the value to be converted from MM to INCH" +msgstr "" + +#: flatcamTools/ToolCalculators.py:98 +msgid "" +"This is the diameter of the tool tip.\n" +"The manufacturer specifies it." +msgstr "" + +#: flatcamTools/ToolCalculators.py:101 +msgid "Tip Angle:" +msgstr "" + +#: flatcamTools/ToolCalculators.py:105 +msgid "" +"This is the angle of the tip of the tool.\n" +"It is specified by manufacturer." +msgstr "" + +#: flatcamTools/ToolCalculators.py:112 +msgid "" +"This is the depth to cut into the material.\n" +"In the CNCJob is the CutZ parameter." +msgstr "" + +#: flatcamTools/ToolCalculators.py:115 +msgid "Tool Diameter:" +msgstr "" + +#: flatcamTools/ToolCalculators.py:119 +msgid "" +"This is the tool diameter to be entered into\n" +"FlatCAM Gerber section.\n" +"In the CNCJob section it is called >Tool dia<." +msgstr "" + +#: flatcamTools/ToolCalculators.py:131 flatcamTools/ToolCalculators.py:214 +msgid "Calculate" +msgstr "" + +#: flatcamTools/ToolCalculators.py:134 +msgid "" +"Calculate either the Cut Z or the effective tool diameter,\n" +" depending on which is desired and which is known. " +msgstr "" + +#: flatcamTools/ToolCalculators.py:190 +msgid "Current Value:" +msgstr "" + +#: flatcamTools/ToolCalculators.py:194 +msgid "" +"This is the current intensity value\n" +"to be set on the Power Supply. In Amps." +msgstr "" + +#: flatcamTools/ToolCalculators.py:198 +msgid "Time:" +msgstr "" + +#: flatcamTools/ToolCalculators.py:202 +msgid "" +"This is the calculated time required for the procedure.\n" +"In minutes." +msgstr "" + +#: flatcamTools/ToolCalculators.py:217 +msgid "" +"Calculate the current intensity value and the procedure time,\n" +" depending on the parameters above" +msgstr "" + +#: flatcamTools/ToolCutOut.py:17 +msgid "Cutout PCB" +msgstr "" + +#: flatcamTools/ToolCutOut.py:53 +msgid "Obj Type:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:55 +msgid "" +"Specify the type of object to be cutout.\n" +"It can be of type: Gerber or Geometry.\n" +"What is selected here will dictate the kind\n" +"of objects that will populate the 'Object' combobox." +msgstr "" + +#: flatcamTools/ToolCutOut.py:69 flatcamTools/ToolPanelize.py:71 +msgid "Object:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:71 +msgid "Object to be cutout. " +msgstr "" + +#: flatcamTools/ToolCutOut.py:79 +msgid "" +"Diameter of the tool used to cutout\n" +"the PCB shape out of the surrounding material." +msgstr "" + +#: flatcamTools/ToolCutOut.py:88 +msgid "" +"Margin over bounds. A positive value here\n" +"will make the cutout of the PCB further from\n" +"the actual PCB border" +msgstr "" + +#: flatcamTools/ToolCutOut.py:98 +msgid "" +"The size of the bridge gaps in the cutout\n" +"used to keep the board connected to\n" +"the surrounding material (the one \n" +"from which the PCB is cutout)." +msgstr "" + +#: flatcamTools/ToolCutOut.py:114 +msgid "A. Automatic Bridge Gaps" +msgstr "" + +#: flatcamTools/ToolCutOut.py:116 +msgid "This section handle creation of automatic bridge gaps." +msgstr "" + +#: flatcamTools/ToolCutOut.py:127 +msgid "" +"Number of gaps used for the Automatic cutout.\n" +"There can be maximum 8 bridges/gaps.\n" +"The choices are:\n" +"- lr - left + right\n" +"- tb - top + bottom\n" +"- 4 - left + right +top + bottom\n" +"- 2lr - 2*left + 2*right\n" +"- 2tb - 2*top + 2*bottom\n" +"- 8 - 2*left + 2*right +2*top + 2*bottom" +msgstr "" + +#: flatcamTools/ToolCutOut.py:150 +msgid "FreeForm:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:152 +msgid "" +"The cutout shape can be of ny shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" + +#: flatcamTools/ToolCutOut.py:161 +msgid "" +"Cutout the selected object.\n" +"The cutout shape can be of any shape.\n" +"Useful when the PCB has a non-rectangular shape." +msgstr "" + +#: flatcamTools/ToolCutOut.py:170 +msgid "Rectangular:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:172 +msgid "" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" + +#: flatcamTools/ToolCutOut.py:181 +msgid "" +"Cutout the selected object.\n" +"The resulting cutout shape is\n" +"always a rectangle shape and it will be\n" +"the bounding box of the Object." +msgstr "" + +#: flatcamTools/ToolCutOut.py:189 +msgid "B. Manual Bridge Gaps" +msgstr "" + +#: flatcamTools/ToolCutOut.py:191 +msgid "" +"This section handle creation of manual bridge gaps.\n" +"This is done by mouse clicking on the perimeter of the\n" +"Geometry object that is used as a cutout object. " +msgstr "" + +#: flatcamTools/ToolCutOut.py:207 +msgid "Geo Obj:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:209 +msgid "Geometry object used to create the manual cutout." +msgstr "" + +#: flatcamTools/ToolCutOut.py:220 +msgid "Manual Geo:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:222 flatcamTools/ToolCutOut.py:232 +msgid "" +"If the object to be cutout is a Gerber\n" +"first create a Geometry that surrounds it,\n" +"to be used as the cutout, if one doesn't exist yet.\n" +"Select the source Gerber file in the top object combobox." +msgstr "" + +#: flatcamTools/ToolCutOut.py:242 +msgid "Manual Add Bridge Gaps:" +msgstr "" + +#: flatcamTools/ToolCutOut.py:244 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material." +msgstr "" + +#: flatcamTools/ToolCutOut.py:251 +msgid "Generate Gap" +msgstr "" + +#: flatcamTools/ToolCutOut.py:253 +msgid "" +"Use the left mouse button (LMB) click\n" +"to create a bridge gap to separate the PCB from\n" +"the surrounding material.\n" +"The LMB click has to be done on the perimeter of\n" +"the Geometry object used as a cutout geometry." +msgstr "" + +#: flatcamTools/ToolCutOut.py:329 flatcamTools/ToolCutOut.py:468 +#: flatcamTools/ToolNonCopperClear.py:659 flatcamTools/ToolPaint.py:757 +#: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve object: %s" +msgstr "" + +#: flatcamTools/ToolCutOut.py:333 +msgid "" +"[ERROR_NOTCL]There is no object selected for Cutout.\n" +"Select one and try again." +msgstr "" + +#: flatcamTools/ToolCutOut.py:349 +msgid "" +"[WARNING_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" + +#: flatcamTools/ToolCutOut.py:359 flatcamTools/ToolCutOut.py:496 +#: flatcamTools/ToolCutOut.py:721 +msgid "" +"[WARNING_NOTCL] Margin value is missing or wrong format. Add it and retry." +msgstr "" + +#: flatcamTools/ToolCutOut.py:370 flatcamTools/ToolCutOut.py:507 +#: flatcamTools/ToolCutOut.py:616 +msgid "" +"[WARNING_NOTCL] Gap size value is missing or wrong format. Add it and retry." +msgstr "" + +#: flatcamTools/ToolCutOut.py:377 flatcamTools/ToolCutOut.py:514 +msgid "[WARNING_NOTCL] Number of gaps value is missing. Add it and retry." +msgstr "" + +#: flatcamTools/ToolCutOut.py:381 flatcamTools/ToolCutOut.py:518 +msgid "" +"[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 " +"or 8. Fill in a correct value and retry. " +msgstr "" + +#: flatcamTools/ToolCutOut.py:386 flatcamTools/ToolCutOut.py:523 +msgid "" +"[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n" +"Optionally, this Multi-geo Geometry can be converted to Single-geo " +"Geometry,\n" +"and after that perform Cutout." +msgstr "" + +#: flatcamTools/ToolCutOut.py:452 flatcamTools/ToolCutOut.py:586 +msgid "[success] Any form CutOut operation finished." +msgstr "" + +#: flatcamTools/ToolCutOut.py:472 flatcamTools/ToolPaint.py:761 +#: flatcamTools/ToolPanelize.py:299 +#, python-format +msgid "[ERROR_NOTCL]Object not found: %s" +msgstr "" + +#: flatcamTools/ToolCutOut.py:486 flatcamTools/ToolCutOut.py:606 +#: flatcamTools/ToolCutOut.py:711 +msgid "" +"[ERROR_NOTCL]Tool Diameter is zero value. Change it to a positive integer." +msgstr "" + +#: flatcamTools/ToolCutOut.py:591 +msgid "" +"Click on the selected geometry object perimeter to create a bridge gap ..." +msgstr "" + +#: flatcamTools/ToolCutOut.py:632 +msgid "Making manual bridge gap..." +msgstr "" + +#: flatcamTools/ToolCutOut.py:655 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Geoemtry object: %s" +msgstr "" + +#: flatcamTools/ToolCutOut.py:659 +#, python-format +msgid "[ERROR_NOTCL]Geometry object for manual cutout not found: %s" +msgstr "" + +#: flatcamTools/ToolCutOut.py:669 +msgid "[success] Added manual Bridge Gap." +msgstr "" + +#: flatcamTools/ToolCutOut.py:686 +#, python-format +msgid "[ERROR_NOTCL]Could not retrieve Gerber object: %s" +msgstr "" + +#: flatcamTools/ToolCutOut.py:690 +msgid "" +"[ERROR_NOTCL]There is no Gerber object selected for Cutout.\n" +"Select one and try again." +msgstr "" + +#: flatcamTools/ToolCutOut.py:695 +msgid "" +"[ERROR_NOTCL]The selected object has to be of Gerber type.\n" +"Select a Gerber file and try again." +msgstr "" + +#: flatcamTools/ToolDblSided.py:18 +msgid "2-Sided PCB" +msgstr "" + +#: flatcamTools/ToolDblSided.py:52 flatcamTools/ToolDblSided.py:76 +#: flatcamTools/ToolDblSided.py:100 +msgid "Mirror" +msgstr "" + +#: flatcamTools/ToolDblSided.py:54 flatcamTools/ToolDblSided.py:78 +#: flatcamTools/ToolDblSided.py:102 +msgid "" +"Mirrors (flips) the specified object around \n" +"the specified axis. Does not create a new \n" +"object, but modifies it." +msgstr "" + +#: flatcamTools/ToolDblSided.py:73 +msgid "Excellon Object to be mirrored." +msgstr "" + +#: flatcamTools/ToolDblSided.py:97 +msgid "Geometry Obj to be mirrored." +msgstr "" + +#: flatcamTools/ToolDblSided.py:135 +msgid "" +"The axis should pass through a point or cut\n" +" a specified box (in a FlatCAM object) through \n" +"the center." +msgstr "" + +#: flatcamTools/ToolDblSided.py:152 +msgid "Point/Box Reference:" +msgstr "" + +#: flatcamTools/ToolDblSided.py:154 +msgid "" +"If 'Point' is selected above it store the coordinates (x, y) through which\n" +"the mirroring axis passes.\n" +"If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or " +"Geo).\n" +"Through the center of this object pass the mirroring axis selected above." +msgstr "" + +#: flatcamTools/ToolDblSided.py:162 +msgid "" +"Add the coordinates in format (x, y) through which the mirroring " +"axis \n" +" selected in 'MIRROR AXIS' pass.\n" +"The (x, y) coordinates are captured by pressing SHIFT key\n" +"and left mouse button click on canvas or you can enter the coords manually." +msgstr "" + +#: flatcamTools/ToolDblSided.py:182 +msgid "Gerber Reference Box Object" +msgstr "" + +#: flatcamTools/ToolDblSided.py:183 +msgid "Excellon Reference Box Object" +msgstr "" + +#: flatcamTools/ToolDblSided.py:184 +msgid "Geometry Reference Box Object" +msgstr "" + +#: flatcamTools/ToolDblSided.py:193 +msgid "Alignment Drill Coordinates:" +msgstr "" + +#: flatcamTools/ToolDblSided.py:195 +msgid "" +"Alignment holes (x1, y1), (x2, y2), ... on one side of the mirror axis. For " +"each set of (x, y) coordinates\n" +"entered here, a pair of drills will be created:\n" +"\n" +"- one drill at the coordinates from the field\n" +"- one drill in mirror position over the axis selected above in the 'Mirror " +"Axis'." +msgstr "" + +#: flatcamTools/ToolDblSided.py:210 +msgid "" +"Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n" +"on one side of the mirror axis.\n" +"\n" +"The coordinates set can be obtained:\n" +"- press SHIFT key and left mouse clicking on canvas. Then click Add.\n" +"- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the " +"field.\n" +"- press SHIFT key and left mouse clicking on canvas. Then RMB click in the " +"field and click Paste.\n" +"- by entering the coords manually in the format: (x1, y1), (x2, y2), ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:224 +msgid "Alignment Drill Diameter" +msgstr "" + +#: flatcamTools/ToolDblSided.py:247 +msgid "Create Excellon Object" +msgstr "" + +#: flatcamTools/ToolDblSided.py:249 +msgid "" +"Creates an Excellon Object containing the\n" +"specified alignment holes and their mirror\n" +"images." +msgstr "" + +#: flatcamTools/ToolDblSided.py:255 +msgid "Reset" +msgstr "" + +#: flatcamTools/ToolDblSided.py:257 +msgid "Resets all the fields." +msgstr "" + +#: flatcamTools/ToolDblSided.py:302 +msgid "2-Sided Tool" +msgstr "" + +#: flatcamTools/ToolDblSided.py:327 +msgid "" +"[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates are " +"missing. Add them and retry." +msgstr "" + +#: flatcamTools/ToolDblSided.py:346 +msgid "" +"[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry." +msgstr "" + +#: flatcamTools/ToolDblSided.py:368 +msgid "" +"[WARNING_NOTCL]No value or wrong format in Drill Dia entry. Add it and retry." +msgstr "" + +#: flatcamTools/ToolDblSided.py:375 +msgid "" +"[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them " +"and retry." +msgstr "" + +#: flatcamTools/ToolDblSided.py:397 +msgid "[success] Excellon object with alignment drills created..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:406 +msgid "[WARNING_NOTCL] There is no Gerber object loaded ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:410 flatcamTools/ToolDblSided.py:453 +#: flatcamTools/ToolDblSided.py:497 +msgid "" +"[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored." +msgstr "" + +#: flatcamTools/ToolDblSided.py:420 +msgid "" +"[WARNING_NOTCL] 'Point' coordinates missing. Using Origin (0, 0) as " +"mirroring reference." +msgstr "" + +#: flatcamTools/ToolDblSided.py:430 flatcamTools/ToolDblSided.py:474 +#: flatcamTools/ToolDblSided.py:511 +msgid "[WARNING_NOTCL] There is no Box object loaded ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:440 +#, python-format +msgid "[success] Gerber %s was mirrored..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:449 +msgid "[WARNING_NOTCL] There is no Excellon object loaded ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:464 +msgid "" +"[WARNING_NOTCL] There are no Point coordinates in the Point field. Add " +"coords and try again ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:484 +#, python-format +msgid "[success] Excellon %s was mirrored..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:493 +msgid "[WARNING_NOTCL] There is no Geometry object loaded ..." +msgstr "" + +#: flatcamTools/ToolDblSided.py:521 +#, python-format +msgid "[success] Geometry %s was mirrored..." +msgstr "" + +#: flatcamTools/ToolFilm.py:25 +msgid "Film PCB" +msgstr "" + +#: flatcamTools/ToolFilm.py:56 flatcamTools/ToolImage.py:53 +#: flatcamTools/ToolPanelize.py:56 +msgid "Object Type:" +msgstr "" + +#: flatcamTools/ToolFilm.py:58 +msgid "" +"Specify the type of object for which to create the film.\n" +"The object can be of type: Gerber or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Film Object combobox." +msgstr "" + +#: flatcamTools/ToolFilm.py:71 +msgid "Film Object:" +msgstr "" + +#: flatcamTools/ToolFilm.py:73 +msgid "Object for which to create the film." +msgstr "" + +#: flatcamTools/ToolFilm.py:89 flatcamTools/ToolPanelize.py:89 +msgid "Box Type:" +msgstr "" + +#: flatcamTools/ToolFilm.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"film creation. It can be: Gerber or Geometry type.The selection here decide " +"the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" + +#: flatcamTools/ToolFilm.py:104 flatcamTools/ToolPanelize.py:104 +msgid "Box Object:" +msgstr "" + +#: flatcamTools/ToolFilm.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object for which we create the film.\n" +"Usually it is the PCB outline but it can be also the\n" +"same object for which the film is created." +msgstr "" + +#: flatcamTools/ToolFilm.py:157 +msgid "Save Film" +msgstr "" + +#: flatcamTools/ToolFilm.py:159 +msgid "" +"Create a Film for the selected object, within\n" +"the specified box. Does not create a new \n" +" FlatCAM object, but directly save it in SVG format\n" +"which can be opened with Inkscape." +msgstr "" + +#: flatcamTools/ToolFilm.py:225 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry." +msgstr "" + +#: flatcamTools/ToolFilm.py:231 +msgid "" +"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry." +msgstr "" + +#: flatcamTools/ToolFilm.py:255 +msgid "Generating Film ..." +msgstr "" + +#: flatcamTools/ToolFilm.py:260 flatcamTools/ToolFilm.py:264 +msgid "Export SVG positive" +msgstr "" + +#: flatcamTools/ToolFilm.py:269 +msgid "[WARNING_NOTCL]Export SVG positive cancelled." +msgstr "" + +#: flatcamTools/ToolFilm.py:276 flatcamTools/ToolFilm.py:280 +msgid "Export SVG negative" +msgstr "" + +#: flatcamTools/ToolFilm.py:285 +msgid "[WARNING_NOTCL]Export SVG negative cancelled." +msgstr "" + +#: flatcamTools/ToolImage.py:25 +msgid "Image as Object" +msgstr "" + +#: flatcamTools/ToolImage.py:31 +msgid "Image to PCB" +msgstr "" + +#: flatcamTools/ToolImage.py:55 +msgid "" +"Specify the type of object to create from the image.\n" +"It can be of type: Gerber or Geometry." +msgstr "" + +#: flatcamTools/ToolImage.py:63 +msgid "DPI value:" +msgstr "" + +#: flatcamTools/ToolImage.py:65 +msgid "Specify a DPI value for the image." +msgstr "" + +#: flatcamTools/ToolImage.py:72 +msgid "Level of detail" +msgstr "" + +#: flatcamTools/ToolImage.py:81 +msgid "Image type" +msgstr "" + +#: flatcamTools/ToolImage.py:83 +msgid "" +"Choose a method for the image interpretation.\n" +"B/W means a black & white image. Color means a colored image." +msgstr "" + +#: flatcamTools/ToolImage.py:90 flatcamTools/ToolImage.py:103 +#: flatcamTools/ToolImage.py:114 flatcamTools/ToolImage.py:125 +msgid "Mask value" +msgstr "" + +#: flatcamTools/ToolImage.py:92 +msgid "" +"Mask for monochrome image.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry.\n" +"0 means no detail and 255 means everything \n" +"(which is totally black)." +msgstr "" + +#: flatcamTools/ToolImage.py:105 +msgid "" +"Mask for RED color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" + +#: flatcamTools/ToolImage.py:116 +msgid "" +"Mask for GREEN color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" + +#: flatcamTools/ToolImage.py:127 +msgid "" +"Mask for BLUE color.\n" +"Takes values between [0 ... 255].\n" +"Decides the level of details to include\n" +"in the resulting geometry." +msgstr "" + +#: flatcamTools/ToolImage.py:139 +msgid "Import image" +msgstr "" + +#: flatcamTools/ToolImage.py:141 +msgid "Open a image of raster type and then import it in FlatCAM." +msgstr "" + +#: flatcamTools/ToolImage.py:170 +msgid "Image Tool" +msgstr "" + +#: flatcamTools/ToolImage.py:200 flatcamTools/ToolImage.py:203 +msgid "Import IMAGE" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:26 +msgid "Measurement" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:47 +msgid "Start" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:47 flatcamTools/ToolMeasurement.py:50 +msgid "Coords" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:48 flatcamTools/ToolMeasurement.py:99 +msgid "This is measuring Start point coordinates." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:50 +msgid "Stop" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:51 flatcamTools/ToolMeasurement.py:104 +msgid "This is the measuring Stop point coordinates." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:54 flatcamTools/ToolMeasurement.py:109 +msgid "This is the distance measured over the X axis." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:57 flatcamTools/ToolMeasurement.py:115 +msgid "This is the distance measured over the Y axis." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:59 +msgid "DISTANCE" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:60 flatcamTools/ToolMeasurement.py:121 +msgid "This is the point to point Euclidian distance." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:63 flatcamTools/ToolMeasurement.py:70 +#: flatcamTools/ToolMeasurement.py:77 flatcamTools/ToolMeasurement.py:84 +#: flatcamTools/ToolMeasurement.py:91 +msgid "Those are the units in which the distance is measured." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:124 +msgid "Measure" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:183 +msgid "Meas. Tool" +msgstr "" + +#: flatcamTools/ToolMeasurement.py:276 +msgid "MEASURING: Click on the Start point ..." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:305 +msgid "MEASURING: Click on the Destination point ..." +msgstr "" + +#: flatcamTools/ToolMeasurement.py:326 +#, python-brace-format +msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" +msgstr "" + +#: flatcamTools/ToolMove.py:81 +msgid "MOVE: Click on the Start point ..." +msgstr "" + +#: flatcamTools/ToolMove.py:88 +msgid "[WARNING_NOTCL] MOVE action cancelled. No object(s) to move." +msgstr "" + +#: flatcamTools/ToolMove.py:110 +msgid "MOVE: Click on the Destination point ..." +msgstr "" + +#: flatcamTools/ToolMove.py:128 +msgid "Moving ..." +msgstr "" + +#: flatcamTools/ToolMove.py:135 +msgid "[WARNING_NOTCL] No object(s) selected." +msgstr "" + +#: flatcamTools/ToolMove.py:158 +#, python-format +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> %s" +msgstr "" + +#: flatcamTools/ToolMove.py:164 +#, python-format +msgid "[success]%s object was moved ..." +msgstr "" + +#: flatcamTools/ToolMove.py:174 +msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> Error when mouse left click." +msgstr "" + +#: flatcamTools/ToolMove.py:202 +msgid "[WARNING_NOTCL]Move action cancelled." +msgstr "" + +#: flatcamTools/ToolMove.py:214 +msgid "[WARNING_NOTCL]Object(s) not selected" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:25 +msgid "Non-Copper Clearing" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:63 +msgid "Gerber object to be cleared of excess copper. " +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:73 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for copper clearing." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:88 +msgid "" +"This is the Tool Number.\n" +"Non copper clearing will start with the tool with the biggest \n" +"diameter, continuing until there are no more tools.\n" +"Only tools that create NCC clearing geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:100 flatcamTools/ToolPaint.py:98 +msgid "" +"The Tool Type (TT) can be:
- Circular with 1 ... 4 teeth -> it is " +"informative only. Being circular,
the cut width in material is exactly " +"the tool diameter.
- Ball -> informative only and make reference " +"to the Ball type endmill.
- V-Shape -> it will disable de Z-Cut " +"parameter in the resulting geometry UI form and enable two additional UI " +"form fields in the resulting geometry: V-Tip Dia and V-Tip Angle. Adjusting " +"those two values will adjust the Z-Cut parameter such as the cut width into " +"material will be equal with the value in the Tool Diameter column of this " +"table.
Choosing the V-Shape Tool Type automatically will select " +"the Operation Type in the resulting geometry as Isolation." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:119 flatcamTools/ToolPaint.py:117 +msgid "Tool Dia" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:121 +msgid "Diameter for the new tool to add in the Tool Table" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:147 flatcamTools/ToolPaint.py:145 +#: flatcamTools/ToolSolderPaste.py:123 +msgid "" +"Delete a selection of tools in the Tool Table\n" +"by first selecting a row(s) in the Tool Table." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:225 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"If not checked, use the standard algorithm." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:237 +msgid "Generate Geometry" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:483 flatcamTools/ToolPaint.py:543 +#: flatcamTools/ToolSolderPaste.py:760 +msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:511 flatcamTools/ToolPaint.py:567 +msgid "[WARNING_NOTCL]Adding tool cancelled. Tool already in Tool Table." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:516 flatcamTools/ToolPaint.py:572 +msgid "[success] New tool added to Tool Table." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:549 +msgid "[ERROR_NOTCL] Wrong value format entered, use a number." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:558 flatcamTools/ToolPaint.py:615 +msgid "[success] Tool from Tool Table was edited." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:569 flatcamTools/ToolPaint.py:626 +#: flatcamTools/ToolSolderPaste.py:846 +msgid "" +"[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " +"Table." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:608 flatcamTools/ToolPaint.py:723 +msgid "[WARNING_NOTCL]Delete failed. Select a tool to delete." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:613 flatcamTools/ToolPaint.py:728 +msgid "[success] Tool(s) deleted from Tool Table." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:666 +msgid "[ERROR_NOTCL]No Gerber file available." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:704 +#: flatcamTools/ToolNonCopperClear.py:826 +msgid "Clearing Non-Copper areas." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:722 +#, python-format +msgid "[success] Non-Copper Clearing with ToolDia = %s started." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:791 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:796 +msgid "[success] NCC Tool finished." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:798 +msgid "" +"[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " +"cleared. Check the result." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:844 +#, python-format +msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:942 +#, python-format +msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" +msgstr "" + +#: flatcamTools/ToolNonCopperClear.py:950 +msgid "" +"[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " +"settings." +msgstr "" + +#: flatcamTools/ToolPaint.py:24 +msgid "Paint Area" +msgstr "" + +#: flatcamTools/ToolPaint.py:60 +msgid "Geometry:" +msgstr "" + +#: flatcamTools/ToolPaint.py:62 +msgid "Geometry object to be painted. " +msgstr "" + +#: flatcamTools/ToolPaint.py:71 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for painting." +msgstr "" + +#: flatcamTools/ToolPaint.py:86 +msgid "" +"This is the Tool Number.\n" +"Painting will start with the tool with the biggest diameter,\n" +"continuing until there are no more tools.\n" +"Only tools that create painting geometry will still be present\n" +"in the resulting geometry. This is because with some tools\n" +"this function will not be able to create painting geometry." +msgstr "" + +#: flatcamTools/ToolPaint.py:119 +msgid "Diameter for the new tool." +msgstr "" + +#: flatcamTools/ToolPaint.py:224 +msgid "" +"If checked, use 'rest machining'.\n" +"Basically it will clear copper outside PCB features,\n" +"using the biggest tool and continue with the next tools,\n" +"from bigger to smaller, to clear areas of copper that\n" +"could not be cleared by previous tool, until there is\n" +"no more copper to clear or there are no more tools.\n" +"\n" +"If not checked, use the standard algorithm." +msgstr "" + +#: flatcamTools/ToolPaint.py:239 +msgid "" +"How to select the polygons to paint.
Options:
- Single: left " +"mouse click on the polygon to be painted.
- All: paint all " +"polygons." +msgstr "" + +#: flatcamTools/ToolPaint.py:254 +msgid "Create Paint Geometry" +msgstr "" + +#: flatcamTools/ToolPaint.py:256 +msgid "" +"After clicking here, click inside
the polygon you wish to be painted if " +"Single is selected.
If All is selected then the Paint will " +"start after click.
A new Geometry object with the tool
paths will be " +"created." +msgstr "" + +#: flatcamTools/ToolPaint.py:732 +msgid "geometry_on_paint_button" +msgstr "" + +#: flatcamTools/ToolPaint.py:735 flatcamTools/ToolPaint.py:780 +msgid "[WARNING_NOTCL]Click inside the desired polygon." +msgstr "" + +#: flatcamTools/ToolPaint.py:767 +msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." +msgstr "" + +#: flatcamTools/ToolPaint.py:789 flatcamTools/ToolPaint.py:992 +msgid "Painting polygon..." +msgstr "" + +#: flatcamTools/ToolPaint.py:840 +msgid "[WARNING] No polygon found." +msgstr "" + +#: flatcamTools/ToolPaint.py:843 +msgid "Painting polygon." +msgstr "" + +#: flatcamTools/ToolPaint.py:885 +msgid "[ERROR_NOTCL] Geometry could not be painted completely" +msgstr "" + +#: flatcamTools/ToolPaint.py:911 +#, python-format +msgid "" +"[ERROR] Could not do Paint. Try a different combination of parameters. Or a " +"different strategy of paint\n" +"%s" +msgstr "" + +#: flatcamTools/ToolPaint.py:953 +#, python-format +msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" +msgstr "" + +#: flatcamTools/ToolPaint.py:959 flatcamTools/ToolPaint.py:1251 +msgid "Polygon Paint started ..." +msgstr "" + +#: flatcamTools/ToolPaint.py:1107 flatcamTools/ToolPaint.py:1196 +#, python-format +msgid "" +"[ERROR] Could not do Paint All. Try a different combination of parameters. " +"Or a different Method of paint\n" +"%s" +msgstr "" + +#: flatcamTools/ToolPaint.py:1131 +msgid "" +"[ERROR] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" + +#: flatcamTools/ToolPaint.py:1140 +msgid "[success] Paint All Done." +msgstr "" + +#: flatcamTools/ToolPaint.py:1226 +msgid "" +"[ERROR_NOTCL] There is no Painting Geometry in the file.\n" +"Usually it means that the tool diameter is too big for the painted " +"geometry.\n" +"Change the painting parameters and try again." +msgstr "" + +#: flatcamTools/ToolPaint.py:1235 +msgid "[success] Paint All with Rest-Machining done." +msgstr "" + +#: flatcamTools/ToolPanelize.py:25 +msgid "Panelize PCB" +msgstr "" + +#: flatcamTools/ToolPanelize.py:58 +msgid "" +"Specify the type of object to be panelized\n" +"It can be of type: Gerber, Excellon or Geometry.\n" +"The selection here decide the type of objects that will be\n" +"in the Object combobox." +msgstr "" + +#: flatcamTools/ToolPanelize.py:73 +msgid "" +"Object to be panelized. This means that it will\n" +"be duplicated in an array of rows and columns." +msgstr "" + +#: flatcamTools/ToolPanelize.py:91 +msgid "" +"Specify the type of object to be used as an container for\n" +"panelization. It can be: Gerber or Geometry type.\n" +"The selection here decide the type of objects that will be\n" +"in the Box Object combobox." +msgstr "" + +#: flatcamTools/ToolPanelize.py:106 +msgid "" +"The actual object that is used a container for the\n" +" selected object that is to be panelized." +msgstr "" + +#: flatcamTools/ToolPanelize.py:150 +msgid "" +"Choose the type of object for the panel object:\n" +"- Geometry\n" +"- Gerber" +msgstr "" + +#: flatcamTools/ToolPanelize.py:158 +msgid "Constrain panel within:" +msgstr "" + +#: flatcamTools/ToolPanelize.py:192 +msgid "Panelize Object" +msgstr "" + +#: flatcamTools/ToolPanelize.py:194 +msgid "" +"Panelize the specified object around the specified box.\n" +"In other words it creates multiple copies of the source object,\n" +"arranged in a 2D array of rows and columns." +msgstr "" + +#: flatcamTools/ToolPanelize.py:311 +#, python-format +msgid "[WARNING]No object Box. Using instead %s" +msgstr "" + +#: flatcamTools/ToolPanelize.py:392 +msgid "" +"[ERROR_NOTCL]Columns or Rows are zero value. Change them to a positive " +"integer." +msgstr "" + +#: flatcamTools/ToolPanelize.py:417 flatcamTools/ToolPanelize.py:526 +msgid "Generating panel ... Please wait." +msgstr "" + +#: flatcamTools/ToolPanelize.py:520 +msgid "[success]Panel done..." +msgstr "" + +#: flatcamTools/ToolPanelize.py:523 +#, python-brace-format +msgid "" +"[WARNING] Too big for the constrain area. Final panel has {col} columns and " +"{row} rows" +msgstr "" + +#: flatcamTools/ToolPanelize.py:531 +msgid "[success]Panel created successfully." +msgstr "" + +#: flatcamTools/ToolProperties.py:103 +msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." +msgstr "" + +#: flatcamTools/ToolProperties.py:110 +msgid "[success] Object Properties are displayed." +msgstr "" + +#: flatcamTools/ToolProperties.py:111 +msgid "Properties Tool" +msgstr "" + +#: flatcamTools/ToolShell.py:69 +msgid "...proccessing..." +msgstr "" + +#: flatcamTools/ToolShell.py:71 +#, python-format +msgid "...proccessing... [%s]" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:37 +msgid "Solder Paste Tool" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:65 +msgid "Gerber Solder paste object. " +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:72 +msgid "" +"Tools pool from which the algorithm\n" +"will pick the ones used for dispensing solder paste." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:87 +msgid "" +"This is the Tool Number.\n" +"The solder dispensing will start with the tool with the biggest \n" +"diameter, continuing until there are no more Nozzle tools.\n" +"If there are no longer tools but there are still pads not covered\n" +" with solder paste, the app will issue a warning message box." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:94 +msgid "" +"Nozzle tool Diameter. It's value (in current FlatCAM units)\n" +"is the width of the solder paste dispensed." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:101 +msgid "New Nozzle Tool" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:117 +msgid "" +"Add a new nozzle tool to the Tool Table\n" +"with the diameter specified above." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:129 +msgid "Generate solder paste dispensing geometry." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:142 +msgid "STEP 1" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:144 +msgid "" +"First step is to select a number of nozzle tools for usage\n" +"and then optionally modify the GCode parameters bellow." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:147 +msgid "" +"Select tools.\n" +"Modify parameters." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:290 +msgid "Generate GCode" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:292 +msgid "" +"Generate GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:308 +msgid "STEP 2:" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:310 +msgid "" +"Second step is to create a solder paste dispensing\n" +"geometry out of an Solder Paste Mask Gerber file." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:326 +msgid "Geo Result:" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:328 +msgid "" +"Geometry Solder Paste object.\n" +"The name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:337 +msgid "STEP 3:" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:339 +msgid "" +"Third step is to select a solder paste dispensing geometry,\n" +"and then generate a CNCJob object.\n" +"\n" +"REMEMBER: if you want to create a CNCJob with new parameters,\n" +"first you need to generate a geometry with those new params,\n" +"and only after that you can generate an updated CNCJob." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:359 +msgid "CNC Result:" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:361 +msgid "" +"CNCJob Solder paste object.\n" +"In order to enable the GCode save section,\n" +"the name of the object has to end in:\n" +"'_solderpaste' as a protection." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:371 +msgid "View GCode" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:373 +msgid "" +"View the generated GCode for Solder Paste dispensing\n" +"on PCB pads." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:377 +msgid "Save GCode" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:379 +msgid "" +"Save the generated GCode for Solder Paste dispensing\n" +"on PCB pads, to a file." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:383 +msgid "STEP 4:" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:385 +msgid "" +"Fourth step (and last) is to select a CNCJob made from \n" +"a solder paste dispensing geometry, and then view/save it's GCode." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:413 +msgid "Delete Object" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:788 +msgid "" +"[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:793 +msgid "[success] New Nozzle tool added to Tool Table." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:835 +msgid "[success] Nozzle tool from Tool Table was edited." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:891 +msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:896 +msgid "[success] Nozzle tool(s) deleted from Tool Table." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:951 +msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:968 +msgid "Creating Solder Paste dispensing geometry." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:980 +msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1106 flatcamTools/ToolSolderPaste.py:1161 +msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1109 +msgid "[success] Solder Paste geometry generated successfully..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1115 +msgid "" +"[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " +"diameters..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1129 +msgid "Generating Solder Paste dispensing geometry..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1149 +msgid "[WARNING_NOTCL] There is no Geometry object available." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1153 +msgid "" +"[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " +"geometry." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1258 +#, python-format +msgid "[success] ToolSolderPaste CNCjob created: %s" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 +#: flatcamTools/ToolSolderPaste.py:1345 +msgid "" +"[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " +"solder_paste_tool CNCJob object." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1317 +msgid "[ERROR_NOTCL] No Gcode in the object..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1326 +#, python-format +msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1355 +msgid "Export GCode ..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1363 +msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." +msgstr "" + +#: flatcamTools/ToolSolderPaste.py:1393 +#, python-format +msgid "[success] Solder paste dispenser GCode file saved to: %s" +msgstr "" + +#: flatcamTools/ToolTransform.py:23 +msgid "Object Transform" +msgstr "" + +#: flatcamTools/ToolTransform.py:84 +msgid "" +"Rotate the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" + +#: flatcamTools/ToolTransform.py:120 flatcamTools/ToolTransform.py:138 +msgid "" +"Skew/shear the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects." +msgstr "" + +#: flatcamTools/ToolTransform.py:176 flatcamTools/ToolTransform.py:193 +msgid "" +"Scale the selected object(s).\n" +"The point of reference depends on \n" +"the Scale reference checkbox state." +msgstr "" + +#: flatcamTools/ToolTransform.py:202 +msgid "" +"Scale the selected object(s)\n" +"using the Scale Factor X for both axis." +msgstr "" + +#: flatcamTools/ToolTransform.py:250 flatcamTools/ToolTransform.py:267 +msgid "" +"Offset the selected object(s).\n" +"The point of reference is the middle of\n" +"the bounding box for all selected objects.\n" +msgstr "" + +#: flatcamTools/ToolTransform.py:297 flatcamTools/ToolTransform.py:305 +msgid "" +"Flip the selected object(s) over the X axis.\n" +"Does not create a new object.\n" +" " +msgstr "" + +#: flatcamTools/ToolTransform.py:637 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to rotate!" +msgstr "" + +#: flatcamTools/ToolTransform.py:665 +msgid "CNCJob objects can't be rotated." +msgstr "" + +#: flatcamTools/ToolTransform.py:674 +msgid "[success]Rotate done ..." +msgstr "" + +#: flatcamTools/ToolTransform.py:689 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to flip!" +msgstr "" + +#: flatcamTools/ToolTransform.py:724 +msgid "CNCJob objects can't be mirrored/flipped." +msgstr "" + +#: flatcamTools/ToolTransform.py:735 +msgid "[success]Flip on the Y axis done ..." +msgstr "" + +#: flatcamTools/ToolTransform.py:745 +msgid "[success]Flip on the X axis done ..." +msgstr "" + +#: flatcamTools/ToolTransform.py:759 +msgid "" +"[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!" +msgstr "" + +#: flatcamTools/ToolTransform.py:781 +msgid "CNCJob objects can't be skewed." +msgstr "" + +#: flatcamTools/ToolTransform.py:793 +#, python-format +msgid "[success]Skew on the %s axis done ..." +msgstr "" + +#: flatcamTools/ToolTransform.py:808 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to scale!" +msgstr "" + +#: flatcamTools/ToolTransform.py:841 +msgid "CNCJob objects can't be scaled." +msgstr "" + +#: flatcamTools/ToolTransform.py:861 +msgid "[WARNING_NOTCL] No object selected. Please Select an object to offset!" +msgstr "" + +#: flatcamTools/ToolTransform.py:882 +msgid "CNCJob objects can't be offseted." +msgstr "" + +#: flatcamTools/ToolTransform.py:894 +#, python-format +msgid "[success]Offset on the %s axis done ..." +msgstr "" + +#~ msgid "" +#~ "How much (fraction) of the tool width to overlap each tool pass.\n" +#~ "Example:\n" +#~ "A value here of 0.25 means 25\\% from the tool diameter found above.\n" +#~ "\n" +#~ "Adjust the value starting with lower values\n" +#~ "and increasing it if areas that should be painted are still \n" +#~ "not painted.\n" +#~ "Lower values = faster processing, faster execution on PCB.\n" +#~ "Higher values = slow processing and slow execution on CNC\n" +#~ "due of too many paths." +#~ msgstr "" +#~ "Cat de mult (fractie) din diametrul uneltei sa se suprapuna la fiecare " +#~ "trecere a uneltei.\n" +#~ "Exemplu:\n" +#~ "O valoare aici de 0.25 inseamna 25\\% din diametrul uneltei de mai sus.\n" +#~ "\n" +#~ "Ajusteaza valoarea incepand de la valori mici si pe urma creste daca " +#~ "ariile care ar trebui\n" +#~ " >pictate< inca nu sunt procesate.\n" +#~ "Valori scazute = procesare rapida,executie rapida a PCB-ului.\n" +#~ "Valori mari= procesare lenta cat si o executie la fel de lenta a PCB-" +#~ "ului,\n" +#~ "datorita numarului mai mare de treceri-taiere." + +#, fuzzy +#~| msgid "z_toolchange = Z coord for Toolchange" +#~ msgid "z_cut = Z coord for Toolchange" +#~ msgstr "z_toolchange = Z coord for Toolchange" + +#, fuzzy +#~| msgid "z_toolchange = Z coord for Toolchange" +#~ msgid "z_move = Z coord for Toolchange" +#~ msgstr "z_toolchange = Z coord for Toolchange" + +#~ msgid "%s/Project_%s" +#~ msgstr "%s/Proiect_%s" + +#~ msgid "tool_tab" +#~ msgstr "tool_tab" diff --git a/make_win.py b/make_win.py index 812130b2..619e7a7b 100644 --- a/make_win.py +++ b/make_win.py @@ -2,10 +2,10 @@ # FlatCAM: 2D Post-processing for Manufacturing # # http://flatcam.org # # Author: Juan Pablo Caram (c) # -# Date: 12/20/2018 # +# Date: 12/20/2018 # # MIT Licence # # # -# Creates a portable copy of FlatCAM, including Python # +# Creates a portable copy of FlatCAM, including Python # # itself and all dependencies. # # # # This is not an aid to install FlatCAM from source on # @@ -13,6 +13,12 @@ # and running and ready to be packaged. # ############################################################ +############################################################ +# File Modified (major mod): Marius Adrian Stanciu # +# Date: 3/10/2019 # +############################################################ + + # Files not needed: Qt, tk.dll, tcl.dll, tk/, tcl/, vtk/, # scipy.lib.lapack.flapack.pyd, scipy.lib.blas.fblas.pyd, # numpy.core._dotblas.pyd, scipy.sparse.sparsetools._bsr.pyd, diff --git a/postprocessors/Paste_1.py b/postprocessors/Paste_1.py index 004ce35c..79587265 100644 --- a/postprocessors/Paste_1.py +++ b/postprocessors/Paste_1.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/Repetier.py b/postprocessors/Repetier.py index cd4c0323..74add556 100644 --- a/postprocessors/Repetier.py +++ b/postprocessors/Repetier.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/Roland_MDX_20.py b/postprocessors/Roland_MDX_20.py index 72ec055d..3a451042 100644 --- a/postprocessors/Roland_MDX_20.py +++ b/postprocessors/Roland_MDX_20.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/Toolchange_Custom.py b/postprocessors/Toolchange_Custom.py index 160d95aa..d9ba51bf 100644 --- a/postprocessors/Toolchange_Custom.py +++ b/postprocessors/Toolchange_Custom.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/Toolchange_Probe_MACH3.py b/postprocessors/Toolchange_Probe_MACH3.py index 8b9ba456..7d902fd2 100644 --- a/postprocessors/Toolchange_Probe_MACH3.py +++ b/postprocessors/Toolchange_Probe_MACH3.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/Toolchange_manual.py b/postprocessors/Toolchange_manual.py index c6da953f..4d9341fd 100644 --- a/postprocessors/Toolchange_manual.py +++ b/postprocessors/Toolchange_manual.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/default.py b/postprocessors/default.py index d8185647..643348cf 100644 --- a/postprocessors/default.py +++ b/postprocessors/default.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Matthieu Berthomé # +# Date: 5/26/2017 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/grbl_11.py b/postprocessors/grbl_11.py index d4264a7f..988a90d5 100644 --- a/postprocessors/grbl_11.py +++ b/postprocessors/grbl_11.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Matthieu Berthomé # +# Date: 5/26/2017 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/grbl_laser.py b/postprocessors/grbl_laser.py index 84e62126..4895549f 100644 --- a/postprocessors/grbl_laser.py +++ b/postprocessors/grbl_laser.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Matthieu Berthomé # +# Date: 5/26/2017 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * # This post processor is configured to output code that @@ -42,7 +50,7 @@ class grbl_laser(FlatCAMPostProc): return '' def lift_code(self, p): - return 'M05' + return 'M05 S0' def down_code(self, p): if p.spindlespeed: diff --git a/postprocessors/hpgl.py b/postprocessors/hpgl.py index 50ac07e4..9b4ca374 100644 --- a/postprocessors/hpgl.py +++ b/postprocessors/hpgl.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/line_xyz.py b/postprocessors/line_xyz.py index fc69bfd4..adbd849f 100644 --- a/postprocessors/line_xyz.py +++ b/postprocessors/line_xyz.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/postprocessors/marlin.py b/postprocessors/marlin.py index eef7e1cb..72fe44c9 100644 --- a/postprocessors/marlin.py +++ b/postprocessors/marlin.py @@ -1,3 +1,11 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + from FlatCAMPostProc import * diff --git a/share/cut16_bis.png b/share/cut16_bis.png new file mode 100644 index 00000000..832a03da Binary files /dev/null and b/share/cut16_bis.png differ diff --git a/share/cut32_bis.png b/share/cut32_bis.png new file mode 100644 index 00000000..880acbaa Binary files /dev/null and b/share/cut32_bis.png differ diff --git a/share/language32.png b/share/language32.png new file mode 100644 index 00000000..05fecccb Binary files /dev/null and b/share/language32.png differ diff --git a/share/ncc16.png b/share/ncc16.png new file mode 100644 index 00000000..f2cf1ebf Binary files /dev/null and b/share/ncc16.png differ diff --git a/tclCommands/TclCommandDrillcncjob.py b/tclCommands/TclCommandDrillcncjob.py index 007fc6bc..fbb665b9 100644 --- a/tclCommands/TclCommandDrillcncjob.py +++ b/tclCommands/TclCommandDrillcncjob.py @@ -81,6 +81,11 @@ class TclCommandDrillcncjob(TclCommandSignaled): if not isinstance(obj, FlatCAMExcellon): self.raise_tcl_error('Expected FlatCAMExcellon, got %s %s.' % (name, type(obj))) + xmin = obj.options['xmin'] + ymin = obj.options['ymin'] + xmax = obj.options['xmax'] + ymax = obj.options['ymax'] + def job_init(job_obj, app_obj): drillz = args["drillz"] if "drillz" in args else obj.options["drillz"] @@ -93,10 +98,22 @@ class TclCommandDrillcncjob(TclCommandSignaled): job_obj.pp_excellon_name = args["ppname_e"] if "ppname_e" in args \ else obj.options["ppname_e"] + job_obj.coords_decimals = int(self.app.defaults["cncjob_coords_decimals"]) + job_obj.fr_decimals = int(self.app.defaults["cncjob_fr_decimals"]) + + job_obj.options['type'] = 'Excellon' + toolchange = True if "toolchange" in args and args["toolchange"] == 1 else False toolchangez = args["toolchangez"] if "toolchangez" in args else obj.options["toolchangez"] job_obj.toolchangexy = args["toolchangexy"] if "toolchangexy" in args else obj.options["toolchangexy"] + job_obj.toolchange_xy_type = "excellon" + + job_obj.options['xmin'] = xmin + job_obj.options['ymin'] = ymin + job_obj.options['xmax'] = xmax + job_obj.options['ymax'] = ymax + endz = args["endz"] if "endz" in args else obj.options["endz"] tools = args["tools"] if "tools" in args else 'all'