# HG changeset patch # User Andrey Skvortsov # Date 1480340821 -10800 # Node ID 2295fdc5c271b4ca77c9ceecad114d5b17e30cd8 # Parent f37b88d3edc6d00de117c948a4c3d80de50c1b0f fix translation strings with multiple parameters this fixes a lot of warnings given by msgmerge: ../PLCOpenEditor.py:196: warning: 'msgid' format string with unnamed arguments cannot be properly localized: The translator cannot reorder the arguments. Please consider using a format string with named arguments, diff -r f37b88d3edc6 -r 2295fdc5c271 CodeFileTreeNode.py --- a/CodeFileTreeNode.py Mon Nov 28 16:27:24 2016 +0300 +++ b/CodeFileTreeNode.py Mon Nov 28 16:47:01 2016 +0300 @@ -117,11 +117,12 @@ try: self.CodeFile, error = self.CodeFileParser.LoadXMLString(codefile_xml) if error is not None: - self.GetCTRoot().logger.write_warning( - XSDSchemaErrorMessage % ((self.CODEFILE_NAME,) + error)) + (fname, lnum, src) = ((self.CODEFILE_NAME,) + error) + self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src)) self.CreateCodeFileBuffer(True) except Exception, exc: - self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (CTNName, unicode(exc))) + msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1 = CTNName, a2 = unicode(exc)) + self.GetCTRoot().logger.write_error(msg) self.GetCTRoot().logger.write_error(traceback.format_exc()) else: self.CodeFile = self.CodeFileParser.CreateRoot() diff -r f37b88d3edc6 -r 2295fdc5c271 ConfigTreeNode.py --- a/ConfigTreeNode.py Mon Nov 28 16:27:24 2016 +0300 +++ b/ConfigTreeNode.py Mon Nov 28 16:47:01 2016 +0300 @@ -53,7 +53,7 @@ """) NameTypeSeparator = '@' -XSDSchemaErrorMessage = _("%s XML file doesn't follow XSD schema at line %d:\n%s") +XSDSchemaErrorMessage = _("{a1} XML file doesn't follow XSD schema at line %{a2}:\n{a3}") class ConfigTreeNode: """ @@ -421,7 +421,8 @@ shutil.move(oldname, self.CTNPath()) # warn user he has two left hands if DesiredName != res: - self.GetCTRoot().logger.write_warning(_("A child named \"%s\" already exist -> \"%s\"\n")%(DesiredName,res)) + msg = _("A child named \"{a1}\" already exists -> \"{a2}\"\n").format(a1 = DesiredName, a2 = res) + self.GetCTRoot().logger.write_warning(msg) return res def GetAllChannels(self): @@ -525,7 +526,7 @@ try: CTNClass, CTNHelp = CTNChildrenTypes[CTNType] except KeyError: - raise Exception, _("Cannot create child %s of type %s ")%(CTNName, CTNType) + raise Exception, _("Cannot create child {a1} of type {a2} ").format(a1 = CTNName, a2 = CTNType) # if CTNClass is a class factory, call it. (prevent unneeded imports) if type(CTNClass) == types.FunctionType: @@ -535,7 +536,8 @@ ChildrenWithSameClass = self.Children.setdefault(CTNType, list()) # Check count if getattr(CTNClass, "CTNMaxCount", None) and len(ChildrenWithSameClass) >= CTNClass.CTNMaxCount: - raise Exception, _("Max count (%d) reached for this confnode of type %s ")%(CTNClass.CTNMaxCount, CTNType) + msg = _("Max count ({a1}) reached for this confnode of type {a2} ").format(a1 = CTNClass.CTNMaxCount, a2 = CTNType) + raise Exception, msg # create the final class, derived of provided confnode and template class FinalCTNClass(CTNClass, ConfigTreeNode): @@ -561,7 +563,9 @@ _self.LoadXMLParams(NewCTNName) # Basic check. Better to fail immediately. if (_self.BaseParams.getName() != NewCTNName): - raise Exception, _("Project tree layout do not match confnode.xml %s!=%s ")%(NewCTNName, _self.BaseParams.getName()) + msg = _("Project tree layout do not match confnode.xml {a1}!={a2} ").\ + format(a1 = NewCTNName, a2 = _self.BaseParams.getName()) + raise Exception, msg # Now, self.CTNPath() should be OK @@ -614,12 +618,13 @@ basexmlfile = open(self.ConfNodeBaseXmlFilePath(CTNName), 'r') self.BaseParams, error = _BaseParamsParser.LoadXMLString(basexmlfile.read()) if error is not None: - self.GetCTRoot().logger.write_warning( - XSDSchemaErrorMessage % ((ConfNodeName + " BaseParams",) + error)) + (fname, lnum, src) = ((ConfNodeName + " BaseParams",) + error) + self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src)) self.MandatoryParams = ("BaseParams", self.BaseParams) basexmlfile.close() except Exception, exc: - self.GetCTRoot().logger.write_error(_("Couldn't load confnode base parameters %s :\n %s") % (ConfNodeName, unicode(exc))) + msg = _("Couldn't load confnode base parameters {a1} :\n {a2}").format(a1 = ConfNodeName, a2 = unicode(exc)) + self.GetCTRoot().logger.write_error(msg) self.GetCTRoot().logger.write_error(traceback.format_exc()) # Get the xml tree @@ -628,14 +633,15 @@ xmlfile = open(self.ConfNodeXmlFilePath(CTNName), 'r') obj, error = self.Parser.LoadXMLString(xmlfile.read()) if error is not None: - self.GetCTRoot().logger.write_warning( - XSDSchemaErrorMessage % ((ConfNodeName,) + error)) + (fname, lnum, src) = ((ConfNodeName,) + error) + self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src)) name = obj.getLocalTag() setattr(self, name, obj) self.CTNParams = (name, obj) xmlfile.close() except Exception, exc: - self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (ConfNodeName, unicode(exc))) + msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1 = ConfNodeName, a2 = unicode(exc)) + self.GetCTRoot().logger.write_error(msg) self.GetCTRoot().logger.write_error(traceback.format_exc()) def LoadChildren(self): @@ -647,6 +653,7 @@ try: self.CTNAddChild(pname, ptype) except Exception, exc: - self.GetCTRoot().logger.write_error(_("Could not add child \"%s\", type %s :\n%s\n")%(pname, ptype, unicode(exc))) + msg = _("Could not add child \"{a1}\", type {a2} :\n{a3}\n").format(a1 = pname, a2 = ptype, a3 = unicode(exc)) + self.GetCTRoot().logger.write_error(msg) self.GetCTRoot().logger.write_error(traceback.format_exc()) diff -r f37b88d3edc6 -r 2295fdc5c271 PLCControler.py --- a/PLCControler.py Mon Nov 28 16:27:24 2016 +0300 +++ b/PLCControler.py Mon Nov 28 16:47:01 2016 +0300 @@ -967,7 +967,8 @@ # programs cannot be pasted as functions or function blocks if orig_type == 'functionBlock' and pou_type == 'function' or \ orig_type == 'program' and pou_type in ['function', 'functionBlock']: - return _('''%s "%s" can't be pasted as a %s.''') % (orig_type, name, pou_type) + msg = _('''{a1} "{a2}" can't be pasted as a {a3}.''').format(a1 = orig_type, a2 = name, a3 = pou_type) + return msg new_pou.setpouType(pou_type) diff -r f37b88d3edc6 -r 2295fdc5c271 PLCGenerator.py --- a/PLCGenerator.py Mon Nov 28 16:27:24 2016 +0300 +++ b/PLCGenerator.py Mon Nov 28 16:47:01 2016 +0300 @@ -775,7 +775,8 @@ for element in body.getcontentInstances(): if isinstance(element, ConnectorClass) and element.getname() == name: if connector is not None: - raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) + msg = _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name) + raise PLCGenException, msg connector = element if connector is not None: undefined = [instance.connectionPointOut, connector.connectionPointIn] @@ -794,7 +795,8 @@ for connection in related: self.ConnectionTypes[connection] = var_type else: - raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) + msg = _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name) + raise PLCGenException, msg elif isinstance(instance, BlockClass): block_infos = self.GetBlockType(instance.gettypeName(), "undefined") if block_infos is not None: @@ -948,7 +950,7 @@ if block_infos is None: block_infos = self.GetBlockType(block_type) if block_infos is None: - raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) + raise PLCGenException, _("Undefined block type \"{a1}\" in \"{a2}\" POU").format(a1 = block_type, a2 = self.Name) try: self.GenerateBlock(instance, block_infos, body, None) except ValueError, e: @@ -1088,7 +1090,8 @@ self.Program += JoinList([(", ", ())], vars) self.Program += [(");\n", ())] else: - self.Warnings.append(_("\"%s\" function cancelled in \"%s\" POU: No input connected")%(type, self.TagName.split("::")[-1])) + msg = _("\"{a1}\" function cancelled in \"{a2}\" POU: No input connected").format(a1 = type, a2 = self.TagName.split("::")[-1]) + self.Warnings.append(msg) elif block_infos["type"] == "functionBlock": if not self.ComputedBlocks.get(block, False) and not order: self.ComputedBlocks[block] = True @@ -1177,11 +1180,12 @@ if output_parameter is None: output_parameter = "" if name: - blockname = "%s(%s)" % (name, type) + blockname = "{a1}({a2})".format(a1 = name, a2 = type) else: blockname = type - raise ValueError, _("No output %s variable found in block %s in POU %s. Connection must be broken") % \ - (output_parameter, blockname, self.Name) + msg = _("No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken").\ + format(a1 = output_parameter, a2 = blockname, a3 = self.Name) + raise ValueError, msg def GeneratePaths(self, connections, body, order = False, to_inout = False): paths = [] @@ -1199,7 +1203,8 @@ if block_infos is None: block_infos = self.GetBlockType(block_type) if block_infos is None: - raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) + msg = _("Undefined block type \"{a1}\" in \"{a2}\" POU").format(a1 = block_type, a2 = self.Name) + raise PLCGenException, msg try: paths.append(str(self.GenerateBlock(next, block_infos, body, connection, order, to_inout))) except ValueError, e: @@ -1214,7 +1219,8 @@ for instance in body.getcontentInstances(): if isinstance(instance, ConnectorClass) and instance.getname() == name: if connector is not None: - raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) + msg = _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name) + raise PLCGenException, msg connector = instance if connector is not None: connections = connector.connectionPointIn.getconnections() @@ -1224,7 +1230,8 @@ self.ComputedConnectors[name] = expression paths.append(str(expression)) else: - raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) + msg = _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name) + raise PLCGenException, msg elif isinstance(next, ContactClass): contact_info = (self.TagName, "contact", next.getlocalId()) variable = str(self.ExtractModifier(next, [(next.getvariable(), contact_info + ("reference",))], contact_info)) @@ -1576,7 +1583,9 @@ elif len(transition_infos["from"]) == 1: self.Program += transition_infos["from"][0] else: - raise PLCGenException, _("Transition with content \"%s\" not connected to a previous step in \"%s\" POU")%(transition_infos["content"], self.Name) + msg = _("Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU").\ + format(a1 = transition_infos["content"], a2 = self.Name) + raise PLCGenException, msg self.Program += [(" TO ", ())] if len(transition_infos["to"]) > 1: self.Program += [("(", ())] @@ -1585,7 +1594,9 @@ elif len(transition_infos["to"]) == 1: self.Program += transition_infos["to"][0] else: - raise PLCGenException, _("Transition with content \"%s\" not connected to a next step in \"%s\" POU")%(transition_infos["content"], self.Name) + msg = _("Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU").\ + format(a1 = transition_infos["content"], a2 = self.Name) + raise PLCGenException, msg self.Program += transition_infos["content"] self.Program += [("%sEND_TRANSITION\n\n"%self.CurrentIndent, ())] for [(step_name, step_infos)] in transition_infos["to"]: diff -r f37b88d3edc6 -r 2295fdc5c271 PLCOpenEditor.py --- a/PLCOpenEditor.py Mon Nov 28 16:27:24 2016 +0300 +++ b/PLCOpenEditor.py Mon Nov 28 16:47:01 2016 +0300 @@ -192,8 +192,8 @@ self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) if result is not None: - self.ShowErrorMessage( - _("PLC syntax error at line %d:\n%s") % result) + (num, line) = result + self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1 = num, a2 = line)) def OnCloseFrame(self, event): if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")): @@ -305,8 +305,8 @@ dialog.Destroy() if result is not None: - self.ShowErrorMessage( - _("PLC syntax error at line %d:\n%s") % result) + (num, line) = result + self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1 = num, a2 = line)) def OnCloseProjectMenu(self, event): if not self.CheckSaveBeforeClosing(): diff -r f37b88d3edc6 -r 2295fdc5c271 ProjectController.py --- a/ProjectController.py Mon Nov 28 16:27:24 2016 +0300 +++ b/ProjectController.py Mon Nov 28 16:47:01 2016 +0300 @@ -360,8 +360,8 @@ error = self.OpenXMLFile(plc_file) if error is not None: if self.Project is not None: - self.logger.write_warning( - XSDSchemaErrorMessage % (("PLC",) + error)) + (fname_err, lnum, src) = (("PLC",) + error) + self.logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname_err, a2 = lnum, a3 = src)) else: return error if len(self.GetProjectConfigNames()) == 0: diff -r f37b88d3edc6 -r 2295fdc5c271 canfestival/config_utils.py --- a/canfestival/config_utils.py Mon Nov 28 16:27:24 2016 +0300 +++ b/canfestival/config_utils.py Mon Nov 28 16:47:01 2016 +0300 @@ -352,14 +352,16 @@ # Check Id is in slave node list if nodeid not in self.NodeList.SlaveNodes.keys(): - raise PDOmappingException, _("Non existing node ID : %d (variable %s)") % (nodeid,name) + raise PDOmappingException, _("Non existing node ID : {a1} (variable {a2})").format(a1 = nodeid, a2 = name) # Get the model for this node (made from EDS) node = self.NodeList.SlaveNodes[nodeid]["Node"] # Extract and check index and subindex if not node.IsEntry(index, subindex): - raise PDOmappingException, _("No such index/subindex (%x,%x) in ID : %d (variable %s)") % (index,subindex,nodeid,name) + msg = _("No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})").\ + format(a1 = "%x" % index, a2 ="%x" % subindex, a3 = nodeid, a4 = name) + raise PDOmappingException, msg # Get the entry info subentry_infos = node.GetSubentryInfos(index, subindex) @@ -369,19 +371,23 @@ if sizelocation == "X" and len(loc) > 3: numbit = loc[3] elif sizelocation != "X" and len(loc) > 3: - raise PDOmappingException, _("Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))") % (name,nodeid,index,subindex) + msg = _("Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))").\ + format(a1 = name, a2 = nodeid, a3 = "%x" % index, a4 = "%x" % subindex) + raise PDOmappingException, msg else: numbit = None if location["IEC_TYPE"] != "BOOL" and subentry_infos["type"] != COlocationtype: - raise PDOmappingException, _("Invalid type \"%s\"-> %d != %d for location\"%s\"") % (location["IEC_TYPE"], COlocationtype, subentry_infos["type"] , name) + raise PDOmappingException, _("Invalid type \"{a1}\"-> {a2} != {a3} for location\"{a4}\"").\ + format(a1 = location["IEC_TYPE"], a2 = COlocationtype, a3 = subentry_infos["type"] , a4 = name) typeinfos = node.GetEntryInfos(COlocationtype) self.IECLocations[name] = {"type":COlocationtype, "pdotype":SlavePDOType[direction], "nodeid": nodeid, "index": index,"subindex": subindex, "bit": numbit, "size": typeinfos["size"], "sizelocation": sizelocation} else: - raise PDOmappingException, _("Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))") % (name,nodeid,index,subindex) + raise PDOmappingException, _("Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))").\ + format(a1 = name, a2 = nodeid, a3 = "%x" % index, a4 = "%x" % subindex) #------------------------------------------------------------------------------- # Search for locations already mapped @@ -630,12 +636,14 @@ # Extract and check index and subindex if not slave.IsEntry(index, subindex): - raise PDOmappingException, _("No such index/subindex (%x,%x) (variable %s)") % (index, subindex, name) + raise PDOmappingException, _("No such index/subindex ({a1},{a2}) (variable {a3})").\ + format(a1 = "%x" % index, a2 = "%x" % subindex, a3 = name) # Get the entry info subentry_infos = slave.GetSubentryInfos(index, subindex) if subentry_infos["type"] != COlocationtype: - raise PDOmappingException, _("Invalid type \"%s\"-> %d != %d for location\"%s\"") % (location["IEC_TYPE"], COlocationtype, subentry_infos["type"] , name) + raise PDOmappingException, _("Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\"").\ + format( a1 = location["IEC_TYPE"], a2 = COlocationtype, a3 = subentry_infos["type"] , a4 = name) IECLocations[name] = COlocationtype pointers[(index, subindex)] = name diff -r f37b88d3edc6 -r 2295fdc5c271 connectors/PYRO/__init__.py --- a/connectors/PYRO/__init__.py Mon Nov 28 16:27:24 2016 +0300 +++ b/connectors/PYRO/__init__.py Mon Nov 28 16:47:01 2016 +0300 @@ -87,7 +87,7 @@ ip = str(socket.inet_ntoa(i.getAddress())) port = str(i.getPort()) newlocation = ip + ':' + port - confnodesroot.logger.write(_("'%s' is located at %s\n") % (location, newlocation)) + confnodesroot.logger.write(_("'{a1}' is located at {a2}\n").format(a1 = location, a2 = newlocation)) location = newlocation r.close() except Exception, msg: diff -r f37b88d3edc6 -r 2295fdc5c271 controls/SearchResultPanel.py --- a/controls/SearchResultPanel.py Mon Nov 28 16:27:24 2016 +0300 +++ b/controls/SearchResultPanel.py Mon Nov 28 16:47:01 2016 +0300 @@ -249,11 +249,11 @@ search_results_tree_children.append(element_infos) if matches_number < 2: - header_format = _("'%s' - %d match in project") + header_format = _("'{a1}' - {a2} match in project") else: - header_format = _("'%s' - %d matches in project") - - self.HeaderLabel.SetLabel(header_format % (self.Criteria["find_pattern"], matches_number)) + header_format = _("'{a1}' - {a2} matches in project") + + self.HeaderLabel.SetLabel(header_format.format(a1 = self.Criteria["find_pattern"], a2 = matches_number)) self.ResetButton.Enable(True) if matches_number > 0: diff -r f37b88d3edc6 -r 2295fdc5c271 controls/VariablePanel.py --- a/controls/VariablePanel.py Mon Nov 28 16:27:24 2016 +0300 +++ b/controls/VariablePanel.py Mon Nov 28 16:47:01 2016 +0300 @@ -273,7 +273,8 @@ if values[2] is not None: base_location_type = self.ParentWindow.Controler.GetBaseType(values[2]) if values[2] != variable_type and base_type != base_location_type: - message = _("Incompatible data types between \"%s\" and \"%s\"")%(values[2], variable_type) + message = _("Incompatible data types between \"{a1}\" and \"{a2}\"").\ + format(a1 = values[2], a2 = variable_type) if message is None: if not location.startswith("%"): @@ -282,7 +283,8 @@ elif location[0] not in LOCATIONDATATYPES: message = _("Unrecognized data size \"%s\"")%location[0] elif base_type not in LOCATIONDATATYPES[location[0]]: - message = _("Incompatible size of data between \"%s\" and \"%s\"")%(location, variable_type) + message = _("Incompatible size of data between \"{a1}\" and \"{a2}\"").\ + format(a1 = location, a2 = variable_type) else: dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow, _("Select a variable class:"), _("Variable class"), diff -r f37b88d3edc6 -r 2295fdc5c271 dialogs/ForceVariableDialog.py --- a/dialogs/ForceVariableDialog.py Mon Nov 28 16:27:24 2016 +0300 +++ b/dialogs/ForceVariableDialog.py Mon Nov 28 16:47:01 2016 +0300 @@ -174,7 +174,7 @@ if value == "": message = _("You must type a value!") elif GetTypeValue[self.IEC_Type](value) is None: - message = _("Invalid value \"%s\" for \"%s\" variable!") % (value, self.IEC_Type) + message = _("Invalid value \"{a1}\" for \"{a2}\" variable!").format(a1 = value, a2 = self.IEC_Type) if message is not None: dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) dialog.ShowModal() diff -r f37b88d3edc6 -r 2295fdc5c271 editors/Viewer.py --- a/editors/Viewer.py Mon Nov 28 16:27:24 2016 +0300 +++ b/editors/Viewer.py Mon Nov 28 16:47:01 2016 +0300 @@ -243,7 +243,7 @@ elif pou_type == "function" and values[1] != "function": message = _("Function Blocks can't be used in Functions!") elif self.ParentWindow.Controler.PouIsUsedBy(pou_name, values[0], self.ParentWindow.Debug): - message = _("\"%s\" is already used by \"%s\"!")%(pou_name, values[0]) + message = _("\"{a1}\" is already used by \"{a2}\"!").format(a1 = pou_name, a2 = values[0]) else: blockname = values[2] if len(values) > 3: diff -r f37b88d3edc6 -r 2295fdc5c271 plcopen/plcopen.py --- a/plcopen/plcopen.py Mon Nov 28 16:27:24 2016 +0300 +++ b/plcopen/plcopen.py Mon Nov 28 16:47:01 2016 +0300 @@ -497,7 +497,8 @@ def addconfigurationResource(self, config_name, name): if self.getconfigurationResource(config_name, name) is not None: - raise ValueError, _("\"%s\" resource already exists in \"%s\" configuration !!!") % (name, config_name) + msg = _("\"{a1}\" resource already exists in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name) + raise ValueError, msg configuration = self.getconfiguration(config_name) if configuration is not None: new_resource = PLCOpenParser.CreateElement("resource", "configuration") @@ -514,7 +515,8 @@ configuration.remove(resource) found = True if not found: - raise ValueError, _("\"%s\" resource doesn't exist in \"%s\" configuration !!!")%(name, config_name) + msg = _("\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name) + raise ValueError, msg setattr(cls, "removeconfigurationResource", removeconfigurationResource) def updateElementName(self, old_name, new_name): diff -r f37b88d3edc6 -r 2295fdc5c271 util/ProcessLogger.py --- a/util/ProcessLogger.py Mon Nov 28 16:27:24 2016 +0300 +++ b/util/ProcessLogger.py Mon Nov 28 16:47:01 2016 +0300 @@ -166,7 +166,7 @@ def log_the_end(self,ecode,pid): self.logger.write(self.Command_str + "\n") - self.logger.write_warning(_("exited with status %s (pid %s)\n")%(str(ecode),str(pid))) + self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid))) def finish(self, pid,ecode): # avoid running function before start is finished