diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 012783fdce..e010d10b16 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -28,7 +28,7 @@ from FreeCAD import Vector if FreeCAD.GuiUp: import FreeCADGui from PySide import QtGui,QtCore - from DraftTools import translate + from DraftTools import translate, utf8_decode else: # \cond def translate(ctxt,txt): @@ -809,19 +809,19 @@ def survey(callback=False): t = u.getUserPreferred()[0] t = t.encode("utf8").replace("^3","³") anno.LabelText = "v " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Volume: " + t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Volume: " + utf8_decode(t) + "\n") elif o.Object.Shape.Faces: u = FreeCAD.Units.Quantity(o.Object.Shape.Area,FreeCAD.Units.Area) t = u.getUserPreferred()[0] t = t.encode("utf8").replace("^2","²") anno.LabelText = "a " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Area: " + t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Area: " + utf8_decode(t) + "\n") else: u = FreeCAD.Units.Quantity(o.Object.Shape.Length,FreeCAD.Units.Length) t = u.getUserPreferred()[0] t = t.encode("utf8") anno.LabelText = "l " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Length: " + t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Length: " + utf8_decode(t) + "\n") if FreeCAD.GuiUp and t: if showUnit: QtGui.qApp.clipboard().setText(t) @@ -845,19 +845,19 @@ def survey(callback=False): t = u.getUserPreferred()[0] t = t.encode("utf8").replace("^2","²") anno.LabelText = "a " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Area: "+ t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Area: "+ utf8_decode(t) + "\n") elif "Edge" in el: u= FreeCAD.Units.Quantity(e.Length,FreeCAD.Units.Length) t = u.getUserPreferred()[0] t = t.encode("utf8") anno.LabelText = "l " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Length: " + t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Length: " + utf8_decode(t) + "\n") elif "Vertex" in el: u = FreeCAD.Units.Quantity(e.Z,FreeCAD.Units.Length) t = u.getUserPreferred()[0] t = t.encode("utf8") anno.LabelText = "z " + t - FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Zcoord: " + t.decode("utf8") + "\n") + FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Zcoord: " + utf8_decode(t) + "\n") if FreeCAD.GuiUp and t: if showUnit: QtGui.qApp.clipboard().setText(t) @@ -1229,7 +1229,7 @@ class _CommandCheck: else: FreeCADGui.Selection.clearSelection() for i in result: - FreeCAD.Console.PrintWarning("Object "+i[0].Name+" ("+i[0].Label+") "+i[1].decode("utf8")) + FreeCAD.Console.PrintWarning("Object "+i[0].Name+" ("+i[0].Label+") "+ utf8_decode(i[1])) FreeCADGui.Selection.addSelection(i[0]) diff --git a/src/Mod/Arch/ArchPanel.py b/src/Mod/Arch/ArchPanel.py index e799f67136..554f5dcb7a 100644 --- a/src/Mod/Arch/ArchPanel.py +++ b/src/Mod/Arch/ArchPanel.py @@ -197,11 +197,11 @@ class CommandPanel: "sets up a taskbox widget" w = QtGui.QWidget() ui = FreeCADGui.UiLoader() - w.setWindowTitle(translate("Arch","Panel options").decode("utf8")) + w.setWindowTitle(translate("Arch","Panel options", utf8_decode=True)) grid = QtGui.QGridLayout(w) # presets box - labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8")) + labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True)) valuep = QtGui.QComboBox() fpresets = [" "] for p in Presets[1:]: @@ -211,32 +211,32 @@ class CommandPanel: grid.addWidget(valuep,0,1,1,1) # length - label1 = QtGui.QLabel(translate("Arch","Length").decode("utf8")) + label1 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True)) self.vLength = ui.createWidget("Gui::InputField") self.vLength.setText(FreeCAD.Units.Quantity(self.Length,FreeCAD.Units.Length).UserString) grid.addWidget(label1,1,0,1,1) grid.addWidget(self.vLength,1,1,1,1) # width - label2 = QtGui.QLabel(translate("Arch","Width").decode("utf8")) + label2 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True)) self.vWidth = ui.createWidget("Gui::InputField") self.vWidth.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString) grid.addWidget(label2,2,0,1,1) grid.addWidget(self.vWidth,2,1,1,1) # height - label3 = QtGui.QLabel(translate("Arch","Thickness").decode("utf8")) + label3 = QtGui.QLabel(translate("Arch","Thickness", utf8_decode=True)) self.vHeight = ui.createWidget("Gui::InputField") self.vHeight.setText(FreeCAD.Units.Quantity(self.Thickness,FreeCAD.Units.Length).UserString) grid.addWidget(label3,3,0,1,1) grid.addWidget(self.vHeight,3,1,1,1) # horizontal button - value5 = QtGui.QPushButton(translate("Arch","Rotate").decode("utf8")) + value5 = QtGui.QPushButton(translate("Arch","Rotate", utf8_decode=True)) grid.addWidget(value5,4,0,1,2) # continue button - label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8")) + label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True)) value4 = QtGui.QCheckBox() value4.setObjectName("ContinueCmd") value4.setLayoutDirection(QtCore.Qt.RightToLeft) diff --git a/src/Mod/Arch/ArchStructure.py b/src/Mod/Arch/ArchStructure.py index 77553282bd..cf1a8e2f76 100644 --- a/src/Mod/Arch/ArchStructure.py +++ b/src/Mod/Arch/ArchStructure.py @@ -247,18 +247,18 @@ class _CommandStructure: "sets up a taskbox widget" w = QtGui.QWidget() ui = FreeCADGui.UiLoader() - w.setWindowTitle(translate("Arch","Structure options").decode("utf8")) + w.setWindowTitle(translate("Arch","Structure options", utf8_decode=True)) grid = QtGui.QGridLayout(w) # categories box - labelc = QtGui.QLabel(translate("Arch","Category").decode("utf8")) + labelc = QtGui.QLabel(translate("Arch","Category", utf8_decode=True)) valuec = QtGui.QComboBox() valuec.addItems([" ","Precast concrete"]+Categories) grid.addWidget(labelc,0,0,1,1) grid.addWidget(valuec,0,1,1,1) # presets box - labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8")) + labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True)) self.vPresets = QtGui.QComboBox() self.pSelect = [None] fpresets = [" "] @@ -267,34 +267,34 @@ class _CommandStructure: grid.addWidget(self.vPresets,1,1,1,1) # length - label1 = QtGui.QLabel(translate("Arch","Length").decode("utf8")) + label1 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True)) self.vLength = ui.createWidget("Gui::InputField") self.vLength.setText(FreeCAD.Units.Quantity(self.Length,FreeCAD.Units.Length).UserString) grid.addWidget(label1,2,0,1,1) grid.addWidget(self.vLength,2,1,1,1) # width - label2 = QtGui.QLabel(translate("Arch","Width").decode("utf8")) + label2 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True)) self.vWidth = ui.createWidget("Gui::InputField") self.vWidth.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString) grid.addWidget(label2,3,0,1,1) grid.addWidget(self.vWidth,3,1,1,1) # height - label3 = QtGui.QLabel(translate("Arch","Height").decode("utf8")) + label3 = QtGui.QLabel(translate("Arch","Height", utf8_decode=True)) self.vHeight = ui.createWidget("Gui::InputField") self.vHeight.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString) grid.addWidget(label3,4,0,1,1) grid.addWidget(self.vHeight,4,1,1,1) # horizontal button - value5 = QtGui.QPushButton(translate("Arch","Switch L/H").decode("utf8")) + value5 = QtGui.QPushButton(translate("Arch","Switch L/H", utf8_decode=True)) grid.addWidget(value5,5,0,1,1) - value6 = QtGui.QPushButton(translate("Arch","Switch L/W").decode("utf8")) + value6 = QtGui.QPushButton(translate("Arch","Switch L/W", utf8_decode=True)) grid.addWidget(value6,5,1,1,1) # continue button - label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8")) + label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True)) value4 = QtGui.QCheckBox() value4.setObjectName("ContinueCmd") value4.setLayoutDirection(QtCore.Qt.RightToLeft) diff --git a/src/Mod/Arch/ArchWall.py b/src/Mod/Arch/ArchWall.py index 0caef5ea6a..65c476f00a 100644 --- a/src/Mod/Arch/ArchWall.py +++ b/src/Mod/Arch/ArchWall.py @@ -303,7 +303,7 @@ class _CommandWall: "sets up a taskbox widget" w = QtGui.QWidget() ui = FreeCADGui.UiLoader() - w.setWindowTitle(translate("Arch","Wall options").decode("utf8")) + w.setWindowTitle(translate("Arch","Wall options", utf8_decode=True)) grid = QtGui.QGridLayout(w) matCombo = QtGui.QComboBox() @@ -321,25 +321,25 @@ class _CommandWall: self.MultiMat = o grid.addWidget(matCombo,0,0,1,2) - label5 = QtGui.QLabel(translate("Arch","Length").decode("utf8")) + label5 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True)) self.Length = ui.createWidget("Gui::InputField") self.Length.setText("0.00 mm") grid.addWidget(label5,1,0,1,1) grid.addWidget(self.Length,1,1,1,1) - label1 = QtGui.QLabel(translate("Arch","Width").decode("utf8")) + label1 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True)) value1 = ui.createWidget("Gui::InputField") value1.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString) grid.addWidget(label1,2,0,1,1) grid.addWidget(value1,2,1,1,1) - label2 = QtGui.QLabel(translate("Arch","Height").decode("utf8")) + label2 = QtGui.QLabel(translate("Arch","Height", utf8_decode=True)) value2 = ui.createWidget("Gui::InputField") value2.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString) grid.addWidget(label2,3,0,1,1) grid.addWidget(value2,3,1,1,1) - label3 = QtGui.QLabel(translate("Arch","Alignment").decode("utf8")) + label3 = QtGui.QLabel(translate("Arch","Alignment", utf8_decode=True)) value3 = QtGui.QComboBox() items = ["Center","Left","Right"] value3.addItems(items) @@ -347,7 +347,7 @@ class _CommandWall: grid.addWidget(label3,4,0,1,1) grid.addWidget(value3,4,1,1,1) - label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8")) + label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True)) value4 = QtGui.QCheckBox() value4.setObjectName("ContinueCmd") value4.setLayoutDirection(QtCore.Qt.RightToLeft) diff --git a/src/Mod/Arch/ArchWindow.py b/src/Mod/Arch/ArchWindow.py index 92fc9f68d1..841654466c 100644 --- a/src/Mod/Arch/ArchWindow.py +++ b/src/Mod/Arch/ArchWindow.py @@ -538,24 +538,24 @@ class _CommandWindow: "sets up a taskbox widget" w = QtGui.QWidget() ui = FreeCADGui.UiLoader() - w.setWindowTitle(translate("Arch","Window options").decode("utf8")) + w.setWindowTitle(translate("Arch","Window options", utf8_decode=True)) grid = QtGui.QGridLayout(w) # include box - include = QtGui.QCheckBox(translate("Arch","Auto include in host object").decode("utf8")) + include = QtGui.QCheckBox(translate("Arch","Auto include in host object", utf8_decode=True)) include.setChecked(True) grid.addWidget(include,0,0,1,2) QtCore.QObject.connect(include,QtCore.SIGNAL("stateChanged(int)"),self.setInclude) # sill height - labels = QtGui.QLabel(translate("Arch","Sill height").decode("utf8")) + labels = QtGui.QLabel(translate("Arch","Sill height", utf8_decode=True)) values = ui.createWidget("Gui::InputField") grid.addWidget(labels,1,0,1,1) grid.addWidget(values,1,1,1,1) QtCore.QObject.connect(values,QtCore.SIGNAL("valueChanged(double)"),self.setSill) # presets box - labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8")) + labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True)) valuep = QtGui.QComboBox() valuep.addItems(WindowPresets) valuep.setCurrentIndex(self.Preset) @@ -573,7 +573,7 @@ class _CommandWindow: # parameters i = 4 for param in self.wparams: - lab = QtGui.QLabel(translate("Arch",param).decode("utf8")) + lab = QtGui.QLabel(translate("Arch",param, utf8_decode=True)) setattr(self,"val"+param,ui.createWidget("Gui::InputField")) wid = getattr(self,"val"+param) if param == "Width": diff --git a/src/Mod/Arch/import3DS.py b/src/Mod/Arch/import3DS.py index 1fe8fb0f85..1bc8c9c44e 100644 --- a/src/Mod/Arch/import3DS.py +++ b/src/Mod/Arch/import3DS.py @@ -76,7 +76,7 @@ def insert(filename,docname): def decode(name): "decodes encoded strings" try: - decodedName = (name.decode("utf8")) + decodedName = (utf8_decode(name)) except UnicodeDecodeError: try: decodedName = (name.decode("latin1")) diff --git a/src/Mod/Arch/importWebGL.py b/src/Mod/Arch/importWebGL.py index a4d4eb7ada..b46f42cda4 100644 --- a/src/Mod/Arch/importWebGL.py +++ b/src/Mod/Arch/importWebGL.py @@ -126,7 +126,7 @@ def export(exportList,filename): outfile = pythonopen(filename,"wb") outfile.write(html) outfile.close() - FreeCAD.Console.PrintMessage(translate("Arch","successfully written ").decode("utf8")+filename+"\n") + FreeCAD.Console.PrintMessage(translate("Arch","successfully written ", utf8_decode=True)+filename+"\n") def getHTML(objectsList): "returns the complete HTML code of a viewer for the given objects" diff --git a/src/Mod/Draft/DraftGui.py b/src/Mod/Draft/DraftGui.py index bd6745abfb..1c9c117aca 100644 --- a/src/Mod/Draft/DraftGui.py +++ b/src/Mod/Draft/DraftGui.py @@ -40,6 +40,7 @@ Report to Draft.py for info ''' import FreeCAD, FreeCADGui, os, Draft, sys, DraftVecUtils, math +from DraftTools import utf8_decode try: from PySide import QtCore,QtGui,QtSvg @@ -883,7 +884,7 @@ class DraftToolBar: def labelUi(self,title=translate("draft","Label"),callback=None): w = QtGui.QWidget() - w.setWindowTitle(translate("draft","Label type").decode("utf8")) + w.setWindowTitle(translate("draft","Label type", utf8_decode=True)) l = QtGui.QVBoxLayout(w) combo = QtGui.QComboBox() for s in ["Custom","Name","Label","Position","Length","Area","Volume","Tag","Material"]: @@ -1373,7 +1374,7 @@ class DraftToolBar: dialogFilter) # print(fname) #fname = str(fname.toUtf8()) # QString to PyString - fname = fname[0].decode("utf8") + fname = utf8_decode(fname[0]) # print("debug: D_G DraftToolBar.pickFile type(fname): " str(type(fname))) except Exception as e: @@ -1392,7 +1393,7 @@ class DraftToolBar: if self.sourceCmd: if (self.labelFFile.isVisible()): if self.FFileValue.text(): - self.sourceCmd.validFFile(self.FFileValue.text().decode("utf8")) #QString to PyString + self.sourceCmd.validFFile(utf8_decode(self.FFileValue.text())) #QString to PyString else: FreeCAD.Console.PrintMessage(translate("draft", "Please enter a font file.")) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 55a89d020e..aade4824da 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -76,20 +76,48 @@ MODALT = MODS[Draft.getParam("modalt",2)] try: _encoding = QtGui.QApplication.UnicodeUTF8 - def translate(context, text): - "convenience function for Qt translator" - if sys.version_info.major >= 3: + def translate(context, text, utf8_decode=False): + """convenience function for Qt translator + context: str + context is typically a class name (e.g., "MyDialog") + text: str + text which gets translated + utf8_decode: bool [False] + if set to true utf8 encoded unicode will be returned. This option does not have influence + on python3 as for python3 we are returning utf-8 encoded unicode by default! + """ + if sys.version_info.major >= 3 or utf8_decode: return QtGui.QApplication.translate(context, text, None, _encoding) else: return QtGui.QApplication.translate(context, text, None, _encoding).encode("utf8") + except AttributeError: - def translate(context, text): - "convenience function for Qt translator" - if sys.version >= 3: + def translate(context, text, utf8_decode=False): + """convenience function for Qt translator + context: str + context is typically a class name (e.g., "MyDialog") + text: str + text which gets translated + utf8_decode: bool [False] + if set to true utf8 encoded unicode will be returned. This option does not have influence + on python3 as for python3 we are returning utf-8 encoded unicode by default! + """ + if sys.version >= 3 or utf8_decode: return QtGui.QApplication.translate(context, text, None) else: return QtGui.QApplication.translate(context, text, None).encode("utf8") +def utf8_decode(text): + """py2: str -> unicode + unicode -> unicode + py3: str -> str + bytes -> str + """ + try: + return text.decode("utf-8") + except AttributeError: + return text + def msg(text=None,mode=None): "prints the given message on the FreeCAD status bar" if not text: FreeCAD.Console.PrintMessage("") @@ -2253,7 +2281,7 @@ class Move(Modifier): 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Move", "Moves the selected objects between 2 points. CTRL to snap, SHIFT to constrain, ALT to copy")} def Activated(self): - self.name = translate("draft","Move").decode("utf8") + self.name = translate("draft","Move", utf8_decode=True) Modifier.Activated(self,self.name) self.ghost = None if self.ui: @@ -3536,7 +3564,7 @@ class Scale(Modifier): 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Scale", "Scales the selected objects from a base point. CTRL to snap, SHIFT to constrain, ALT to copy")} def Activated(self): - self.name = translate("draft","Scale").decode("utf8") + self.name = translate("draft","Scale", utf8_decode=True) Modifier.Activated(self,self.name) self.ghost = None if self.ui: @@ -4970,7 +4998,7 @@ class Mirror(Modifier): 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Mirror", "Mirrors the selected objects along a line defined by two points")} def Activated(self): - self.name = translate("draft","Mirror").decode("utf8") + self.name = translate("draft","Mirror", utf8_decode=True) Modifier.Activated(self,self.name) self.ghost = None if self.ui: @@ -5215,7 +5243,7 @@ class Draft_Label(Creator): 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Label", "Creates a label, optionally attached to a selected object or element")} def Activated(self): - self.name = translate("draft","Label").decode("utf8") + self.name = translate("draft","Label", utf8_decode=True) Creator.Activated(self,self.name,noplanesetup=True) self.ghost = None self.labeltype = Draft.getParam("labeltype","Custom")