You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
|
Feb
(1) |
Mar
(15) |
Apr
(20) |
May
(2) |
Jun
(9) |
Jul
(3) |
Aug
(2) |
Sep
(17) |
Oct
(16) |
Nov
(38) |
Dec
(40) |
2010 |
Jan
(51) |
Feb
(11) |
Mar
(24) |
Apr
(31) |
May
(24) |
Jun
(3) |
Jul
(9) |
Aug
(1) |
Sep
(29) |
Oct
(33) |
Nov
(81) |
Dec
(6) |
2011 |
Jan
(2) |
Feb
(4) |
Mar
(13) |
Apr
(4) |
May
(24) |
Jun
(4) |
Jul
(19) |
Aug
(46) |
Sep
(10) |
Oct
(28) |
Nov
(31) |
Dec
|
From: <dg...@us...> - 2010-03-03 22:25:42
|
Revision: 518 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=518&view=rev Author: dgranda Date: 2010-03-03 22:25:30 +0000 (Wed, 03 Mar 2010) Log Message: ----------- Removing Firefox from dependencies, reviewing others Modified Paths: -------------- pytrainer/trunk/INSTALL pytrainer/trunk/bin/pytrainer Modified: pytrainer/trunk/INSTALL =================================================================== --- pytrainer/trunk/INSTALL 2010-02-25 10:03:33 UTC (rev 517) +++ pytrainer/trunk/INSTALL 2010-03-03 22:25:30 UTC (rev 518) @@ -7,11 +7,12 @@ Here you are dependencies for PyTrainer. Of course you must have a working environment with proper shell configuration and typical GNU tools to uncompress (gunzip) and untar (tar) files. -1.1.- Packages (Fedora 12 working versions as of 2010.01.21 for 1.7.1) +1.1.- Packages (Fedora 12 working versions as of 2010.03.03 for 1.7.2 dev) python-2.6.2 python-devel-2.6.2 (to run installation from tarball) python-matplotlib-0.98.5.2 +python-dateutil-1.4.1 gnome-python2-gtkmozembed-2.25.3 pygtk2-libglade-2.16.0 pygtk2-2.16.0 @@ -22,8 +23,7 @@ libxslt-python-1.1.26 libxslt-1.1.26 sqlite-3.6.20 (sqlite is preferred as db than mysql) -xulrunner-1.9.1.6 -firefox-3.5.6 +xulrunner-1.9.1.8 - Only needed if correspondent plugin is enabled: gpsbabel-1.3.5 ("Garmin via GPSBabel 1.3.5" aka garmin_hr) Modified: pytrainer/trunk/bin/pytrainer =================================================================== --- pytrainer/trunk/bin/pytrainer 2010-02-25 10:03:33 UTC (rev 517) +++ pytrainer/trunk/bin/pytrainer 2010-03-03 22:25:30 UTC (rev 518) @@ -38,9 +38,6 @@ from pytrainer.main import pyTrainer -os.environ['MOZILLA_FIVE_HOME']="/usr/lib/firefox" -os.environ['LD_LIBRARY_PATH']="/usr/lib/firefox" -#os.environ['MOZILLA_FIVE_HOME']="/usr/lib64/xulrunner-1.9.1" os.environ['MOZILLA_FIVE_HOME']=commands.getstatusoutput("find /usr/li* -name xulrunner -exec dirname {} \; 2>/dev/null")[1] def main(argv): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-25 10:03:41
|
Revision: 517 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=517&view=rev Author: jblance Date: 2010-02-25 10:03:33 +0000 (Thu, 25 Feb 2010) Log Message: ----------- Start of 'editing details before import work' for unified import Modified Paths: -------------- pytrainer/trunk/glade/newrecord.glade pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/newrecord.glade =================================================================== --- pytrainer/trunk/glade/newrecord.glade 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/glade/newrecord.glade 2010-02-25 10:03:33 UTC (rev 517) @@ -24,8 +24,6 @@ </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">2</property> </packing> </child> Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-25 10:03:33 UTC (rev 517) @@ -395,36 +395,42 @@ for item in self.activities_store: if item[1] is True: #Checkbox is True logging.debug("Added activity %s to selected list" % item) - selectedActivities.append(item) + file_id = int(item[7]) + activity_id = item[0] + start_time = item[2] + distance = item[3] + duration = item[4] + sport = item[5] + gpx_file = self.processClasses[file_id].getGPXFile(activity_id)[1] + selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file)) logging.debug( "Found %d selected activities to import" % len(selectedActivities) ) return selectedActivities - def importSelectedActivity(self, activity): + def importSelectedActivities(self, activities): """ Function to import selected activity """ - activity_id = activity[0] - #selected = activity[1] - #start_time = activity[2] - #distance = activity[3] - #duration = activity[4] - #sport = activity[5] - #notes = activity[6] - file_id = int(activity[7]) - logging.debug( "Importing activity %s from file %s" % (activity_id, file_id)) - sport, gpxFile = self.processClasses[file_id].getGPXFile(activity_id) + #selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file)) + logging.debug( "Importing %d activities" % len(activities)) + list_sport = self.pytrainer_main.profile.getSportList() + self.pytrainer_main.record.newMultiRecord(activities, list_sport) + #sport, gpxFile = self.processClasses[file_id].getGPXFile(activity_id) #process returned GPX files - if os.path.isfile(gpxFile): + '''if os.path.isfile(gpxFile): logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(gpxFile), sport)) #TODO trigger newentry screen to allow user to edit data - self.parent.parent.record.importFromGPX(gpxFile, sport) + #list_sport = self.pytrainer_main.profile.getSportList() + #logging.debug('id_record: '+str(id_record)+' | list_sport: '+str(list_sport)) + #def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): + #self.pytrainer_main.record.newMultiRecord(list_sport, date=start_time, distance=distance, time=duration, comment=sport) + #self.pytrainer_main.record.importFromGPX(gpxFile, sport) #Deselect imported activity and change note self.updateActivity(activity_id, file_id, status=False, notes="Imported into database") else: logging.error('File %s not valid' % gpxFile) + ''' - def updateActivity(self, activityID, file_id, status = None, notes = None): path = 0 for item in self.activities_store: @@ -554,9 +560,8 @@ self.updateStatusbar(self.statusbarImportFile, msgImporting) while gtk.events_pending(): # This allows the GUI to update gtk.main_iteration() # before completion of this entire action - for activity in selectedActivities: - self.importSelectedActivity(activity) - #TODO progress bar here?? + #for activity in selectedActivities: + self.importSelectedActivities(selectedActivities) self.updateStatusbar(self.statusbarImportFile, msgImported) #Display informational dialog box md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, msgImported) Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-02-25 10:03:33 UTC (rev 517) @@ -18,6 +18,7 @@ import os import logging +import gtk, gobject from SimpleGladeApp import SimpleGladeApp from windowcalendar import WindowCalendar from filechooser import FileChooser @@ -34,6 +35,7 @@ domain = None self.mode = "newrecord" self.id_record = "" + self.store = None SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) self.conf_options = [ "rcd_date", @@ -77,7 +79,49 @@ self.rcd_unegative.set_text(unegative) if calories != None: self.rcd_calories.set_text(calories) + + def populateMultiWindow(self, activities): + #activities (activity_id, start_time, distance, duration, sport, gpx_file) + #Make treeview + self.store = self.build_tree_view() + #Add data + for activity in activities: + iter = self.store.append() + self.store.set( + iter, + 0, activity[0], + 1, activity[1], + 2, activity[2], + 3, activity[3], + 4, activity[4], + 5, activity[5] + ) + #Make row clickable to show details + #Select first activity + + self.scrolledwindowEntries.show_all() + + def build_tree_view(self): + store = gtk.ListStore( gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING ) + column_names=["id", _("Start Time"), _("Distance"),_("Duration"),_("Sport"), _("GPX File")] + for column_index, column_name in enumerate(column_names): + #Add columns + column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) + column.set_sort_column_id(column_index) + #if column_name == "id": + # column.set_visible(False) + column.set_resizable(True) + self.treeviewEntries.append_column(column) + self.treeviewEntries.set_headers_clickable(True) + self.treeviewEntries.set_model(store) + return store + def on_accept_clicked(self,widget): list_options = {} trackSummary = {} Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-25 10:03:33 UTC (rev 517) @@ -75,7 +75,7 @@ self.tree = etree.ElementTree(file=filename).getroot() if self.tree.get("version") == "1.0": #Got an old GPX file - print "Old gpx version" + logging.debug("Old gpx version") mainNS = string.Template(".//{http://www.topografix.com/GPX/1/0}$tag") timeTag = mainNS.substitute(tag="time") trackTag = mainNS.substitute(tag="trk") @@ -85,7 +85,7 @@ elevationTag = mainNS.substitute(tag="ele") nameTag = mainNS.substitute(tag="name") else: - print self.tree.get("version") + logging.debug("Importing version %s gpx file" % self.tree.get("version")) mainNS = string.Template(".//{http://www.topografix.com/GPX/1/1}$tag") timeTag = mainNS.substitute(tag="time") trackTag = mainNS.substitute(tag="trk") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/pytrainer/main.py 2010-02-25 10:03:33 UTC (rev 517) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#516" + self.version ="1.7.1_svn#517" self.DB_version = 3 #Setup usage and permitted options Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-02-25 08:50:25 UTC (rev 516) +++ pytrainer/trunk/pytrainer/record.py 2010-02-25 10:03:33 UTC (rev 517) @@ -48,9 +48,18 @@ logging.debug('<<') def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): + logging.debug('>>') self.recordwindow = WindowRecord(self.data_path, list_sport,self, date, title, distance, time, upositive, unegative, bpm, calories, comment) self.recordwindow.run() logging.debug('<<') + + def newMultiRecord(self, activities, list_sport): + logging.debug('>>') + #activities (activity_id, start_time, distance, duration, sport, gpx_file) + self.recordwindow = WindowRecord(self.data_path, list_sport, windowTitle="Modify details before importing") + self.recordwindow.populateMultiWindow(activities) + self.recordwindow.run() + logging.debug('<<') def editRecord(self,id_record,list_sport): logging.debug('>>') @@ -497,7 +506,6 @@ Add a record from a valid pytrainer type GPX file """ logging.debug('>>') - print gpxFile if not os.path.isfile(gpxFile): logging.error("Invalid file: " +gpxFile) else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-25 08:50:32
|
Revision: 516 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=516&view=rev Author: jblance Date: 2010-02-25 08:50:25 +0000 (Thu, 25 Feb 2010) Log Message: ----------- Davidfraser's code changes for waypoint editor - incomplete (see Trac #40) Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/waypointeditor.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/waypoint.py Modified: pytrainer/trunk/pytrainer/extensions/waypointeditor.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-02-25 08:50:25 UTC (rev 516) @@ -36,11 +36,44 @@ self.conf = checkConf() self.extension = Extension() self.moz = gtkmozembed.MozEmbed() + self.moz.connect('title', self.handle_title_changed) vbox.pack_start(self.moz, True, True) vbox.show_all() self.htmlfile = "" self.waypoint=waypoint logging.debug("<<") + + def handle_title_changed(self, *args): + title = self.moz.get_title() + m = re.match("call:([a-zA-Z]*)[(](.*)[)]", title) + if m: + fname = m.group(1) + args = m.group(2) + if fname == "addWaypoint": + am = re.match("([+-]?[0-9]+[.][0-9]+),([+-]?[0-9]+[.][0-9]+)", args) + if am: + lon, lat = am.group(1), am.group(2) + lon, lat = float(lon), float(lat) + self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + else: + raise ValueError("Error parsing addWaypoint parameters: %s" % args) + elif fname == "updateWaypoint": + am = re.match("([+-]?[0-9]+[.][0-9]+),([+-]?[0-9]+[.][0-9]+),([0-9]*)", args) + if am: + lon, lat, id_waypoint = am.group(1), am.group(2), am.group(3) + lon, lat, id_waypoint = float(lon), float(lat), int(id_waypoint) + retorno = self.waypoint.getwaypointInfo(id_waypoint) + if retorno: + name, comment, sym = retorno[5], retorno[3], retorno[6] + self.waypoint.updateWaypoint(id_waypoint, lat, lon, name, comment, sym) + else: + raise KeyError("Unknown waypoint id %d", id_waypoint) + self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + else: + raise ValueError("Error parsing addWaypoint parameters: %s" % args) + else: + raise ValueError("Unexpected function name %s" % fname) + return False def drawMap(self): logging.debug(">>") @@ -74,6 +107,8 @@ """ i = 0 arrayjs = "" + if default_waypoint is None and points: + default_waypoint = points[0][0] for point in points: if point[0] == default_waypoint: londef = point[2] @@ -95,74 +130,11 @@ //<![CDATA[ function addWaypoint(lon,lat) { - var pytrainerAPI = new SOAPCall(); - netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); - pytrainerAPI.transportURI = "http://localhost:8081/"; - - var param1 = new SOAPParameter(); - param1.name = "lon"; - param1.value = lon; - - var param2 = new SOAPParameter(); - param2.name = "lat"; - param2.value = lat; - - var param3 = new SOAPParameter(); - param3.name = "name"; - param3.value = "NEW WAYPOINT"; - - var parameters = [param1,param2,param3]; - pytrainerAPI.encode(0, - "addWaypoint", null, - 0, null, - parameters.length, parameters); - - var response = pytrainerAPI.invoke(); - - if(response.fault){ - alert("An error occured: " + response.fault.faultString); - return 0; - } - else { - var re = new Array(); - re = response.getParameters(false, {}); - } - return re[0].value; + document.title = "call:addWaypoint(" + lon + "," + lat + ")"; } function updateWaypoint(lon,lat,id) { - var pytrainerAPI = new SOAPCall(); - netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); - pytrainerAPI.transportURI = "http://localhost:8081/"; - - var param1 = new SOAPParameter(); - param1.name = "lon"; - param1.value = lon; - - var param2 = new SOAPParameter(); - param2.name = "lat"; - param2.value = lat; - - var param3 = new SOAPParameter(); - param3.name = "id_waypoint"; - param3.value = id; - - var parameters = [param1,param2,param3]; - pytrainerAPI.encode(0, - "updateWaypoint", null, - 0, null, - parameters.length, parameters); - - var response = pytrainerAPI.invoke(); - - if(response.fault){ - alert("An error occured: " + response.fault.faultString); - } - else { - var re = new Array(); - re = response.getParameters(false, {}); - //alert("Return value: " + re[0].value); - } + document.title = "call:updateWaypoint(" + lon + "," + lat + "," + id + ")"; } function createMarker(waypoint) { Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/main.py 2010-02-25 08:50:25 UTC (rev 516) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#515" + self.version ="1.7.1_svn#516" self.DB_version = 3 #Setup usage and permitted options @@ -345,7 +345,7 @@ self.windowmain.actualize_listview(record_list) logging.debug('<<') - def refreshWaypointView(self,default_waypoint=False,redrawmap=1): + def refreshWaypointView(self,default_waypoint=None,redrawmap=1): logging.debug('>>') waypoint_list = self.waypoint.getAllWaypoints() self.windowmain.actualize_waypointview(waypoint_list,default_waypoint,redrawmap) Modified: pytrainer/trunk/pytrainer/waypoint.py =================================================================== --- pytrainer/trunk/pytrainer/waypoint.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/waypoint.py 2010-02-25 08:50:25 UTC (rev 516) @@ -46,6 +46,16 @@ self.ddbb.update("waypoints","lat,lon,comment,name,sym",[lat,lon,desc,name,sym]," id_waypoint=%d" %id_waypoint) self.ddbb.disconnect() logging.debug("<<") + + def addWaypoint(self,lon=None,lat=None,name=None,comment=None,sym=None): + logging.debug(">>") + self.ddbb.connect() + cells = "lat,lon,comment,name,sym" + values = (lat,lon,comment,name,sym) + self.ddbb.insert("waypoints",cells,values) + id_waypoint = self.ddbb.lastRecord("waypoints") + self.ddbb.disconnect() + logging.debug("<<") def getwaypointInfo(self,id_waypoint): logging.debug(">>") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-22 09:48:04
|
Revision: 515 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=515&view=rev Author: jblance Date: 2010-02-22 09:47:56 +0000 (Mon, 22 Feb 2010) Log Message: ----------- Start of converting the googleearth plugin to new plugin format Modified Paths: -------------- pytrainer/trunk/plugins/garmin-gpx/garmingpx.py pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py pytrainer/trunk/plugins/googleearth/main.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Added Paths: ----------- pytrainer/trunk/schemas/ogckml22.xsd Modified: pytrainer/trunk/plugins/garmin-gpx/garmingpx.py =================================================================== --- pytrainer/trunk/plugins/garmin-gpx/garmingpx.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/plugins/garmin-gpx/garmingpx.py 2010-02-22 09:47:56 UTC (rev 515) @@ -61,7 +61,6 @@ if not self.inDatabase(filename): sport = self.getSport(filename) gpxfile = "%s/garmin-gpx-%d.gpx" % (self.tmpdir, len(importfiles)) - shutil shutil.copy(filename, gpxfile) importfiles.append((gpxfile, sport)) else: Modified: pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py =================================================================== --- pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2010-02-22 09:47:56 UTC (rev 515) @@ -75,7 +75,7 @@ return True else: xslfile = os.path.realpath(self.parent.parent.data_path)+ "/schemas/GarminTrainingCenterDatabase_v2.xsd" - from lib.xmlValidation import xmlValidator + from pytrainer.lib.xmlValidation import xmlValidator validator = xmlValidator() return validator.validateXSL(filename, xslfile) Modified: pytrainer/trunk/plugins/googleearth/main.py =================================================================== --- pytrainer/trunk/plugins/googleearth/main.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/plugins/googleearth/main.py 2010-02-22 09:47:56 UTC (rev 515) @@ -20,18 +20,83 @@ import os import commands +import logging +from lxml import etree +from pytrainer.gui.dialogs import fileChooserDialog, guiFlush class googleearth(): - def __init__(self, parent = None): + def __init__(self, parent = None, validate=False): self.parent = parent + self.validate = validate + self.data_path = os.path.dirname(__file__) self.tmpdir = self.parent.conf.getValue("tmpdir") def run(self): - f = os.popen("zenity --file-selection --title 'Choose a Google Earth file (.kml) to import'") - inputData = f.read().strip() + logging.debug(">>") + selectedFiles = fileChooserDialog(title="Choose a Google Earth file (.kml) to import", multiple=True).getFiles() + guiFlush() + importfiles = [] + if not selectedFiles: + return importfiles + for filename in selectedFiles: + if self.valid_input_file(filename): + if not self.inDatabase(filename): + sport = self.getSport(filename) #TODO Fix sport determination + gpxfile = "%s/googleearth-%d.gpx" % (self.tmpdir, len(importfiles)) + outgps = commands.getstatusoutput("gpsbabel -t -i kml -f %s -o gpx -F %s" % (filename, gpxfile) ) + #self.createGPXfile(gpxfile, filename) #TODO Fix processing so not dependant on the broken gpsbabel + importfiles.append((gpxfile, sport)) + else: + logging.debug("%s already in database. Skipping import." % (filename) ) + else: + logging.info("File %s failed validation" % (filename)) + logging.debug("<<") + return importfiles - tmpgpx="/tmp/reg.gpx" - outgps = commands.getstatusoutput("gpsbabel -t -i kml -f %s -o gpx -F %s" % (inputData, tmpgpx) ) + def valid_input_file(self, filename): + """ Function to validate input file if requested""" + if not self.validate: #not asked to validate + logging.debug("Not validating %s" % (filename) ) + return True + else: + return True + #TODO need to check schema and validation for example kml files + #xslfile = os.path.realpath(self.parent.parent.data_path)+ "/schemas/ogckml22.xsd" + #from pytrainer.lib.xmlValidation import xmlValidator + #validator = xmlValidator() + #return validator.validateXSL(filename, xslfile) + + def inDatabase(self, filename): + """ Function to determine if a given file has already been imported into the database + only compares date and start time (sport may have been changed in DB after import) + """ + #time = self.detailsFromKML(filename) + #if self.parent.parent.ddbb.select("records","*","date_time_utc=\"%s\"" % (time)): + # return True + #else: + return False + + def getSport(self, filename): + #TODO Fix sport determination + return "Run" + + def detailsFromKML(self, filename): + """ Function to return the first time element from a KML file """ + #TODO + #tree = xml.etree.cElementTree.ElementTree(file=filename) + #root = tree.getroot() + #timeElement = root.find(".//{http://www.topografix.com/GPX/1/1}time") + #if timeElement is None: + # return None + #else: + # return timeElement.text + + def createGPXfile(self, gpxfile, filename): + ''' Function to transform a GPSBabel kml file to a valid GPX+ file + ''' + #TODO!! + xslt_doc = etree.parse(self.data_path+"/translate.xsl") + transform = etree.XSLT(xslt_doc) + result_tree = transform(filename) + result_tree.write(gpxfile, xml_declaration=True) - return [tmpgpx, ] - Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-22 09:47:56 UTC (rev 515) @@ -53,6 +53,7 @@ class Gpx: def __init__(self, data_path = None, filename = None, trkname = None): logging.debug(">>") + global mainNS, timeTag, trackTag, trackPointTag, trackPointTagLast, trackSegTag, elevationTag, nameTag self.data_path = data_path self.filename = filename self.trkname = trkname @@ -72,6 +73,28 @@ return None logging.debug("parsing content from "+self.filename) self.tree = etree.ElementTree(file=filename).getroot() + if self.tree.get("version") == "1.0": + #Got an old GPX file + print "Old gpx version" + mainNS = string.Template(".//{http://www.topografix.com/GPX/1/0}$tag") + timeTag = mainNS.substitute(tag="time") + trackTag = mainNS.substitute(tag="trk") + trackPointTag = mainNS.substitute(tag="trkpt") + trackPointTagLast = mainNS.substitute(tag="trkpt[last()]") + trackSegTag = mainNS.substitute(tag="trkseg") + elevationTag = mainNS.substitute(tag="ele") + nameTag = mainNS.substitute(tag="name") + else: + print self.tree.get("version") + mainNS = string.Template(".//{http://www.topografix.com/GPX/1/1}$tag") + timeTag = mainNS.substitute(tag="time") + trackTag = mainNS.substitute(tag="trk") + trackPointTag = mainNS.substitute(tag="trkpt") + trackPointTagLast = mainNS.substitute(tag="trkpt[last()]") + trackSegTag = mainNS.substitute(tag="trkseg") + elevationTag = mainNS.substitute(tag="ele") + nameTag = mainNS.substitute(tag="name") + logging.debug("getting values...") self.Values = self._getValues() logging.debug("<<") @@ -154,11 +177,14 @@ tree = self.tree # Calories data comes within laps. Maybe more than one, adding them together - dgranda 20100114 laps = tree.findall(lapTag) - for lap in laps: - lapCalories = lap.findtext(calorieTag) - logging.debug("Lap calories: "+str(lapCalories)) - self.calories += int(lapCalories) - logging.debug("Calories: "+str(self.calories)) + if laps is not None and laps != "": + for lap in laps: + lapCalories = lap.findtext(calorieTag) + logging.debug("Lap calories: "+str(lapCalories)) + self.calories += int(lapCalories) + logging.debug("Calories: "+str(self.calories)) + else: + laps = [] retorno = [] his_vel = [] @@ -169,9 +195,9 @@ total_hr = 0 tmp_alt = 0 len_validhrpoints = 0 - trkpoints = tree.findall(trackPointTag) - if not len(trkpoints): + if trkpoints is None or len(trkpoints) == 0: + logging.debug( "No trkpoints found in file") return retorno date_ = tree.find(timeTag).text @@ -179,6 +205,7 @@ mk_time = self.getDateTime(date_)[1] #Local Date self.date = mk_time.strftime("%Y-%m-%d") + for trkpoint in trkpoints: lat = trkpoint.get("lat") lon = trkpoint.get("lon") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/pytrainer/main.py 2010-02-22 09:47:56 UTC (rev 515) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#514" + self.version ="1.7.1_svn#515" self.DB_version = 3 #Setup usage and permitted options @@ -203,7 +203,9 @@ for (pluginFile, sport) in pluginFiles: if os.path.isfile(pluginFile): logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(pluginFile), sport)) - self.record.importFromGPX(pluginFile, sport) + if self.record.importFromGPX(pluginFile, sport) is None: + print "Error importing file "+pluginFile + logging.error("Error importing file "+pluginFile) else: logging.error('File '+pluginFile+' not valid') else: Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-02-22 06:38:56 UTC (rev 514) +++ pytrainer/trunk/pytrainer/record.py 2010-02-22 09:47:56 UTC (rev 515) @@ -181,7 +181,9 @@ Moves GPX file to store destination and updates database args: path to source GPX file""" logging.debug('--') - list_options, gpx_laps = self.summaryFromGPX(gpxOrig, entry) + (list_options, gpx_laps) = self.summaryFromGPX(gpxOrig, entry) + if list_options is None: + return None return self.insertRecord(list_options, laps=gpx_laps) def lapsFromGPX(self, gpx): @@ -214,7 +216,8 @@ gpx = Gpx(self.data_path,gpxOrig) distance, time, maxspeed, maxheartrate = gpx.getMaxValues() if time == 0: #invalid record - return None + print "Invalid record" + return (None, None) upositive,unegative = gpx.getUnevenness() speed = distance*3600/time time_hhmmss = [time//3600,(time/60)%60,time%60] Added: pytrainer/trunk/schemas/ogckml22.xsd =================================================================== --- pytrainer/trunk/schemas/ogckml22.xsd (rev 0) +++ pytrainer/trunk/schemas/ogckml22.xsd 2010-02-22 09:47:56 UTC (rev 515) @@ -0,0 +1,1642 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:kml="http://www.opengis.net/kml/2.2" + xmlns:atom="http://www.w3.org/2005/Atom" + xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" + targetNamespace="http://www.opengis.net/kml/2.2" + elementFormDefault="qualified" + version="2.2.0"> + + <xsd:annotation> + <xsd:appinfo>ogckml22.xsd 2008-01-23</xsd:appinfo> + <xsd:documentation>XML Schema Document for OGC KML version 2.2. Copyright (c) + 2008 Open Geospatial Consortium, Inc. All Rights Reserved. + </xsd:documentation> + </xsd:annotation> + + <!-- import atom:author and atom:link --> + <xsd:import namespace="http://www.w3.org/2005/Atom" + schemaLocation="atom-author-link.xsd"/> + + <!-- import xAL:Address --> + <xsd:import namespace="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" + schemaLocation="http://docs.oasis-open.org/election/external/xAL.xsd"/> + + <!-- KML field types (simple content) --> + + <xsd:simpleType name="anglepos90Type"> + <xsd:restriction base="double"> + <xsd:minInclusive value="0.0"/> + <xsd:maxInclusive value="90.0"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="angle90Type"> + <xsd:restriction base="double"> + <xsd:minInclusive value="-90"/> + <xsd:maxInclusive value="90.0"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="anglepos180Type"> + <xsd:restriction base="double"> + <xsd:minInclusive value="0.0"/> + <xsd:maxInclusive value="180.0"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="angle180Type"> + <xsd:restriction base="double"> + <xsd:minInclusive value="-180.0"/> + <xsd:maxInclusive value="180.0"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="angle360Type"> + <xsd:restriction base="double"> + <xsd:minInclusive value="-360.0"/> + <xsd:maxInclusive value="360.0"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="altitudeModeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="clampToGround"/> + <xsd:enumeration value="relativeToGround"/> + <xsd:enumeration value="absolute"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="colorType"> + <xsd:annotation> + <xsd:documentation><![CDATA[ + + aabbggrr + + ffffffff: opaque white + ff000000: opaque black + + ]]></xsd:documentation> + </xsd:annotation> + <xsd:restriction base="hexBinary"> + <xsd:length value="4"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="coordinatesType"> + <xsd:list itemType="string"/> + </xsd:simpleType> + + <xsd:simpleType name="colorModeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="random"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="dateTimeType"> + <xsd:union memberTypes="dateTime date gYearMonth gYear"/> + </xsd:simpleType> + + <xsd:simpleType name="displayModeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="hide"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="gridOriginEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="lowerLeft"/> + <xsd:enumeration value="upperLeft"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="itemIconStateType"> + <xsd:list itemType="kml:itemIconStateEnumType"/> + </xsd:simpleType> + + <xsd:simpleType name="itemIconStateEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="open"/> + <xsd:enumeration value="closed"/> + <xsd:enumeration value="error"/> + <xsd:enumeration value="fetching0"/> + <xsd:enumeration value="fetching1"/> + <xsd:enumeration value="fetching2"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="listItemTypeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="radioFolder"/> + <xsd:enumeration value="check"/> + <xsd:enumeration value="checkHideChildren"/> + <xsd:enumeration value="checkOffOnly"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="refreshModeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="onChange"/> + <xsd:enumeration value="onInterval"/> + <xsd:enumeration value="onExpire"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="viewRefreshModeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="never"/> + <xsd:enumeration value="onRequest"/> + <xsd:enumeration value="onStop"/> + <xsd:enumeration value="onRegion"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="shapeEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="rectangle"/> + <xsd:enumeration value="cylinder"/> + <xsd:enumeration value="sphere"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="styleStateEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="highlight"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="unitsEnumType"> + <xsd:restriction base="string"> + <xsd:enumeration value="fraction"/> + <xsd:enumeration value="pixels"/> + <xsd:enumeration value="insetPixels"/> + </xsd:restriction> + </xsd:simpleType> + + <xsd:complexType name="vec2Type" abstract="false"> + <xsd:attribute name="x" type="double" default="1.0"/> + <xsd:attribute name="y" type="double" default="1.0"/> + <xsd:attribute name="xunits" type="kml:unitsEnumType" use="optional" + default="fraction"/> + <xsd:attribute name="yunits" type="kml:unitsEnumType" use="optional" + default="fraction"/> + </xsd:complexType> + + <xsd:element name="address" type="string"/> + <xsd:element name="altitude" type="double" default="0.0"/> + <xsd:element name="altitudeModeGroup" abstract="true"/> + <xsd:element name="altitudeMode" type="kml:altitudeModeEnumType" + default="clampToGround" substitutionGroup="kml:altitudeModeGroup"/> + <xsd:element name="begin" type="kml:dateTimeType"/> + <xsd:element name="bgColor" type="kml:colorType" default="ffffffff"/> + <xsd:element name="bottomFov" type="kml:angle90Type" default="0.0"/> + <xsd:element name="color" type="kml:colorType" default="ffffffff"/> + <xsd:element name="colorMode" type="kml:colorModeEnumType" default="normal"/> + <xsd:element name="cookie" type="string"/> + <xsd:element name="coordinates" type="kml:coordinatesType"/> + <xsd:element name="description" type="string"/> + <xsd:element name="displayName" type="string"/> + <xsd:element name="displayMode" type="kml:displayModeEnumType" default="default"/> + <xsd:element name="drawOrder" type="int" default="0"/> + <xsd:element name="east" type="kml:angle180Type" default="180.0"/> + <xsd:element name="end" type="kml:dateTimeType"/> + <xsd:element name="expires" type="kml:dateTimeType"/> + <xsd:element name="extrude" type="boolean" default="0"/> + <xsd:element name="fill" type="boolean" default="1"/> + <xsd:element name="flyToView" type="boolean" default="0"/> + <xsd:element name="gridOrigin" type="kml:gridOriginEnumType" default="lowerLeft"/> + <xsd:element name="heading" type="kml:angle360Type" default="0.0"/> + <xsd:element name="href" type="string"> + <xsd:annotation> + <xsd:documentation>not anyURI due to $[x] substitution in + PhotoOverlay</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="httpQuery" type="string"/> + <xsd:element name="hotSpot" type="kml:vec2Type"/> + <xsd:element name="key" type="kml:styleStateEnumType" default="normal"/> + <xsd:element name="latitude" type="kml:angle90Type" default="0.0"/> + <xsd:element name="leftFov" type="kml:angle180Type" default="0.0"/> + <xsd:element name="linkDescription" type="string"/> + <xsd:element name="linkName" type="string"/> + <xsd:element name="linkSnippet" type="kml:SnippetType"/> + <xsd:element name="listItemType" type="kml:listItemTypeEnumType" default="check"/> + <xsd:element name="longitude" type="kml:angle180Type" default="0.0"/> + <xsd:element name="maxSnippetLines" type="int" default="2"/> + <xsd:element name="maxSessionLength" type="double" default="-1.0"/> + <xsd:element name="message" type="string"/> + <xsd:element name="minAltitude" type="double" default="0.0"/> + <xsd:element name="minFadeExtent" type="double" default="0.0"/> + <xsd:element name="minLodPixels" type="double" default="0.0"/> + <xsd:element name="minRefreshPeriod" type="double" default="0.0"/> + <xsd:element name="maxAltitude" type="double" default="0.0"/> + <xsd:element name="maxFadeExtent" type="double" default="0.0"/> + <xsd:element name="maxLodPixels" type="double" default="-1.0"/> + <xsd:element name="maxHeight" type="int" default="0"/> + <xsd:element name="maxWidth" type="int" default="0"/> + <xsd:element name="name" type="string"/> + <xsd:element name="near" type="double" default="0.0"/> + <xsd:element name="north" type="kml:angle180Type" default="180.0"/> + <xsd:element name="open" type="boolean" default="0"/> + <xsd:element name="outline" type="boolean" default="1"/> + <xsd:element name="overlayXY" type="kml:vec2Type"/> + <xsd:element name="phoneNumber" type="string"/> + <xsd:element name="range" type="double" default="0.0"/> + <xsd:element name="refreshMode" type="kml:refreshModeEnumType" + default="onChange"/> + <xsd:element name="refreshInterval" type="double" default="4.0"/> + <xsd:element name="refreshVisibility" type="boolean" default="0"/> + <xsd:element name="rightFov" type="kml:angle180Type" default="0.0"/> + <xsd:element name="roll" type="kml:angle180Type" default="0.0"/> + <xsd:element name="rotation" type="kml:angle180Type" default="0.0"/> + <xsd:element name="rotationXY" type="kml:vec2Type"/> + <xsd:element name="scale" type="double" default="1.0"/> + <xsd:element name="screenXY" type="kml:vec2Type"/> + <xsd:element name="shape" type="kml:shapeEnumType" default="rectangle"/> + <xsd:element name="size" type="kml:vec2Type"/> + <xsd:element name="south" type="kml:angle180Type" default="-180.0"/> + <xsd:element name="sourceHref" type="anyURI"/> + <xsd:element name="snippet" type="string"/> + <xsd:element name="state" type="kml:itemIconStateType"/> + <xsd:element name="styleUrl" type="anyURI"/> + <xsd:element name="targetHref" type="anyURI"/> + <xsd:element name="tessellate" type="boolean" default="0"/> + <xsd:element name="text" type="string"/> + <xsd:element name="textColor" type="kml:colorType" default="ff000000"/> + <xsd:element name="tileSize" type="int" default="256"/> + <xsd:element name="tilt" type="kml:anglepos180Type" default="0.0"/> + <xsd:element name="topFov" type="kml:angle90Type" default="0.0"/> + <xsd:element name="value" type="string"/> + <xsd:element name="viewBoundScale" type="double" default="1.0"/> + <xsd:element name="viewFormat" type="string"/> + <xsd:element name="viewRefreshMode" type="kml:viewRefreshModeEnumType" + default="never"/> + <xsd:element name="viewRefreshTime" type="double" default="4.0"/> + <xsd:element name="visibility" type="boolean" default="1"/> + <xsd:element name="west" type="kml:angle180Type" default="-180.0"/> + <xsd:element name="when" type="kml:dateTimeType"/> + <xsd:element name="width" type="double" default="1.0"/> + <xsd:element name="x" type="double" default="1.0"/> + <xsd:element name="y" type="double" default="1.0"/> + <xsd:element name="z" type="double" default="1.0"/> + + <xsd:element name="AbstractObjectGroup" type="kml:AbstractObjectType" + abstract="true"/> + <xsd:complexType name="AbstractObjectType" abstract="true"> + <xsd:sequence> + <xsd:element ref="kml:ObjectSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="kml:idAttributes"/> + </xsd:complexType> + <xsd:element name="ObjectSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + + <xsd:attributeGroup name="idAttributes"> + <xsd:attribute name="id" type="ID" use="optional"/> + <xsd:attribute name="targetId" type="NCName" use="optional"/> + </xsd:attributeGroup> + + <xsd:element name="AbstractFeatureGroup" type="kml:AbstractFeatureType" + abstract="true" substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AbstractFeatureType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:name" minOccurs="0"/> + <xsd:element ref="kml:visibility" minOccurs="0"/> + <xsd:element ref="kml:open" minOccurs="0"/> + <xsd:element ref="atom:author" minOccurs="0"/> + <xsd:element ref="atom:link" minOccurs="0"/> + <xsd:element ref="kml:address" minOccurs="0"/> + <xsd:element ref="xal:AddressDetails" minOccurs="0"/> + <xsd:element ref="kml:phoneNumber" minOccurs="0"/> + <xsd:choice> + <xsd:annotation> + <xsd:documentation>Snippet deprecated in 2.2</xsd:documentation> + </xsd:annotation> + <xsd:element ref="kml:Snippet" minOccurs="0"/> + <xsd:element ref="kml:snippet" minOccurs="0"/> + </xsd:choice> + <xsd:element ref="kml:description" minOccurs="0"/> + <xsd:element ref="kml:AbstractViewGroup" minOccurs="0"/> + <xsd:element ref="kml:AbstractTimePrimitiveGroup" minOccurs="0"/> + <xsd:element ref="kml:styleUrl" minOccurs="0"/> + <xsd:element ref="kml:AbstractStyleSelectorGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:Region" minOccurs="0"/> + <xsd:choice> + <xsd:annotation> + <xsd:documentation>Metadata deprecated in 2.2</xsd:documentation> + </xsd:annotation> + <xsd:element ref="kml:Metadata" minOccurs="0"/> + <xsd:element ref="kml:ExtendedData" minOccurs="0"/> + </xsd:choice> + <xsd:element ref="kml:AbstractFeatureSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractFeatureObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractFeatureObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:element name="AbstractFeatureSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + + <xsd:element name="Snippet" type="kml:SnippetType"/> + <xsd:complexType name="SnippetType" final="#all"> + <xsd:simpleContent> + <xsd:extension base="string"> + <xsd:attribute name="maxLines" type="int" use="optional" default="2"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:element name="AbstractViewGroup" type="kml:AbstractViewType" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AbstractViewType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractViewSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractViewObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractViewSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractViewObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="LookAt" type="kml:LookAtType" + substitutionGroup="kml:AbstractViewGroup"/> + <xsd:complexType name="LookAtType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractViewType"> + <xsd:sequence> + <xsd:element ref="kml:longitude" minOccurs="0"/> + <xsd:element ref="kml:latitude" minOccurs="0"/> + <xsd:element ref="kml:altitude" minOccurs="0"/> + <xsd:element ref="kml:heading" minOccurs="0"/> + <xsd:element ref="kml:tilt" minOccurs="0"/> + <xsd:element ref="kml:range" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:LookAtSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LookAtObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LookAtSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LookAtObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Camera" type="kml:CameraType" + substitutionGroup="kml:AbstractViewGroup"/> + <xsd:complexType name="CameraType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractViewType"> + <xsd:sequence> + <xsd:element ref="kml:longitude" minOccurs="0"/> + <xsd:element ref="kml:latitude" minOccurs="0"/> + <xsd:element ref="kml:altitude" minOccurs="0"/> + <xsd:element ref="kml:heading" minOccurs="0"/> + <xsd:element ref="kml:tilt" minOccurs="0"/> + <xsd:element ref="kml:roll" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:CameraSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:CameraObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="CameraSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="CameraObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Metadata" type="kml:MetadataType"> + <xsd:annotation> + <xsd:documentation>Metadata deprecated in 2.2</xsd:documentation> + </xsd:annotation> + </xsd:element> + + <xsd:complexType name="MetadataType" final="#all"> + <xsd:annotation> + <xsd:documentation>MetadataType deprecated in 2.2</xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:any namespace="##any" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="ExtendedData" type="kml:ExtendedDataType"/> + <xsd:complexType name="ExtendedDataType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:Data" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:SchemaData" minOccurs="0" maxOccurs="unbounded"/> + <xsd:any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="SchemaData" type="kml:SchemaDataType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="SchemaDataType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:SimpleData" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:SchemaDataExtension" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="schemaUrl" type="anyURI"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="SchemaDataExtension" abstract="true"/> + + <xsd:element name="SimpleData" type="kml:SimpleDataType"/> + <xsd:complexType name="SimpleDataType" final="#all"> + <xsd:simpleContent> + <xsd:extension base="string"> + <xsd:attribute name="name" type="string" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:element name="Data" type="kml:DataType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="DataType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:displayName" minOccurs="0"/> + <xsd:element ref="kml:value"/> + <xsd:element ref="kml:DataExtension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="DataExtension" abstract="true"/> + + <xsd:element name="AbstractContainerGroup" type="kml:AbstractContainerType" + abstract="true" substitutionGroup="kml:AbstractFeatureGroup"/> + <xsd:complexType name="AbstractContainerType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractFeatureType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractContainerSimpleExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractContainerObjectExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractContainerSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractContainerObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="AbstractGeometryGroup" type="kml:AbstractGeometryType" + abstract="true" substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AbstractGeometryType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractGeometrySimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractGeometryObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractGeometrySimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractGeometryObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="AbstractOverlayGroup" type="kml:AbstractOverlayType" + abstract="true" substitutionGroup="kml:AbstractFeatureGroup"/> + <xsd:complexType name="AbstractOverlayType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractFeatureType"> + <xsd:sequence> + <xsd:element ref="kml:color" minOccurs="0"/> + <xsd:element ref="kml:drawOrder" minOccurs="0"/> + <xsd:element ref="kml:Icon" minOccurs="0"/> + <xsd:element ref="kml:AbstractOverlaySimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractOverlayObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractOverlaySimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractOverlayObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="AbstractStyleSelectorGroup" + type="kml:AbstractStyleSelectorType" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AbstractStyleSelectorType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractStyleSelectorSimpleExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractStyleSelectorObjectExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractStyleSelectorSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractStyleSelectorObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="AbstractTimePrimitiveGroup" + type="kml:AbstractTimePrimitiveType" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AbstractTimePrimitiveType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractTimePrimitiveSimpleExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractTimePrimitiveObjectExtensionGroup" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AbstractTimePrimitiveSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AbstractTimePrimitiveObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="kml" type="kml:KmlType"> + <xsd:annotation> + <xsd:documentation><![CDATA[ + + <kml> is the root element. + + ]]></xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:complexType name="KmlType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:NetworkLinkControl" minOccurs="0"/> + <xsd:element ref="kml:AbstractFeatureGroup" minOccurs="0"/> + <xsd:element ref="kml:KmlSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:KmlObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="hint" type="string"/> + </xsd:complexType> + <xsd:element name="KmlSimpleExtensionGroup" abstract="true" type="anySimpleType"/> + <xsd:element name="KmlObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="NetworkLinkControl" type="kml:NetworkLinkControlType"/> + <xsd:complexType name="NetworkLinkControlType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:minRefreshPeriod" minOccurs="0"/> + <xsd:element ref="kml:maxSessionLength" minOccurs="0"/> + <xsd:element ref="kml:cookie" minOccurs="0"/> + <xsd:element ref="kml:message" minOccurs="0"/> + <xsd:element ref="kml:linkName" minOccurs="0"/> + <xsd:element ref="kml:linkDescription" minOccurs="0"/> + <xsd:element ref="kml:linkSnippet" minOccurs="0"/> + <xsd:element ref="kml:expires" minOccurs="0"/> + <xsd:element ref="kml:Update" minOccurs="0"/> + <xsd:element ref="kml:AbstractViewGroup" minOccurs="0"/> + <xsd:element ref="kml:NetworkLinkControlSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:NetworkLinkControlObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="NetworkLinkControlSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="NetworkLinkControlObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Document" type="kml:DocumentType" + substitutionGroup="kml:AbstractContainerGroup"/> + <xsd:complexType name="DocumentType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractContainerType"> + <xsd:sequence> + <xsd:element ref="kml:Schema" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:AbstractFeatureGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:DocumentSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:DocumentObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="DocumentSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="DocumentObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Schema" type="kml:SchemaType"/> + <xsd:complexType name="SchemaType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:SimpleField" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:SchemaExtension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="string"/> + <xsd:attribute name="id" type="ID"/> + </xsd:complexType> + <xsd:element name="SchemaExtension" abstract="true"/> + + <xsd:element name="SimpleField" type="kml:SimpleFieldType"/> + <xsd:complexType name="SimpleFieldType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:displayName" minOccurs="0"/> + <xsd:element ref="kml:SimpleFieldExtension" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="type" type="string"/> + <xsd:attribute name="name" type="string"/> + </xsd:complexType> + <xsd:element name="SimpleFieldExtension" abstract="true"/> + + <xsd:element name="Folder" type="kml:FolderType" + substitutionGroup="kml:AbstractContainerGroup"/> + <xsd:complexType name="FolderType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractContainerType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractFeatureGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:FolderSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:FolderObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="FolderSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="FolderObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Placemark" type="kml:PlacemarkType" + substitutionGroup="kml:AbstractFeatureGroup"/> + <xsd:complexType name="PlacemarkType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractFeatureType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractGeometryGroup" minOccurs="0"/> + <xsd:element ref="kml:PlacemarkSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:PlacemarkObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="PlacemarkSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="PlacemarkObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="NetworkLink" type="kml:NetworkLinkType" + substitutionGroup="kml:AbstractFeatureGroup"/> + <xsd:complexType name="NetworkLinkType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractFeatureType"> + <xsd:sequence> + <xsd:element ref="kml:refreshVisibility" minOccurs="0"/> + <xsd:element ref="kml:flyToView" minOccurs="0"/> + <xsd:choice> + <xsd:annotation> + <xsd:documentation>Url deprecated in 2.2</xsd:documentation> + </xsd:annotation> + <xsd:element ref="kml:Url" minOccurs="0"/> + <xsd:element ref="kml:Link" minOccurs="0"/> + </xsd:choice> + <xsd:element ref="kml:NetworkLinkSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:NetworkLinkObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="NetworkLinkSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="NetworkLinkObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Region" type="kml:RegionType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="RegionType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:LatLonAltBox" minOccurs="0"/> + <xsd:element ref="kml:Lod" minOccurs="0"/> + <xsd:element ref="kml:RegionSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:RegionObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="RegionSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="RegionObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="LatLonAltBox" type="kml:LatLonAltBoxType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="LatLonAltBoxType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractLatLonBoxType"> + <xsd:sequence> + <xsd:element ref="kml:minAltitude" minOccurs="0"/> + <xsd:element ref="kml:maxAltitude" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:LatLonAltBoxSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LatLonAltBoxObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LatLonAltBoxSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LatLonAltBoxObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Lod" type="kml:LodType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="LodType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:minLodPixels" minOccurs="0"/> + <xsd:element ref="kml:maxLodPixels" minOccurs="0"/> + <xsd:element ref="kml:minFadeExtent" minOccurs="0"/> + <xsd:element ref="kml:maxFadeExtent" minOccurs="0"/> + <xsd:element ref="kml:LodSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LodObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LodSimpleExtensionGroup" abstract="true" type="anySimpleType"/> + <xsd:element name="LodObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Icon" type="kml:LinkType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:element name="Link" type="kml:LinkType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:element name="Url" type="kml:LinkType" + substitutionGroup="kml:AbstractObjectGroup"> + <xsd:annotation> + <xsd:documentation>Url deprecated in 2.2</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:complexType name="LinkType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:BasicLinkType"> + <xsd:sequence> + <xsd:element ref="kml:refreshMode" minOccurs="0"/> + <xsd:element ref="kml:refreshInterval" minOccurs="0"/> + <xsd:element ref="kml:viewRefreshMode" minOccurs="0"/> + <xsd:element ref="kml:viewRefreshTime" minOccurs="0"/> + <xsd:element ref="kml:viewBoundScale" minOccurs="0"/> + <xsd:element ref="kml:viewFormat" minOccurs="0"/> + <xsd:element ref="kml:httpQuery" minOccurs="0"/> + <xsd:element ref="kml:LinkSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LinkObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LinkSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LinkObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="MultiGeometry" type="kml:MultiGeometryType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="MultiGeometryType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:AbstractGeometryGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:MultiGeometrySimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:MultiGeometryObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="MultiGeometrySimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="MultiGeometryObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Point" type="kml:PointType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="PointType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:extrude" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:coordinates" minOccurs="0"/> + <xsd:element ref="kml:PointSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:PointObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="PointSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="PointObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="LineString" type="kml:LineStringType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="LineStringType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:extrude" minOccurs="0"/> + <xsd:element ref="kml:tessellate" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:coordinates" minOccurs="0"/> + <xsd:element ref="kml:LineStringSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LineStringObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LineStringSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LineStringObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="LinearRing" type="kml:LinearRingType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="LinearRingType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:extrude" minOccurs="0"/> + <xsd:element ref="kml:tessellate" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:coordinates" minOccurs="0"/> + <xsd:element ref="kml:LinearRingSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LinearRingObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LinearRingSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LinearRingObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Polygon" type="kml:PolygonType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="PolygonType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:extrude" minOccurs="0"/> + <xsd:element ref="kml:tessellate" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:outerBoundaryIs" minOccurs="0"/> + <xsd:element ref="kml:innerBoundaryIs" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:PolygonSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:PolygonObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="PolygonSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="PolygonObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="outerBoundaryIs" type="kml:BoundaryType"/> + <xsd:element name="innerBoundaryIs" type="kml:BoundaryType"/> + <xsd:complexType name="BoundaryType" final="#all"> + <xsd:sequence> + <xsd:element ref="kml:LinearRing" minOccurs="0"/> + <xsd:element ref="kml:BoundarySimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:BoundaryObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="BoundarySimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="BoundaryObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Model" type="kml:ModelType" + substitutionGroup="kml:AbstractGeometryGroup"/> + <xsd:complexType name="ModelType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractGeometryType"> + <xsd:sequence> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:Location" minOccurs="0"/> + <xsd:element ref="kml:Orientation" minOccurs="0"/> + <xsd:element ref="kml:Scale" minOccurs="0"/> + <xsd:element ref="kml:Link" minOccurs="0"/> + <xsd:element ref="kml:ResourceMap" minOccurs="0"/> + <xsd:element ref="kml:ModelSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:ModelObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="ModelSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="ModelObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Location" type="kml:LocationType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="LocationType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:longitude" minOccurs="0"/> + <xsd:element ref="kml:latitude" minOccurs="0"/> + <xsd:element ref="kml:altitude" minOccurs="0"/> + <xsd:element ref="kml:LocationSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:LocationObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="LocationSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="LocationObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Orientation" type="kml:OrientationType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="OrientationType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:heading" minOccurs="0"/> + <xsd:element ref="kml:tilt" minOccurs="0"/> + <xsd:element ref="kml:roll" minOccurs="0"/> + <xsd:element ref="kml:OrientationSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:OrientationObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="OrientationSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="OrientationObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Scale" type="kml:ScaleType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="ScaleType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:x" minOccurs="0"/> + <xsd:element ref="kml:y" minOccurs="0"/> + <xsd:element ref="kml:z" minOccurs="0"/> + <xsd:element ref="kml:ScaleSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:ScaleObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="ScaleSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="ScaleObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="ResourceMap" type="kml:ResourceMapType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="ResourceMapType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:Alias" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="kml:ResourceMapSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:ResourceMapObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="ResourceMapSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="ResourceMapObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="Alias" type="kml:AliasType" + substitutionGroup="kml:AbstractObjectGroup"/> + <xsd:complexType name="AliasType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractObjectType"> + <xsd:sequence> + <xsd:element ref="kml:targetHref" minOccurs="0"/> + <xsd:element ref="kml:sourceHref" minOccurs="0"/> + <xsd:element ref="kml:AliasSimpleExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element ref="kml:AliasObjectExtensionGroup" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="AliasSimpleExtensionGroup" abstract="true" + type="anySimpleType"/> + <xsd:element name="AliasObjectExtensionGroup" abstract="true" + substitutionGroup="kml:AbstractObjectGroup"/> + + <xsd:element name="GroundOverlay" type="kml:GroundOverlayType" + substitutionGroup="kml:AbstractOverlayGroup"/> + <xsd:complexType name="GroundOverlayType" final="#all"> + <xsd:complexContent> + <xsd:extension base="kml:AbstractOverlayType"> + <xsd:sequence> + <xsd:element ref="kml:altitude" minOccurs="0"/> + <xsd:element ref="kml:altitudeModeGroup" minOccurs="0"/> + <xsd:element ref="kml:LatLonBox" minOccurs="0"/> + <xsd:element ref="km... [truncated message content] |
From: <jb...@us...> - 2010-02-22 06:39:02
|
Revision: 514 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=514&view=rev Author: jblance Date: 2010-02-22 06:38:56 +0000 (Mon, 22 Feb 2010) Log Message: ----------- Update to edit record window in preparation for editing import info - currently incomplete and not visible Modified Paths: -------------- pytrainer/trunk/glade/newrecord.glade pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/newrecord.glade =================================================================== --- pytrainer/trunk/glade/newrecord.glade 2010-02-17 09:27:56 UTC (rev 513) +++ pytrainer/trunk/glade/newrecord.glade 2010-02-22 06:38:56 UTC (rev 514) @@ -12,6 +12,24 @@ <property name="visible">True</property> <property name="orientation">vertical</property> <child> + <widget class="GtkScrolledWindow" id="scrolledwindowEntries"> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTreeView" id="treeviewEntries"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> <widget class="GtkNotebook" id="notebook2"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1079,7 +1097,8 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">0</property> + <property name="pack_type">end</property> + <property name="position">1</property> </packing> </child> <child> @@ -1130,7 +1149,8 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">1</property> + <property name="pack_type">end</property> + <property name="position">0</property> </packing> </child> </widget> Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-17 09:27:56 UTC (rev 513) +++ pytrainer/trunk/pytrainer/main.py 2010-02-22 06:38:56 UTC (rev 514) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#513" + self.version ="1.7.1_svn#514" self.DB_version = 3 #Setup usage and permitted options This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-17 09:28:02
|
Revision: 513 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=513&view=rev Author: jblance Date: 2010-02-17 09:27:56 +0000 (Wed, 17 Feb 2010) Log Message: ----------- Small tidy up of globals in main.py Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-15 10:40:37 UTC (rev 512) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-17 09:27:56 UTC (rev 513) @@ -80,7 +80,7 @@ #Disable import menu item unless specified on startup if not self.testimport: self.menu_importdata.set_sensitive(0) - + def _createXmlListView(self,file): menufile = XMLParser(file) savedOptions = [] @@ -117,7 +117,7 @@ def runExtension(self,widget,widget2,extension): txtbutton,extensioncode,extensiontype = extension if extensiontype=="record": - selected,iter = self.recordTreeView.get_selection().get_selected() + selected,iter = self.recordTreeView.get_selection().get_selected() id = selected.get_value(iter,0) self.parent.runExtension(extension,id) @@ -1042,12 +1042,12 @@ self.actualize_yearview() def on_recordTree_clicked(self,widget,num,num2): - selected,iter = self.recordTreeView.get_selection().get_selected() + selected,iter = self.recordTreeView.get_selection().get_selected() self.parent.editRecord(selected.get_value(iter,0)) ######## waypoints events ########## def on_savewaypoint_clicked(self,widget): - selected,iter = self.waypointTreeView.get_selection().get_selected() + selected,iter = self.waypointTreeView.get_selection().get_selected() id_waypoint = selected.get_value(iter,0) lat = self.waypoint_latitude.get_text() lon = self.waypoint_longitude.get_text() @@ -1057,7 +1057,7 @@ self.parent.updateWaypoint(id_waypoint,lat,lon,name,desc,sym) def on_removewaypoint_clicked(self,widget): - selected,iter = self.waypointTreeView.get_selection().get_selected() + selected,iter = self.waypointTreeView.get_selection().get_selected() id_waypoint = selected.get_value(iter,0) self.parent.removeWaypoint(id_waypoint) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-15 10:40:37 UTC (rev 512) +++ pytrainer/trunk/pytrainer/main.py 2010-02-17 09:27:56 UTC (rev 513) @@ -60,60 +60,53 @@ from lib.system import checkConf from lib.heartrate import * - -##TODO The below should all be able to be in the __init__ section, i.e. does not need to be global - -# ERROR is the default log level -PATH = os.environ['HOME']+"/.pytrainer" -if not os.path.exists(PATH): - os.mkdir(PATH) -LOG_FILENAME = PATH + "/log.out" - -#Setup usage and permitted options -usage = """usage: %prog [options] - -For more help on valid options try: - %prog -h """ -parser = OptionParser(usage=usage) -parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False) -parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") -parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") -parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") -parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") -parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") -parser.add_option("--gmaps2", action="store_false", dest="gm3", help="Use old Google Maps API version (v2)") -parser.add_option("--testimport", action="store_true", dest="testimport", help="EXPERIMENTAL: show new import functionality - for testing only USE AT YOUR OWN RISK") -(options, args) = parser.parse_args() -log_level = options.log_level -validate = options.validate -check = options.check -gm3 = options.gm3 -testimport = options.testimport - -# Adding rotating support to default logger with customized format -rotHandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=100000, backupCount=5) -formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s') -rotHandler.setFormatter(formatter) -logging.getLogger('').addHandler(rotHandler) -logging.getLogger('').setLevel(log_level) - class pyTrainer: def __init__(self,filename = None, data_path = None): + #Version constants + self.version ="1.7.1_svn#513" + self.DB_version = 3 + + #Setup usage and permitted options + usage = '''usage: %prog [options] + + For more help on valid options try: + %prog -h ''' + parser = OptionParser(usage=usage) + parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False) + parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") + parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") + parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") + parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") + parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") + parser.add_option("--gmaps2", action="store_false", dest="gm3", help="Use old Google Maps API version (v2)") + parser.add_option("--testimport", action="store_true", dest="testimport", help="EXPERIMENTAL: show new import functionality - for testing only USE AT YOUR OWN RISK") + (options, args) = parser.parse_args() + #Populate startup options + self.log_level = options.log_level + self.validate = options.validate + self.check = options.check + self.gm3 = options.gm3 + self.testimport = options.testimport + + PATH = os.environ['HOME']+"/.pytrainer" + if not os.path.exists(PATH): + os.mkdir(PATH) + LOG_FILENAME = PATH + "/log.out" + + # Adding rotating support to default logger with customized format + rotHandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=100000, backupCount=5) + formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s') + rotHandler.setFormatter(formatter) + logging.getLogger('').addHandler(rotHandler) + logging.getLogger('').setLevel(self.log_level) + logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#512" - self.DB_version = 3 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) self.profile.isProfileConfigured() - #Populate startup options - self.log_level = log_level - self.validate = validate - self.check = check - self.gm3 = gm3 - self.testimport = testimport - + self.windowmain = None logging.debug('checking configuration...') @@ -475,57 +468,3 @@ logging.info('Setting DB version to: ' + str(self.DB_version)) self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - - #def addDateTimeUTC(self): #TODO remove - """12.07.2008 - dgranda - Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 - args: none - returns: none""" - '''logging.debug('>>') - # Retrieves info from all GPX files stored locally - listTracksGPX = self.record.shortFromLocal() - logging.debug('Retrieved info from local files: '+ str(listTracksGPX)) - # Creates column date_time_utc in records table - try: - self.ddbb.addDateTimeUTC2ddbb() - except: - logging.error('Column date_time_utc already exists in DB') - traceback.print_exc() - # Updates data - num=0 - for track in listTracksGPX: - try: - # update records set date_time_utc="2008-07-11T10:21:31Z" where id_record='158'; - logging.debug('Updating: '+str(track)) - self.ddbb.update("records","date_time_utc",[track[1]], "id_record = %d" %int(track[2])) - num+=1 - except: - logging.error('Error when updating data for track '+ track[2]) - traceback.print_exc() - logging.info('Updated '+str(num)+' entries') - logging.debug('<<')''' - - #def checkPacesDB(self): #TODO remove - """19.07.2008 - dgranda - Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 - args: none - returns: none""" - '''logging.debug('>>') - # Retrieves info from DB: id_record,maxspeed,maxpace,average,pace - listPaces = self.ddbb.select("records", "id_record,maxspeed,maxpace,average,pace") - logging.debug('Retrieved info from db: '+ str(listPaces)) - num=0 - for entry in listPaces: - if entry[1]>0 and entry[3]>0: - tmpMax = "%d.%02d" %((3600/entry[1])/60,(3600/entry[1])%60) - tmpAve = "%d.%02d" %((3600/entry[3])/60,(3600/entry[3])%60) - try: - self.ddbb.update("records","maxpace,pace",[eval(tmpMax),eval(tmpAve)], "id_record = %d" %int(entry[0])) - num+=1 - except: - logging.error('Error when updating data for track '+ entry[0]) - traceback.print_last() - else: - logging.error('No pace info available for entry '+str(entry[0])+' in DB. Please check') - logging.info('Updated '+str(num)+' entries') - logging.debug('<<')''' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-15 10:40:44
|
Revision: 512 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=512&view=rev Author: jblance Date: 2010-02-15 10:40:37 +0000 (Mon, 15 Feb 2010) Log Message: ----------- Unified import - plugins tab now functional Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/gui/windowplugins.py pytrainer/trunk/pytrainer/importdata.py pytrainer/trunk/pytrainer/main.py Added Paths: ----------- pytrainer/trunk/glade/plugins.glade Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/glade/importdata.glade 2010-02-15 10:40:37 UTC (rev 512) @@ -381,11 +381,65 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vboxPlugins"> + <widget class="GtkVBox" id="vboxPluginsTab"> <property name="visible">True</property> <property name="orientation">vertical</property> <child> - <placeholder/> + <widget class="GtkVBox" id="vboxPlugins"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkHBox" id="hboxPluginsButtons"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkButton" id="buttonPluginsClose"> + <property name="label">gtk-close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_buttonPluginsClose_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkStatusbar" id="statusbarPlugins"> + <property name="visible">True</property> + <property name="spacing">2</property> + <property name="has_resize_grip">False</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> </child> </widget> <packing> @@ -454,6 +508,27 @@ <property name="position">1</property> </packing> </child> + <child> + <widget class="GtkRadioButton" id="radiobuttonPlugins"> + <property name="label" translatable="yes">Plugins</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="yalign">0.4699999988079071</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">radiobuttonTabGPSDevice</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">10</property> + <property name="position">2</property> + </packing> + </child> + <child> + <placeholder/> + </child> </widget> </child> </widget> Added: pytrainer/trunk/glade/plugins.glade =================================================================== --- pytrainer/trunk/glade/plugins.glade (rev 0) +++ pytrainer/trunk/glade/plugins.glade 2010-02-15 10:40:37 UTC (rev 512) @@ -0,0 +1,224 @@ +<?xml version="1.0"?> +<glade-interface> + <!-- interface-requires gtk+ 2.16 --> + <!-- interface-naming-policy toplevel-contextual --> + <widget class="GtkWindow" id="plugins"> + <property name="width_request">650</property> + <property name="height_request">230</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Plugins</property> + <property name="icon">logo_mini.png</property> + <child> + <widget class="GtkHBox" id="hbox34"> + <property name="width_request">32</property> + <property name="height_request">16</property> + <property name="visible">True</property> + <property name="border_width">9</property> + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow5"> + <property name="width_request">230</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <child> + <widget class="GtkTreeView" id="pluginsTreeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="rules_hint">True</property> + <signal name="button_release_event" handler="on_pluginsTree_clicked"/> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox21"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkTable" id="table12"> + <property name="visible">True</property> + <property name="border_width">5</property> + <property name="n_rows">4</property> + <property name="n_columns">2</property> + <property name="column_spacing">5</property> + <property name="row_spacing">5</property> + <child> + <widget class="GtkLabel" id="label-2147483647"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Plugin Details</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="descriptionEntry"> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">description-entry </property> + <property name="use_underline">True</property> + <property name="wrap">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11113"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Description:</property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="statusEntry"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">status-entry</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11114"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Status:</property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="nameEntry"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">nameEntry</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11112"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Name:</property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox35"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label11118"> + <property name="visible">True</property> + </widget> + <packing> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11119"> + <property name="visible">True</property> + </widget> + <packing> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button32"> + <property name="label">gtk-preferences</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_preferences_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button33"> + <property name="label">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_accept_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/glade/pytrainer.glade 2010-02-15 10:40:37 UTC (rev 512) @@ -9090,393 +9090,6 @@ </child> </widget> -<widget class="GtkWindow" id="plugins"> - <property name="width_request">650</property> - <property name="height_request">230</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Plugins</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="icon">logo_mini.png</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - - <child> - <widget class="GtkHBox" id="hbox34"> - <property name="border_width">9</property> - <property name="width_request">32</property> - <property name="height_request">16</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow5"> - <property name="width_request">230</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTreeView" id="pluginsTreeview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">True</property> - <property name="rules_hint">True</property> - <property name="reorderable">False</property> - <property name="enable_search">True</property> - <property name="fixed_height_mode">False</property> - <property name="hover_selection">False</property> - <property name="hover_expand">False</property> - <signal name="button_release_event" handler="on_pluginsTree_clicked" last_modification_time="Tue, 27 Mar 2007 11:56:15 GMT"/> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox21"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkTable" id="table12"> - <property name="border_width">5</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">5</property> - <property name="column_spacing">5</property> - - <child> - <widget class="GtkLabel" id="label-2147483647"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Plugin Details</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="descriptionEntry"> - <property name="height_request">78</property> - <property name="visible">True</property> - <property name="label" translatable="yes">description-entry </property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">True</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label11113"> - <property name="visible">True</property> - <property name="label" translatable="yes">Description:</property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="statusEntry"> - <property name="visible">True</property> - <property name="label" translatable="yes">status-entry</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label11114"> - <property name="visible">True</property> - <property name="label" translatable="yes">Status:</property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="nameEntry"> - <property name="visible">True</property> - <property name="label" translatable="yes">nameEntry</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label11112"> - <property name="visible">True</property> - <property name="label" translatable="yes">Name:</property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox35"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkLabel" id="label11118"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label11119"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button32"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-preferences</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_preferences_clicked" last_modification_time="Tue, 31 Oct 2006 10:35:46 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button33"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_accept_clicked" last_modification_time="Tue, 31 Oct 2006 11:54:10 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - <widget class="GtkWindow" id="selecttrackdialog"> <property name="width_request">350</property> <property name="height_request">235</property> Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-15 10:40:37 UTC (rev 512) @@ -28,21 +28,22 @@ from pytrainer.gui.dialogs import fileChooserDialog class WindowImportdata(SimpleGladeApp): - def __init__(self, data_path = None, parent=None, config=None): + def __init__(self, data_path = None, parent=None, config=None, pytrainer_main=None): self.data_path = data_path self.glade_path=data_path+"glade/importdata.glade" self.root = "win_importdata" self.domain = None self.parent = parent + self.pytrainer_main = pytrainer_main self.configuration = config self.activities_store = None self.files_store = None self.processClasses = [] self.plugins = Plugins(data_path, self.parent.parent) - #SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) + SimpleGladeApp.__init__(self, self.glade_path, self.root, self.domain) - def run(self): - SimpleGladeApp.__init__(self, self.glade_path, self.root, self.domain) + #def run(self): + # SimpleGladeApp.__init__(self, self.glade_path, self.root, self.domain) def new(self): self.defaulttab = self.configuration.getValue("pytraining","import_default_tab") @@ -96,10 +97,10 @@ return def init_plugins_tab(self): - #Remove all components in vbox - in case of re-detection + #Remove components in vbox - in case of re-detection for child in self.vboxPlugins.get_children(): - print "removing ", child - self.vboxPlugins.remove(child) + if isinstance(child, gtk.Table): + self.vboxPlugins.remove(child) pluginList = self.plugins.getPluginsList() for plugin in pluginList: #Store plugin details @@ -117,29 +118,24 @@ pluginFrame.add(description) #Get plugin information name,description,status = self.plugins.getPluginInfo(pluginClass) - #get plugin conf params ## These are the default params, need to get those stored for the user - #params = self.plugins.getPluginConfParams(pluginClass) - #print params - #Create buttons - statusButton = gtk.Button(label="Disable") - statusButton.connect('clicked', self.pluginsButton_clicked, pluginClass) - configButton = gtk.Button(label="Configure") - configButton.connect('clicked', self.pluginsButton_clicked, pluginClass) - runButton = gtk.Button(label="Run") - runButton.connect('clicked', self.pluginsButton_clicked, pluginClass) - + #Create labels and buttons + configButton = gtk.Button(label=_("Configure")) + runButton = gtk.Button(label=_("Run")) + #Connect button handlers + configButton.connect('clicked', self.on_pluginsButton_Configure_clicked, pluginClass) + runButton.connect('clicked', self.on_pluginsButton_Run_clicked, pluginClass) if status == 0 or status == "0": #Plugin disabled pluginFrame.set_sensitive(0) - statusButton.set_label("Enable") - configButton.set_sensitive(0) runButton.set_sensitive(0) + statusLabel = gtk.Label(_("Disabled")) else: - pass + statusLabel = gtk.Label(_("Enabled")) + #Create a table for the frame and button pluginTable = gtk.Table() pluginTable.attach(pluginFrame, 0, 1, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) - pluginTable.attach(statusButton, 1, 2, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) + pluginTable.attach(statusLabel, 1, 2, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) pluginTable.attach(configButton, 2, 3, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) pluginTable.attach(runButton, 3, 4, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) #Add frame to tab @@ -151,24 +147,25 @@ #Set correct radiobutton based on saved preference if self.defaulttab == 1: self.radiobuttonFile.set_active(1) + elif self.defaulttab == 2: + self.radiobuttonPlugins.set_active(1) else: self.radiobuttonTabGPSDevice.set_active(1) return def detect_tools(self): - """ + ''' Iterate through all tool files from import directory Each file contains information on a particular tool and knows how to determine if the tool is present on the system and what configuration options are needed for the tool Currently displays the tool info and config grayed out if tool is not present - """ + ''' logging.debug('>>') self.updateStatusbar(self.statusbarDevice, "Checking for tools") #Remove all components in vbox - in case of re-detection for child in self.vboxImportTools.get_children(): - print "removing ", child self.vboxImportTools.remove(child) #Get import tool_* files fileList = glob.glob(self.data_path+"import/tool_*.py") @@ -213,7 +210,7 @@ self.win_importdata.show_all() def validateFile(self, import_filename): - """ + ''' Iterate through all supported types of file by reading processing files from import directory Each processing file understands one type of file @@ -221,7 +218,7 @@ returns the instantiated class otherwise: returns None - """ + ''' logging.debug('>>') self.updateStatusbar(self.statusbarImportFile, "Checking file type for: " + import_filename) #Get import files_* files @@ -308,27 +305,27 @@ return store def checkTreestoreForSelection(self, store): - """ + ''' Function iterates over store checking if any items are selected returns True if at least one item is selected, False otherwise Checks item in position 1 only - """ + ''' for item in store: if item[1]: return True return False def treeviewImportFiles_toggled_checkbox(self, cell, path, store): - """ + ''' Sets the state of the checkbox to true or false. - """ + ''' store[path][1] = not store[path][1] self.buttonRemoveSelectedFiles.set_sensitive(self.checkTreestoreForSelection(store)) def treeviewImportEvents_toggled_checkbox(self, cell, path, store): - """ + ''' Sets the state of the checkbox to true or false. - """ + ''' store[path][1] = not store[path][1] self.buttonFileImport.set_sensitive(self.checkTreestoreForSelection(store)) @@ -354,15 +351,17 @@ self.defaulttab = "0" elif self.radiobuttonFile.get_active(): self.defaulttab = "1" + elif self.radiobuttonPlugins.get_active(): + self.defaulttab = "2" self.configuration.setValue("pytraining","import_default_tab",self.defaulttab) #option def removeSelectedFiles(self): - """ + ''' Function to determine which files are selected * remove them from the list * remove the associated activities from the list also - """ + ''' if self.files_store is None: return file_index = 0 @@ -438,22 +437,78 @@ def close_window(self): self.win_importdata.hide() - self.win_importdata.destroy() + #self.win_importdata.destroy() + self.quit() ############################ ## Window signal handlers ## ############################ - def pluginsButton_clicked(self, button, pluginClass): + def on_pluginsButton_Configure_clicked(self, button, pluginClass): ''' Handler for plugin Buttons ''' - print button.get_label(), pluginClass - + name,description,status = self.plugins.getPluginInfo(pluginClass) + prefs = self.plugins.getPluginConfParams(pluginClass) + + self.prefwindow = gtk.Window() + self.prefwindow.set_border_width(20) + self.prefwindow.set_title(_("%s settings" %name)) + + table = gtk.Table(1,2) + i=0 + self.entryList = [] + for pref in prefs: + label = gtk.Label("<b>%s</b>"%pref[0]) + label.set_use_markup(True) + if pref[0] != "status": + entry = gtk.Entry() + entry.set_text(pref[1]) + self.entryList.append(entry) + table.attach(entry,1,2,i,i+1) + else: + combobox = gtk.combo_box_new_text() + combobox.append_text(_("Disable")) + combobox.append_text(_("Enable")) + combobox.set_active(int(pref[1])) + table.attach(combobox,1,2,i,i+1) + self.entryList.append(combobox) + table.attach(label,0,1,i,i+1) + i+=1 + + button = gtk.Button(_("Ok")) + button.connect("clicked", self.on_pluginAcceptSettings_clicked, pluginClass) + table.attach(button,0,2,i,i+1) + self.prefwindow.add(table) + self.prefwindow.show_all() + + def on_pluginsButton_Run_clicked(self, button, pluginClass): + ''' + Handler for plugin Buttons + ''' + self.pytrainer_main.runPlugin(button,pluginClass) + + def on_pluginAcceptSettings_clicked(self, widget, pluginClass): + prefs = self.plugins.getPluginConfParams(pluginClass) + savedOptions = [] + i = 0 + for pref in prefs: + try: + savedOptions.append((pref[0],self.entryList[i].get_text())) + except: + combobox = self.entryList[i] + index = combobox.get_active() + savedOptions.append((pref[0],"%s" %index)) + i+=1 + self.prefwindow.hide() + self.prefwindow = None + self.plugins.setPluginConfParams(pluginClass,savedOptions) + self.init_plugins_tab() + def treeviewImportEvents_header_checkbox(self, column, store): - """ + ''' Handler for click on checkbox column - """ + ''' if store is None: return for item in store: @@ -463,62 +518,16 @@ self.treeviewImportEvents_setCheckboxes(True) def on_win_importdata_delete_event(self, widget, window): - """ Windows closed """ + ''' Window closed ''' self.close_window() def on_notebookMainTabs_switch_page(self, notebook, page, new_page): self.init_tab(new_page) - #def on_filechooserbuttonSelectFile_file_set(self, widget): - ''' - self.buttonClearFile.set_sensitive(1) #Enable clear button - self.buttonFileImport.set_sensitive(0) #Disable import button - self.updateStatusbar(self.statusbarImportFile, "" ) #Clear status bar - #Clear store - if self.activities_store is not None: - self.activities_store.clear() - #Validate file - self.processClass = self.validateFile(self.filechooserbuttonSelectFile.get_filename()) - if self.processClass is not None: - self.updateStatusbar(self.statusbarImportFile, _("Found file of type: %s") % self.processClass.getFileType() ) - #Get activities in file - activitiesSummary = self.processClass.getActivitiesSummary() - for activity in activitiesSummary: - if not activity[1]: - #Activity selected, so enable import button - self.buttonFileImport.set_sensitive(1) - note = "" - else: - note = _("Found in database") - #Add activity details to TreeView store to display - iter = self.activities_store.append() - self.activities_store.set( - iter, - 0, activity[0], - 1, not activity[1], - 2, activity[2], - 3, activity[3], - 4, activity[4], - 5, activity[5], - 6, note, - ) - else: - #Selected file not understood by any of the process files - self.updateStatusbar(self.statusbarImportFile, _("Unknown file type") ) - #Display error - msg = _("File selected is of unknown or unsupported file type") - md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) - md.set_title("Error") - md.run() - md.destroy()''' - - #def on_buttonClearFile_clicked(self, widget): - # self.init_tab(1) - def on_buttonOptionsSave_clicked(self, widget): - self.updateStatusbar(self.statusbarOptions, "Saving options") + self.updateStatusbar(self.statusbarOptions, _("Saving options")) self.saveOptions() - self.updateStatusbar(self.statusbarOptions, "Options saved") + self.updateStatusbar(self.statusbarOptions, _("Options saved")) def on_buttonOptionsReset_clicked(self, widget): #GPS Device is default @@ -557,7 +566,7 @@ self.buttonFileImport.set_sensitive(0) #Disable import button def on_buttonSelectFiles_clicked(self, widget): - selectedFiles = fileChooserDialog(title="Choose a file (or files) to import activities from", multiple=True).getFiles() + selectedFiles = fileChooserDialog(title=_("Choose a file (or files) to import activities from"), multiple=True).getFiles() while gtk.events_pending(): # This allows the GUI to update gtk.main_iteration() # before completion of this entire action if selectedFiles is None or len(selectedFiles) == 0: @@ -618,6 +627,9 @@ def on_buttonOptionsClose_clicked(self, widget): self.close_window() + + def on_buttonPluginsClose_clicked(self, widget): + self.close_window() def on_buttonDeviceToolRescan_clicked(self, widget): self.detect_tools() Modified: pytrainer/trunk/pytrainer/gui/windowplugins.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowplugins.py 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/pytrainer/gui/windowplugins.py 2010-02-15 10:40:37 UTC (rev 512) @@ -23,7 +23,7 @@ class WindowPlugins(SimpleGladeApp): def __init__(self, data_path = None, parent=None): - glade_path="glade/pytrainer.glade" + glade_path="glade/plugins.glade" root = "plugins" domain = None self.parent = parent @@ -61,7 +61,6 @@ i+=1 def on_pluginsTree_clicked(self,widget,widget2): - print "clicked" selected,iter = self.pluginsTreeview.get_selection().get_selected() name,description,status = self.parent.getPluginInfo(selected.get_value(iter,0)) self.nameEntry.set_text(name) Modified: pytrainer/trunk/pytrainer/importdata.py =================================================================== --- pytrainer/trunk/pytrainer/importdata.py 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/pytrainer/importdata.py 2010-02-15 10:40:37 UTC (rev 512) @@ -27,9 +27,10 @@ def __init__(self, data_path = None, parent = None, config = None): self.data_path=data_path self.parent = parent + self.pytrainer_main = parent #self.conf = checkConf() self.configuration = config def runImportdata(self): - windowImportdata = WindowImportdata(self.data_path, self, self.configuration) + windowImportdata = WindowImportdata(self.data_path, self, self.configuration, self.pytrainer_main) windowImportdata.run() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-15 08:26:32 UTC (rev 511) +++ pytrainer/trunk/pytrainer/main.py 2010-02-15 10:40:37 UTC (rev 512) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#511" + self.version ="1.7.1_svn#512" self.DB_version = 3 self.date = Date() # Checking profile @@ -369,7 +369,11 @@ def importData(self): logging.debug('>>') + activeplugins_before = self.plugins.getActivePlugins() self.importdata.runImportdata() + activeplugins_after = self.plugins.getActivePlugins() + #Need to check for plugins that have been disabled (were active and now are not) + self.setMenuPlugins(activeplugins_before, activeplugins_after) logging.debug('<<') def editGpsPlugins(self): @@ -378,6 +382,12 @@ self.plugins.managePlugins() activeplugins_after = self.plugins.getActivePlugins() #Need to check for plugins that have been disabled (were active and now are not) + self.setMenuPlugins(activeplugins_before, activeplugins_after) + logging.debug('<<') + + def setMenuPlugins(self, activeplugins_before, activeplugins_after): + logging.debug('>>') + #Need to check for plugins that have been disabled (were active and now are not) for plugin in activeplugins_before: if plugin not in activeplugins_after: #disabled plugin -> need to unload plugin This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-15 08:26:39
|
Revision: 511 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=511&view=rev Author: jblance Date: 2010-02-15 08:26:32 +0000 (Mon, 15 Feb 2010) Log Message: ----------- Bug fixes in Unified Import - file import tab Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-02-08 08:03:51 UTC (rev 510) +++ pytrainer/trunk/glade/importdata.glade 2010-02-15 08:26:32 UTC (rev 511) @@ -222,6 +222,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Add files to import activities from</property> <property name="use_stock">True</property> <property name="focus_on_click">False</property> <signal name="clicked" handler="on_buttonSelectFiles_clicked"/> @@ -246,7 +247,7 @@ <child> <widget class="GtkLabel" id="labelSelectFileFrame"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Select file(s) to import activities from</b></property> + <property name="label" translatable="yes"><b>Add file(s) to import activities from</b></property> <property name="use_markup">True</property> <property name="single_line_mode">True</property> </widget> @@ -312,6 +313,7 @@ <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Import selected activities</property> <signal name="clicked" handler="on_buttonFileImport_clicked"/> </widget> <packing> @@ -328,6 +330,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Close Import dialog</property> <property name="use_stock">True</property> <signal name="clicked" handler="on_buttonFileClose_clicked"/> </widget> Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-08 08:03:51 UTC (rev 510) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-15 08:26:32 UTC (rev 511) @@ -306,28 +306,31 @@ self.treeviewImportEvents.set_headers_clickable(True) self.treeviewImportEvents.set_model(store) return store + + def checkTreestoreForSelection(self, store): + """ + Function iterates over store checking if any items are selected + returns True if at least one item is selected, False otherwise + Checks item in position 1 only + """ + for item in store: + if item[1]: + return True + return False def treeviewImportFiles_toggled_checkbox(self, cell, path, store): """ Sets the state of the checkbox to true or false. """ store[path][1] = not store[path][1] - self.buttonRemoveSelectedFiles.set_sensitive(0) - for item in store: - if item[1]: - #Only enable remove button if at least one file is selected - self.buttonRemoveSelectedFiles.set_sensitive(1) - + self.buttonRemoveSelectedFiles.set_sensitive(self.checkTreestoreForSelection(store)) + def treeviewImportEvents_toggled_checkbox(self, cell, path, store): """ Sets the state of the checkbox to true or false. """ store[path][1] = not store[path][1] - self.buttonFileImport.set_sensitive(0) - for item in store: - if item[1]: - #Only enable import button if at least one activity is selected - self.buttonFileImport.set_sensitive(1) + self.buttonFileImport.set_sensitive(self.checkTreestoreForSelection(store)) def treeviewImportEvents_setCheckboxes(self, state): """ @@ -377,6 +380,7 @@ file_index += 1 for activity_iter in activity_iters: self.activities_store.remove(activity_iter) + self.buttonFileImport.set_sensitive(self.checkTreestoreForSelection(self.activities_store)) #Set correct state for import button for file_iter in file_iters: self.files_store.remove(file_iter) @@ -425,7 +429,7 @@ def updateActivity(self, activityID, file_id, status = None, notes = None): path = 0 for item in self.activities_store: - if item[0] == activityID and item[7] == file_id: + if item[0] == activityID and item[7] == str(file_id): if status is not None: self.activities_store[path][1] = status if notes is not None: @@ -525,7 +529,6 @@ def on_buttonRemoveSelectedFiles_clicked(self, widget): #Remove selected files and associated activities from list - #TODO self.removeSelectedFiles() def on_buttonFileImport_clicked(self, widget): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-08 08:03:51 UTC (rev 510) +++ pytrainer/trunk/pytrainer/main.py 2010-02-15 08:26:32 UTC (rev 511) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#510" + self.version ="1.7.1_svn#511" self.DB_version = 3 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-08 08:03:57
|
Revision: 510 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=510&view=rev Author: jblance Date: 2010-02-08 08:03:51 +0000 (Mon, 08 Feb 2010) Log Message: ----------- Update to unified import to allow import of multiple files at once Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/import/file_gpxplus.py pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-02-03 09:49:07 UTC (rev 509) +++ pytrainer/trunk/glade/importdata.glade 2010-02-08 08:03:51 UTC (rev 510) @@ -179,33 +179,64 @@ <property name="visible">True</property> <property name="left_padding">12</property> <child> - <widget class="GtkHBox" id="hbox2"> + <widget class="GtkVBox" id="vboxImportfromFileSelectFiles"> <property name="visible">True</property> + <property name="orientation">vertical</property> <child> - <widget class="GtkFileChooserButton" id="filechooserbuttonSelectFile"> + <widget class="GtkTreeView" id="treeviewImportFiles"> <property name="visible">True</property> - <property name="create_folders">False</property> - <property name="focus_on_click">False</property> - <signal name="file_set" handler="on_filechooserbuttonSelectFile_file_set"/> + <property name="can_focus">True</property> </widget> <packing> - <property name="position">0</property> + <property name="pack_type">end</property> + <property name="position">1</property> </packing> </child> <child> - <widget class="GtkButton" id="buttonClearFile"> - <property name="label" translatable="yes">Clear</property> + <widget class="GtkHBox" id="hbox2"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="focus_on_click">False</property> - <signal name="clicked" handler="on_buttonClearFile_clicked"/> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkButton" id="buttonRemoveSelectedFiles"> + <property name="label">gtk-remove</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Remove selected files and the associated activities</property> + <property name="use_stock">True</property> + <property name="yalign">0.4699999988079071</property> + <signal name="clicked" handler="on_buttonRemoveSelectedFiles_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="buttonSelectFiles"> + <property name="label">gtk-add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <property name="focus_on_click">False</property> + <signal name="clicked" handler="on_buttonSelectFiles_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> + <property name="pack_type">end</property> + <property name="position">0</property> </packing> </child> </widget> @@ -215,7 +246,7 @@ <child> <widget class="GtkLabel" id="labelSelectFileFrame"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Select a file to import</b></property> + <property name="label" translatable="yes"><b>Select file(s) to import activities from</b></property> <property name="use_markup">True</property> <property name="single_line_mode">True</property> </widget> @@ -258,7 +289,7 @@ <child> <widget class="GtkLabel" id="labelEvents"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Select Activities to Import</b></property> + <property name="label" translatable="yes"><b>Select activities to import</b></property> <property name="use_markup">True</property> <property name="single_line_mode">True</property> </widget> Modified: pytrainer/trunk/import/file_gpxplus.py =================================================================== --- pytrainer/trunk/import/file_gpxplus.py 2010-02-03 09:49:07 UTC (rev 509) +++ pytrainer/trunk/import/file_gpxplus.py 2010-02-08 08:03:51 UTC (rev 510) @@ -51,8 +51,7 @@ logging.debug('>>') logging.debug("Testing " + filename) #Check if file is a GPX - #try: - while True: + try: #parse as xml xmldoc = etree.parse(filename) #Parse XML schema @@ -74,9 +73,9 @@ sport, ) ) return True - #except: + except: #Not gpx file - # return False + return False return False def getDateTime(self, time_): Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-03 09:49:07 UTC (rev 509) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-02-08 08:03:51 UTC (rev 510) @@ -25,6 +25,7 @@ from lxml import etree from pytrainer.plugins import Plugins +from pytrainer.gui.dialogs import fileChooserDialog class WindowImportdata(SimpleGladeApp): def __init__(self, data_path = None, parent=None, config=None): @@ -34,8 +35,9 @@ self.domain = None self.parent = parent self.configuration = config - self.store = None - self.processClass = None + self.activities_store = None + self.files_store = None + self.processClasses = [] self.plugins = Plugins(data_path, self.parent.parent) #SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) @@ -78,14 +80,18 @@ return def init_file_tab(self): - self.filechooserbuttonSelectFile.unselect_all() + #self.filechooserbuttonSelectFile.unselect_all() self.updateStatusbar(self.statusbarImportFile, _("No file selected") ) - self.processClass = None - if self.store is None: - self.store = self.build_tree_view() + self.processClasses = [] + if self.activities_store is None: + self.activities_store = self.build_activities_tree_view() else: - self.store.clear() - self.buttonClearFile.set_sensitive(0) + self.activities_store.clear() + if self.files_store is None: + self.files_store = self.build_files_tree_view() + else: + self.files_store.clear() + self.buttonRemoveSelectedFiles.set_sensitive(0) self.buttonFileImport.set_sensitive(0) return @@ -220,6 +226,7 @@ self.updateStatusbar(self.statusbarImportFile, "Checking file type for: " + import_filename) #Get import files_* files fileList = glob.glob(self.data_path+"import/file_*.py") + fileList.sort() for processingFile in fileList: directory, filename = os.path.split(processingFile) filename = filename.rstrip('.py') @@ -239,20 +246,45 @@ logging.debug('<<') return processClass + def build_files_tree_view(self): + store = gtk.ListStore( gobject.TYPE_STRING, + gobject.TYPE_BOOLEAN, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, ) + column_names=["id", _(""), _("File"), _("Type"), _("Activities")] + for column_index, column_name in enumerate(column_names): + if column_index == 1: + #Add button column + self.renderer1 = gtk.CellRendererToggle() + self.renderer1.set_property('activatable', True) + self.renderer1.connect( 'toggled', self.treeviewImportFiles_toggled_checkbox, store ) + column = gtk.TreeViewColumn(column_name, self.renderer1 ) + column.add_attribute( self.renderer1, "active", column_index) + column.set_sort_column_id(-1) + #column.connect('clicked', self.treeviewImportFiles_header_checkbox, store) + else: + #Add other columns + column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) + column.set_sort_column_id(column_index) + if column_name == "id": + column.set_visible(False) + column.set_resizable(True) + self.treeviewImportFiles.append_column(column) + self.treeviewImportFiles.set_headers_clickable(True) + self.treeviewImportFiles.set_model(store) + return store - self.updateStatusbar(self.statusbarImportFile, "Unknown file type") - logging.debug('<<') - return None - - def build_tree_view(self): - store = gtk.ListStore(gobject.TYPE_STRING, + def build_activities_tree_view(self): + store = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, + gobject.TYPE_STRING, + gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, - gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING ) - column_names=["id", _(""),_("Start Time"), _("Distance"),_("Duration"),_("Sport"), _("Notes")] + column_names=["id", _(""), _("Start Time"), _("Distance"),_("Duration"),_("Sport"), _("Notes"), "file_id"] for column_index, column_name in enumerate(column_names): if column_index == 1: #Add checkbox column @@ -267,7 +299,7 @@ #Add other columns column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) column.set_sort_column_id(column_index) - if column_name == "id": + if column_name == "id" or column_name == "file_id": column.set_visible(False) column.set_resizable(True) self.treeviewImportEvents.append_column(column) @@ -275,25 +307,35 @@ self.treeviewImportEvents.set_model(store) return store - def treeviewImportEvents_toggled_checkbox( self, cell, path, store ): + def treeviewImportFiles_toggled_checkbox(self, cell, path, store): """ Sets the state of the checkbox to true or false. """ store[path][1] = not store[path][1] + self.buttonRemoveSelectedFiles.set_sensitive(0) + for item in store: + if item[1]: + #Only enable remove button if at least one file is selected + self.buttonRemoveSelectedFiles.set_sensitive(1) + + def treeviewImportEvents_toggled_checkbox(self, cell, path, store): + """ + Sets the state of the checkbox to true or false. + """ + store[path][1] = not store[path][1] self.buttonFileImport.set_sensitive(0) for item in store: if item[1]: #Only enable import button if at least one activity is selected self.buttonFileImport.set_sensitive(1) - return def treeviewImportEvents_setCheckboxes(self, state): """ Sets or unsets all checkboxes """ - if self.store is None or len(self.store) == 0: + if self.activities_store is None or len(self.activities_store) == 0: return - for item in self.store: + for item in self.activities_store: item[1] = state if state: self.buttonFileImport.set_sensitive(1) @@ -312,6 +354,32 @@ self.configuration.setValue("pytraining","import_default_tab",self.defaulttab) #option + def removeSelectedFiles(self): + """ + Function to determine which files are selected + * remove them from the list + * remove the associated activities from the list also + """ + if self.files_store is None: + return + file_index = 0 + file_iters = [] + activity_iters = [] + for item in self.files_store: + if item[1] is True: #Checkbox is True, file for removal + file_id = item[0] + activity_index = 0 + for activity in self.activities_store: + if activity[7] == file_id: #Activity relates to file to be removed + activity_iters.append(self.activities_store.get_iter(activity_index)) + activity_index += 1 + file_iters.append( self.files_store.get_iter(file_index)) + file_index += 1 + for activity_iter in activity_iters: + self.activities_store.remove(activity_iter) + for file_iter in file_iters: + self.files_store.remove(file_iter) + def getSelectedActivities(self): """ Function to determine which activities are selected @@ -319,43 +387,49 @@ Returns array of the ids of the selected activities """ selectedActivities = [] - if self.store is None: + if self.activities_store is None: return None - for item in self.store: + for item in self.activities_store: if item[1] is True: #Checkbox is True - logging.debug("Added activity id:%s to selected list" % item[0]) - selectedActivities.append(item[0]) + logging.debug("Added activity %s to selected list" % item) + selectedActivities.append(item) logging.debug( "Found %d selected activities to import" % len(selectedActivities) ) return selectedActivities - def importSelectedActivities(self, selectedActivities): + def importSelectedActivity(self, activity): """ - Function to import selected activities + Function to import selected activity """ - if selectedActivities is None or len(selectedActivities) == 0: - return - for activityID in selectedActivities: - logging.debug( "Importing activity %s" % activityID) - sport, gpxFile = self.processClass.getGPXFile(activityID) - #process returned GPX files - if os.path.isfile(gpxFile): - logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(gpxFile), sport)) - #TODO trigger newentry screen to allow user to edit data - self.parent.parent.record.importFromGPX(gpxFile, sport) - #Deselect imported activity and change note - self.updateActivity(activityID, status=False, notes="Imported into database") - else: - logging.error('File %s not valid' % gpxFile) + activity_id = activity[0] + #selected = activity[1] + #start_time = activity[2] + #distance = activity[3] + #duration = activity[4] + #sport = activity[5] + #notes = activity[6] + file_id = int(activity[7]) + + logging.debug( "Importing activity %s from file %s" % (activity_id, file_id)) + sport, gpxFile = self.processClasses[file_id].getGPXFile(activity_id) + #process returned GPX files + if os.path.isfile(gpxFile): + logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(gpxFile), sport)) + #TODO trigger newentry screen to allow user to edit data + self.parent.parent.record.importFromGPX(gpxFile, sport) + #Deselect imported activity and change note + self.updateActivity(activity_id, file_id, status=False, notes="Imported into database") + else: + logging.error('File %s not valid' % gpxFile) - def updateActivity(self, activityID, status = None, notes = None): + def updateActivity(self, activityID, file_id, status = None, notes = None): path = 0 - for item in self.store: - if item[0] == activityID: + for item in self.activities_store: + if item[0] == activityID and item[7] == file_id: if status is not None: - self.store[path][1] = status + self.activities_store[path][1] = status if notes is not None: - self.store[path][6] = notes + self.activities_store[path][6] = notes path +=1 def close_window(self): @@ -391,13 +465,14 @@ def on_notebookMainTabs_switch_page(self, notebook, page, new_page): self.init_tab(new_page) - def on_filechooserbuttonSelectFile_file_set(self, widget): + #def on_filechooserbuttonSelectFile_file_set(self, widget): + ''' self.buttonClearFile.set_sensitive(1) #Enable clear button self.buttonFileImport.set_sensitive(0) #Disable import button self.updateStatusbar(self.statusbarImportFile, "" ) #Clear status bar #Clear store - if self.store is not None: - self.store.clear() + if self.activities_store is not None: + self.activities_store.clear() #Validate file self.processClass = self.validateFile(self.filechooserbuttonSelectFile.get_filename()) if self.processClass is not None: @@ -412,8 +487,8 @@ else: note = _("Found in database") #Add activity details to TreeView store to display - iter = self.store.append() - self.store.set( + iter = self.activities_store.append() + self.activities_store.set( iter, 0, activity[0], 1, not activity[1], @@ -431,10 +506,10 @@ md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) md.set_title("Error") md.run() - md.destroy() + md.destroy()''' - def on_buttonClearFile_clicked(self, widget): - self.init_tab(1) + #def on_buttonClearFile_clicked(self, widget): + # self.init_tab(1) def on_buttonOptionsSave_clicked(self, widget): self.updateStatusbar(self.statusbarOptions, "Saving options") @@ -448,6 +523,11 @@ self.init_options_tab() self.updateStatusbar(self.statusbarOptions, "") + def on_buttonRemoveSelectedFiles_clicked(self, widget): + #Remove selected files and associated activities from list + #TODO + self.removeSelectedFiles() + def on_buttonFileImport_clicked(self, widget): #Import selected activities selectedActivities = self.getSelectedActivities() @@ -462,7 +542,9 @@ self.updateStatusbar(self.statusbarImportFile, msgImporting) while gtk.events_pending(): # This allows the GUI to update gtk.main_iteration() # before completion of this entire action - self.importSelectedActivities(selectedActivities) + for activity in selectedActivities: + self.importSelectedActivity(activity) + #TODO progress bar here?? self.updateStatusbar(self.statusbarImportFile, msgImported) #Display informational dialog box md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, msgImported) @@ -470,6 +552,60 @@ md.run() md.destroy() self.buttonFileImport.set_sensitive(0) #Disable import button + + def on_buttonSelectFiles_clicked(self, widget): + selectedFiles = fileChooserDialog(title="Choose a file (or files) to import activities from", multiple=True).getFiles() + while gtk.events_pending(): # This allows the GUI to update + gtk.main_iteration() # before completion of this entire action + if selectedFiles is None or len(selectedFiles) == 0: + #Nothing selected + return + for filename in selectedFiles: #Multiple files + class_index = len(self.processClasses) + #Validate file + self.processClasses.append(self.validateFile(filename)) + if self.processClasses[class_index] is not None: + self.updateStatusbar(self.statusbarImportFile, _("Found file of type: %s") % self.processClasses[class_index].getFileType() ) + activitiesSummary = self.processClasses[class_index].getActivitiesSummary() + activity_count = len(activitiesSummary) + #Add file to files treeview + iter = self.files_store.append() + self.files_store.set( + iter, + 0, class_index, + 1, False, + 2, filename, + 3, self.processClasses[class_index].getFileType(), + 4, activity_count + ) + #Get activities in file + for activity in activitiesSummary: + #Add activity details to TreeView store to display + if not activity[1]: + #Activity selected, so enable import button + self.buttonFileImport.set_sensitive(1) + note = "" + else: + note = _("Found in database") + activity_iter = self.activities_store.append() + self.activities_store.set( + activity_iter, + 0, activity[0], + 1, not activity[1], + 2, activity[2], + 3, activity[3], + 4, activity[4], + 5, activity[5], + 6, note, + 7, class_index, + ) + else: #Selected file not understood by any of the process files + #Display error + msg = _("File %s is of unknown or unsupported file type" % filename) + md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) + md.set_title("Error") + md.run() + md.destroy() def on_buttonFileClose_clicked(self, widget): self.close_window() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-03 09:49:07 UTC (rev 509) +++ pytrainer/trunk/pytrainer/main.py 2010-02-08 08:03:51 UTC (rev 510) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#509" + self.version ="1.7.1_svn#510" self.DB_version = 3 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-03 09:49:13
|
Revision: 509 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=509&view=rev Author: jblance Date: 2010-02-03 09:49:07 +0000 (Wed, 03 Feb 2010) Log Message: ----------- Update DB lap code to populate laps on import, refactor earlier lap work, add lap_number column to DB (DB now v3) Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-03 09:49:07 UTC (rev 509) @@ -195,9 +195,9 @@ finishinfo.open(map,finishmarker); });\n''' - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", for lap in laps: - lapNumber = laps.index(lap)+1 + lapNumber = int(lap[9])+1 elapsedTime = float(lap[2]) elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-03 09:49:07 UTC (rev 509) @@ -964,20 +964,6 @@ #Get lap info id_record = i[8] laps = self.parent.record.getLaps(id_record) - if laps is None or laps == []: #No laps stored - update DB - laps = [] - #Get details from gpx file - gpxfile = "%s/%s.gpx" %(self.gpxDir, id_record) - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - gpxLaps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) - cells = "record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories" - for lap in gpxLaps: - values = (id_record, lap[0], lap[4], lap[5], lap[6], lap[1], lap[2], lap[3]) - logging.debug("Adding lap information: " + str(values)) - self.parent.record.insertLaps(cells,values) - #Try to get lap info again #TODO? refactor - laps = self.parent.record.getLaps(id_record) iter = store.append(None) if not iterOne: iterOne = iter @@ -995,8 +981,8 @@ ) if laps is not None: for lap in laps: - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", - lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + lapNumber = "%s%d" % ( _("lap"), int(lap[9])+1 ) distance = "%0.2f" % (float(lap[3]) / 1000.0) timeHours = int(float(lap[2]) / 3600) timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-03 09:49:07 UTC (rev 509) @@ -129,6 +129,7 @@ }, "laps":{ "id_lap": "integer primary key autoincrement", "record": "integer", + "lap_number": "integer", "elapsed_time": "varchar(20)", "distance": "float", "start_lat": "float", Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/main.py 2010-02-03 09:49:07 UTC (rev 509) @@ -101,8 +101,8 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#508" - self.DB_version = 2 + self.version ="1.7.1_svn#509" + self.DB_version = 3 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/record.py 2010-02-03 09:49:07 UTC (rev 509) @@ -69,7 +69,7 @@ self.recordwindow.run() logging.debug('<<') - def removeRecord(self,id_record): #TODO remember to update once laps are in DB + def removeRecord(self,id_record): logging.debug('>>') record = self.ddbb.delete("records", "id_record=\"%s\"" %id_record) laps = self.ddbb.delete("laps", "record=\"%s\"" %id_record) @@ -148,8 +148,9 @@ logging.debug('<<') return keys,values - def insertRecord(self, list_options): + def insertRecord(self, list_options, laps=None): logging.debug('>>') + #Create entry for activity in records table if list_options is None: logging.info('No data provided, abort adding entry') return None @@ -157,10 +158,17 @@ cells,values = self._formatRecordNew(list_options) self.ddbb.insert("records",cells,values) logging.debug('DB updated: '+str(cells)+' | '+str(values)) + id_record = self.ddbb.lastRecord("records") + #Create entry(s) for activity in laps table + if laps is not None: + for lap in laps: + lap['record'] = id_record #Add reference to entry in record table + lap_keys = ", ".join(map(str, lap.keys())) + lap_values = lap.values() + self.insertLaps(lap_keys,lap.values()) gpxOrig = list_options["rcd_gpxfile"] if os.path.isfile(gpxOrig): gpxDest = self.conf.getValue("gpxdir") - id_record = self.ddbb.lastRecord("records") gpxNew = gpxDest+"/%d.gpx"%id_record shutil.move(gpxOrig, gpxNew) logging.debug('Moving '+gpxOrig+' to '+gpxNew) @@ -173,13 +181,35 @@ Moves GPX file to store destination and updates database args: path to source GPX file""" logging.debug('--') - return self.insertRecord(self.summaryFromGPX(gpxOrig, entry)) - + list_options, gpx_laps = self.summaryFromGPX(gpxOrig, entry) + return self.insertRecord(list_options, laps=gpx_laps) + + def lapsFromGPX(self, gpx): + logging.debug('>>') + laps = [] + gpxLaps = gpx.getLaps() + for lap in gpxLaps: + lap_number = gpxLaps.index(lap) + tmp_lap = {} + tmp_lap['record'] = "" + tmp_lap['lap_number'] = lap_number + tmp_lap['elapsed_time'] = lap[0] + tmp_lap['distance'] = lap[4] + tmp_lap['start_lat'] = lap[5] + tmp_lap['start_lon'] = lap[6] + tmp_lap['end_lat'] = lap[1] + tmp_lap['end_lon'] = lap[2] + tmp_lap['calories'] = lap[3] + laps.append(tmp_lap) + logging.debug('<<') + return laps + def summaryFromGPX(self, gpxOrig, entry): """29.03.2008 - dgranda Retrieves info which will be stored in DB from GPX file args: path to source GPX file - returns: list with fields and values""" + returns: list with fields and values, list of laps + """ logging.debug('>>') gpx = Gpx(self.data_path,gpxOrig) distance, time, maxspeed, maxheartrate = gpx.getMaxValues() @@ -212,15 +242,16 @@ summaryRecord['rcd_maxbeats'] = maxheartrate summaryRecord['rcd_upositive'] = upositive summaryRecord['rcd_unegative'] = unegative - if entry[1]=="": # coming from new track dialog (file opening) - summaryRecord['date_time_utc'], summaryRecord['date_time_local'] = gpx.getStartTimeFromGPX(gpxOrig) - else: # coming from GPS device - summaryRecord['date_time_utc'] = entry[1] - summaryRecord['date_time_local'] = entry[1] - print "#TODO fix record summaryRecord local and utc time..." + if entry[1]=="": # coming from new track dialog (file opening) #TODO This if-else needs checking + summaryRecord['date_time_utc'], summaryRecord['date_time_local'] = gpx.getStartTimeFromGPX(gpxOrig) # + else: # coming from GPS device # + summaryRecord['date_time_utc'] = entry[1] # + summaryRecord['date_time_local'] = entry[1] # + print "#TODO fix record summaryRecord local and utc time..." # logging.debug('summary: '+str(summaryRecord)) + laps = self.lapsFromGPX(gpx) logging.debug('<<') - return summaryRecord + return summaryRecord, laps def updateRecord(self, list_options, id_record): logging.debug('>>') @@ -262,12 +293,30 @@ def getLaps(self, id_record): logging.debug('--') - return self.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + laps = self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", "record=\"%s\"" % id_record) + if laps is None or laps == []: #No laps stored - update DB + logging.debug("No laps in DB for record %d" % id_record) + gpx_dest = self.conf.getValue("gpxdir") + gpxfile = gpx_dest+"/%d.gpx"%id_record + gpx = Gpx(self.data_path,gpxfile) + laps = self.lapsFromGPX(gpx) + if laps is not None: + for lap in laps: + lap['record'] = id_record #Add reference to entry in record table + lap_keys = ", ".join(map(str, lap.keys())) + lap_values = lap.values() + self.insertLaps(lap_keys,lap.values()) + #Try to get lap info again #TODO? refactor + laps = self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + "record=\"%s\"" % id_record) + return laps def insertLaps(self, cells, values): logging.debug('--') + logging.debug("Adding lap information: " + ", ".join(map(str, values))) self.ddbb.insert("laps",cells,values) def getrecordPeriod(self,date_ini, date_end, sport=None): @@ -445,15 +494,20 @@ Add a record from a valid pytrainer type GPX file """ logging.debug('>>') - logging.info('Retrieving data from '+gpxFile) - if not sport: - sport = "import" - entry = [sport,""] - entry_id = self.insertNewRecord(gpxFile, entry) - if entry_id is None: - logging.error("Entry not created for file %s" % gpxFile) + print gpxFile + if not os.path.isfile(gpxFile): + logging.error("Invalid file: " +gpxFile) else: - logging.info("Entry %d has been added" % entry_id) + logging.info('Retrieving data from '+gpxFile) + if not sport: + sport = "import" + entry = [sport,""] + entry_id = self.insertNewRecord(gpxFile, entry) + if entry_id is None: + logging.error("Entry not created for file %s" % gpxFile) + else: + logging.info("Entry %d has been added" % entry_id) + logging.debug('<<') #def importFromGTRNCTR(self,gtrnctrFile): #TODO remove This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-01 09:52:09
|
Revision: 508 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=508&view=rev Author: jblance Date: 2010-02-01 09:52:03 +0000 (Mon, 01 Feb 2010) Log Message: ----------- Update remove record code to delete lap info as well Modified Paths: -------------- pytrainer/trunk/glade/newrecord.glade pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/newrecord.glade =================================================================== --- pytrainer/trunk/glade/newrecord.glade 2010-02-01 09:37:15 UTC (rev 507) +++ pytrainer/trunk/glade/newrecord.glade 2010-02-01 09:52:03 UTC (rev 508) @@ -245,7 +245,7 @@ <property name="width_request">47</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="adjustment">0 0 23 1 2 2</property> + <property name="adjustment">0 0 23 1 2 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> <property name="wrap">True</property> @@ -271,7 +271,7 @@ <property name="width_request">47</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="adjustment">0 0 59 2 2 2</property> + <property name="adjustment">0 0 59 2 2 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> <property name="wrap">True</property> @@ -297,7 +297,7 @@ <property name="width_request">42</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="adjustment">0 0 59 1 2 2</property> + <property name="adjustment">0 0 59 1 2 0</property> <property name="climb_rate">1</property> <property name="wrap">True</property> </widget> Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-01 09:37:15 UTC (rev 507) +++ pytrainer/trunk/pytrainer/main.py 2010-02-01 09:52:03 UTC (rev 508) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#507" + self.version ="1.7.1_svn#508" self.DB_version = 2 self.date = Date() # Checking profile Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-02-01 09:37:15 UTC (rev 507) +++ pytrainer/trunk/pytrainer/record.py 2010-02-01 09:52:03 UTC (rev 508) @@ -72,7 +72,8 @@ def removeRecord(self,id_record): #TODO remember to update once laps are in DB logging.debug('>>') record = self.ddbb.delete("records", "id_record=\"%s\"" %id_record) - logging.debug('removed record '+str(id_record)+' from bbdd') + laps = self.ddbb.delete("laps", "record=\"%s\"" %id_record) + logging.debug('removed record '+str(id_record)+' (and associated laps) from DB') gpxfile = self.conf.getValue("gpxdir")+"/%d.gpx"%int(id_record) if os.path.isfile(gpxfile): os.remove(gpxfile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-01 09:37:22
|
Revision: 507 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=507&view=rev Author: jblance Date: 2010-02-01 09:37:15 +0000 (Mon, 01 Feb 2010) Log Message: ----------- Create laps table, refactor code to use laps table and create entries if non-existant Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py pytrainer/trunk/pytrainer/recordgraph.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-01 09:37:15 UTC (rev 507) @@ -81,7 +81,9 @@ points = points.replace("\\","\\\\") if self.useGM3: logging.debug("Using Google Maps version 3 API") - laps = gpx.getLaps() # [](elapsedTime, lat, lon, calories, distance) + #laps = gpx.getLaps() # [](elapsedTime, lat, lon, calories, distance) + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + laps = self.record.getLaps(id_record) #"sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats" info = self.record.getrecordInfo(id_record) timeHours = int(info[0][3]) / 3600 @@ -193,9 +195,10 @@ finishinfo.open(map,finishmarker); });\n''' + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", for lap in laps: lapNumber = laps.index(lap)+1 - elapsedTime = float(lap[0]) + elapsedTime = float(lap[2]) elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) @@ -207,15 +210,15 @@ strElapsedTime = "%0.0fs" % (elapsedTimeSecs) #process lat and lon for this lap try: - lapLat = float(lap[1]) - lapLon = float(lap[2]) + lapLat = float(lap[6]) + lapLon = float(lap[7]) content += "var lap%dmarker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f), icon: lapimage, map: map, title:\"Lap%d\"}); \n " % (lapNumber, lapLat, lapLon, lapNumber) - content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[4])/1000, lap[3]) + content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[3])/1000, lap[8]) content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) except: #Error processing lap lat or lon #dont show this lap - print "Error processing lap "+ str(lapNumber) + " (lat,lon) ( " + str(lap[1]) + "," +str (lap[2]) + ")" + print "Error processing lap "+ str(lapNumber) + " id: " + lap(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" content += ''' Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-01 09:37:15 UTC (rev 507) @@ -951,37 +951,6 @@ logging.debug("<<") return False - '''def actualize_recordTreeView(self, record_list): - logging.debug(">>") - iterOne = False - store = gtk.ListStore( - gobject.TYPE_INT, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - object) - for i in record_list: - iter = store.append() - if not iterOne: - iterOne = iter - dateTime = i[12] - if dateTime is not None: - localTime = dateutil.parser.parse(dateTime).strftime("%H:%M") - else: - localTime = "" - store.set ( - iter, - 0, int(i[8]), - 1, str(localTime), - 2, str(i[0]), - 3, str(i[2]) - ) - self.recordTreeView.set_model(store) - if iterOne: - self.recordTreeView.get_selection().select_iter(iterOne) - logging.debug("<<") - #if len(record_list)>0:''' - def actualize_recordTreeView(self, record_list): logging.debug(">>") iterOne = False @@ -992,13 +961,23 @@ gobject.TYPE_STRING, #Distance object) for i in record_list: - #Get lap info #TODO refactor to use a database table - gpxfile = "%s/%s.gpx" %(self.gpxDir, i[8]) - laps = None - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - laps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) - #print gpxfile, laps + #Get lap info + id_record = i[8] + laps = self.parent.record.getLaps(id_record) + if laps is None or laps == []: #No laps stored - update DB + laps = [] + #Get details from gpx file + gpxfile = "%s/%s.gpx" %(self.gpxDir, id_record) + if os.path.isfile(gpxfile): + gpx = Gpx(self.data_path,gpxfile) + gpxLaps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) + cells = "record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories" + for lap in gpxLaps: + values = (id_record, lap[0], lap[4], lap[5], lap[6], lap[1], lap[2], lap[3]) + logging.debug("Adding lap information: " + str(values)) + self.parent.record.insertLaps(cells,values) + #Try to get lap info again #TODO? refactor + laps = self.parent.record.getLaps(id_record) iter = store.append(None) if not iterOne: iterOne = iter @@ -1016,11 +995,12 @@ ) if laps is not None: for lap in laps: + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) - distance = "%0.2f" % (float(lap[4]) / 1000.0) - timeHours = int(float(lap[0]) / 3600) - timeMin = int((float(lap[0]) / 3600.0 - timeHours) * 60) - timeSec = float(lap[0]) - (timeHours * 3600) - (timeMin * 60) + distance = "%0.2f" % (float(lap[3]) / 1000.0) + timeHours = int(float(lap[2]) / 3600) + timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) + timeSec = float(lap[2]) - (timeHours * 3600) - (timeMin * 60) if timeHours > 0: duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) else: Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-01 09:37:15 UTC (rev 507) @@ -76,139 +76,12 @@ def update(self,table,cells,value,condition): self.ddbbObject.update(table,cells,value,condition) - def lastRecord(self,table): #TODO Make generic i.e. something like id = "id_" + table[:-1] - if table=="records": - id = "id_record" - if table=="sports": - id = "id_sport" - if table=="waypoints": - id = "id_waypoint" + def lastRecord(self,table): + id = "id_" + table[:-1] #prune 's' of table name and pre-pend 'id_' to get id column sql = "select %s from %s order by %s Desc limit 0,1" %(id,table,id) ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] - #TODO Remove extra check functions below - - #def addTitle2ddbb(self): - '''#this function add a title column in - #the record ddbb. New in 0.9.9 version - sql = "alter table records add title varchar(200)" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column title already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addUnevenness2ddbb(self): - '''#this function add accumulated unevennes columns in - #the record ddbb. New in 1.3.2 version - sql = "alter table records add upositive float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column upositive already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add unegative float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column unegative already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addWaypoints2ddbb(self): - '''#adds waipoints table to database - try: - self.ddbbObject.addWaipoints2ddbb() - except: - logging.error('Waypoints table already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def updatemonth(self): - '''#this is a function to repair a bug from - #pytrainer 0.9.5 and previus - listOfRecords = self.ddbbObject.select("records","id_record,date", None) - for record in listOfRecords: - rec = record[1].split("-") - newmonth = int(rec[1])+1 - newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - - #def updateDateFormat(self): #TODO Might still need this function?? - '''#this is a function to repair a bug from - #pytrainer 0.9.8 and previus - listOfRecords = self.ddbbObject.select("records","id_record,date", None) - for record in listOfRecords: - try: - rec = record[1].split("-") - newdate = "%0.4d-%0.2d-%0.2d" %(int(rec[0]),int(rec[1]),int(rec[2])) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) - except: - print record''' - - #def addweightandmet2ddbb(self): - '''#this function add weight extra and met fields to sports table - sql = "alter table sports add weight float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column weight already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table sports add met float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def checkmettable(self): - '''sql = "alter table sports add met float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addpaceandmax2ddbb(self): - '''sql = "alter table records add maxspeed float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxspeed already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add maxpace float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxpace already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add pace float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column pace already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add maxbeats float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxbeats already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addDateTimeUTC2ddbb(self): - '''sql = "alter table records add date_time_utc varchar2(20)" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports - '''if getSport is True: - sql = "select sports.name,records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - else: - sql = "select records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - return self.ddbbObject.freeExec(sql)''' - def checkDBIntegrity(self): """17.11.2009 - dgranda Retrieves tables and columns from database, checks current ones and adds something if missed. New in version 1.7.0 @@ -219,38 +92,52 @@ if self.ddbb_type != "sqlite": logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check') exit(-2) - columnsSports = {"id_sports":"integer primary key autoincrement", - "name":"varchar(100)", - "weight":"float", - "met":"float"} - columnsRecords = {"id_record":"integer primary key autoincrement", - "date":"date", - "sport":"integer", - "distance":"float", - "time":"varchar(200)", - "beats":"float", - "average":"float", - "calories":"int", - "comments":"text", - "gpslog":"varchar(200)", - "title":"varchar(200)", - "upositive":"float", - "unegative":"float", - "maxspeed":"float", - "maxpace":"float", - "pace":"float", - "maxbeats":"float", - "date_time_local":"varchar2(20)", - "date_time_utc":"varchar2(20)"} - columnsWaypoints = {"id_waypoint":"integer primary key autoincrement", - "lat":"float", - "lon":"float", - "ele":"float", - "comment":"varchar(240)", - "time":"date", - "name":"varchar(200)", - "sym":"varchar(200)"} - tablesList = {"records":columnsRecords,"sports":columnsSports,"waypoints":columnsWaypoints} + #Define the tables and their columns that should be in the database + tablesList = { "records":{ "id_record":"integer primary key autoincrement", + "date":"date", + "sport":"integer", + "distance":"float", + "time":"varchar(200)", + "beats":"float", + "average":"float", + "calories":"int", + "comments":"text", + "gpslog":"varchar(200)", + "title":"varchar(200)", + "upositive":"float", + "unegative":"float", + "maxspeed":"float", + "maxpace":"float", + "pace":"float", + "maxbeats":"float", + "date_time_local":"varchar2(20)", + "date_time_utc":"varchar2(20)", + }, + "sports":{ "id_sports":"integer primary key autoincrement", + "name":"varchar(100)", + "weight":"float", + "met":"float", + }, + "waypoints":{ "id_waypoint":"integer primary key autoincrement", + "lat":"float", + "lon":"float", + "ele":"float", + "comment":"varchar(240)", + "time":"date", + "name":"varchar(200)", + "sym":"varchar(200)", + }, + "laps":{ "id_lap": "integer primary key autoincrement", + "record": "integer", + "elapsed_time": "varchar(20)", + "distance": "float", + "start_lat": "float", + "start_lon": "float", + "end_lat": "float", + "end_lon": "float", + "calories": "int", + }, + } try: tablesDBT = self.ddbbObject.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") except: Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-01 09:37:15 UTC (rev 507) @@ -46,6 +46,7 @@ cadTag = gpxdataNS.substitute(tag="cadence") lapTag = gpxdataNS.substitute(tag="lap") endPointTag = gpxdataNS.substitute(tag="endPoint") +startPointTag = gpxdataNS.substitute(tag="startPoint") elapsedTimeTag = gpxdataNS.substitute(tag="elapsedTime") distanceTag = gpxdataNS.substitute(tag="distance") @@ -128,6 +129,12 @@ endPoint = lap.find(endPointTag) lat = endPoint.get("lat") lon = endPoint.get("lon") + startPoint = lap.find(startPointTag) + if startPoint is not None: + stLat = startPoint.get("lat") + stLon = startPoint.get("lon") + else: + stLat, stLon = "","" elapsedTime = lap.findtext(elapsedTimeTag) if elapsedTime.count(":") == 2: # got a 0:41:42.14 type elasped time hours, mins, secs = elapsedTime.split(":") @@ -136,7 +143,7 @@ calories = lap.findtext(calorieTag) distance = lap.findtext(distanceTag) logging.debug("Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance)) - lapInfo.append((elapsedTime, lat, lon, calories, distance)) + lapInfo.append((elapsedTime, lat, lon, calories, distance, stLat, stLon)) return lapInfo def _getValues(self): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/main.py 2010-02-01 09:37:15 UTC (rev 507) @@ -101,8 +101,8 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1" - self.DB_version = 1 + self.version ="1.7.1_svn#507" + self.DB_version = 2 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -302,7 +302,7 @@ if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() - gpx_laps = gpx.getLaps() + gpx_laps = self.record.getLaps(id_record) self.windowmain.actualize_recordgraph(gpx_tracklist, gpx_laps) if view=="map": Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/record.py 2010-02-01 09:37:15 UTC (rev 507) @@ -259,6 +259,16 @@ "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local", "date=\"%s\" and records.sport=sports.id_sports" %date) + def getLaps(self, id_record): + logging.debug('--') + return self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + "record=\"%s\"" % id_record) + + def insertLaps(self, cells, values): + logging.debug('--') + self.ddbb.insert("laps",cells,values) + def getrecordPeriod(self,date_ini, date_end, sport=None): #TODO This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two tables = "records,sports" Modified: pytrainer/trunk/pytrainer/recordgraph.py =================================================================== --- pytrainer/trunk/pytrainer/recordgraph.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/recordgraph.py 2010-02-01 09:37:15 UTC (rev 507) @@ -46,8 +46,8 @@ if laps is not None and showLaps: lapValues = [] lastPoint = 0.0 - for lap in laps: #(elapsedTime, lat, lon, calories, distance) - thisPoint = float(lap[4])/1000.0 + lastPoint + for lap in laps: #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + thisPoint = float(lap[3])/1000.0 + lastPoint lapValues.append((lastPoint, thisPoint)) lastPoint = thisPoint else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-25 21:52:43
|
Revision: 506 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=506&view=rev Author: dgranda Date: 2010-01-25 21:52:36 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Removed filter that prevents entries with no duration to be added - rollback svn499 Modified Paths: -------------- pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-25 21:48:24 UTC (rev 505) +++ pytrainer/trunk/pytrainer/record.py 2010-01-25 21:52:36 UTC (rev 506) @@ -150,11 +150,8 @@ def insertRecord(self, list_options): logging.debug('>>') if list_options is None: - logging.debug('No data provided, abort adding entry') + logging.info('No data provided, abort adding entry') return None - elif list_options["rcd_time"] == [0, 0, 0]: - logging.debug('Activity has no duration, abort adding entry') - return None logging.debug('list_options: '+str(list_options)) cells,values = self._formatRecordNew(list_options) self.ddbb.insert("records",cells,values) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-25 21:48:34
|
Revision: 505 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=505&view=rev Author: dgranda Date: 2010-01-25 21:48:24 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Updating spanish localization to include translations missed due to uncomplete translator.sh Modified Paths: -------------- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-01-25 21:45:15 UTC (rev 504) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-01-25 21:48:24 UTC (rev 505) @@ -1,14 +1,14 @@ -# Spanish translations for vud package. -# Copyright (C) 2006 THE vud'S COPYRIGHT HOLDER -# This file is distributed under the same license as the vud package. +# Spanish translations for pytrainer package. +# Copyright (C) 2006 pytrainer COPYRIGHT HOLDER +# This file is distributed under the same license as the pytrainer package. # Fiz Vazquez <vu...@si...>, 2006. # msgid "" msgstr "" -"Project-Id-Version: vud 1\n" +"Project-Id-Version: pytrainer 1.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-21 22:32+0100\n" -"PO-Revision-Date: 2010-01-21 22:34+0100\n" +"POT-Creation-Date: 2010-01-25 21:14+0100\n" +"PO-Revision-Date: 2010-01-25 21:09+0100\n" "Last-Translator: David García Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "MIME-Version: 1.0\n" @@ -16,6 +16,445 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: glade/calendar.glade:7 +msgid "Calendar" +msgstr "Calendario" + +#: glade/importdata.glade:7 glade/importdata.glade:279 +msgid "Import" +msgstr "_Importar" + +#: glade/importdata.glade:37 +msgid "" +"Test 1\n" +"Test 2" +msgstr "" +"Prueba 1\n" +"Prueba 2" + +#: glade/importdata.glade:47 +msgid "<b>Select your GPS device</b>" +msgstr "<b>Seleccione su dispositivo GPS</b>" + +#: glade/importdata.glade:83 +msgid "<b>Tools</b>" +msgstr "<b>Herramientas</b>" + +#: glade/importdata.glade:102 +msgid "Rescan" +msgstr "Examinar de nuevo" + +#: glade/importdata.glade:106 +msgid "Rescan system for available tools" +msgstr "Buscando de nuevo herramientas disponibles en el sistema" + +#: glade/importdata.glade:159 +msgid "<b>Import from GPS Device</b>" +msgstr "<b>Importar desde el dispositivo GPS</b>" + +#: glade/importdata.glade:197 +msgid "Clear" +msgstr "Limpiar" + +#: glade/importdata.glade:218 +msgid "<b>Select a file to import</b>" +msgstr "<b>Seleccionar fichero a importar</b>" + +#: glade/importdata.glade:261 +msgid "<b>Select Activities to Import</b>" +msgstr "<b>Seleccionar actividades para importar</b>" + +#: glade/importdata.glade:339 +msgid "<b>Import from File</b>" +msgstr "<b>Importar desde fichero</b>" + +#: glade/importdata.glade:364 +msgid "<b>Plugins</b>" +msgstr "<b>Plugins</b>" + +#: glade/importdata.glade:392 +msgid "Import from GPS Device" +msgstr "Importar desde el dispositivo GPS" + +#: glade/importdata.glade:408 +msgid "Import from File" +msgstr "Importar desde fichero" + +#: glade/importdata.glade:430 +msgid "<b>Default to Tab</b>" +msgstr "<b>Pestaña por defecto</b>" + +#: glade/importdata.glade:453 +msgid "Reset" +msgstr "Resetear" + +#: glade/importdata.glade:469 +msgid "Save" +msgstr "Guardar" + +#: glade/importdata.glade:528 +msgid "<b>Options</b>" +msgstr "<b>Opciones:</b>" + +#: glade/newrecord.glade:7 +msgid "New Entry" +msgstr "Nueva entrada" + +#: glade/newrecord.glade:46 +msgid "Title:" +msgstr "Título:" + +#: glade/newrecord.glade:69 +msgid "GPX File:" +msgstr "Archivo GPX:" + +#: glade/newrecord.glade:113 +msgid "Calculate Values" +msgstr "Calcular valores" + +#: glade/newrecord.glade:133 +msgid "Sport:" +msgstr "Deporte:" + +#: glade/newrecord.glade:167 +msgid "<b>Main</b>" +msgstr "<b>Principal</b>" + +#: glade/newrecord.glade:204 +msgid "Distance (Km):" +msgstr "Distancia (Km):" + +#: glade/newrecord.glade:213 glade/newrecord.glade:334 +#: glade/newrecord.glade:535 glade/newrecord.glade:673 +#: glade/newrecord.glade:934 glade/profile.glade:2417 +msgid "Calculate" +msgstr "Calcular" + +#: glade/newrecord.glade:231 +msgid "Duration:" +msgstr "Duración:" + +#: glade/newrecord.glade:261 glade/newrecord.glade:287 +#: glade/pytrainer.glade:1475 glade/pytrainer.glade:1525 +#: glade/pytrainer.glade:3271 glade/pytrainer.glade:3321 +#: glade/pytrainer.glade:4399 glade/pytrainer.glade:4449 +#: glade/pytrainer.glade:5541 glade/pytrainer.glade:5591 +#: glade/pytrainer.glade:6836 glade/pytrainer.glade:6886 +msgid ":" +msgstr ":" + +#: glade/newrecord.glade:355 +msgid "Date:" +msgstr "Fecha:" + +#: glade/newrecord.glade:382 glade/pytrainer.glade:4763 +#: glade/pytrainer.glade:5905 +msgid " " +msgstr " " + +#: glade/newrecord.glade:423 +msgid "Start Time:" +msgstr "Hora de comienzo:" + +#: glade/newrecord.glade:439 +msgid "12:00:00" +msgstr "12:00:00" + +#: glade/newrecord.glade:463 glade/profile.glade:2467 +msgid "<b>General</b>" +msgstr "<b>General:</b>" + +#: glade/newrecord.glade:499 +msgid "Max (km/h):" +msgstr "Punta (Km/h)" + +#: glade/newrecord.glade:524 +msgid "Velocity (km/h)" +msgstr "Velocidad (km/h)" + +#: glade/newrecord.glade:570 +msgid "<b>Velocity</b>" +msgstr "<b>Velocidad</b>" + +#: glade/newrecord.glade:589 +msgid "Quick Entry" +msgstr "Entrada" + +#: glade/newrecord.glade:622 +msgid "Max (min/km):" +msgstr "Max (min/km)" + +#: glade/newrecord.glade:648 +msgid "Pace (min/km):" +msgstr "Ritmo (min/km)" + +#: glade/newrecord.glade:694 +msgid "<b>Pace</b>" +msgstr "<b>Ritmo</b>" + +#: glade/newrecord.glade:730 +msgid "Ascent:" +msgstr "Ascenso:" + +#: glade/newrecord.glade:756 +msgid "Descent:" +msgstr "Descenso:" + +#: glade/newrecord.glade:789 +msgid "<b>Accumulated Altitude Change</b>" +msgstr "<b>Desnivel acumulado:</b>" + +#: glade/newrecord.glade:826 +msgid "Max (bpm):" +msgstr "Pulsaciones máximas" + +#: glade/newrecord.glade:838 +msgid "Heart rate:" +msgstr "Pulsaciones" + +#: glade/newrecord.glade:878 pytrainer/gui/windowmain.py:720 +#: pytrainer/monthgraph.py:77 pytrainer/yeargraph.py:78 +#: pytrainer/weekgraph.py:123 +msgid "Calories" +msgstr "Calorías" + +#: glade/newrecord.glade:907 +msgid "" +"<small><b>Note:</b> In order to calculate the calories you must set the " +"sport MET (in Preferences->Sport) </small>" +msgstr "" +"<small><b>Nota:</b> para el cálculo de calorías es necesario introducir el " +"valor de MET del deporte (en Preferencias -> Deporte)</small>" + +#: glade/newrecord.glade:981 +msgid "<b>Heart Rate</b>" +msgstr "<b>Pulsaciones</b>" + +#: glade/newrecord.glade:1003 +msgid "Advanced" +msgstr "Avanzado" + +#: glade/newrecord.glade:1055 +msgid "<b>Comments</b>" +msgstr "<b>Comentarios</b>" + +#: glade/newrecord.glade:1070 +msgid "Comments" +msgstr "Comentarios" + +#: glade/profile.glade:8 +msgid "Preferences" +msgstr "Preferencias" + +#: glade/profile.glade:82 +msgid "Metric system" +msgstr "Sistema métrico" + +#: glade/profile.glade:104 +msgid "U.S. customary units" +msgstr "Sistema americano" + +#: glade/profile.glade:130 +msgid "<b>System of Measurement</b>" +msgstr "<b>Sistema de medida</b>" + +#: glade/profile.glade:190 +msgid "Database type:" +msgstr "Tipo de base de datos" + +#: glade/profile.glade:218 +msgid "Database host:" +msgstr "Servidor base de datos" + +#: glade/profile.glade:267 +msgid "Database name:" +msgstr "Nombre base de datos" + +#: glade/profile.glade:335 +msgid "Database user:" +msgstr "Usuario base de datos" + +#: glade/profile.glade:363 +msgid "Database pass:" +msgstr "Contraseña base de datos" + +#: glade/profile.glade:437 +msgid "<b>Database</b>" +msgstr "<b>Base de datos:</b>" + +#: glade/profile.glade:497 +msgid "Use this port for internal connections: " +msgstr "Use este puerto para conexiones internas" + +#: glade/profile.glade:548 +msgid "" +"<small><b>Note:</b> Change this only if you know what you are doing</small>" +msgstr "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" + +#: glade/profile.glade:580 +msgid "<b>Port Connnection</b>" +msgstr "<b>Puerto de conexión:</b>" + +#: glade/profile.glade:616 +msgid "General" +msgstr "General" + +#: glade/profile.glade:669 +msgid "User name:" +msgstr "Nombre de usuario:" + +#: glade/profile.glade:697 +msgid "Gender:" +msgstr "Género:" + +#: glade/profile.glade:743 +msgid "Height:" +msgstr "Altura:" + +#: glade/profile.glade:814 +msgid "Date of birth:" +msgstr "Fecha de nacimiento:" + +#: glade/profile.glade:926 +msgid "Weight:" +msgstr "Peso:" + +#: glade/profile.glade:958 +msgid "<b>Athlete Details</b>" +msgstr "<b>Datos personales</b>" + +#: glade/profile.glade:987 +msgid "Athlete" +msgstr "Atleta" + +#: glade/profile.glade:1170 +msgid "<b>Sport List</b>" +msgstr "<b>Lista de deportes:</b>" + +#: glade/profile.glade:1199 +msgid "llist" +msgstr "lista" + +#: glade/profile.glade:1279 glade/pytrainer.glade:8850 +#: glade/pytrainer.glade:9341 +msgid "Name:" +msgstr "Nombre:" + +#: glade/profile.glade:1307 +msgid "M.E.T.:" +msgstr "M.E.T.:" + +#: glade/profile.glade:1356 +msgid "Extra Weight:" +msgstr "Peso extra:" + +#: glade/profile.glade:1430 glade/profile.glade:2028 +msgid "" +"More information on determining yor M.E.T sport coefficient on Wikipedia" +msgstr "Más información sobre el coeficiente M.E.T. en Wikipedia" + +#: glade/profile.glade:1534 +msgid "<b>Add New Sport</b>" +msgstr "<b>Añadir nuevo deporte</b>" + +#: glade/profile.glade:1563 +msgid "new" +msgstr "nuevo" + +#: glade/profile.glade:1623 +msgid "" +"Deleting a sport removes associated records.\n" +"Continue?" +msgstr "" +"Si borra un deporte elimina sus registros asociados.\n" +"¿Desea continuar?" + +#: glade/profile.glade:1763 +msgid "<b>Delete Sport</b>" +msgstr "<b>Borrar deporte</b>" + +#: glade/profile.glade:1787 glade/pytrainer.glade:2975 +#: glade/pytrainer.glade:8368 +msgid "label-2147483648" +msgstr " " + +#: glade/profile.glade:1823 +msgid "delete" +msgstr "borrar" + +#: glade/profile.glade:1882 +msgid "Name" +msgstr "Nombre" + +#: glade/profile.glade:1931 +msgid "M.E.T." +msgstr "M.E.T." + +#: glade/profile.glade:1980 pytrainer/gui/windowprofile.py:69 +msgid "Extra Weight" +msgstr "Peso extra" + +#: glade/profile.glade:2138 +msgid "<b>Edit Sport</b>" +msgstr "<b>Editar deporte</b>" + +#: glade/profile.glade:2162 +msgid "<b>lalaal</b>" +msgstr "<b>lalaal</b>" + +#: glade/profile.glade:2198 +msgid "edit" +msgstr "editar" + +#: glade/profile.glade:2227 +msgid "Sports" +msgstr "Deportes" + +#: glade/profile.glade:2286 +msgid "Maximum heart rate:" +msgstr "Pulsaciones máximas:" + +#: glade/profile.glade:2314 +msgid "Resting heart rate:" +msgstr "Pulsaciones en reposo:" + +#: glade/profile.glade:2388 +msgid "" +"<small><b>Note:</b> Maximum heart rate is calculated by subtracting the " +"number 220 minus your age. </small>" +msgstr "" +"<small><b>Nota:</b> el número máximo de pulsaciones se calcula con la " +"siguiente fórmula: 220 menos su edad. </small>" + +#: glade/profile.glade:2527 +msgid "" +"<small><b>NOTE:</b> in order to use the Karvonen method you must cover the " +"Resting hr field.</small>" +msgstr "" +"<small><b>Nota:</b> rellene todos los campos relativos a pulsaciones si usa " +"el método Karvonen</small>" + +#: glade/profile.glade:2556 +msgid "Percentages based method" +msgstr "Basado en porcentajes" + +#: glade/profile.glade:2578 pytrainer/gui/windowmain.py:291 +msgid "Karvonen method" +msgstr "Karvonen" + +#: glade/profile.glade:2600 +msgid "Select how to calculate your heart rate zones." +msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca" + +#: glade/profile.glade:2632 +msgid "<b>Heart Rate Zones</b>" +msgstr "<b>Zonas de frecuencia cardiaca</b>" + +#: glade/profile.glade:2668 pytrainer/recordgraph.py:99 +#: pytrainer/heartrategraph.py:38 pytrainer/daygraph.py:56 +msgid "Heart Rate" +msgstr "Pulsaciones" + #: glade/pytrainer.glade:8 msgid "window1" msgstr "Ventana1" @@ -56,8 +495,7 @@ msgid "Tools" msgstr "Herramientas" -#: glade/pytrainer.glade:201 -#: glade/pytrainer.glade:8842 +#: glade/pytrainer.glade:201 glade/pytrainer.glade:8718 msgid "Extensions" msgstr "Extensiones" @@ -69,17 +507,9 @@ msgid "_Help" msgstr "_Ayuda" -#: glade/pytrainer.glade:345 -#: build/lib/pytrainer/gui/windowmain.py:63 -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:715 -#: build/lib/pytrainer/gui/windowimportdata.py:255 -#: build/lib/pytrainer/gui/windowprofile.py:69 -#: pytrainer/gui/windowmain.py:63 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:715 -#: pytrainer/gui/windowimportdata.py:255 -#: pytrainer/gui/windowprofile.py:69 +#: glade/pytrainer.glade:345 pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:716 +#: pytrainer/gui/windowimportdata.py:255 pytrainer/gui/windowprofile.py:69 msgid "Sport" msgstr "Deporte" @@ -91,26 +521,20 @@ msgid "<b>Sport:</b>" msgstr "<b>Deporte:</b>" -#: glade/pytrainer.glade:592 -#: glade/pytrainer.glade:3212 -#: glade/pytrainer.glade:4340 -#: glade/pytrainer.glade:5482 +#: glade/pytrainer.glade:592 glade/pytrainer.glade:3212 +#: glade/pytrainer.glade:4340 glade/pytrainer.glade:5482 #: glade/pytrainer.glade:6777 msgid "<b>Duration:</b>" msgstr "<b>Duración:</b>" -#: glade/pytrainer.glade:621 -#: glade/pytrainer.glade:3409 -#: glade/pytrainer.glade:4510 -#: glade/pytrainer.glade:5652 +#: glade/pytrainer.glade:621 glade/pytrainer.glade:3409 +#: glade/pytrainer.glade:4510 glade/pytrainer.glade:5652 #: glade/pytrainer.glade:7001 msgid "<b>Speed:</b>" msgstr "<b>Velocidad:</b>" -#: glade/pytrainer.glade:649 -#: glade/pytrainer.glade:3718 -#: glade/pytrainer.glade:4874 -#: glade/pytrainer.glade:6016 +#: glade/pytrainer.glade:649 glade/pytrainer.glade:3718 +#: glade/pytrainer.glade:4874 glade/pytrainer.glade:6016 #: glade/pytrainer.glade:7171 msgid "<b>Pace:</b>" msgstr "<b>Ritmo:</b>" @@ -127,74 +551,33 @@ msgid "<b>Comments:</b>" msgstr "<b>Comentarios:</b>" -#: glade/pytrainer.glade:760 -#: glade/pytrainer.glade:1585 -#: glade/pytrainer.glade:3465 -#: glade/pytrainer.glade:3522 -#: glade/pytrainer.glade:4566 -#: glade/pytrainer.glade:4735 -#: glade/pytrainer.glade:5708 -#: glade/pytrainer.glade:5877 -#: glade/pytrainer.glade:7057 -#: glade/pytrainer.glade:7085 -#: build/lib/pytrainer/gui/windowmain.py:177 -#: build/lib/pytrainer/gui/windowmain.py:178 -#: build/lib/pytrainer/gui/windowmain.py:311 -#: build/lib/pytrainer/gui/windowmain.py:312 -#: build/lib/pytrainer/gui/windowmain.py:411 -#: build/lib/pytrainer/gui/windowmain.py:412 -#: build/lib/pytrainer/gui/windowmain.py:489 -#: build/lib/pytrainer/gui/windowmain.py:490 -#: pytrainer/gui/windowmain.py:177 -#: pytrainer/gui/windowmain.py:178 -#: pytrainer/gui/windowmain.py:311 -#: pytrainer/gui/windowmain.py:312 -#: pytrainer/gui/windowmain.py:411 -#: pytrainer/gui/windowmain.py:412 -#: pytrainer/gui/windowmain.py:489 -#: pytrainer/gui/windowmain.py:490 +#: glade/pytrainer.glade:760 glade/pytrainer.glade:1585 +#: glade/pytrainer.glade:3465 glade/pytrainer.glade:3522 +#: glade/pytrainer.glade:4566 glade/pytrainer.glade:4735 +#: glade/pytrainer.glade:5708 glade/pytrainer.glade:5877 +#: glade/pytrainer.glade:7057 glade/pytrainer.glade:7085 +#: pytrainer/gui/windowmain.py:177 pytrainer/gui/windowmain.py:178 +#: pytrainer/gui/windowmain.py:311 pytrainer/gui/windowmain.py:312 +#: pytrainer/gui/windowmain.py:412 pytrainer/gui/windowmain.py:413 +#: pytrainer/gui/windowmain.py:490 pytrainer/gui/windowmain.py:491 msgid "km/h" msgstr "Km/h" -#: glade/pytrainer.glade:788 -#: glade/pytrainer.glade:1267 -#: glade/pytrainer.glade:3746 -#: glade/pytrainer.glade:3802 -#: glade/pytrainer.glade:4930 -#: glade/pytrainer.glade:4958 -#: glade/pytrainer.glade:6072 -#: glade/pytrainer.glade:6100 -#: glade/pytrainer.glade:7228 -#: glade/pytrainer.glade:7256 -#: build/lib/pytrainer/gui/windowmain.py:179 -#: build/lib/pytrainer/gui/windowmain.py:180 -#: build/lib/pytrainer/gui/windowmain.py:313 -#: build/lib/pytrainer/gui/windowmain.py:314 -#: build/lib/pytrainer/gui/windowmain.py:413 -#: build/lib/pytrainer/gui/windowmain.py:414 -#: build/lib/pytrainer/gui/windowmain.py:491 -#: build/lib/pytrainer/gui/windowmain.py:492 -#: pytrainer/gui/windowmain.py:179 -#: pytrainer/gui/windowmain.py:180 -#: pytrainer/gui/windowmain.py:313 -#: pytrainer/gui/windowmain.py:314 -#: pytrainer/gui/windowmain.py:413 -#: pytrainer/gui/windowmain.py:414 -#: pytrainer/gui/windowmain.py:491 -#: pytrainer/gui/windowmain.py:492 +#: glade/pytrainer.glade:788 glade/pytrainer.glade:1267 +#: glade/pytrainer.glade:3746 glade/pytrainer.glade:3802 +#: glade/pytrainer.glade:4930 glade/pytrainer.glade:4958 +#: glade/pytrainer.glade:6072 glade/pytrainer.glade:6100 +#: glade/pytrainer.glade:7228 glade/pytrainer.glade:7256 +#: pytrainer/gui/windowmain.py:179 pytrainer/gui/windowmain.py:180 +#: pytrainer/gui/windowmain.py:313 pytrainer/gui/windowmain.py:314 +#: pytrainer/gui/windowmain.py:414 pytrainer/gui/windowmain.py:415 +#: pytrainer/gui/windowmain.py:492 pytrainer/gui/windowmain.py:493 msgid "min/km" msgstr "min/km" -#: glade/pytrainer.glade:816 -#: glade/pytrainer.glade:1323 -#: build/lib/pytrainer/gui/windowmain.py:181 -#: build/lib/pytrainer/gui/windowmain.py:182 -#: build/lib/pytrainer/gui/windowmain.py:1022 -#: build/lib/pytrainer/gui/windowmain.py:1024 -#: pytrainer/gui/windowmain.py:181 -#: pytrainer/gui/windowmain.py:182 -#: pytrainer/gui/windowmain.py:1022 -#: pytrainer/gui/windowmain.py:1024 +#: glade/pytrainer.glade:816 glade/pytrainer.glade:1323 +#: pytrainer/gui/windowmain.py:181 pytrainer/gui/windowmain.py:182 +#: pytrainer/gui/windowmain.py:1025 pytrainer/gui/windowmain.py:1027 msgid "m" msgstr "m" @@ -202,10 +585,8 @@ msgid "<b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:1013 -#: glade/pytrainer.glade:3184 -#: glade/pytrainer.glade:4312 -#: glade/pytrainer.glade:5454 +#: glade/pytrainer.glade:1013 glade/pytrainer.glade:3184 +#: glade/pytrainer.glade:4312 glade/pytrainer.glade:5454 #: glade/pytrainer.glade:6749 msgid "<b>Distance:</b>" msgstr "<b>Distancia:</b>" @@ -214,10 +595,8 @@ msgid "<b>Max Speed</b>" msgstr "<b>Pico velocidad:</b>" -#: glade/pytrainer.glade:1070 -#: glade/pytrainer.glade:3774 -#: glade/pytrainer.glade:4902 -#: glade/pytrainer.glade:6044 +#: glade/pytrainer.glade:1070 glade/pytrainer.glade:3774 +#: glade/pytrainer.glade:4902 glade/pytrainer.glade:6044 #: glade/pytrainer.glade:7200 msgid "<b>Max Pace:</b>" msgstr "<b>Pico ritmo:</b>" @@ -226,50 +605,27 @@ msgid "<b>Descent:</b>" msgstr "<b>Descenso:</b>" -#: glade/pytrainer.glade:1351 -#: glade/pytrainer.glade:3606 -#: glade/pytrainer.glade:4650 -#: glade/pytrainer.glade:5792 +#: glade/pytrainer.glade:1351 glade/pytrainer.glade:3606 +#: glade/pytrainer.glade:4650 glade/pytrainer.glade:5792 #: glade/pytrainer.glade:6608 msgid "Cal" msgstr "Cal" -#: glade/pytrainer.glade:1417 -#: glade/pytrainer.glade:3128 -#: glade/pytrainer.glade:4256 -#: glade/pytrainer.glade:5398 +#: glade/pytrainer.glade:1417 glade/pytrainer.glade:3128 +#: glade/pytrainer.glade:4256 glade/pytrainer.glade:5398 #: glade/pytrainer.glade:6973 msgid "Km" msgstr "km" -#: glade/pytrainer.glade:1450 -#: glade/pytrainer.glade:1500 -#: glade/pytrainer.glade:1550 -#: glade/pytrainer.glade:3246 -#: glade/pytrainer.glade:3296 -#: glade/pytrainer.glade:3346 -#: glade/pytrainer.glade:4424 -#: glade/pytrainer.glade:4474 -#: glade/pytrainer.glade:5566 -#: glade/pytrainer.glade:5616 -#: glade/pytrainer.glade:6861 -#: glade/pytrainer.glade:6911 +#: glade/pytrainer.glade:1450 glade/pytrainer.glade:1500 +#: glade/pytrainer.glade:1550 glade/pytrainer.glade:3246 +#: glade/pytrainer.glade:3296 glade/pytrainer.glade:3346 +#: glade/pytrainer.glade:4424 glade/pytrainer.glade:4474 +#: glade/pytrainer.glade:5566 glade/pytrainer.glade:5616 +#: glade/pytrainer.glade:6861 glade/pytrainer.glade:6911 msgid "00" msgstr "00" -#: glade/pytrainer.glade:1475 -#: glade/pytrainer.glade:1525 -#: glade/pytrainer.glade:3271 -#: glade/pytrainer.glade:3321 -#: glade/pytrainer.glade:4399 -#: glade/pytrainer.glade:4449 -#: glade/pytrainer.glade:5541 -#: glade/pytrainer.glade:5591 -#: glade/pytrainer.glade:6836 -#: glade/pytrainer.glade:6886 -msgid ":" -msgstr ":" - #: glade/pytrainer.glade:1726 msgid " <b>Title:</b>" msgstr "<b>Título:</b>" @@ -287,10 +643,8 @@ "Ritmo\n" "Pulsaciones" -#: glade/pytrainer.glade:1860 -#: glade/pytrainer.glade:5256 -#: glade/pytrainer.glade:6398 -#: glade/pytrainer.glade:7554 +#: glade/pytrainer.glade:1860 glade/pytrainer.glade:5256 +#: glade/pytrainer.glade:6398 glade/pytrainer.glade:7554 msgid "Versus" msgstr "contra" @@ -317,18 +671,14 @@ msgid "<b>Beats:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2089 -#: glade/pytrainer.glade:3550 -#: glade/pytrainer.glade:4594 -#: glade/pytrainer.glade:5736 +#: glade/pytrainer.glade:2089 glade/pytrainer.glade:3550 +#: glade/pytrainer.glade:4594 glade/pytrainer.glade:5736 #: glade/pytrainer.glade:6552 msgid "<b>Calories: </b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:2117 -#: glade/pytrainer.glade:3830 -#: glade/pytrainer.glade:5014 -#: glade/pytrainer.glade:6156 +#: glade/pytrainer.glade:2117 glade/pytrainer.glade:3830 +#: glade/pytrainer.glade:5014 glade/pytrainer.glade:6156 #: glade/pytrainer.glade:7284 msgid "<b>Max Beats:</b>" msgstr "<b>Pico pulsaciones:</b>" @@ -341,8 +691,7 @@ msgid "<b>HR Zone5:</b>" msgstr "<b>Máximo esfuerzo:</b>" -#: glade/pytrainer.glade:2202 -#: glade/pytrainer.glade:2566 +#: glade/pytrainer.glade:2202 glade/pytrainer.glade:2566 msgid " bpm" msgstr "ppm" @@ -366,18 +715,12 @@ msgid "<b>HR Zone1:</b>" msgstr "<b>Recuperación:</b>" -#: glade/pytrainer.glade:2621 -#: glade/pytrainer.glade:2648 -#: glade/pytrainer.glade:2676 -#: glade/pytrainer.glade:2704 -#: glade/pytrainer.glade:2732 -#: glade/pytrainer.glade:3690 -#: glade/pytrainer.glade:3858 -#: glade/pytrainer.glade:4846 -#: glade/pytrainer.glade:4986 -#: glade/pytrainer.glade:5988 -#: glade/pytrainer.glade:6128 -#: glade/pytrainer.glade:6692 +#: glade/pytrainer.glade:2621 glade/pytrainer.glade:2648 +#: glade/pytrainer.glade:2676 glade/pytrainer.glade:2704 +#: glade/pytrainer.glade:2732 glade/pytrainer.glade:3690 +#: glade/pytrainer.glade:3858 glade/pytrainer.glade:4846 +#: glade/pytrainer.glade:4986 glade/pytrainer.glade:5988 +#: glade/pytrainer.glade:6128 glade/pytrainer.glade:6692 #: glade/pytrainer.glade:7113 msgid "bpm" msgstr "ppm" @@ -386,30 +729,21 @@ msgid " <b>Heart Rate:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2975 -#: glade/pytrainer.glade:8368 -msgid "label-2147483648" -msgstr " " - #: glade/pytrainer.glade:3013 msgid "label-2147483647" -msgstr "" +msgstr " " #: glade/pytrainer.glade:3069 msgid "Record" msgstr "Registro" -#: glade/pytrainer.glade:3494 -#: glade/pytrainer.glade:4679 -#: glade/pytrainer.glade:5821 -#: glade/pytrainer.glade:7142 +#: glade/pytrainer.glade:3494 glade/pytrainer.glade:4679 +#: glade/pytrainer.glade:5821 glade/pytrainer.glade:7142 msgid "<b>Max Speed:</b>" msgstr "<b>Velocidad máxima:</b>" -#: glade/pytrainer.glade:3634 -#: glade/pytrainer.glade:4790 -#: glade/pytrainer.glade:5932 -#: glade/pytrainer.glade:6636 +#: glade/pytrainer.glade:3634 glade/pytrainer.glade:4790 +#: glade/pytrainer.glade:5932 glade/pytrainer.glade:6636 msgid "<b>Beats avg:</b>" msgstr "<b>Media pulsaciones:</b>" @@ -435,23 +769,16 @@ msgid "Day" msgstr "Día" -#: glade/pytrainer.glade:4374 -#: glade/pytrainer.glade:5516 +#: glade/pytrainer.glade:4374 glade/pytrainer.glade:5516 #: glade/pytrainer.glade:6811 msgid "000" msgstr "000" -#: glade/pytrainer.glade:4763 -#: glade/pytrainer.glade:5905 -msgid " " -msgstr " " - #: glade/pytrainer.glade:5136 msgid " <b>Week:</b>" msgstr "<b>Semana:</b>" -#: glade/pytrainer.glade:5236 -#: glade/pytrainer.glade:6378 +#: glade/pytrainer.glade:5236 glade/pytrainer.glade:6378 #: glade/pytrainer.glade:7534 msgid "" "Distance\n" @@ -466,8 +793,7 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:5281 -#: glade/pytrainer.glade:6423 +#: glade/pytrainer.glade:5281 glade/pytrainer.glade:6423 #: glade/pytrainer.glade:7579 msgid "" "None\n" @@ -552,9 +878,8 @@ msgid "Longitude:" msgstr "<b>Longitud:</b>" -#: glade/pytrainer.glade:8163 -#: glade/pytrainer.glade:9030 -#: glade/pytrainer.glade:9353 +#: glade/pytrainer.glade:8163 glade/pytrainer.glade:8906 +#: glade/pytrainer.glade:9229 msgid "Description:" msgstr "<b>Descripción:</b>" @@ -570,680 +895,435 @@ msgid "label163" msgstr " " -#: glade/pytrainer.glade:8581 -msgid "Calendar" -msgstr "Calendario" - -#: glade/pytrainer.glade:8783 +#: glade/pytrainer.glade:8659 msgid "Edit Record" msgstr "Editar registro" -#: glade/pytrainer.glade:8804 +#: glade/pytrainer.glade:8680 msgid "Show graph in classic view" msgstr "Mostrar en vista clásica" -#: glade/pytrainer.glade:8918 +#: glade/pytrainer.glade:8794 msgid "<b>Extension Details</b>" msgstr "<b>Detalles de la extensión</b>" -#: glade/pytrainer.glade:8946 +#: glade/pytrainer.glade:8822 msgid "name-entry" msgstr "Nombre" -#: glade/pytrainer.glade:8974 -#: glade/pytrainer.glade:9465 -msgid "Name:" -msgstr "Nombre:" - -#: glade/pytrainer.glade:9002 -#: glade/pytrainer.glade:9409 +#: glade/pytrainer.glade:8878 glade/pytrainer.glade:9285 msgid "Status:" msgstr "Estado:" -#: glade/pytrainer.glade:9058 -#: glade/pytrainer.glade:9381 +#: glade/pytrainer.glade:8934 glade/pytrainer.glade:9257 msgid "status-entry" msgstr "Estado" -#: glade/pytrainer.glade:9086 +#: glade/pytrainer.glade:8962 msgid "description-entry" msgstr "Descripción" -#: glade/pytrainer.glade:9221 +#: glade/pytrainer.glade:9097 msgid "Plugins" msgstr "Plugins" -#: glade/pytrainer.glade:9296 +#: glade/pytrainer.glade:9172 msgid "<b>Plugin Details</b>" -msgstr "<b>Detalles del plugin:</b>" +msgstr "<b>Detalles del plugin</b>" -#: glade/pytrainer.glade:9325 +#: glade/pytrainer.glade:9201 msgid "description-entry " msgstr "Descripción" -#: glade/pytrainer.glade:9437 +#: glade/pytrainer.glade:9313 msgid "nameEntry" msgstr "Nombre entrada" -#: glade/pytrainer.glade:9608 +#: glade/pytrainer.glade:9484 msgid "Select track record" msgstr "Seleccione uno de los tracks" -#: pytrainer/main.py:416 -#: build/lib/pytrainer/main.py:416 -msgid "Delete this database entry?" -msgstr "¿Borrar esta entrada de la base de datos?" +#: glade/warning.glade:7 glade/warning.glade:38 +msgid "Warning" +msgstr "Advertencia" -#: pytrainer/main.py:430 -#: build/lib/pytrainer/main.py:430 -msgid "Delete this waypoint?" -msgstr "¿Borrar este waypoint?" - -#: build/lib/pytrainer/gui/windowmain.py:63 -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:70 -#: pytrainer/gui/windowmain.py:63 -#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:63 pytrainer/gui/windowmain.py:66 #: pytrainer/gui/windowmain.py:70 msgid "id" msgstr "id" -#: build/lib/pytrainer/gui/windowmain.py:63 #: pytrainer/gui/windowmain.py:63 msgid "Start" msgstr "Comienzo" -#: build/lib/pytrainer/gui/windowmain.py:63 #: pytrainer/gui/windowmain.py:63 msgid "Kilometer" msgstr "Kilómetros" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:712 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:712 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:713 msgid "Title" msgstr "Título" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:713 -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:713 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:714 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:714 -#: build/lib/pytrainer/gui/windowimportdata.py:255 -#: build/lib/pytrainer/extensions/googlemaps.py:91 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:714 -#: pytrainer/gui/windowimportdata.py:255 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:715 +#: pytrainer/gui/windowimportdata.py:255 pytrainer/extensions/googlemaps.py:91 msgid "Distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:716 -#: build/lib/pytrainer/extensions/googlemaps.py:91 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:716 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:717 #: pytrainer/extensions/googlemaps.py:91 msgid "Time" msgstr "Tiempo" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:717 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:717 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:718 msgid "Beats" msgstr "Pulsaciones" -#: build/lib/pytrainer/gui/windowmain.py:66 -#: build/lib/pytrainer/gui/windowmain.py:718 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:718 +#: pytrainer/gui/windowmain.py:66 pytrainer/gui/windowmain.py:719 msgid "Average" msgstr "Media" -#: build/lib/pytrainer/gui/windowmain.py:70 #: pytrainer/gui/windowmain.py:70 msgid "Waypoint" msgstr "Waypoint" -#: build/lib/pytrainer/gui/windowmain.py:168 -#: build/lib/pytrainer/gui/windowmain.py:304 -#: build/lib/pytrainer/gui/windowmain.py:404 -#: build/lib/pytrainer/gui/windowmain.py:482 -#: pytrainer/gui/windowmain.py:168 -#: pytrainer/gui/windowmain.py:304 -#: pytrainer/gui/windowmain.py:404 -#: pytrainer/gui/windowmain.py:482 +#: pytrainer/gui/windowmain.py:168 pytrainer/gui/windowmain.py:304 +#: pytrainer/gui/windowmain.py:405 pytrainer/gui/windowmain.py:483 msgid "miles" msgstr "millas" -#: build/lib/pytrainer/gui/windowmain.py:169 -#: build/lib/pytrainer/gui/windowmain.py:170 -#: build/lib/pytrainer/gui/windowmain.py:305 -#: build/lib/pytrainer/gui/windowmain.py:306 -#: build/lib/pytrainer/gui/windowmain.py:405 -#: build/lib/pytrainer/gui/windowmain.py:406 -#: build/lib/pytrainer/gui/windowmain.py:483 -#: build/lib/pytrainer/gui/windowmain.py:484 -#: pytrainer/gui/windowmain.py:169 -#: pytrainer/gui/windowmain.py:170 -#: pytrainer/gui/windowmain.py:305 -#: pytrainer/gui/windowmain.py:306 -#: pytrainer/gui/windowmain.py:405 -#: pytrainer/gui/windowmain.py:406 -#: pytrainer/gui/windowmain.py:483 -#: pytrainer/gui/windowmain.py:484 +#: pytrainer/gui/windowmain.py:169 pytrainer/gui/windowmain.py:170 +#: pytrainer/gui/windowmain.py:305 pytrainer/gui/windowmain.py:306 +#: pytrainer/gui/windowmain.py:406 pytrainer/gui/windowmain.py:407 +#: pytrainer/gui/windowmain.py:484 pytrainer/gui/windowmain.py:485 msgid "miles/h" msgstr "millas/h" -#: build/lib/pytrainer/gui/windowmain.py:171 -#: build/lib/pytrainer/gui/windowmain.py:172 -#: build/lib/pytrainer/gui/windowmain.py:307 -#: build/lib/pytrainer/gui/windowmain.py:308 -#: build/lib/pytrainer/gui/windowmain.py:407 -#: build/lib/pytrainer/gui/windowmain.py:408 -#: build/lib/pytrainer/gui/windowmain.py:485 -#: build/lib/pytrainer/gui/windowmain.py:486 -#: pytrainer/gui/windowmain.py:171 -#: pytrainer/gui/windowmain.py:172 -#: pytrainer/gui/windowmain.py:307 -#: pytrainer/gui/windowmain.py:308 -#: pytrainer/gui/windowmain.py:407 -#: pytrainer/gui/windowmain.py:408 -#: pytrainer/gui/windowmain.py:485 -#: pytrainer/gui/windowmain.py:486 +#: pytrainer/gui/windowmain.py:171 pytrainer/gui/windowmain.py:172 +#: pytrainer/gui/windowmain.py:307 pytrainer/gui/windowmain.py:308 +#: pytrainer/gui/windowmain.py:408 pytrainer/gui/windowmain.py:409 +#: pytrainer/gui/windowmain.py:486 pytrainer/gui/windowmain.py:487 msgid "min/mile" msgstr "min/milla" -#: build/lib/pytrainer/gui/windowmain.py:173 -#: build/lib/pytrainer/gui/windowmain.py:174 -#: pytrainer/gui/windowmain.py:173 -#: pytrainer/gui/windowmain.py:174 +#: pytrainer/gui/windowmain.py:173 pytrainer/gui/windowmain.py:174 msgid "feet" msgstr "pies" -#: build/lib/pytrainer/gui/windowmain.py:176 -#: build/lib/pytrainer/gui/windowmain.py:310 -#: build/lib/pytrainer/gui/windowmain.py:410 -#: build/lib/pytrainer/gui/windowmain.py:488 -#: build/lib/pytrainer/extensions/googlemaps.py:91 -#: pytrainer/gui/windowmain.py:176 -#: pytrainer/gui/windowmain.py:310 -#: pytrainer/gui/windowmain.py:410 -#: pytrainer/gui/windowmain.py:488 +#: pytrainer/gui/windowmain.py:176 pytrainer/gui/windowmain.py:310 +#: pytrainer/gui/windowmain.py:411 pytrainer/gui/windowmain.py:489 #: pytrainer/extensions/googlemaps.py:91 msgid "km" msgstr "Km" -#: build/lib/pytrainer/gui/windowmain.py:291 -#: pytrainer/gui/windowmain.py:291 -msgid "Karvonen method" -msgstr "Karvonen" - -#: build/lib/pytrainer/gui/windowmain.py:293 #: pytrainer/gui/windowmain.py:293 msgid "Percentages method" msgstr "basado en porcentajes" -#: build/lib/pytrainer/gui/windowmain.py:719 -#: build/lib/pytrainer/monthgraph.py:77 -#: build/lib/pytrainer/yeargraph.py:78 -#: build/lib/pytrainer/weekgraph.py:123 -#: pytrainer/gui/windowmain.py:719 -#: pytrainer/monthgraph.py:77 -#: pytrainer/yeargraph.py:78 -#: pytrainer/weekgraph.py:123 -msgid "Calories" -msgstr "Calorías" - -#: build/lib/pytrainer/gui/windowmain.py:1016 -#: pytrainer/gui/windowmain.py:1016 +#: pytrainer/gui/windowmain.py:1019 msgid "lap" msgstr "vuelta" -#: build/lib/pytrainer/gui/windowmain.py:1022 -#: build/lib/pytrainer/gui/drawArea.py:143 -#: build/lib/pytrainer/extensions/googlemaps.py:89 -#: pytrainer/gui/windowmain.py:1022 -#: pytrainer/gui/drawArea.py:143 +#: pytrainer/gui/windowmain.py:1025 pytrainer/gui/drawArea.py:143 #: pytrainer/extensions/googlemaps.py:89 msgid "h" msgstr "h" -#: build/lib/pytrainer/gui/windowmain.py:1022 -#: build/lib/pytrainer/gui/windowmain.py:1024 -#: pytrainer/gui/windowmain.py:1022 -#: pytrainer/gui/windowmain.py:1024 +#: pytrainer/gui/windowmain.py:1025 pytrainer/gui/windowmain.py:1027 msgid "s" msgstr "s" -#: build/lib/pytrainer/gui/windowimportdata.py:82 #: pytrainer/gui/windowimportdata.py:82 msgid "No file selected" msgstr "Ningún fichero seleccionado" -#: build/lib/pytrainer/gui/windowimportdata.py:189 #: pytrainer/gui/windowimportdata.py:189 msgid "GPS device found" msgstr "Dispositivos GPS encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:192 #: pytrainer/gui/windowimportdata.py:192 msgid "GPS device <b>not</b> found" msgstr "Dispositivo GPS <b>no</b> encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:199 #: pytrainer/gui/windowimportdata.py:199 msgid "This tool was not found on the system" msgstr "No se ha encontrado esta herramienta en el sistema" -#: build/lib/pytrainer/gui/windowimportdata.py:201 #: pytrainer/gui/windowimportdata.py:201 msgid " Homepage" msgstr "Página de inicio" -#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "Start Time" msgstr "Hora de comienzo" -#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "Duration" msgstr "<b>Duración:</b>" -#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "Notes" msgstr "Notas" -#: build/lib/pytrainer/gui/windowimportdata.py:404 #: pytrainer/gui/windowimportdata.py:404 #, python-format msgid "Found file of type: %s" msgstr "Tipo de fichero encontrado: %s" -#: build/lib/pytrainer/gui/windowimportdata.py:413 #: pytrainer/gui/windowimportdata.py:413 msgid "Found in database" msgstr "Encontrado en base de datos" -#: build/lib/pytrainer/gui/windowimportdata.py:428 #: pytrainer/gui/windowimportdata.py:428 msgid "Unknown file type" msgstr "Tipo de fichero desconocido" -#: build/lib/pytrainer/gui/windowimportdata.py:430 #: pytrainer/gui/windowimportdata.py:430 msgid "File selected is of unknown or unsupported file type" msgstr "Fichero seleccionado desconocido o no soportado" -#: build/lib/pytrainer/gui/windowimportdata.py:457 #: pytrainer/gui/windowimportdata.py:457 msgid "Importing one activity" msgstr "Importando una actividad" -#: build/lib/pytrainer/gui/windowimportdata.py:458 #: pytrainer/gui/windowimportdata.py:458 msgid "Imported one activity" msgstr "Una actividad importada" -#: build/lib/pytrainer/gui/windowimportdata.py:460 #: pytrainer/gui/windowimportdata.py:460 #, python-format msgid "Importing %d activities" msgstr "Importando %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:461 #: pytrainer/gui/windowimportdata.py:461 #, python-format msgid "Imported %d activities" msgstr "Importadas %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:469 #: pytrainer/gui/windowimportdata.py:469 msgid "Import Success" msgstr "Importación satisfactoria" -#: build/lib/pytrainer/gui/drawArea.py:144 -#: build/lib/pytrainer/extensions/googlemaps.py:89 -#: pytrainer/gui/drawArea.py:144 -#: pytrainer/extensions/googlemaps.py:89 +#: pytrainer/gui/drawArea.py:144 pytrainer/extensions/googlemaps.py:89 msgid "min" msgstr "min" -#: build/lib/pytrainer/gui/windowprofile.py:51 #: pytrainer/gui/windowprofile.py:51 msgid "Male" msgstr "Varón" -#: build/lib/pytrainer/gui/windowprofile.py:52 #: pytrainer/gui/windowprofile.py:52 msgid "Female" msgstr "Mujer" -#: build/lib/pytrainer/gui/windowprofile.py:69 #: pytrainer/gui/windowprofile.py:69 msgid "MET" msgstr "M.E.T." -#: build/lib/pytrainer/gui/windowprofile.py:69 -#: pytrainer/gui/windowprofile.py:69 -msgid "Extra Weight" -msgstr "Peso extra" - -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Track Name" msgstr "Nombre de la ruta" -#: build/lib/pytrainer/gui/windowextensions.py:70 -#: build/lib/pytrainer/gui/windowplugins.py:70 -#: build/lib/pytrainer/gui/windowplugins.py:97 -#: pytrainer/gui/windowextensions.py:70 -#: pytrainer/gui/windowplugins.py:70 +#: pytrainer/gui/windowextensions.py:70 pytrainer/gui/windowplugins.py:70 #: pytrainer/gui/windowplugins.py:97 msgid "Enable" msgstr "Activo" -#: build/lib/pytrainer/gui/windowextensions.py:72 -#: build/lib/pytrainer/gui/windowplugins.py:72 -#: build/lib/pytrainer/gui/windowplugins.py:96 -#: pytrainer/gui/windowextensions.py:72 -#: pytrainer/gui/windowplugins.py:72 +#: pytrainer/gui/windowextensions.py:72 pytrainer/gui/windowplugins.py:72 #: pytrainer/gui/windowplugins.py:96 msgid "Disable" msgstr "Desactivo" -#: build/lib/pytrainer/gui/windowextensions.py:81 -#: build/lib/pytrainer/gui/windowplugins.py:81 -#: pytrainer/gui/windowextensions.py:81 -#: pytrainer/gui/windowplugins.py:81 +#: pytrainer/gui/windowextensions.py:81 pytrainer/gui/windowplugins.py:81 #, python-format msgid "%s settings" msgstr "%s opciones" -#: build/lib/pytrainer/gui/windowextensions.py:104 -#: build/lib/pytrainer/gui/windowextensions.py:117 -#: pytrainer/gui/windowextensions.py:104 -#: pytrainer/gui/windowextensions.py:117 +#: pytrainer/gui/windowextensions.py:104 pytrainer/gui/windowextensions.py:117 msgid "OK" msgstr "Ok" -#: build/lib/pytrainer/gui/windowplugins.py:104 #: pytrainer/gui/windowplugins.py:104 msgid "Ok" msgstr "Ok" -#: build/lib/pytrainer/recordgraph.py:93 -#: build/lib/pytrainer/recordgraph.py:95 -#: build/lib/pytrainer/recordgraph.py:97 -#: build/lib/pytrainer/recordgraph.py:99 -#: build/lib/pytrainer/recordgraph.py:101 -#: build/lib/pytrainer/monthgraph.py:69 -#: build/lib/pytrainer/heartrategraph.py:38 -#: build/lib/pytrainer/yeargraph.py:70 -#: build/lib/pytrainer/daygraph.py:52 -#: build/lib/pytrainer/daygraph.py:54 -#: build/lib/pytrainer/daygraph.py:56 -#: build/lib/pytrainer/weekgraph.py:115 -#: pytrainer/recordgraph.py:93 -#: pytrainer/recordgraph.py:95 -#: pytrainer/recordgraph.py:97 -#: pytrainer/recordgraph.py:99 -#: pytrainer/recordgraph.py:101 -#: pytrainer/monthgraph.py:69 -#: pytrainer/heartrategraph.py:38 -#: pytrainer/yeargraph.py:70 -#: pytrainer/daygraph.py:52 -#: pytrainer/daygraph.py:54 -#: pytrainer/daygraph.py:56 +#: pytrainer/recordgraph.py:93 pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:97 pytrainer/recordgraph.py:99 +#: pytrainer/recordgraph.py:101 pytrainer/monthgraph.py:69 +#: pytrainer/heartrategraph.py:38 pytrainer/yeargraph.py:70 +#: pytrainer/daygraph.py:52 pytrainer/daygraph.py:54 pytrainer/daygraph.py:56 #: pytrainer/weekgraph.py:115 msgid "Distance (km)" msgstr "Distancia (Km)" -#: build/lib/pytrainer/recordgraph.py:93 -#: build/lib/pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:93 -#: pytrainer/daygraph.py:52 +#: pytrainer/recordgraph.py:93 pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" -#: build/lib/pytrainer/recordgraph.py:93 -#: build/lib/pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:93 -#: pytrainer/daygraph.py:52 +#: pytrainer/recordgraph.py:93 pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" -#: build/lib/pytrainer/recordgraph.py:95 #: pytrainer/recordgraph.py:95 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/recordgraph.py:95 #: pytrainer/recordgraph.py:95 msgid "Speed" msgstr "Velocidad" -#: build/lib/pytrainer/recordgraph.py:97 #: pytrainer/recordgraph.py:97 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" -#: build/lib/pytrainer/recordgraph.py:97 #: pytrainer/recordgraph.py:97 msgid "Pace" msgstr "Ritmo" -#: build/lib/pytrainer/recordgraph.py:99 -#: build/lib/pytrainer/heartrategraph.py:38 -#: build/lib/pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:99 -#: pytrainer/heartrategraph.py:38 +#: pytrainer/recordgraph.py:99 pytrainer/heartrategraph.py:38 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" -#: build/lib/pytrainer/recordgraph.py:99 -#: build/lib/pytrainer/heartrategraph.py:38 -#: build/lib/pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:99 -#: pytrainer/heartrategraph.py:38 -#: pytrainer/daygraph.py:56 -msgid "Heart Rate" -msgstr "Pulsaciones" - -#: build/lib/pytrainer/recordgraph.py:101 #: pytrainer/recordgraph.py:101 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" -#: build/lib/pytrainer/recordgraph.py:101 #: pytrainer/recordgraph.py:101 msgid "Cadence" msgstr "Cadence" -#: build/lib/pytrainer/lib/gpx.py:93 #: pytrainer/lib/gpx.py:93 msgid "No Name" msgstr "Sin nombre" -#: build/lib/pytrainer/lib/gpx.py:100 #: pytrainer/lib/gpx.py:100 msgid "No Data" msgstr "Sin datos" -#: build/lib/pytrainer/lib/heartrate.py:46 #: pytrainer/lib/heartrate.py:46 msgid "Moderate activity" msgstr "Actividad moderada" -#: build/lib/pytrainer/lib/heartrate.py:47 #: pytrainer/lib/heartrate.py:47 msgid "Weight Control" msgstr "Control de peso" -#: build/lib/pytrainer/lib/heartrate.py:48 #: pytrainer/lib/heartrate.py:48 msgid "Aerobic" msgstr "Aeróbico" -#: build/lib/pytrainer/lib/heartrate.py:49 #: pytrainer/lib/heartrate.py:49 msgid "Anaerobic" msgstr "Anaeróbico" -#: build/lib/pytrainer/lib/heartrate.py:50 #: pytrainer/lib/heartrate.py:50 msgid "VO2 MAX" msgstr "VO2 máximo" -#: build/lib/pytrainer/monthgraph.py:69 -#: build/lib/pytrainer/monthgraph.py:71 -#: build/lib/pytrainer/monthgraph.py:73 -#: build/lib/pytrainer/monthgraph.py:75 -#: build/lib/pytrainer/monthgraph.py:77 -#: pytrainer/monthgraph.py:69 -#: pytrainer/monthgraph.py:71 -#: pytrainer/monthgraph.py:73 -#: pytrainer/monthgraph.py:75 +#: pytrainer/monthgraph.py:69 pytrainer/monthgraph.py:71 +#: pytrainer/monthgraph.py:73 pytrainer/monthgraph.py:75 #: pytrainer/monthgraph.py:77 msgid "day" msgstr "día" -#: build/lib/pytrainer/monthgraph.py:69 -#: build/lib/pytrainer/weekgraph.py:115 -#: pytrainer/monthgraph.py:69 -#: pytrainer/weekgraph.py:115 +#: pytrainer/monthgraph.py:69 pytrainer/weekgraph.py:115 msgid "Daily Distance" msgstr "Distancia" -#: build/lib/pytrainer/monthgraph.py:71 -#: build/lib/pytrainer/yeargraph.py:72 -#: build/lib/pytrainer/weekgraph.py:117 -#: pytrainer/monthgraph.py:71 -#: pytrainer/yeargraph.py:72 +#: pytrainer/monthgraph.py:71 pytrainer/yeargraph.py:72 #: pytrainer/weekgraph.py:117 msgid "Time (hours)" msgstr "Tiempo en horas" -#: build/lib/pytrainer/monthgraph.py:71 -#: build/lib/pytrainer/weekgraph.py:117 -#: pytrainer/monthgraph.py:71 -#: pytrainer/weekgraph.py:117 +#: pytrainer/monthgraph.py:71 pytrainer/weekgraph.py:117 msgid "Daily Time" msgstr "Tiempo diario" -#: build/lib/pytrainer/monthgraph.py:73 -#: build/lib/pytrainer/yeargraph.py:74 -#: build/lib/pytrainer/weekgraph.py:119 -#: pytrainer/monthgraph.py:73 -#: pytrainer/yeargraph.py:74 +#: pytrainer/monthgraph.py:73 pytrainer/yeargraph.py:74 #: pytrainer/weekgraph.py:119 msgid "Average Heart Rate (bpm)" msgstr "Pulsaciones medias (ppm)" -#: build/lib/pytrainer/monthgraph.py:73 -#: build/lib/pytrainer/weekgraph.py:119 -#: pytrainer/monthgraph.py:73 -#: pytrainer/weekgraph.py:119 +#: pytrainer/monthgraph.py:73 pytrainer/weekgraph.py:119 msgid "Daily Average Heart Rate" msgstr "Pulsaciones diarias" -#: build/lib/pytrainer/monthgraph.py:75 -#: build/lib/pytrainer/yeargraph.py:76 -#: build/lib/pytrainer/weekgraph.py:121 -#: pytrainer/monthgraph.py:75 -#: pytrainer/yeargraph.py:76 +#: pytrainer/monthgraph.py:75 pytrainer/yeargraph.py:76 #: pytrainer/weekgraph.py:121 msgid "Average Speed (km/h)" msgstr "Velocidad media (km/h)" -#: build/lib/pytrainer/monthgraph.py:75 -#: build/lib/pytrainer/weekgraph.py:121 -#: pytrainer/monthgraph.py:75 -#: pytrainer/weekgraph.py:121 +#: pytrainer/monthgraph.py:75 pytrainer/weekgraph.py:121 msgid "Daily Average Speed" msgstr "medias diarias" -#: build/lib/pytrainer/monthgraph.py:77 -#: build/lib/pytrainer/weekgraph.py:123 -#: pytrainer/monthgraph.py:77 -#: pytrainer/weekgraph.py:123 +#: pytrainer/monthgraph.py:77 pytrainer/weekgraph.py:123 msgid "Daily Calories" msgstr "Calorías diarias" -#: build/lib/pytrainer/record.py:61 #: pytrainer/record.py:61 msgid "Edit Entry" msgstr "Editar entrada" -#: build/lib/pytrainer/record.py:373 -#: pytrainer/record.py:373 +#: pytrainer/record.py:379 msgid "pyTrainer cant import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" -#: build/lib/pytrainer/yeargraph.py:70 -#: build/lib/pytrainer/yeargraph.py:72 -#: build/lib/pytrainer/yeargraph.py:74 -#: build/lib/pytrainer/yeargraph.py:76 -#: build/lib/pytrainer/yeargraph.py:78 -#: pytrainer/yeargraph.py:70 -#: pytrainer/yeargraph.py:72 -#: pytrainer/yeargraph.py:74 -#: pytrainer/yeargraph.py:76 +#: pytrainer/yeargraph.py:70 pytrainer/yeargraph.py:72 +#: pytrainer/yeargraph.py:74 pytrainer/yeargraph.py:76 #: pytrainer/yeargraph.py:78 msgid "month" msgstr "mes" -#: build/lib/pytrainer/yeargraph.py:70 #: pytrainer/yeargraph.py:70 msgid "Monthly Distance" msgstr "Distancia" -#: build/lib/pytrainer/yeargraph.py:72 #: pytrainer/yeargraph.py:72 msgid "Monthly Time" msgstr "Tiempo mensual" -#: build/lib/pytrainer/yeargraph.py:74 #: pytrainer/yeargraph.py:74 msgid "Monthly Average Heart Rate" msgstr "Pulsaciones medias mensuales" -#: build/lib/pytrainer/yeargraph.py:76 #: pytrainer/yeargraph.py:76 msgid "Monthly Average Speed" msgstr "medias mensuales" -#: build/lib/pytrainer/yeargraph.py:78 #: pytrainer/yeargraph.py:78 msgid "Monthly Calories" msgstr "Calorías mensuales" -#: build/lib/pytrainer/waypoint.py:80 #: pytrainer/waypoint.py:80 -msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" -msgstr "Parece que el archivo gpx contiene salidas de varios dias. Probablementenecesitarás editar tu archivo gpx" +msgid "" +"The gpx file seems to be a several days records. Perhaps you will need to " +"edit your gpx file" +msgstr "" +"Parece que el archivo gpx contiene salidas de varios dias. " +"Probablementenecesitarás editar tu archivo gpx" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity" msgstr "Velocidad" +#: pytrainer/main.py:416 +msgid "Delete this database entry?" +msgstr "¿Borrar esta entrada de la base de datos?" + +#: pytrainer/main.py:430 +msgid "Delete this waypoint?" +msgstr "¿Borrar este waypoint?" + #: import/file_gpxplus.py:45 msgid "GPS eXchange file" msgstr "Fichero de intercambio GPS" @@ -1272,198 +1352,54 @@ msgid "Garmin training center database file version 2" msgstr "Versión 2 del fichero Garmin training center database" +#~ msgid "<b>Date Time:</b>" +#~ msgstr "<b>Fecha:</b>" + #~ msgid " " #~ msgstr " " + #~ msgid " " #~ msgstr " " + #~ msgid "<b>Time:</b>" #~ msgstr "<b>Tiempo:</b>" -#~ msgid "New Entry" -#~ msgstr "Nueva entrada" -#~ msgid "Title:" -#~ msgstr "Título:" -#~ msgid "GPX File:" -#~ msgstr "Archivo GPX" -#~ msgid "Calculate Values" -#~ msgstr "Calcular valores" -#~ msgid "Sport:" -#~ msgstr "Deporte:" -#~ msgid "<b>Main</b>" -#~ msgstr "<b>Principal</b>" -#~ msgid "Distance (Km):" -#~ msgstr "Distancia (Km):" -#~ msgid "Calculate" -#~ msgstr "Calcular" + #~ msgid "Time:" #~ msgstr "Tiempo:" -#~ msgid "Date:" -#~ msgstr "Fecha:" -#~ msgid "<b>General</b>" -#~ msgstr "<b>General:</b>" -#~ msgid "Max (km/h):" -#~ msgstr "Punta (Km/h)" -#~ msgid "Velocity (km/h)" -#~ msgstr "Velocidad (km/h)" -#~ msgid "<b>Velocity</b>" -#~ msgstr "<b>Velocidad</b>" -#~ msgid "Max (min/km):" -#~ msgstr "Max (min/km)" -#~ msgid "Pace (min/km):" -#~ msgstr "Ritmo (min/km)" -#~ msgid "<b>Pace</b>" -#~ msgstr "<b>Ritmo</b>" -#~ msgid "Ascent:" -#~ msgstr "Ascenso:" -#~ msgid "Descent:" -#~ msgstr "Descenso:" -#~ msgid "<b>Accumulated Altitude Change</b>" -#~ msgstr "<b>Desnivel acumulado:</b>" -#~ msgid "Max (bpm):" -#~ msgstr "Pulsaciones máximas" -#~ msgid "Heart rate:" -#~ msgstr "Pulsaciones" -#~ msgid "" -#~ "<small><b>Note:</b> In order to calculate the calories you must set the " -#~ "sport MET (in Preferences->Sport) </small>" -#~ msgstr "" -#~ "<small><b>Nota:</a> para el cálculo de calorías es necesario introducir " -#~ "el valor de MET del deporte (en Preferencias -> Deporte)</small>" -#~ msgid "<b>Heart Rate</b>" -#~ msgstr "<b>Pulsaciones</b>" -#~ msgid "Advanced" -#~ msgstr "Avanzado" -#~ msgid "<b>Comments</b>" -#~ msgstr "<b>Comentarios</b>" -#~ msgid "Comments" -#~ msgstr "Comentarios" -#~ msgid "Preferences" -#~ msgstr "Preferencias" -#~ msgid "Metric system" -#~ msgstr "Sistema métrico" -#~ msgid "U.S. customary units" -#~ msgstr "Sistema americano" -#~ msgid "<b>System of Measurement</b>" -#~ msgstr "<b>Sistema de medida</b>" -#~ msgid "Database type:" -#~ msgstr "Tipo de base de datos" -#~ msgid "Database host:" -#~ msgstr "Servidor base de datos" -#~ msgid "Database name:" -#~ msgstr "Nombre base de datos" -#~ msgid "Database user:" -#~ msgstr "Usuario base de datos" -#~ msgid "Database pass:" -#~ msgstr "Contraseña base de datos" -#~ msgid "<b>Database</b>" -#~ msgstr "<b>Base de datos:</b>" -#~ msgid "Use this port for internal connections: " -#~ msgstr "Use este puerto para conexiones internas" -#~ msgid "" -#~ "<small><b>Note:</b> Change this only if you know what you are doing</" -#~ "small>" -#~ msgstr "" -#~ "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" -#~ msgid "<b>Port Connnection</b>" -#~ msgstr "<b>Puerto de conexión:</b>" -#~ msgid "General" -#~ msgstr "General" -#~ msgid "User name:" -#~ msgstr "Nombre de usuario:" -#~ msgid "Gender:" -#~ msgstr "Género:" -#~ msgid "Height:" -#~ msgstr "Altura:" -#~ msgid "Date of birth:" -#~ msgstr "Fecha de nacimiento:" -#~ msgid "Weight:" -#~ msgstr "Peso:" -#~ msgid "<b>Athlete Details</b>" -#~ msgstr "<b>Datos personales</b>" -#~ msgid "Athlete" -#~ msgstr "Atleta" -#~ msgid "<b>Sport List</b>" -#~ msgstr "<b>Lista de deportes:</b>" -#~ msgid "M.E.T.:" -#~ msgstr "M.E.T.:" -#~ msgid "Extra Weight:" -#~ msgstr "Peso extra:" -#~ msgid "" -#~ "More information on determining yor M.E.T sport coefficient on Wikipedia" -#~ msgstr "Más información sobre el coeficiente M.E.T. en Wikipedia" -#~ msgid "<b>Add New Sport</b>" -#~ msgstr "<b>Añadir nuevo deporte</b>" -#~ msgid "new" -#~ msgstr "nuevo" -#~ msgid "" -#~ "Deleting a sport removes associated records.\n" -#~ "Continue?" -#~ msgstr "" -#~ "Si borra un deporte elimina sus registros asociados.\n" -#~ "¿Desea continuar?" -#~ msgid "<b>Delete Sport</b>" -#~ msgstr "<b>Borrar deporte</b>" -#~ msgid "delete" -#~ msgstr "borrar" -#~ msgid "Name" -#~ msgstr "Nombre" -#~ msgid "M.E.T." -#~ msgstr "M.E.T." -#~ msgid "<b>Edit Sport</b>" -#~ msgstr "<b>Editar deporte</b>" -#, fuzzy -#~ msgid "<b>lalaal</b>" -#~ msgstr "<b>Base de datos:</b>" -#~ msgid "edit" -#~ msgstr "editar" -#~ msgid "Sports" -#~ msgstr "Deportes" -#~ msgid "Maximum heart rate:" -#~ msgstr "Pulsaciones máximas:" -#~ msgid "Resting heart rate:" -#~ msgstr "Pulsaciones en reposo:" -#~ msgid "" -#~ "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the " -#~ "number 220 minus your age. </small>" -#~ msgstr "" -#~ "<small><b>Nota:</b> el número máximo de pulsaciones se calcula con la " -#~ "siguiente fórmula: 220 menos su edad. </small>" -#~ msgid "" -#~ "<small><b>NOTE:</b> in order to use the Karvonen method you must cover " -#~ "the Resting hr field.</small>" -#~ msgstr "" -#~ "<small><b>Nota:</b> rellene todos los campos relativos a pulsaciones si " -#~ "usa el método Karvonen</small>" -#~ msgid "Percentages based method" -#~ msgstr "Basado en porcentajes" -#~ msgid "Select how to calculate your heart rate zones." -#~ msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca" -#~ msgid "<b>Heart Rate Zones</b>" -#~ msgstr "<b>Zonas de frecuencia cardiaca</b>" -#~ msgid "warning" -#~ msgstr "advertencia" #~ msgid "January" #~ msgstr "Enero" + #~ msgid "Febrary" #~ msgstr "Febrero" + #~ msgid "March" #~ msgstr "Marzo" + #~ msgid "April" #~ msgstr "Abril" + #~ msgid "May" #~ msgstr "Mayo" + #~ msgid "June" #~ msgstr "Junio" + #~ msgid "July" #~ msgstr "Julio" + #~ msgid "August" #~ msgstr "Agosto" + #~ msgid "September" #~ msgstr "Septiembre" + #~ msgid "October" #~ msgstr "Octubre" + #~ msgid "November" #~ msgstr "Noviembre" + #~ msgid "December" #~ msgstr "Diciembre" @@ -1482,44 +1418,64 @@ #, fuzzy #~ msgid "Daily Beats" #~ msgstr "pulsaciones diarias" + #~ msgid "kilometers" #~ msgstr "Kilometros" + #~ msgid "monthly kilometers" #~ msgstr "Kilometros mensuales" + #~ msgid "time in hours" #~ msgstr "Tiempo en horas" + #~ msgid "beats per minute" #~ msgstr "pulsaciones por minuto" + #~ msgid "monthly beats" #~ msgstr "pulsaciones mensuales" + #~ msgid "average (hm/h)" #~ msgstr "media (km/h)" + #~ msgid "calories" #~ msgstr "calorias" + #~ msgid "Week View" #~ msgstr "Vista semanal" + #~ msgid " Km" #~ msgstr "km" + #~ msgid " km/h" #~ msgstr "Km/h" + #~ msgid "<b>Positive:</b>" #~ msgstr "<b>Positivo:</b>" + #~ msgid "<b>Negative:</b>" #~ msgstr "<b>Negativo:</b>" + #~ msgid " <b>Name:</b>" #~ msgstr "<b>Nombre:</b>" + #~ msgid " <b>Description:</b>" #~ msgstr "<b>Descripción:</b>" + #~ msgid "Calculate Distance" #~ msgstr "Calcular Distancia" + #~ msgid "Calculate Average" #~ msgstr "Calcular Media" + #~ msgid "Profile" #~ msgstr "Perfil" + #~ msgid "Age" #~ msgstr "Edad" + #~ msgid "Database" #~ msgstr "Base de datos" + #~ msgid "" #~ "You are going to remove a sport. When you delete a \n" #~ "sport you delete the records asociated. Are you sure \n" @@ -1529,14 +1485,19 @@ #~ "un deporte borras también la lista de registros asociados\n" #~ "en la base de datos. ¿Estás seguro de que es ésto lo que \n" #~ "quieres hacer?" + #~ msgid "pytrainer" #~ msgstr "pytrainer" + #~ msgid "(c) Fiz Vazquez <vu...@si...>" #~ msgstr " " + #~ msgid "The free sport trainning center" #~ msgstr "El centro de entrenamiento libre" + #~ msgid "pytrainer.e-oss.net" #~ msgstr " " + #~ msgid "" #~ "Catalan: Eloi Crespillo Itchart <el...@ik...>\n" #~ "Czech: Lobus Pokorny <sp...@se...>\n" @@ -1546,25 +1507,33 @@ #~ "german: Aleks <al...@sc...>\n" #~ "Spanish: Fiz vazquez <vu...@si...>" #~ msgstr " " + #~ msgid "window2" #~ msgstr "window2" + #~ msgid "No Active Plugins" #~ msgstr "No hay plugins activos" + #~ msgid "No Active Extensions" #~ msgstr "No hay extensiones activas" + #~ msgid "" #~ "You are going to remove one database entry. Are you sure yo want do it?" #~ msgstr "" #~ "Estás a punto de borrar una entrada en la base de datos. Estás seguro de " #~ "que quieres hacer eso?" + #~ msgid "You are going to remove one waypoint. Are you sure yo want do it?" #~ msgstr "" #~ "Estás a punto de borrar una entrada en la base de datos. Estás seguro de " #~ "que quieres hacer eso?" + #~ msgid "Active" #~ msgstr "Activo" + #~ msgid "unActive" #~ msgstr "inActivo" + #~ msgid "" #~ "The gpx file seems to have several track records. Press cancel to select " #~ "a track record. Press Ok to load all of them as a single track record." @@ -1572,20 +1541,27 @@ #~ "Parece que el archivo gpx contiene varios registros de rutas. Presione " #~ "Cancelar para seleccionar una ruta. Selecciona aceptar para " #~ "seleccionarlos todos como una unica ruta." + #~ msgid "Km/day" #~ msgstr "Km/dia" + #~ msgid "bpm/day" #~ msgstr "ppm/dia" + #~ msgid "km/h/day" #~ msgstr "km/h/dia" + #~ msgid "cal/day" #~ msgstr "cal/dia" + #~ msgid "time/day" #~ msgstr "tiempo/dia" + #~ msgid "Export " #~ msgstr "Exportar" + #~ msgid "Kj/day" #~ msgstr "Kj/dia" + #~ msgid "Press Here to create the database" #~ msgstr "Presiona aqui para crear la base de datos" - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-25 21:45:23
|
Revision: 504 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=504&view=rev Author: dgranda Date: 2010-01-25 21:45:15 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Updated as some glade files were missed Modified Paths: -------------- pytrainer/trunk/utils/translator.sh Modified: pytrainer/trunk/utils/translator.sh =================================================================== --- pytrainer/trunk/utils/translator.sh 2010-01-24 19:39:12 UTC (rev 503) +++ pytrainer/trunk/utils/translator.sh 2010-01-25 21:45:15 UTC (rev 504) @@ -9,9 +9,9 @@ cd ../ # Extract translatable strings from input files -xgettext glade/pytrainer.glade -o ./messages.pot +xgettext glade/*.glade -o ./messages.pot if [ $? != 0 ]; then echo "WARNING: xgettext not found. Please install gettext package"; exit; fi -find ./ -iname "*.py" -exec xgettext -k_ -j -o ./messages.pot ./pytrainer/main.py {} \; +find ./ -iname "*.py" -exec xgettext -k_ -j -o ./messages.pot {} \; # Initializing translations for desired language msginit -i ./messages.pot -l $LANGUAGE -o ./locale/$LANGUAGE/LC_MESSAGES/pytrainer_$LANGUAGE.po_new This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-24 19:39:19
|
Revision: 503 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=503&view=rev Author: dgranda Date: 2010-01-24 19:39:12 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Added forgotten changes Modified Paths: -------------- pytrainer/tags/1.7.1/CHANGES Modified: pytrainer/tags/1.7.1/CHANGES =================================================================== --- pytrainer/tags/1.7.1/CHANGES 2010-01-24 18:13:46 UTC (rev 502) +++ pytrainer/tags/1.7.1/CHANGES 2010-01-24 19:39:12 UTC (rev 503) @@ -24,6 +24,8 @@ * Bug fix for calorie calculation - svn [441], [474] * Bug fix for migration/new install error bug #2924209 - svn [456] * Bug fix for GPX import without elevation data - svn [490] + * Bug fix to prevent adding empty entries - svn [496], [498], [499] + * Updated localizations (es, fr) - svn [494], [495], [497] * Separate some GUI elements into separate files to ease development - svn [443], [457], [465] * EXPERIMENTAL Unified Import GUI begun (for testing/feedback only) - svn [458], [466], [468], [469], [470], [471], [476], [481], [489] o disabled by default This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-24 18:13:51
|
Revision: 502 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=502&view=rev Author: dgranda Date: 2010-01-24 18:13:46 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Updated for 1.7.1 Modified Paths: -------------- pytrainer/trunk/CHANGES Modified: pytrainer/trunk/CHANGES =================================================================== --- pytrainer/trunk/CHANGES 2010-01-24 17:42:37 UTC (rev 501) +++ pytrainer/trunk/CHANGES 2010-01-24 18:13:46 UTC (rev 502) @@ -24,6 +24,8 @@ * Bug fix for calorie calculation - svn [441], [474] * Bug fix for migration/new install error bug #2924209 - svn [456] * Bug fix for GPX import without elevation data - svn [490] + * Bug fix to prevent adding empty entries - svn [496], [498], [499] + * Updated localizations (es, fr) - svn [494], [495], [497] * Separate some GUI elements into separate files to ease development - svn [443], [457], [465] * EXPERIMENTAL Unified Import GUI begun (for testing/feedback only) - svn [458], [466], [468], [469], [470], [471], [476], [481], [489] o disabled by default This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-24 17:42:43
|
Revision: 501 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=501&view=rev Author: dgranda Date: 2010-01-24 17:42:37 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Tagging 1.7.1 release Added Paths: ----------- pytrainer/tags/1.7.1/ Property changes on: pytrainer/tags/1.7.1 ___________________________________________________________________ Added: svn:mergeinfo + /pytrainer/branches/plugins-v2:345-382 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-24 17:38:45
|
Revision: 500 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=500&view=rev Author: dgranda Date: 2010-01-24 17:38:39 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Updating to version 1.7.1 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/aboutdialog.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/setup.py Modified: pytrainer/trunk/pytrainer/gui/aboutdialog.py =================================================================== --- pytrainer/trunk/pytrainer/gui/aboutdialog.py 2010-01-24 17:21:59 UTC (rev 499) +++ pytrainer/trunk/pytrainer/gui/aboutdialog.py 2010-01-24 17:38:39 UTC (rev 500) @@ -34,12 +34,12 @@ def run(self): authors = ["Fiz Vázquez <vu...@si...>\nDavid García Granda <dg...@gm...>\nJohn Blance <joh...@gm...>\n\n-Package maintainers:\n\nRedHat/Fedora: Douglas E. Warner <sil...@si...>\nDebian: Noèl Köthe <no...@de...>\nUbuntu: Kevin Dwyer <ke...@ph...>, Alessio Treglia <qua...@ub...>"] translator_credits = "Basque: Jabier Santamaria <men...@gm...>\nCatalan: Eloi Crespillo Itchart <el...@ik...>\nCzech: Lobus Pokorny <sp...@se...>\nFrench: Dj <dj...@dj...>, Pierre Gaigé <pg...@fr...>\nNorwegian: Havard Davidsen <hav...@gm...>\nPolish: Seweryn Kokot <sk...@po...>\nGerman: Aleks <al...@sc...>, Noèl Köthe <no...@de...>\nSpanish: Fiz Vázquez <vu...@si...>, David García Granda <dg...@gm...>" - license = "PyTrainer - The free sport tracking center\nCopyright (C) 2005-09 Fiz Vázquez\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA" + license = "PyTrainer - The free sport tracking center\nCopyright (C) 2005-10 Fiz Vázquez\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA" about_dialog = gtk.AboutDialog() about_dialog.set_destroy_with_parent(True) about_dialog.set_name("pyTrainer") about_dialog.set_version(self.version) - about_dialog.set_copyright("Copyright \xc2\xa9 2005-9 Fiz Vázquez") + about_dialog.set_copyright("Copyright \xc2\xa9 2005-10 Fiz Vázquez") about_dialog.set_website("http://sourceforge.net/projects/pytrainer") about_dialog.set_website_label("http://sourceforge.net/projects/pytrainer") about_dialog.set_comments("The free sport tracking center") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-24 17:21:59 UTC (rev 499) +++ pytrainer/trunk/pytrainer/main.py 2010-01-24 17:38:39 UTC (rev 500) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_pre-release-svn#498" + self.version ="1.7.1" self.DB_version = 1 self.date = Date() # Checking profile Modified: pytrainer/trunk/setup.py =================================================================== --- pytrainer/trunk/setup.py 2010-01-24 17:21:59 UTC (rev 499) +++ pytrainer/trunk/setup.py 2010-01-24 17:38:39 UTC (rev 500) @@ -15,7 +15,7 @@ return "share/pytrainer/extensions/%s"%extension_name, glob("extensions/%s/*"%extension_name) setup( name="pytrainer", - version="1.7.0", + version="1.7.1", author="Fiz Vazquez", maintainer_email="pyt...@li...", url="https://sourceforge.net/projects/pytrainer/", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-24 17:22:06
|
Revision: 499 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=499&view=rev Author: dgranda Date: 2010-01-24 17:21:59 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Avoid importing entries with no duration Modified Paths: -------------- pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-24 00:21:23 UTC (rev 498) +++ pytrainer/trunk/pytrainer/record.py 2010-01-24 17:21:59 UTC (rev 499) @@ -150,7 +150,11 @@ def insertRecord(self, list_options): logging.debug('>>') if list_options is None: + logging.debug('No data provided, abort adding entry') return None + elif list_options["rcd_time"] == [0, 0, 0]: + logging.debug('Activity has no duration, abort adding entry') + return None logging.debug('list_options: '+str(list_options)) cells,values = self._formatRecordNew(list_options) self.ddbb.insert("records",cells,values) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-24 02:02:56
|
Revision: 498 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=498&view=rev Author: jblance Date: 2010-01-24 00:21:23 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Fix for trac bug 32 - manual entry broken, updated calendar code to select date in entry, moved calendar gui into separate file, greyed out uneditable items on edit record screen, fixed utc and local date_time fields for manual entry Modified Paths: -------------- pytrainer/trunk/glade/newrecord.glade pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowcalendar.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/date.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Added Paths: ----------- pytrainer/trunk/glade/calendar.glade Added: pytrainer/trunk/glade/calendar.glade =================================================================== --- pytrainer/trunk/glade/calendar.glade (rev 0) +++ pytrainer/trunk/glade/calendar.glade 2010-01-24 00:21:23 UTC (rev 498) @@ -0,0 +1,128 @@ +<?xml version="1.0"?> +<glade-interface> + <!-- interface-requires gtk+ 2.16 --> + <!-- interface-naming-policy toplevel-contextual --> +<widget class="GtkWindow" id="calendardialog"> + <property name="visible">True</property> + <property name="title" translatable="yes">Calendar</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="icon">logo_mini.png</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <signal name="destroy" handler="gtk_main_quit" last_modification_time="Mon, 03 Apr 2006 18:04:31 GMT"/> + + <child> + <widget class="GtkVBox" id="vbox6"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkCalendar" id="calendar"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox6"> + <property name="border_width">3</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">5</property> + + <child> + <widget class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_cancel_clicked" last_modification_time="Mon, 03 Apr 2006 18:10:09 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_accept_clicked" last_modification_time="Mon, 03 Apr 2006 18:09:48 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> +</glade-interface> Modified: pytrainer/trunk/glade/newrecord.glade =================================================================== --- pytrainer/trunk/glade/newrecord.glade 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/glade/newrecord.glade 2010-01-24 00:21:23 UTC (rev 498) @@ -179,7 +179,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="frame24"> + <widget class="GtkFrame" id="frameGeneral"> <property name="visible">True</property> <property name="border_width">4</property> <property name="label_xalign">0</property> @@ -248,6 +248,7 @@ <property name="adjustment">0 0 23 1 2 2</property> <property name="climb_rate">1</property> <property name="numeric">True</property> + <property name="wrap">True</property> </widget> <packing> <property name="expand">False</property> @@ -270,9 +271,10 @@ <property name="width_request">47</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="adjustment">0 0 59 1 2 2</property> + <property name="adjustment">0 0 59 2 2 2</property> <property name="climb_rate">1</property> <property name="numeric">True</property> + <property name="wrap">True</property> </widget> <packing> <property name="expand">False</property> @@ -297,6 +299,7 @@ <property name="can_focus">True</property> <property name="adjustment">0 0 59 1 2 2</property> <property name="climb_rate">1</property> + <property name="wrap">True</property> </widget> <packing> <property name="expand">False</property> @@ -432,8 +435,8 @@ <widget class="GtkEntry" id="rcd_time"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="editable">False</property> <property name="width_chars">10</property> + <property name="text" translatable="yes">12:00:00</property> </widget> <packing> <property name="left_attach">3</property> @@ -472,7 +475,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="Velocity"> + <widget class="GtkFrame" id="frameVelocity"> <property name="visible">True</property> <property name="border_width">5</property> <property name="label_xalign">0</property> Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/glade/pytrainer.glade 2010-01-24 00:21:23 UTC (rev 498) @@ -8576,130 +8576,6 @@ </child> </widget> -<widget class="GtkWindow" id="calendardialog"> - <property name="visible">True</property> - <property name="title" translatable="yes">Calendar</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="icon">logo_mini.png</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - <signal name="destroy" handler="gtk_main_quit" last_modification_time="Mon, 03 Apr 2006 18:04:31 GMT"/> - - <child> - <widget class="GtkVBox" id="vbox6"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkCalendar" id="calendar"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkHSeparator" id="hseparator1"> - <property name="visible">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox6"> - <property name="border_width">3</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">5</property> - - <child> - <widget class="GtkLabel" id="label29"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button9"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_cancel_clicked" last_modification_time="Mon, 03 Apr 2006 18:10:09 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button8"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_accept_clicked" last_modification_time="Mon, 03 Apr 2006 18:09:48 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - <widget class="GtkFileChooserDialog" id="filechooserdialog"> <property name="border_width">5</property> <property name="visible">True</property> Modified: pytrainer/trunk/pytrainer/gui/windowcalendar.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowcalendar.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/gui/windowcalendar.py 2010-01-24 00:21:23 UTC (rev 498) @@ -19,12 +19,19 @@ from SimpleGladeApp import SimpleGladeApp class WindowCalendar(SimpleGladeApp): - def __init__(self, data_path = None, parent = None): + def __init__(self, data_path = None, parent = None, date = None): self.parent = parent - glade_path="glade/pytrainer.glade" + glade_path="glade/calendar.glade" root = "calendardialog" domain = None SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) + if date is not None: + try: + year, month, day = date.split("-") + self.calendar.select_month( int(month)-1, int(year) ) + self.calendar.select_day( int(day) ) + except: + pass def on_accept_clicked(self,widget): date = self.calendar.get_date() Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-01-24 00:21:23 UTC (rev 498) @@ -249,7 +249,7 @@ else: self.recordview.set_sensitive(0) logging.debug(">>") - + def actualize_recordgraph(self,record_list,laps=None): logging.debug(">>") if len(record_list)>0: @@ -321,6 +321,7 @@ beats = 0 maxbeats = 0 maxspeed = 0 + average = 0 maxpace = "0.00" pace = "0.00" for record in record_list: @@ -341,8 +342,8 @@ if tbeats > 0: tbeats = tbeats/(timeinseconds/60/60) - - average = distance/(timeinseconds/60/60) + if distance > 0: + average = distance/(timeinseconds/60/60) if maxspeed > 0: maxpace = "%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) if average > 0: @@ -993,6 +994,7 @@ for i in record_list: #Get lap info #TODO refactor to use a database table gpxfile = "%s/%s.gpx" %(self.gpxDir, i[8]) + laps = None if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) laps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) @@ -1012,25 +1014,26 @@ 2, str(i[0]), 3, str(i[2]) ) - for lap in laps: - lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) - distance = "%0.2f" % (float(lap[4]) / 1000.0) - timeHours = int(float(lap[0]) / 3600) - timeMin = int((float(lap[0]) / 3600.0 - timeHours) * 60) - timeSec = float(lap[0]) - (timeHours * 3600) - (timeMin * 60) - if timeHours > 0: - duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) - else: - duration = "%2d%s%02d%s" % (timeMin, _("m"), timeSec, _("s")) + if laps is not None: + for lap in laps: + lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) + distance = "%0.2f" % (float(lap[4]) / 1000.0) + timeHours = int(float(lap[0]) / 3600) + timeMin = int((float(lap[0]) / 3600.0 - timeHours) * 60) + timeSec = float(lap[0]) - (timeHours * 3600) - (timeMin * 60) + if timeHours > 0: + duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) + else: + duration = "%2d%s%02d%s" % (timeMin, _("m"), timeSec, _("s")) - child_iter = store.append(iter) - store.set ( - child_iter, - 0, int(i[8]), - 1, lapNumber, - 2, duration, - 3, distance - ) + child_iter = store.append(iter) + store.set ( + child_iter, + 0, int(i[8]), + 1, lapNumber, + 2, duration, + 3, distance + ) self.recordTreeView.set_model(store) if iterOne: self.recordTreeView.get_selection().select_iter(iterOne) Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-01-24 00:21:23 UTC (rev 498) @@ -16,11 +16,14 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +import os import logging from SimpleGladeApp import SimpleGladeApp from windowcalendar import WindowCalendar from filechooser import FileChooser +from pytrainer.lib.date import Date import dateutil.parser +from dateutil.tz import * # for tzutc() class WindowRecord(SimpleGladeApp): def __init__(self, data_path = None, listSport = None, parent = None, date = None, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None, windowTitle=None): @@ -47,7 +50,7 @@ "rcd_maxbeats", "rcd_pace", "rcd_maxpace", - "rcd_maxvel" + "rcd_maxvel", ] self.listSport = {} for i in listSport: @@ -95,12 +98,20 @@ if self.mode == "newrecord": logging.debug('Track data: '+str(list_options)) if list_options["rcd_gpxfile"] != "": - logging.info('Adding new activity based on GPX file') + logging.info('Adding new activity based on GPX file') trackSummary=(list_options["rcd_sport"],"","") self.parent.insertNewRecord(list_options["rcd_gpxfile"], trackSummary) else: logging.info('Adding new activity based on provided data') - list_options["date_time_utc"] = list_options["rcd_date"] + "T12:00:00Z" # hardcoded + #Manual entry, calculate time info + record_time = self.rcd_time.get_text() + record_date = self.rcd_date.get_text() + localtz = Date().getLocalTZ() + date = dateutil.parser.parse(record_date+" "+record_time+" "+localtz) + local_date = str(date) + utc_date = date.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ") + list_options["date_time_utc"] = utc_date + list_options["date_time_local"] = local_date self.parent.insertRecord(list_options) elif self.mode == "editrecord": self.parent.updateRecord(list_options, self.id_record) @@ -115,7 +126,7 @@ self.quit() def on_calendar_clicked(self,widget): - calendardialog = WindowCalendar(self.data_path,self) + calendardialog = WindowCalendar(self.data_path,self, date=self.rcd_date.get_text()) calendardialog.run() def setDate(self,date): @@ -270,5 +281,8 @@ def on_calculatevalues_clicked(self,widget): gpxfile = self.rcd_gpxfile.get_text() - self.parent.actualize_fromgpx(gpxfile) + if os.path.isfile(gpxfile): + self.frameGeneral.set_sensitive(0) + self.frameVelocity.set_sensitive(0) + self.parent.actualize_fromgpx(gpxfile) Modified: pytrainer/trunk/pytrainer/lib/date.py =================================================================== --- pytrainer/trunk/pytrainer/lib/date.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/lib/date.py 2010-01-24 00:21:23 UTC (rev 498) @@ -21,6 +21,7 @@ import time import datetime import calendar +import datetime import dateutil.parser from dateutil.tz import * # for tzutc() @@ -29,6 +30,8 @@ self.calendar = calendar def second2time(self,seconds): + if not seconds: + return 0,0,0 time_in_hour = seconds/3600.0 hour = int(time_in_hour) min = int((time_in_hour-hour)*60) @@ -38,8 +41,12 @@ def time2second(self,time): hour,min,sec = time - return sec+(min*60)+(hour*3600) + return int(sec)+(int(min)*60)+(int(hour)*3600) + def getLocalTZ(self): + ''' Returns string representation of local timezone''' + return datetime.datetime.now(tzlocal()).tzname() + def getDate(self): #hack for the gtk calendar widget if self.calendar is not None: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/main.py 2010-01-24 00:21:23 UTC (rev 498) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_pre-release-svn#492" + self.version ="1.7.1_pre-release-svn#498" self.DB_version = 1 self.date = Date() # Checking profile Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-23 17:36:32 UTC (rev 497) +++ pytrainer/trunk/pytrainer/record.py 2010-01-24 00:21:23 UTC (rev 498) @@ -61,6 +61,8 @@ self.recordwindow = WindowRecord(self.data_path, list_sport,self, None, windowTitle=_("Edit Entry")) if os.path.isfile(gpxfile): self.recordwindow.rcd_gpxfile.set_text(gpxfile) + self.recordwindow.frameGeneral.set_sensitive(0) #Currently record values not changed if a GPX file is present + self.recordwindow.frameVelocity.set_sensitive(0) #Greying out options to indicate this to user logging.debug('sending record info to window') self.recordwindow.setValues(record[0]) logging.debug('launching window') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-23 17:36:40
|
Revision: 497 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=497&view=rev Author: dgranda Date: 2010-01-23 17:36:32 +0000 (Sat, 23 Jan 2010) Log Message: ----------- Updated french localization (from Pierre) Modified Paths: -------------- pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po Modified: pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po =================================================================== --- pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po 2010-01-22 06:31:21 UTC (rev 496) +++ pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po 2010-01-23 17:36:32 UTC (rev 497) @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: pytrainer_fr\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-02 19:33+0100\n" -"PO-Revision-Date: 2009-12-02 19:36+0100\n" +"POT-Creation-Date: 2010-01-23 11:17+0100\n" +"PO-Revision-Date: 2010-01-23 11:21+0100\n" "Last-Translator: Pierre Gaigé <pg...@fr...>\n" "Language-Team: <fr...@li...>\n" "MIME-Version: 1.0\n" @@ -21,481 +21,209 @@ "X-Poedit-Language: French\n" "X-Poedit-Country: FRANCE\n" -#: glade/pytrainer.glade:8 -msgid "window1" -msgstr "fenêtre1" +#: glade/pytrainer.glade.h:1 +#: glade/newrecord.glade.h:1 +msgid " " +msgstr " " -#: glade/pytrainer.glade:48 -msgid "_File" -msgstr "_Fichier" +#: glade/pytrainer.glade.h:2 +msgid " <b>Date:</b>" +msgstr " <b>Date:</b>" -#: glade/pytrainer.glade:72 -msgid "_Export as Text Separated by Commas" -msgstr "_Exporter un Fichier Texte séparé par des virgules" +#: glade/pytrainer.glade.h:3 +msgid " <b>Heart Rate:</b>" +msgstr " <b>Fréquence Cardiaque:</b>" -#: glade/pytrainer.glade:112 -msgid "_Edit" -msgstr "_Édition" +#: glade/pytrainer.glade.h:4 +msgid " <b>Month:</b>" +msgstr " <b>Mois:</b>" -#: glade/pytrainer.glade:134 -msgid "_View" -msgstr "_Vue" +#: glade/pytrainer.glade.h:5 +msgid " <b>Title:</b>" +msgstr " <b>Titre:</b>" -#: glade/pytrainer.glade:143 +#: glade/pytrainer.glade.h:6 +msgid " <b>Week:</b>" +msgstr "<b>Semaine:</b>" + +#: glade/pytrainer.glade.h:7 +msgid " <b>Year:</b>" +msgstr " <b>Année:</b>" + +#: glade/pytrainer.glade.h:8 +msgid " Cal" +msgstr " Cal" + +#: glade/pytrainer.glade.h:9 +msgid " Name:" +msgstr "Nom:" + +#: glade/pytrainer.glade.h:10 msgid " _Classic View" msgstr "_Vue classique" -#: glade/pytrainer.glade:154 +#: glade/pytrainer.glade.h:11 msgid " _List View" msgstr "_Vue en liste" -#: glade/pytrainer.glade:166 +#: glade/pytrainer.glade.h:12 msgid " _Waypoints Editor" msgstr "_Vue d'édition des Points de Localisation" -#: glade/pytrainer.glade:182 -msgid "Tools" -msgstr "Outils" +#: glade/pytrainer.glade.h:13 +msgid " bpm" +msgstr " bpm" -#: glade/pytrainer.glade:192 -#: glade/pytrainer.glade:13379 -msgid "Extensions" -msgstr "Extensions" - -#: glade/pytrainer.glade:202 -msgid "GPS Device Plugins" -msgstr "Plugins pour les Périphériques GPS" - -#: glade/pytrainer.glade:216 -msgid "_Help" -msgstr "_Aide" - -#: glade/pytrainer.glade:336 -#: pytrainer/gui/windowprofile.py:69 -#: pytrainer/gui/windowmain.py:57 -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:677 -msgid "Sport" -msgstr "Sport" - -#: glade/pytrainer.glade:362 -msgid "All Sports" -msgstr "Tous les Sports" - -#: glade/pytrainer.glade:471 -#: glade/pytrainer.glade:836 -#: glade/pytrainer.glade:864 -msgid " " +#: glade/pytrainer.glade.h:14 +msgid "00" msgstr "" -#: glade/pytrainer.glade:499 -#: glade/pytrainer.glade:892 -msgid " " +#: glade/pytrainer.glade.h:15 +msgid "000" msgstr "" -#: glade/pytrainer.glade:527 -msgid "<b>Sport:</b>" -msgstr "<b>Sport:</b>" +#: glade/pytrainer.glade.h:16 +#: glade/newrecord.glade.h:2 +msgid ":" +msgstr ":" -#: glade/pytrainer.glade:555 -#: glade/pytrainer.glade:2994 -#: glade/pytrainer.glade:4122 -#: glade/pytrainer.glade:5264 -#: glade/pytrainer.glade:6559 -msgid "<b>Time:</b>" -msgstr "<b>Temps:</b>" +#: glade/pytrainer.glade.h:17 +msgid "<b> Waypoint: </b>" +msgstr "<b> Point de localisation:</b>" -#: glade/pytrainer.glade:584 -#: glade/pytrainer.glade:3191 -#: glade/pytrainer.glade:4292 -#: glade/pytrainer.glade:5434 -#: glade/pytrainer.glade:6783 -msgid "<b>Speed:</b>" -msgstr "<b>Vitesse:</b>" - -#: glade/pytrainer.glade:612 -#: glade/pytrainer.glade:3500 -#: glade/pytrainer.glade:4656 -#: glade/pytrainer.glade:5798 -#: glade/pytrainer.glade:6953 -msgid "<b>Pace:</b>" -msgstr "<b>Cadence:</b>" - -#: glade/pytrainer.glade:640 +#: glade/pytrainer.glade.h:18 msgid "<b>Ascent:</b>" msgstr "<b>Dénivelé Pos.:</b>" -#: glade/pytrainer.glade:668 -msgid "<b>Comments:</b>" -msgstr "<b>Commentaires:</b>" +#: glade/pytrainer.glade.h:19 +msgid "<b>Beats avg:</b>" +msgstr "<b>FC Moy:</b>" -#: glade/pytrainer.glade:696 -#: glade/pytrainer.glade:1379 -#: glade/pytrainer.glade:3247 -#: glade/pytrainer.glade:3304 -#: glade/pytrainer.glade:4348 -#: glade/pytrainer.glade:4517 -#: glade/pytrainer.glade:5490 -#: glade/pytrainer.glade:5659 -#: glade/pytrainer.glade:6839 -#: glade/pytrainer.glade:6867 -#: pytrainer/gui/windowmain.py:167 -#: pytrainer/gui/windowmain.py:168 -#: pytrainer/gui/windowmain.py:274 -#: pytrainer/gui/windowmain.py:275 -#: pytrainer/gui/windowmain.py:373 -#: pytrainer/gui/windowmain.py:374 -#: pytrainer/gui/windowmain.py:451 -#: pytrainer/gui/windowmain.py:452 -msgid "km/h" -msgstr "km/h" +#: glade/pytrainer.glade.h:20 +msgid "<b>Beats:</b>" +msgstr "<b>FC Moy:</b>" -#: glade/pytrainer.glade:724 -#: glade/pytrainer.glade:1089 -#: glade/pytrainer.glade:3528 -#: glade/pytrainer.glade:3584 -#: glade/pytrainer.glade:4712 -#: glade/pytrainer.glade:4740 -#: glade/pytrainer.glade:5854 -#: glade/pytrainer.glade:5882 -#: glade/pytrainer.glade:7010 -#: glade/pytrainer.glade:7038 -#: pytrainer/gui/windowmain.py:169 -#: pytrainer/gui/windowmain.py:170 -#: pytrainer/gui/windowmain.py:276 -#: pytrainer/gui/windowmain.py:277 -#: pytrainer/gui/windowmain.py:375 -#: pytrainer/gui/windowmain.py:376 -#: pytrainer/gui/windowmain.py:453 -#: pytrainer/gui/windowmain.py:454 -msgid "min/km" -msgstr "min/km" +#: glade/pytrainer.glade.h:21 +msgid "<b>Calories: </b>" +msgstr "<b>Calories:</b>" -#: glade/pytrainer.glade:752 -#: glade/pytrainer.glade:1145 -#: pytrainer/gui/windowmain.py:171 -#: pytrainer/gui/windowmain.py:172 -msgid "m" -msgstr "m" +#: glade/pytrainer.glade.h:22 +msgid "<b>Calories:</b>" +msgstr "<b>Calories:</b>" -#: glade/pytrainer.glade:780 -msgid " " -msgstr "" +#: glade/pytrainer.glade.h:23 +msgid "<b>Comments:</b>" +msgstr "<b>Commentaires:</b>" -#: glade/pytrainer.glade:808 -#: glade/pytrainer.glade:1117 -#: glade/pytrainer.glade:2040 -#: glade/pytrainer.glade:2068 -#: glade/pytrainer.glade:2096 -#: glade/pytrainer.glade:2264 -#: glade/pytrainer.glade:3696 -#: glade/pytrainer.glade:4852 -#: glade/pytrainer.glade:5994 -msgid " " -msgstr "" +#: glade/pytrainer.glade.h:24 +msgid "<b>Date Time:</b>" +msgstr "<b>Temps:</b>" -#: glade/pytrainer.glade:920 +#: glade/pytrainer.glade.h:25 msgid "<b>Date:</b>" msgstr "<b>Date:</b>" -#: glade/pytrainer.glade:948 -#: glade/pytrainer.glade:2966 -#: glade/pytrainer.glade:4094 -#: glade/pytrainer.glade:5236 -#: glade/pytrainer.glade:6531 -msgid "<b>Distance:</b>" -msgstr "<b>Distance:</b>" - -#: glade/pytrainer.glade:977 -msgid "<b>Max Speed</b>" -msgstr "<b>Vit. Max:</b>" - -#: glade/pytrainer.glade:1005 -#: glade/pytrainer.glade:3556 -#: glade/pytrainer.glade:4684 -#: glade/pytrainer.glade:5826 -#: glade/pytrainer.glade:6982 -msgid "<b>Max Pace:</b>" -msgstr "<b>Cad. Max:</b>" - -#: glade/pytrainer.glade:1033 +#: glade/pytrainer.glade.h:26 msgid "<b>Descent:</b>" msgstr "<b>Dénivelé Nég.:</b>" -#: glade/pytrainer.glade:1061 -msgid " " -msgstr "" +#: glade/pytrainer.glade.h:27 +msgid "<b>Distance:</b>" +msgstr "<b>Distance:</b>" -#: glade/pytrainer.glade:1211 -#: glade/pytrainer.glade:2910 -#: glade/pytrainer.glade:4038 -#: glade/pytrainer.glade:5180 -#: glade/pytrainer.glade:6755 -msgid "Km" -msgstr "km" +#: glade/pytrainer.glade.h:28 +msgid "<b>Duration:</b>" +msgstr "<b>Durée:</b>" -#: glade/pytrainer.glade:1244 -#: glade/pytrainer.glade:1294 -#: glade/pytrainer.glade:1344 -#: glade/pytrainer.glade:3028 -#: glade/pytrainer.glade:3078 -#: glade/pytrainer.glade:3128 -#: glade/pytrainer.glade:4206 -#: glade/pytrainer.glade:4256 -#: glade/pytrainer.glade:5348 -#: glade/pytrainer.glade:5398 -#: glade/pytrainer.glade:6643 -#: glade/pytrainer.glade:6693 -msgid "00" -msgstr "" +#: glade/pytrainer.glade.h:29 +msgid "<b>Extension Details</b>" +msgstr "<b>Détail des Extensions</b>" -#: glade/pytrainer.glade:1269 -#: glade/pytrainer.glade:1319 -#: glade/pytrainer.glade:3053 -#: glade/pytrainer.glade:3103 -#: glade/pytrainer.glade:4181 -#: glade/pytrainer.glade:4231 -#: glade/pytrainer.glade:5323 -#: glade/pytrainer.glade:5373 -#: glade/pytrainer.glade:6618 -#: glade/pytrainer.glade:6668 -#: glade/pytrainer.glade:8788 -#: glade/pytrainer.glade:8833 -msgid ":" -msgstr ":" +#: glade/pytrainer.glade.h:30 +msgid "<b>HR Zone1:</b>" +msgstr "<b>Zone FC1:</b>" -#: glade/pytrainer.glade:1413 -#: glade/pytrainer.glade:2375 -#: glade/pytrainer.glade:2937 -#: glade/pytrainer.glade:3219 -#: glade/pytrainer.glade:3360 -#: glade/pytrainer.glade:3444 -#: glade/pytrainer.glade:3724 -#: glade/pytrainer.glade:3752 -#: glade/pytrainer.glade:4065 -#: glade/pytrainer.glade:4320 -#: glade/pytrainer.glade:4404 -#: glade/pytrainer.glade:4600 -#: glade/pytrainer.glade:4880 -#: glade/pytrainer.glade:5207 -#: glade/pytrainer.glade:5462 -#: glade/pytrainer.glade:5546 -#: glade/pytrainer.glade:5742 -#: glade/pytrainer.glade:6022 -#: glade/pytrainer.glade:6362 -#: glade/pytrainer.glade:6446 -#: glade/pytrainer.glade:6502 -#: glade/pytrainer.glade:6811 -#: glade/pytrainer.glade:7094 -#: glade/pytrainer.glade:7122 -#: glade/pytrainer.glade:7150 -#: glade/pytrainer.glade:7178 -msgid " " -msgstr "" +#: glade/pytrainer.glade.h:31 +msgid "<b>HR Zone2:</b>" +msgstr "<b>Zone FC2:</b>" -#: glade/pytrainer.glade:1520 -msgid " <b>Title:</b>" -msgstr " <b>Titre:</b>" +#: glade/pytrainer.glade.h:32 +msgid "<b>HR Zone3:</b>" +msgstr "<b>Zone FC3:</b>" -#: glade/pytrainer.glade:1634 -msgid "" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate" -msgstr "" -"Profil\n" -"Vitesse\n" -"Cadence\n" -"Fréquence Cardiaque" +#: glade/pytrainer.glade.h:33 +msgid "<b>HR Zone4:</b>" +msgstr "<b>Zone FC4:</b>" -#: glade/pytrainer.glade:1653 -#: glade/pytrainer.glade:5038 -#: glade/pytrainer.glade:6180 -#: glade/pytrainer.glade:7336 -msgid "Versus" -msgstr "" +#: glade/pytrainer.glade.h:34 +msgid "<b>HR Zone5:</b>" +msgstr "<b>Zone FC5:</b>" -#: glade/pytrainer.glade:1678 -msgid "" -"None\n" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate\n" -msgstr "" -"Null\n" -"Profil\n" -"Vitesse\n" -"Cadence\n" -"Fréquence Cardiaque\n" +#: glade/pytrainer.glade.h:35 +msgid "<b>HR Zones Method:</b>" +msgstr "<b>Calcul des zones de FC :</b>" -#: glade/pytrainer.glade:1843 -msgid "<b>Beats:</b>" -msgstr "<b>FC Moy:</b>" - -#: glade/pytrainer.glade:1871 -#: glade/pytrainer.glade:3332 -#: glade/pytrainer.glade:4376 -#: glade/pytrainer.glade:5518 -#: glade/pytrainer.glade:6334 -msgid "<b>Calories: </b>" -msgstr "<b>Calories:</b>" - -#: glade/pytrainer.glade:1899 -#: glade/pytrainer.glade:3612 -#: glade/pytrainer.glade:4796 -#: glade/pytrainer.glade:5938 -#: glade/pytrainer.glade:7066 +#: glade/pytrainer.glade.h:36 msgid "<b>Max Beats:</b>" msgstr "<b>FC Max:</b>" -#: glade/pytrainer.glade:1927 -msgid "<b>HR Zones Method:</b>" -msgstr "<b>Calcul des zones de FC :</b>" +#: glade/pytrainer.glade.h:37 +msgid "<b>Max Pace:</b>" +msgstr "<b>Cad. Max:</b>" -#: glade/pytrainer.glade:1956 -msgid "<b>HR Zone5:</b>" -msgstr "<b>Zone FC5:</b>" +#: glade/pytrainer.glade.h:38 +msgid "<b>Max Speed:</b>" +msgstr "<b>Vit. Max:</b>" -#: glade/pytrainer.glade:1984 -#: glade/pytrainer.glade:2348 -msgid " bpm" -msgstr " bpm" +#: glade/pytrainer.glade.h:39 +msgid "<b>Max Speed</b>" +msgstr "<b>Vit. Max:</b>" -#: glade/pytrainer.glade:2012 -msgid " Cal" -msgstr " Cal" +#: glade/pytrainer.glade.h:40 +msgid "<b>Pace:</b>" +msgstr "<b>Cadence:</b>" -#: glade/pytrainer.glade:2124 -msgid "<b>HR Zone4:</b>" -msgstr "<b>Zone FC4:</b>" +#: glade/pytrainer.glade.h:41 +msgid "<b>Plugin Details</b>" +msgstr "<b>Détail du plugin</b>" -#: glade/pytrainer.glade:2152 -msgid "<b>HR Zone3:</b>" -msgstr "<b>Zone FC3:</b>" +#: glade/pytrainer.glade.h:42 +msgid "<b>Speed:</b>" +msgstr "<b>Vitesse:</b>" -#: glade/pytrainer.glade:2180 -msgid "<b>HR Zone2:</b>" -msgstr "<b>Zone FC2:</b>" +#: glade/pytrainer.glade.h:43 +msgid "<b>Sport:</b>" +msgstr "<b>Sport:</b>" -#: glade/pytrainer.glade:2208 -msgid "<b>HR Zone1:</b>" -msgstr "<b>Zone FC1:</b>" +#: glade/pytrainer.glade.h:44 +msgid "<b>Title:</b>" +msgstr "<b>Titre:</b>" -#: glade/pytrainer.glade:2236 -#: glade/pytrainer.glade:2292 -#: glade/pytrainer.glade:2320 -#: glade/pytrainer.glade:3668 -#: glade/pytrainer.glade:4489 -#: glade/pytrainer.glade:4824 -#: glade/pytrainer.glade:5631 -#: glade/pytrainer.glade:5966 -msgid " " -msgstr "" +#: glade/pytrainer.glade.h:45 +msgid "All Sports" +msgstr "Tous les Sports" -#: glade/pytrainer.glade:2403 -#: glade/pytrainer.glade:2430 -#: glade/pytrainer.glade:2458 -#: glade/pytrainer.glade:2486 -#: glade/pytrainer.glade:2514 -#: glade/pytrainer.glade:3472 -#: glade/pytrainer.glade:3640 -#: glade/pytrainer.glade:4628 -#: glade/pytrainer.glade:4768 -#: glade/pytrainer.glade:5770 -#: glade/pytrainer.glade:5910 -#: glade/pytrainer.glade:6474 -#: glade/pytrainer.glade:6895 -msgid "bpm" -msgstr "bpm" - -#: glade/pytrainer.glade:2542 -#, fuzzy -msgid " " -msgstr " " - -#: glade/pytrainer.glade:2580 -msgid " <b>Heart Rate:</b>" -msgstr " <b>Fréquence Cardiaque:</b>" - -#: glade/pytrainer.glade:2757 -#: glade/pytrainer.glade:8150 -#: glade/pytrainer.glade:12008 -msgid "label-2147483648" -msgstr "label-2147483648" - -#: glade/pytrainer.glade:2795 -#, fuzzy -msgid "label-2147483647" -msgstr "label-2147483648" - -#: glade/pytrainer.glade:2851 -msgid "Record" -msgstr "Enregistrement" - -#: glade/pytrainer.glade:3276 -#: glade/pytrainer.glade:4461 -#: glade/pytrainer.glade:5603 -#: glade/pytrainer.glade:6924 -msgid "<b>Max Speed:</b>" -msgstr "<b>Vit. Max:</b>" - -#: glade/pytrainer.glade:3388 -#: glade/pytrainer.glade:4432 -#: glade/pytrainer.glade:5574 -#: glade/pytrainer.glade:6390 +#: glade/pytrainer.glade.h:46 msgid "Cal" msgstr "Cal" -#: glade/pytrainer.glade:3416 -#: glade/pytrainer.glade:4572 -#: glade/pytrainer.glade:5714 -#: glade/pytrainer.glade:6418 -msgid "<b>Beats avg:</b>" -msgstr "<b>FC Moy:</b>" +#: glade/pytrainer.glade.h:47 +msgid "Calendar" +msgstr "Calendrier" -#: glade/pytrainer.glade:3790 -msgid " <b>Date:</b>" -msgstr " <b>Date:</b>" +#: glade/pytrainer.glade.h:48 +msgid "Columns" +msgstr "Colonnes" -#: glade/pytrainer.glade:3865 -msgid "Value" -msgstr "Valeur" - -#: glade/pytrainer.glade:3890 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" -msgstr "" -"Profil de la sortie\n" -"Vitesse de la sortie\n" -"Profil de la sortie/Vitesse" - -#: glade/pytrainer.glade:3979 +#: glade/pytrainer.glade.h:49 msgid "Day" msgstr "Jour" -#: glade/pytrainer.glade:4156 -#: glade/pytrainer.glade:5298 -#: glade/pytrainer.glade:6593 -msgid "000" -msgstr "" +#: glade/pytrainer.glade.h:50 +msgid "Description:" +msgstr "Description:" -#: glade/pytrainer.glade:4545 -#: glade/pytrainer.glade:5687 -#: glade/pytrainer.glade:8986 -msgid " " -msgstr " " - -#: glade/pytrainer.glade:4918 -msgid " <b>Week:</b>" -msgstr "<b>Semaine:</b>" - -#: glade/pytrainer.glade:5018 -#: glade/pytrainer.glade:6160 -#: glade/pytrainer.glade:7316 +#: glade/pytrainer.glade.h:51 msgid "" "Distance\n" "Time\n" @@ -509,10 +237,53 @@ "Vitesse moyenne\n" "Calories" -#: glade/pytrainer.glade:5063 -#: glade/pytrainer.glade:6205 -#: glade/pytrainer.glade:7361 +#: glade/pytrainer.glade.h:56 +msgid "Edit Record" +msgstr "Éditer un enregistrement" + +#: glade/pytrainer.glade.h:57 +msgid "Extensions" +msgstr "Extensions" + +#: glade/pytrainer.glade.h:58 msgid "" +"Font\n" +"Restaurant\n" +"Scenic Area\n" +"Summit" +msgstr "" +"Point d'eau\n" +"Restaurant\n" +"Vue Panoramique\n" +"Sommet" + +#: glade/pytrainer.glade.h:62 +msgid "GPS Device Plugins" +msgstr "Plugins pour les Périphériques GPS" + +#: glade/pytrainer.glade.h:63 +msgid "Km" +msgstr "km" + +#: glade/pytrainer.glade.h:64 +msgid "Latitude: " +msgstr "Latitude:" + +#: glade/pytrainer.glade.h:65 +msgid "Longitude:" +msgstr " Longitude:" + +#: glade/pytrainer.glade.h:66 +msgid "Month" +msgstr "Mois" + +#: glade/pytrainer.glade.h:67 +#: glade/profile.glade.h:38 +msgid "Name:" +msgstr "Nom:" + +#: glade/pytrainer.glade.h:68 +msgid "" "None\n" "Distance\n" "Time\n" @@ -527,338 +298,484 @@ "Vitesse moyenne\n" "Calories" -#: glade/pytrainer.glade:5132 -msgid "Week" -msgstr "Semaine" +#: glade/pytrainer.glade.h:74 +msgid "" +"None\n" +"Profile\n" +"Speed\n" +"Pace\n" +"Heart Rate\n" +"Cadence\n" +msgstr "" +"Null\n" +"Profil\n" +"Vitesse\n" +"Cadence\n" +"Fréquence Cardiaque\n" +"Rythme\n" -#: glade/pytrainer.glade:6060 -msgid " <b>Month:</b>" -msgstr " <b>Mois:</b>" +#: glade/pytrainer.glade.h:81 +msgid "Plugins" +msgstr "Plugins" -#: glade/pytrainer.glade:6275 -msgid "Month" -msgstr "Mois" +#: glade/pytrainer.glade.h:82 +msgid "" +"Profile\n" +"Speed\n" +"Pace\n" +"Heart Rate\n" +"Cadence" +msgstr "" +"Profil\n" +"Vitesse\n" +"Cadence\n" +"Fréquence Cardiaque\n" +"Rythme" -#: glade/pytrainer.glade:7216 -msgid " <b>Year:</b>" -msgstr " <b>Année:</b>" +#: glade/pytrainer.glade.h:87 +msgid "Record" +msgstr "Enregistrement" -#: glade/pytrainer.glade:7431 -msgid "Year" -msgstr "Année" +#: glade/pytrainer.glade.h:88 +msgid "Search" +msgstr "Rechercher" -#: glade/pytrainer.glade:7474 -msgid "label154" -msgstr "label154" +#: glade/pytrainer.glade.h:89 +msgid "Select track record" +msgstr "Sélectionnez un Circuit" -#: glade/pytrainer.glade:7511 -msgid "<b>Title:</b>" -msgstr "<b>Titre:</b>" +#: glade/pytrainer.glade.h:90 +msgid "Show Laps" +msgstr "Montrer les tours" -#: glade/pytrainer.glade:7556 -msgid "Search" -msgstr "Rechercher" +#: glade/pytrainer.glade.h:91 +msgid "Show graph in classic view" +msgstr "Montrer le graphe dans la vue classique" -#: glade/pytrainer.glade:7603 -msgid "Columns" -msgstr "Colonnes" +#: glade/pytrainer.glade.h:92 +#: pytrainer/gui/windowprofile.py:69 +#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:715 +#: pytrainer/gui/windowimportdata.py:255 +msgid "Sport" +msgstr "Sport" -#: glade/pytrainer.glade:7678 -msgid "label155" -msgstr "label155" +#: glade/pytrainer.glade.h:93 +msgid "" +"Stage Profile\n" +"Stage Velocity\n" +"Stage Profile/velocity" +msgstr "" +"Profil de la sortie\n" +"Vitesse de la sortie\n" +"Profil de la sortie/Vitesse" -#: glade/pytrainer.glade:7812 +#: glade/pytrainer.glade.h:96 +msgid "Status:" +msgstr "Statut:" + +#: glade/pytrainer.glade.h:97 +msgid "Tools" +msgstr "Outils" + +#: glade/pytrainer.glade.h:98 msgid "Type:" msgstr "Type:" -#: glade/pytrainer.glade:7840 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" +#: glade/pytrainer.glade.h:99 +msgid "Value" +msgstr "Valeur" + +#: glade/pytrainer.glade.h:100 +msgid "Versus" msgstr "" -"Point d'eau\n" -"Restaurant\n" -"Vue Panoramique\n" -"Sommet" -#: glade/pytrainer.glade:7861 -msgid "Latitude: " -msgstr "Latitude:" +#: glade/pytrainer.glade.h:101 +msgid "Week" +msgstr "Semaine" -#: glade/pytrainer.glade:7889 -msgid " Name:" -msgstr "Nom:" +#: glade/pytrainer.glade.h:102 +msgid "Year" +msgstr "Année" -#: glade/pytrainer.glade:7917 -msgid "Longitude:" -msgstr " Longitude:" +#: glade/pytrainer.glade.h:103 +msgid "_Edit" +msgstr "_Édition" -#: glade/pytrainer.glade:7945 -#: glade/pytrainer.glade:13567 -#: glade/pytrainer.glade:13890 -msgid "Description:" +#: glade/pytrainer.glade.h:104 +msgid "_Export as Text Separated by Commas" +msgstr "_Exporter un Fichier Texte séparé par des virgules" + +#: glade/pytrainer.glade.h:105 +msgid "_File" +msgstr "_Fichier" + +#: glade/pytrainer.glade.h:106 +msgid "_Help" +msgstr "_Aide" + +#: glade/pytrainer.glade.h:107 +msgid "_Import" +msgstr "" + +#: glade/pytrainer.glade.h:108 +msgid "_View" +msgstr "_Vue" + +#: glade/pytrainer.glade.h:109 +msgid "bpm" +msgstr "bpm" + +#: glade/pytrainer.glade.h:110 +#, fuzzy +msgid "description-entry" msgstr "Description:" -#: glade/pytrainer.glade:8065 -msgid "<b> Waypoint: </b>" -msgstr "<b> Point de localisation:</b>" +#: glade/pytrainer.glade.h:111 +#, fuzzy +msgid "description-entry " +msgstr "Description:" -#: glade/pytrainer.glade:8198 -msgid "label162" -msgstr "label162" +#: glade/pytrainer.glade.h:112 +#: pytrainer/gui/windowmain.py:177 +#: pytrainer/gui/windowmain.py:178 +#: pytrainer/gui/windowmain.py:311 +#: pytrainer/gui/windowmain.py:312 +#: pytrainer/gui/windowmain.py:411 +#: pytrainer/gui/windowmain.py:412 +#: pytrainer/gui/windowmain.py:489 +#: pytrainer/gui/windowmain.py:490 +msgid "km/h" +msgstr "km/h" -#: glade/pytrainer.glade:8338 -msgid "label163" -msgstr "label163" +#: glade/pytrainer.glade.h:113 +#, fuzzy +msgid "label-2147483647" +msgstr "label-2147483648" -#: glade/pytrainer.glade:8363 -msgid "New Entry" -msgstr "Nouvelle entrée" +#: glade/pytrainer.glade.h:114 +#: glade/profile.glade.h:50 +msgid "label-2147483648" +msgstr "label-2147483648" -#: glade/pytrainer.glade:8436 -msgid "Title:" -msgstr "Titre:" +#: glade/pytrainer.glade.h:115 +#: pytrainer/gui/windowmain.py:181 +#: pytrainer/gui/windowmain.py:182 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/windowmain.py:1024 +msgid "m" +msgstr "m" -#: glade/pytrainer.glade:8485 -msgid "GPX File:" -msgstr "Fichier GPX:" +#: glade/pytrainer.glade.h:116 +#: pytrainer/gui/windowmain.py:179 +#: pytrainer/gui/windowmain.py:180 +#: pytrainer/gui/windowmain.py:313 +#: pytrainer/gui/windowmain.py:314 +#: pytrainer/gui/windowmain.py:413 +#: pytrainer/gui/windowmain.py:414 +#: pytrainer/gui/windowmain.py:491 +#: pytrainer/gui/windowmain.py:492 +msgid "min/km" +msgstr "min/km" -#: glade/pytrainer.glade:8555 -msgid "Calculate Values" -msgstr "Calculer les Valeurs" +#: glade/pytrainer.glade.h:117 +msgid "name-entry" +msgstr "" -#: glade/pytrainer.glade:8574 -msgid "Sport:" -msgstr "Sport:" +#: glade/pytrainer.glade.h:118 +msgid "nameEntry" +msgstr "" -#: glade/pytrainer.glade:8625 +#: glade/pytrainer.glade.h:119 +msgid "status-entry" +msgstr "" + +#: glade/newrecord.glade.h:3 +msgid "<b>Accumulated Altitude Change</b>" +msgstr " <b>Dénivelé Cumulé:</b> " + +#: glade/newrecord.glade.h:4 +msgid "<b>Comments</b>" +msgstr "<b>Commentaires</b>" + +#: glade/newrecord.glade.h:5 +#: glade/profile.glade.h:6 +msgid "<b>General</b>" +msgstr "<b>Général:</b>" + +#: glade/newrecord.glade.h:6 +msgid "<b>Heart Rate</b>" +msgstr "<b>Fréquence Cardiaque:</b>" + +#: glade/newrecord.glade.h:7 msgid "<b>Main</b>" msgstr "<b>Principal:</b>" -#: glade/pytrainer.glade:8686 -msgid "Distance (Km):" -msgstr "Distance (km):" +#: glade/newrecord.glade.h:8 +msgid "<b>Pace</b>" +msgstr "<b>Cadence:</b>" -#: glade/pytrainer.glade:8715 -#: glade/pytrainer.glade:8912 -#: glade/pytrainer.glade:9193 -#: glade/pytrainer.glade:9439 -#: glade/pytrainer.glade:9907 -#: glade/pytrainer.glade:12638 +#: glade/newrecord.glade.h:9 +msgid "<b>Velocity</b>" +msgstr "<b>Vitesse</b>" + +#: glade/newrecord.glade.h:10 +msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" +msgstr "<small><b>Note:</b> Afin de calculer les calories vous devez renseigner le coefficient M.E.T. pour votre sport (menu Préférences->Sport) </small>" + +#: glade/newrecord.glade.h:11 +msgid "Advanced" +msgstr "Avancé" + +#: glade/newrecord.glade.h:12 +msgid "Ascent:" +msgstr "Dénivelé Pos.:" + +#: glade/newrecord.glade.h:13 +#: glade/profile.glade.h:16 msgid "Calculate" msgstr "Calculer" -#: glade/pytrainer.glade:8734 -msgid "Time:" -msgstr "Temps:" +#: glade/newrecord.glade.h:14 +msgid "Calculate Values" +msgstr "Calculer les Valeurs" -#: glade/pytrainer.glade:8932 +#: glade/newrecord.glade.h:15 +#: pytrainer/gui/windowmain.py:719 +#: pytrainer/monthgraph.py:77 +#: pytrainer/weekgraph.py:123 +#: pytrainer/yeargraph.py:78 +msgid "Calories" +msgstr "Calories" + +#: glade/newrecord.glade.h:16 +msgid "Comments" +msgstr "Commentaires" + +#: glade/newrecord.glade.h:17 msgid "Date:" msgstr "Date:" -#: glade/pytrainer.glade:9052 -#: glade/pytrainer.glade:12688 -msgid "<b>General</b>" -msgstr "<b>Général:</b>" +#: glade/newrecord.glade.h:18 +msgid "Descent:" +msgstr "Dénivelé Nég.:" -#: glade/pytrainer.glade:9113 -msgid "Max (km/h):" -msgstr "Max (km/h):" +#: glade/newrecord.glade.h:19 +msgid "Distance (Km):" +msgstr "Distance (km):" -#: glade/pytrainer.glade:9164 -msgid "Velocity (km/h)" -msgstr "Vitesse (km/h)" +#: glade/newrecord.glade.h:20 +msgid "Duration:" +msgstr "Durée" -#: glade/pytrainer.glade:9239 -msgid "<b>Velocity</b>" -msgstr "<b>Vitesse</b>" +#: glade/newrecord.glade.h:21 +msgid "GPX File:" +msgstr "Fichier GPX:" -#: glade/pytrainer.glade:9275 -msgid "Quick Entry" -msgstr "Entrée Rapide" +#: glade/newrecord.glade.h:22 +msgid "Heart rate:" +msgstr "Fréquence Cardiaque:" -#: glade/pytrainer.glade:9335 +#: glade/newrecord.glade.h:23 +msgid "Max (bpm):" +msgstr "Max (bpm):" + +#: glade/newrecord.glade.h:24 +msgid "Max (km/h):" +msgstr "Max (km/h):" + +#: glade/newrecord.glade.h:25 msgid "Max (min/km):" msgstr "Max (min/km)" -#: glade/pytrainer.glade:9387 +#: glade/newrecord.glade.h:26 +msgid "New Entry" +msgstr "Nouvelle entrée" + +#: glade/newrecord.glade.h:27 msgid "Pace (min/km):" msgstr "Cadence (min/km)" -#: glade/pytrainer.glade:9462 -msgid "<b>Pace</b>" -msgstr "<b>Cadence:</b>" +#: glade/newrecord.glade.h:28 +msgid "Quick Entry" +msgstr "Entrée Rapide" -#: glade/pytrainer.glade:9523 -msgid "Ascent:" -msgstr "Dénivelé Pos.:" +#: glade/newrecord.glade.h:29 +msgid "Sport:" +msgstr "Sport:" -#: glade/pytrainer.glade:9575 -msgid "Descent:" -msgstr "Dénivelé Nég.:" +#: glade/newrecord.glade.h:30 +msgid "Start Time:" +msgstr "Début:" -#: glade/pytrainer.glade:9630 -msgid "<b>Accumulated Altitude Change</b>" -msgstr " <b>Dénivelé Cumulé:</b> " +#: glade/newrecord.glade.h:31 +msgid "Title:" +msgstr "Titre:" -#: glade/pytrainer.glade:9691 -msgid "Max (bpm):" -msgstr "Max (bpm):" +#: glade/newrecord.glade.h:32 +msgid "Velocity (km/h)" +msgstr "Vitesse (km/h)" -#: glade/pytrainer.glade:9720 -msgid "Heart rate:" -msgstr "Fréquence Cardiaque:" +#: glade/importdata.glade.h:1 +msgid "<b>Default to Tab</b>" +msgstr "<b>Onglet par défaut</b>" -#: glade/pytrainer.glade:9794 -#: pytrainer/gui/windowmain.py:681 -#: pytrainer/monthgraph.py:77 -#: pytrainer/weekgraph.py:119 -#: pytrainer/yeargraph.py:78 -msgid "Calories" -msgstr "Calories" +#: glade/importdata.glade.h:2 +msgid "<b>Import from File</b>" +msgstr "<b>Importer à partir d'un fichier</b>" -#: glade/pytrainer.glade:9845 -msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" -msgstr "<small><b>Note:</b> Afin de calculer les calories vous devez renseigner le coefficient M.E.T. pour votre sport (menu Préférences->Sport) </small>" +#: glade/importdata.glade.h:3 +msgid "<b>Import from GPS Device</b>" +msgstr "<b>Importer à partir du périphérique GPS</b>" -#: glade/pytrainer.glade:9962 -msgid "<b>Heart Rate</b>" -msgstr "<b>Fréquence Cardiaque:</b>" +#: glade/importdata.glade.h:4 +msgid "<b>Options</b>" +msgstr "<b>Options</b>" -#: glade/pytrainer.glade:9998 -msgid "Advanced" -msgstr "Avancé" +#: glade/importdata.glade.h:5 +msgid "<b>Plugins</b>" +msgstr "<b>Plugins</b>" -#: glade/pytrainer.glade:10095 -msgid "<b>Comments</b>" -msgstr "<b>Commentaires</b>" +#: glade/importdata.glade.h:6 +msgid "<b>Select Activities to Import</b>" +msgstr "<b>Sélectionnez une activité à importer</b>" -#: glade/pytrainer.glade:10124 -msgid "Comments" -msgstr "Commentaires" +#: glade/importdata.glade.h:7 +msgid "<b>Select a file to import</b>" +msgstr "<b>Sélectionnez un fichier à importer</b>" -#: glade/pytrainer.glade:10229 -msgid "Preferences" -msgstr "Préférences" +#: glade/importdata.glade.h:8 +msgid "<b>Select your GPS device</b>" +msgstr "<b>Sélectionnez votre périphérique GPS</b>" -#: glade/pytrainer.glade:10303 -msgid "Metric system" -msgstr "Système Métrique" +#: glade/importdata.glade.h:9 +msgid "<b>Tools</b>" +msgstr "<b>Outils:</b>" -#: glade/pytrainer.glade:10325 -msgid "U.S. customary units" -msgstr "Unités U.S." +#: glade/importdata.glade.h:10 +msgid "Clear" +msgstr "Effacer" -#: glade/pytrainer.glade:10351 -msgid "<b>System of Measurement</b>" -msgstr "<b>Système de Mesure</b>" +#: glade/importdata.glade.h:11 +msgid "Import" +msgstr "Importer" -#: glade/pytrainer.glade:10411 -msgid "Database type:" -msgstr "Type de Base de Données:" +#: glade/importdata.glade.h:12 +msgid "Import from File" +msgstr "Importer à partir d'un fichier" -#: glade/pytrainer.glade:10439 -msgid "Database host:" -msgstr "Hôte de la Base de Données:" +#: glade/importdata.glade.h:13 +msgid "Import from GPS Device" +msgstr "Importer à partir du périphérique GPS" -#: glade/pytrainer.glade:10488 -msgid "Database name:" -msgstr "Nom de la Base de Données:" +#: glade/importdata.glade.h:14 +msgid "Rescan" +msgstr "" -#: glade/pytrainer.glade:10556 -msgid "Database user:" -msgstr "Utilisateur de la Base de Données:" +#: glade/importdata.glade.h:15 +msgid "Rescan system for available tools" +msgstr "" -#: glade/pytrainer.glade:10584 -msgid "Database pass:" -msgstr "Mot de passe de la Base de Données:" +#: glade/importdata.glade.h:16 +msgid "Reset" +msgstr "Réinitialiser" -#: glade/pytrainer.glade:10658 +#: glade/importdata.glade.h:17 +msgid "Save" +msgstr "Sauvegarder" + +#: glade/importdata.glade.h:18 +msgid "" +"Test 1\n" +"Test 2" +msgstr "" + +#: glade/warning.glade.h:1 +msgid "Warning" +msgstr "Attention" + +#: glade/profile.glade.h:1 +msgid "<b>Add New Sport</b>" +msgstr "<b>Ajouter un Sport</b>" + +#: glade/profile.glade.h:2 +msgid "<b>Athlete Details</b>" +msgstr "<b>Détail de l'Athlète</b>" + +#: glade/profile.glade.h:3 msgid "<b>Database</b>" msgstr "<b>Base de données</b>" -#: glade/pytrainer.glade:10718 -msgid "Use this port for internal connections: " -msgstr "Utiliser ce port pour les connexions internes:" +#: glade/profile.glade.h:4 +msgid "<b>Delete Sport</b>" +msgstr "<b>Supprimer un Sport</b>" -#: glade/pytrainer.glade:10769 -msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" -msgstr "<small><b>Note:</b> Changez cette valeur uniquement si vous savez ce que vous faites</small>" +#: glade/profile.glade.h:5 +msgid "<b>Edit Sport</b>" +msgstr "<b>Éditer un sport</b>" -#: glade/pytrainer.glade:10801 +#: glade/profile.glade.h:7 +msgid "<b>Heart Rate Zones</b>" +msgstr "<b>Zones Cardiaque:</b>" + +#: glade/profile.glade.h:8 msgid "<b>Port Connnection</b>" msgstr "<b>Port de Connexion:</b>" -#: glade/pytrainer.glade:10837 -msgid "General" -msgstr "Général" +#: glade/profile.glade.h:9 +msgid "<b>Sport List</b>" +msgstr "<b>Liste des Sports</b>" -#: glade/pytrainer.glade:10890 -msgid "User name:" -msgstr "Nom d'Utilisateur:" +#: glade/profile.glade.h:10 +msgid "<b>System of Measurement</b>" +msgstr "<b>Système de Mesure</b>" -#: glade/pytrainer.glade:10918 -msgid "Gender:" -msgstr "Sexe:" +#: glade/profile.glade.h:11 +msgid "<b>lalaal</b>" +msgstr "<b>Base de données</b>" -#: glade/pytrainer.glade:10964 -msgid "Height:" -msgstr "Taille:" +#: glade/profile.glade.h:12 +msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" +msgstr "<small><b>Note:</b> Afin d'utiliser la méthode de Karvonen vous devez obligatoirement renseigner le champ «Fréquence Cardiaque au Repos».</small>" -#: glade/pytrainer.glade:11035 -msgid "Date of birth:" -msgstr "Date de Naissance:" +#: glade/profile.glade.h:13 +msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" +msgstr "<small><b>Note:</b> Changez cette valeur uniquement si vous savez ce que vous faites</small>" -#: glade/pytrainer.glade:11147 -msgid "Weight:" -msgstr "Poids:" +#: glade/profile.glade.h:14 +msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" +msgstr "<small><b>Note:</b> Le calcul de votre fréquence cardiaque maximale est effectué grâce à la formule 220 moins votre âge. </small>" -#: glade/pytrainer.glade:11179 -msgid "<b>Athlete Details</b>" -msgstr "<b>Détail de l'Athlète</b>" - -#: glade/pytrainer.glade:11208 +#: glade/profile.glade.h:15 msgid "Athlete" msgstr "Athlète" -#: glade/pytrainer.glade:11391 -msgid "<b>Sport List</b>" -msgstr "<b>Liste des Sports</b>" +#: glade/profile.glade.h:17 +msgid "Database host:" +msgstr "Hôte de la Base de Données:" -#: glade/pytrainer.glade:11420 -msgid "llist" -msgstr "" +#: glade/profile.glade.h:18 +msgid "Database name:" +msgstr "Nom de la Base de Données:" -#: glade/pytrainer.glade:11500 -#: glade/pytrainer.glade:13511 -#: glade/pytrainer.glade:14002 -msgid "Name:" -msgstr "Nom:" +#: glade/profile.glade.h:19 +msgid "Database pass:" +msgstr "Mot de passe de la Base de Données:" -#: glade/pytrainer.glade:11528 -msgid "M.E.T.:" -msgstr "M.E.T.:" +#: glade/profile.glade.h:20 +msgid "Database type:" +msgstr "Type de Base de Données:" -#: glade/pytrainer.glade:11577 -msgid "Extra Weight:" -msgstr "Poids Additionnel:" +#: glade/profile.glade.h:21 +msgid "Database user:" +msgstr "Utilisateur de la Base de Données:" -#: glade/pytrainer.glade:11651 -#: glade/pytrainer.glade:12249 -msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" -msgstr "Plus d'information pour déterminer le coefficient M.E.T du sport sur Wikipedia" +#: glade/profile.glade.h:22 +msgid "Date of birth:" +msgstr "Date de Naissance:" -#: glade/pytrainer.glade:11755 -msgid "<b>Add New Sport</b>" -msgstr "<b>Ajouter un Sport</b>" - -#: glade/pytrainer.glade:11784 -msgid "new" -msgstr "nouveau" - -#: glade/pytrainer.glade:11844 +#: glade/profile.glade.h:23 msgid "" "Deleting a sport removes associated records.\n" "Continue?" @@ -866,141 +783,115 @@ "Détruire un sport supprime les enregistrements associés.\n" "Continuer?" -#: glade/pytrainer.glade:11984 -msgid "<b>Delete Sport</b>" -msgstr "<b>Supprimer un Sport</b>" +#: glade/profile.glade.h:25 +#: pytrainer/gui/windowprofile.py:69 +msgid "Extra Weight" +msgstr "Poids Additionnel" -#: glade/pytrainer.glade:12044 -msgid "delete" -msgstr "supprimer" +#: glade/profile.glade.h:26 +msgid "Extra Weight:" +msgstr "Poids Additionnel:" -#: glade/pytrainer.glade:12103 -msgid "Name" -msgstr "Nom" +#: glade/profile.glade.h:27 +msgid "Gender:" +msgstr "Sexe:" -#: glade/pytrainer.glade:12152 -msgid "M.E.T." -msgstr "M.E.T." +#: glade/profile.glade.h:28 +msgid "General" +msgstr "Général" -#: glade/pytrainer.glade:12201 -#: pytrainer/gui/windowprofile.py:69 -msgid "Extra Weight" -msgstr "Poids Additionnel" +#: glade/profile.glade.h:29 +#: pytrainer/daygraph.py:56 +#: pytrainer/recordgraph.py:99 +#: pytrainer/heartrategraph.py:38 +msgid "Heart Rate" +msgstr "Fréquence Cardiaque" -#: glade/pytrainer.glade:12359 -msgid "<b>Edit Sport</b>" -msgstr "<b>Éditer un sport</b>" +#: glade/profile.glade.h:30 +msgid "Height:" +msgstr "Taille:" -#: glade/pytrainer.glade:12383 -msgid "<b>lalaal</b>" -msgstr "<b>Base de données</b>" +#: glade/profile.glade.h:31 +#: pytrainer/gui/windowmain.py:291 +msgid "Karvonen method" +msgstr "Méthode de Karvonen" -#: glade/pytrainer.glade:12419 -msgid "edit" -msgstr "édition" +#: glade/profile.glade.h:32 +msgid "M.E.T." +msgstr "M.E.T." -#: glade/pytrainer.glade:12448 -msgid "Sports" -msgstr "Sports" +#: glade/profile.glade.h:33 +msgid "M.E.T.:" +msgstr "M.E.T.:" -#: glade/pytrainer.glade:12507 +#: glade/profile.glade.h:34 msgid "Maximum heart rate:" msgstr "Fréquence Cardiaque Maximale:" -#: glade/pytrainer.glade:12535 -msgid "Resting heart rate:" -msgstr "Fréquence Cardiaque au Repos:" +#: glade/profile.glade.h:35 +msgid "Metric system" +msgstr "Système Métrique" -#: glade/pytrainer.glade:12609 -msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" -msgstr "<small><b>Note:</b> Le calcul de votre fréquence cardiaque maximale est effectué grâce à la formule 220 moins votre âge. </small>" +#: glade/profile.glade.h:36 +msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" +msgstr "Plus d'information pour déterminer le coefficient M.E.T du sport sur Wikipedia" -#: glade/pytrainer.glade:12748 -msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" -msgstr "<small><b>Note:</b> Afin d'utiliser la méthode de Karvonen vous devez obligatoirement renseigner le champ «Fréquence Cardiaque au Repos».</small>" +#: glade/profile.glade.h:37 +msgid "Name" +msgstr "Nom" -#: glade/pytrainer.glade:12777 +#: glade/profile.glade.h:39 msgid "Percentages based method" msgstr "Méthode basée sur des pourcentages" -#: glade/pytrainer.glade:12799 -#: pytrainer/gui/windowmain.py:254 -msgid "Karvonen method" -msgstr "Méthode de Karvonen" +#: glade/profile.glade.h:40 +msgid "Preferences" +msgstr "Préférences" -#: glade/pytrainer.glade:12821 +#: glade/profile.glade.h:41 +msgid "Resting heart rate:" +msgstr "Fréquence Cardiaque au Repos:" + +#: glade/profile.glade.h:42 msgid "Select how to calculate your heart rate zones." msgstr "Sélectionnez la méthode appropriée pour définir les zones cardiaque." -#: glade/pytrainer.glade:12853 -msgid "<b>Heart Rate Zones</b>" -msgstr "<b>Zones Cardiaque:</b>" +#: glade/profile.glade.h:43 +msgid "Sports" +msgstr "Sports" -#: glade/pytrainer.glade:12889 -#: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:85 -#: pytrainer/heartrategraph.py:38 -msgid "Heart Rate" -msgstr "Fréquence Cardiaque" +#: glade/profile.glade.h:44 +msgid "U.S. customary units" +msgstr "Unités U.S." -#: glade/pytrainer.glade:12994 -msgid "Calendar" -msgstr "Calendrier" +#: glade/profile.glade.h:45 +msgid "Use this port for internal connections: " +msgstr "Utiliser ce port pour les connexions internes:" -#: glade/pytrainer.glade:13196 -msgid "Edit Record" -msgstr "Éditer un enregistrement" +#: glade/profile.glade.h:46 +msgid "User name:" +msgstr "Nom d'Utilisateur:" -#: glade/pytrainer.glade:13217 -msgid "Show graph in classic view" -msgstr "Montrer le graphe dans la vue classique" +#: glade/profile.glade.h:47 +msgid "Weight:" +msgstr "Poids:" -#: glade/pytrainer.glade:13253 -msgid "warning" -msgstr "attention" +#: glade/profile.glade.h:48 +msgid "delete" +msgstr "supprimer" -#: glade/pytrainer.glade:13455 -msgid "<b>Extension Details</b>" -msgstr "<b>Détail des Extensions</b>" +#: glade/profile.glade.h:49 +msgid "edit" +msgstr "édition" -#: glade/pytrainer.glade:13483 -msgid "name-entry" +#: glade/profile.glade.h:51 +msgid "llist" msgstr "" -#: glade/pytrainer.glade:13539 -#: glade/pytrainer.glade:13946 -msgid "Status:" -msgstr "Statut:" +#: glade/profile.glade.h:52 +msgid "new" +msgstr "nouveau" -#: glade/pytrainer.glade:13595 -#: glade/pytrainer.glade:13918 -msgid "status-entry" -msgstr "" - -#: glade/pytrainer.glade:13623 -msgid "description-entry" -msgstr "" - -#: glade/pytrainer.glade:13758 -msgid "Plugins" -msgstr "Plugins" - -#: glade/pytrainer.glade:13833 -msgid "<b>Plugin Details</b>" -msgstr "<b>Détail du plugin</b>" - -#: glade/pytrainer.glade:13862 -msgid "description-entry " -msgstr "" - -#: glade/pytrainer.glade:13974 -msgid "nameEntry" -msgstr "" - -#: glade/pytrainer.glade:14145 -msgid "Select track record" -msgstr "Sélectionnez un Circuit" - #: pytrainer/gui/windowprofile.py:51 msgid "Male" msgstr "Homme" @@ -1035,109 +926,124 @@ msgid "Ok" msgstr "Ok" -#: pytrainer/gui/windowmain.py:57 -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:64 +#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:70 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:57 +#: pytrainer/gui/windowmain.py:63 +msgid "Start" +msgstr "Début" + +#: pytrainer/gui/windowmain.py:63 msgid "Kilometer" msgstr "Kilomètres" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:674 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:712 msgid "Title" msgstr "Titre" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:675 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:713 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Date" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:676 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:714 +#: pytrainer/gui/windowimportdata.py:255 #: pytrainer/extensions/googlemaps.py:91 msgid "Distance" msgstr "Distance" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:678 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:716 #: pytrainer/extensions/googlemaps.py:91 msgid "Time" msgstr "Temps" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:679 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:717 msgid "Beats" msgstr "Pulsations" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:680 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:718 msgid "Average" msgstr "Moyenne" -#: pytrainer/gui/windowmain.py:64 +#: pytrainer/gui/windowmain.py:70 msgid "Waypoint" msgstr "Point de Localisation" -#: pytrainer/gui/windowmain.py:158 -#: pytrainer/gui/windowmain.py:267 -#: pytrainer/gui/windowmain.py:366 -#: pytrainer/gui/windowmain.py:444 +#: pytrainer/gui/windowmain.py:168 +#: pytrainer/gui/windowmain.py:304 +#: pytrainer/gui/windowmain.py:404 +#: pytrainer/gui/windowmain.py:482 msgid "miles" msgstr "miles" -#: pytrainer/gui/windowmain.py:159 -#: pytrainer/gui/windowmain.py:160 -#: pytrainer/gui/windowmain.py:268 -#: pytrainer/gui/windowmain.py:269 -#: pytrainer/gui/windowmain.py:367 -#: pytrainer/gui/windowmain.py:368 -#: pytrainer/gui/windowmain.py:445 -#: pytrainer/gui/windowmain.py:446 +#: pytrainer/gui/windowmain.py:169 +#: pytrainer/gui/windowmain.py:170 +#: pytrainer/gui/windowmain.py:305 +#: pytrainer/gui/windowmain.py:306 +#: pytrainer/gui/windowmain.py:405 +#: pytrainer/gui/windowmain.py:406 +#: pytrainer/gui/windowmain.py:483 +#: pytrainer/gui/windowmain.py:484 msgid "miles/h" msgstr "" -#: pytrainer/gui/windowmain.py:161 -#: pytrainer/gui/windowmain.py:162 -#: pytrainer/gui/windowmain.py:270 -#: pytrainer/gui/windowmain.py:271 -#: pytrainer/gui/windowmain.py:369 -#: pytrainer/gui/windowmain.py:370 -#: pytrainer/gui/windowmain.py:447 -#: pytrainer/gui/windowmain.py:448 +#: pytrainer/gui/windowmain.py:171 +#: pytrainer/gui/windowmain.py:172 +#: pytrainer/gui/windowmain.py:307 +#: pytrainer/gui/windowmain.py:308 +#: pytrainer/gui/windowmain.py:407 +#: pytrainer/gui/windowmain.py:408 +#: pytrainer/gui/windowmain.py:485 +#: pytrainer/gui/windowmain.py:486 msgid "min/mile" msgstr "min/mile" -#: pytrainer/gui/windowmain.py:163 -#: pytrainer/gui/windowmain.py:164 +#: pytrainer/gui/windowmain.py:173 +#: pytrainer/gui/windowmain.py:174 msgid "feet" msgstr "pieds" -#: pytrainer/gui/windowmain.py:166 -#: pytrainer/gui/windowmain.py:273 -#: pytrainer/gui/windowmain.py:372 -#: pytrainer/gui/windowmain.py:450 +#: pytrainer/gui/windowmain.py:176 +#: pytrainer/gui/windowmain.py:310 +#: pytrainer/gui/windowmain.py:410 +#: pytrainer/gui/windowmain.py:488 #: pytrainer/extensions/googlemaps.py:91 msgid "km" msgstr "km" -#: pytrainer/gui/windowmain.py:256 +#: pytrainer/gui/windowmain.py:293 msgid "Percentages method" msgstr "Méthode basée sur des pourcentages" -#: pytrainer/gui/dialogselecttrack.py:40 -msgid "Track Name" -msgstr "Nom du Circuit" +#: pytrainer/gui/windowmain.py:1016 +msgid "lap" +msgstr "tour " -#: pytrainer/gui/drawArea.py:142 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/drawArea.py:143 #: pytrainer/extensions/googlemaps.py:89 msgid "h" msgstr "" -#: pytrainer/gui/drawArea.py:143 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/windowmain.py:1024 +msgid "s" +msgstr "" + +#: pytrainer/gui/dialogselecttrack.py:40 +msgid "Track Name" +msgstr "Nom du Circuit" + +#: pytrainer/gui/drawArea.py:144 #: pytrainer/extensions/googlemaps.py:89 msgid "min" msgstr "min" @@ -1147,11 +1053,82 @@ msgid "OK" msgstr "OK" -#: pytrainer/lib/gpx.py:90 +#: pytrainer/gui/windowimportdata.py:82 +msgid "No file selected" +msgstr "Pas de fichier sélectionné" + +#: pytrainer/gui/windowimportdata.py:189 +msgid "GPS device found" +msgstr "Périphérique GPS trouvé" + +#: pytrainer/gui/windowimportdata.py:192 +msgid "GPS device <b>not</b> found" +msgstr "Périphérique GPS <b>non</b> trouvé" + +#: pytrainer/gui/windowimportdata.py:199 +msgid "This tool was not found on the system" +msgstr "Cet outil n'est pas installé sur votre système" + +#: pytrainer/gui/windowimportdata.py:201 +msgid " Homepage" +msgstr "Page d'accueil" + +#: pytrainer/gui/windowimportdata.py:255 +msgid "Start Time" +msgstr "Heure de début" + +#: pytrainer/gui/windowimportdata.py:255 +msgid "Duration" +msgstr "Durée" + +#: pytrainer/gui/windowimportdata.py:255 +msgid "Notes" +msgstr "" + +#: pytrainer/gui/windowimportdata.py:404 +#, python-format +msgid "Found file of type: %s" +msgstr "Fichier trouvé de type: %s" + +#: pytrainer/gui/windowimportdata.py:413 +msgid "Found in database" +msgstr "Présent dans la base" + +#: pytrainer/gui/windowimportdata.py:428 +msgid "Unknown file type" +msgstr "Fichier de type inconnu" + +#: pytrainer/gui/windowimportdata.py:430 +msgid "File selected is of unknown or unsupported file type" +msgstr "Le type de fichier sélectionné est inconnu ou non supporté" + +#: pytrainer/gui/windowimportdata.py:457 +msgid "Importing one activity" +msgstr "Importation d'une activité" + +#: pytrainer/gui/windowimportdata.py:458 +msgid "Imported one activity" +msgstr "Une activité importée" + +#: pytrainer/gui/windowimportdata.py:460 +#, python-format +msgid "Importing %d activities" +msgstr "Import de %d activités" + +#: pytrainer/gui/windowimportdata.py:461 +#, python-format +msgid "Imported %d activities" +msgstr "%d activités importées" + +#: pytrainer/gui/windowimportdata.py:469 +msgid "Import Success" +msgstr "Importation réussie" + +#: pytrainer/lib/gpx.py:93 msgid "No Name" msgstr "Sans Nom" -#: pytrainer/lib/gpx.py:97 +#: pytrainer/lib/gpx.py:100 msgid "No Data" msgstr "Pas de Valeurs" @@ -1178,24 +1155,25 @@ #: pytrainer/daygraph.py:52 #: pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:79 -#: pytrainer/recordgraph.py:81 -#: pytrainer/recordgraph.py:83 -#: pytrainer/recordgraph.py:85 +#: pytrainer/recordgraph.py:93 +#: pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:99 +#: pytrainer/recordgraph.py:101 #: pytrainer/heartrategraph.py:38 #: pytrainer/monthgraph.py:69 -#: pytrainer/weekgraph.py:111 +#: pytrainer/weekgraph.py:115 #: pytrainer/yeargraph.py:70 msgid "Distance (km)" msgstr "Distance (km) " #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:79 +#: pytrainer/recordgraph.py:93 msgid "Height (m)" msgstr "Altitude (m)" #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:79 +#: pytrainer/recordgraph.py:93 msgid "Stage Profile" msgstr "Profil de la sortie" @@ -1208,27 +1186,35 @@ msgstr "Vitesse" #: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:85 +#: pytrainer/recordgraph.py:99 #: pytrainer/heartrategraph.py:38 msgid "Beats (bpm)" msgstr "Pulsations (bpm)" -#: pytrainer/recordgraph.py:81 +#: pytrainer/recordgraph.py:95 msgid "Speed (Km/h)" msgstr "Vitesse (km/h)" -#: pytrainer/recordgraph.py:81 +#: pytrainer/recordgraph.py:95 msgid "Speed" msgstr "Vitesse" -#: pytrainer/recordgraph.py:83 +#: pytrainer/recordgraph.py:97 msgid "Pace (min/km)" msgstr "Cadence (min/km)" -#: pytrainer/recordgraph.py:83 +#: pytrainer/recordgraph.py:97 msgid "Pace" msgstr "Cadence" +#: pytrainer/recordgraph.py:101 +msgid "Cadence (rpm)" +msgstr "Rythme (rpm) " + +#: pytrainer/recordgraph.py:101 +msgid "Cadence" +msgstr "Rythme" + #: pytrainer/monthgraph.py:69 #: pytrainer/monthgraph.py:71 #: pytrainer/monthgraph.py:73 @@ -1238,45 +1224,45 @@ msgstr "jour" #: pytrainer/monthgraph.py:69 -#: pytrainer/weekgraph.py:111 +#: pytrainer/weekgraph.py:115 msgid "Daily Distance" msgstr "Distance Journalière" #: pytrainer/monthgraph.py:71 -#: pytrainer/weekgraph.py:113 +#: pytrainer/weekgraph.py:117 #: pytrainer/yeargraph.py:72 msgid "Time (hours)" msgstr "Durée (Heures)" #: pytrainer/monthgraph.py:71 -#: pytrainer/weekgraph.py:113 +#: pytrainer/weekgraph.py:117 msgid "Daily Time" msgstr "Durée Journalière" #: pytrainer/monthgraph.py:73 -#: pytrainer/weekgraph.py:115 +#: pytrainer/weekgraph.py:119 #: pytrainer/yeargraph.py:74 msgid "Average Heart Rate (bpm)" msgstr "FC moyenne (bpm):" #: pytrainer/monthgraph.py:73 -#: pytrainer/weekgraph.py:115 +#: pytrainer/weekgraph.py:119 msgid "Daily Average Heart Rate" msgstr "FC moyenne Journalière" #: pytrainer/monthgraph.py:75 -#: pytrainer/weekgraph.py:117 +#: pytrainer/weekgraph.py:121 #: pytrainer/yeargraph.py:76 msgid "Average Speed (km/h)" msgstr "Vitesse moyenne (km/h)" #: pytrainer/monthgraph.py:75 -#: pytrainer/weekgraph.py:117 +#: pytrainer/weekgraph.py:121 msgid "Daily Average Speed" msgstr "Vitesse moyenne Journalière" #: pytrainer/monthgraph.py:77 -#: pytrainer/weekgraph.py:119 +#: pytrainer/weekgraph.py:123 msgid "Daily Calories" msgstr "Calories Journalière" @@ -1284,7 +1270,11 @@ msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" msgstr "Ce fichier GPX semble contenir plusieurs jours d'enregistrements. Vous devrez peut-être au préalable éditer celui-ci." -#: pytrainer/record.py:368 +#: pytrainer/record.py:61 +msgid "Edit Entry" +msgstr "Entrée Rapide" + +#: pytrainer/record.py:373 msgid "pyTrainer cant import data from your gpx file" msgstr "pyTrainer ne peut pas importer de données depuis le fichier GPX" @@ -1316,14 +1306,62 @@ msgid "Monthly Calories" msgstr "Calories Mensuelle" -#: pytrainer/main.py:394 +#: pytrainer/main.py:416 msgid "Delete this database entry?" msgstr "Supprimer cette entrée de la Base de Données?" -#: pytrainer/main.py:408 +#: pytrainer/main.py:430 msgid "Delete this waypoint?" msgstr "Détruire ce Point de Localisation" +#: import/file_garmintools.py:45 +msgid "Garmin tools dump file" +msgstr "Fichier de dump Garmin tools" + +#: import/file_garmintcxv1.py:46 +msgid "Garmin training center database file version 1" +msgstr "" + +#: import/file_garmintcxv2.py:45 +msgid "Garmin training center database file version 2" +msgstr "" + +#: import/tool_garmintools.py:38 +msgid "Garmintools" +msgstr "" + +#: import/tool_gpsbabel.py:38 +msgid "GPSBabel" +msgstr "" + +#: import/file_gpxplus.py:45 +msgid "GPS eXchange file" +msgstr "Fichier de type GPX" + +#: import/tool_gant.py:38 +msgid "Gant" +msgstr "" + +#~ msgid "window1" +#~ msgstr "fenêtre1" +#~ msgid "label154" +#~ msgstr "label154" +#~ msgid "label155" +#~ msgstr "label155" +#~ msgid "label162" +#~ msgstr "label162" +#~ msgid "label163" +#~ msgstr "label163" + +#, fuzzy +#~ msgid " " +#~ msgstr " " + +#, fuzzy +#~ msgid "<b>frame1</b>" +#~ msgstr " <b>Nom:</b>" +#~ msgid "<b>Time:</b>" +#~ msgstr "<b>Temps:</b>" #~ msgid "Kilometers" #~ msgstr "Kilomètres" #~ msgid "Daily kilometers" @@ -1523,8 +1561,6 @@ #~ msgstr "cal/jour" #~ msgid "time/day" #~ msgstr "temps/jour" -#~ msgid " <b>Name:</b>" -#~ msgstr " <b>Nom:</b>" #~ msgid " <b>Description:</b>" #~ msgstr " <b>Description:</b>" #~ msgid "Profile" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-22 06:31:28
|
Revision: 496 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=496&view=rev Author: jblance Date: 2010-01-22 06:31:21 +0000 (Fri, 22 Jan 2010) Log Message: ----------- Possible fix for trac bug #31 Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/webUtils.py Modified: pytrainer/trunk/pytrainer/lib/webUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/webUtils.py 2010-01-21 22:12:20 UTC (rev 495) +++ pytrainer/trunk/pytrainer/lib/webUtils.py 2010-01-22 06:31:21 UTC (rev 496) @@ -53,7 +53,7 @@ :param url: the url to open """ - class BrowserThread(threading.Thread): + class BrowserThread(Thread): def __init__(self, url): Thread.__init__(self) self.url = url This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-21 22:12:26
|
Revision: 495 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=495&view=rev Author: dgranda Date: 2010-01-21 22:12:20 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Removed translatable attribute for empty labels Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-01-21 21:45:07 UTC (rev 494) +++ pytrainer/trunk/glade/pytrainer.glade 2010-01-21 22:12:20 UTC (rev 495) @@ -477,7 +477,7 @@ <child> <widget class="GtkLabel" id="record_sport"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -505,7 +505,7 @@ <child> <widget class="GtkLabel" id="record_upositive"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -533,7 +533,7 @@ <child> <widget class="GtkLabel" id="record_calories"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -841,7 +841,7 @@ <child> <widget class="GtkLabel" id="record_distance"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -869,7 +869,7 @@ <child> <widget class="GtkLabel" id="record_maxspeed"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -897,7 +897,7 @@ <child> <widget class="GtkLabel" id="record_maxpace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -925,7 +925,7 @@ <child> <widget class="GtkLabel" id="record_date"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -954,7 +954,7 @@ <child> <widget class="GtkLabel" id="record_unegative"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -1180,7 +1180,7 @@ <child> <widget class="GtkLabel" id="record_datetime"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -1236,7 +1236,7 @@ <child> <widget class="GtkLabel" id="record_pace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -1292,7 +1292,7 @@ <child> <widget class="GtkLabel" id="record_average"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -1616,7 +1616,7 @@ <child> <widget class="GtkLabel" id="label11145"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2255,7 +2255,7 @@ <child> <widget class="GtkLabel" id="record_beats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2283,7 +2283,7 @@ <child> <widget class="GtkLabel" id="record_maxbeats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2311,7 +2311,7 @@ <child> <widget class="GtkLabel" id="record_calories2"> <!-- not sure what this one is/... --> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2451,7 +2451,7 @@ <child> <widget class="GtkLabel" id="record_zone4"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2479,7 +2479,7 @@ <child> <widget class="GtkLabel" id="record_zone3"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2507,7 +2507,7 @@ <child> <widget class="GtkLabel" id="record_zone2"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2535,7 +2535,7 @@ <child> <widget class="GtkLabel" id="record_zone1"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2590,7 +2590,7 @@ <child> <widget class="GtkLabel" id="record_zone5"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -2757,7 +2757,7 @@ <child> <widget class="GtkLabel" id="record_zonesmethod"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3152,7 +3152,7 @@ <child> <widget class="GtkLabel" id="day_distance"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3434,7 +3434,7 @@ <child> <widget class="GtkLabel" id="day_average"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3575,7 +3575,7 @@ <child> <widget class="GtkLabel" id="day_calories"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3659,7 +3659,7 @@ <child> <widget class="GtkLabel" id="day_beats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3883,7 +3883,7 @@ <child> <widget class="GtkLabel" id="day_maxspeed"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3911,7 +3911,7 @@ <child> <widget class="GtkLabel" id="day_maxbeats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3939,7 +3939,7 @@ <child> <widget class="GtkLabel" id="day_pace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -3967,7 +3967,7 @@ <child> <widget class="GtkLabel" id="day_maxpace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -4280,7 +4280,7 @@ <child> <widget class="GtkLabel" id="weeka_distance"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -4535,7 +4535,7 @@ <child> <widget class="GtkLabel" id="weeka_average"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -4619,7 +4619,7 @@ <child> <widget class="GtkLabel" id="weeka_calories"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -4704,7 +4704,7 @@ <child> <widget class="GtkLabel" id="weeka_maxspeed"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -4815,7 +4815,7 @@ <child> <widget class="GtkLabel" id="weeka_beats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5039,7 +5039,7 @@ <child> <widget class="GtkLabel" id="weeka_pace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5067,7 +5067,7 @@ <child> <widget class="GtkLabel" id="weeka_maxpace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5095,7 +5095,7 @@ <child> <widget class="GtkLabel" id="weeka_maxbeats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5422,7 +5422,7 @@ <child> <widget class="GtkLabel" id="montha_distance"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5677,7 +5677,7 @@ <child> <widget class="GtkLabel" id="montha_average"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5761,7 +5761,7 @@ <child> <widget class="GtkLabel" id="montha_calories"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5846,7 +5846,7 @@ <child> <widget class="GtkLabel" id="montha_maxspeed"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -5957,7 +5957,7 @@ <child> <widget class="GtkLabel" id="montha_beats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6181,7 +6181,7 @@ <child> <widget class="GtkLabel" id="montha_pace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6209,7 +6209,7 @@ <child> <widget class="GtkLabel" id="montha_maxpace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6237,7 +6237,7 @@ <child> <widget class="GtkLabel" id="montha_maxbeats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6577,7 +6577,7 @@ <child> <widget class="GtkLabel" id="yeara_calories"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6661,7 +6661,7 @@ <child> <widget class="GtkLabel" id="yeara_beats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -6717,7 +6717,7 @@ <child> <widget class="GtkLabel" id="yeara_distance"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -7026,7 +7026,7 @@ <child> <widget class="GtkLabel" id="yeara_average"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -7309,7 +7309,7 @@ <child> <widget class="GtkLabel" id="yeara_pace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -7337,7 +7337,7 @@ <child> <widget class="GtkLabel" id="yeara_maxpace"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -7365,7 +7365,7 @@ <child> <widget class="GtkLabel" id="yeara_maxspeed"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -7393,7 +7393,7 @@ <child> <widget class="GtkLabel" id="yeara_maxbeats"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> + <property name="label"> </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-21 21:45:14
|
Revision: 494 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=494&view=rev Author: dgranda Date: 2010-01-21 21:45:07 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Updated spanish localization Modified Paths: -------------- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-01-21 20:01:51 UTC (rev 493) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-01-21 21:45:07 UTC (rev 494) @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: vud 1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-04 21:22+0100\n" -"PO-Revision-Date: 2009-12-05 14:06+0100\n" +"POT-Creation-Date: 2010-01-21 22:32+0100\n" +"PO-Revision-Date: 2010-01-21 22:34+0100\n" "Last-Translator: David García Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "MIME-Version: 1.0\n" @@ -22,302 +22,286 @@ #: glade/pytrainer.glade:48 msgid "_File" -msgstr "Archivo" +msgstr "_Archivo" -#: glade/pytrainer.glade:72 +#: glade/pytrainer.glade:66 +msgid "_Import" +msgstr "_Importar" + +#: glade/pytrainer.glade:81 msgid "_Export as Text Separated by Commas" -msgstr "Exportar como texto separado por comas" +msgstr "_Exportar como texto separado por comas" -#: glade/pytrainer.glade:112 +#: glade/pytrainer.glade:121 msgid "_Edit" -msgstr "Editar" +msgstr "_Editar" -#: glade/pytrainer.glade:134 +#: glade/pytrainer.glade:143 msgid "_View" -msgstr "Ver" +msgstr "_Ver" -#: glade/pytrainer.glade:143 +#: glade/pytrainer.glade:152 msgid " _Classic View" -msgstr "Vista clásica" +msgstr "Vista _clásica" -#: glade/pytrainer.glade:154 +#: glade/pytrainer.glade:163 msgid " _List View" -msgstr "Listado de registros" +msgstr "_Listado de registros" -#: glade/pytrainer.glade:166 +#: glade/pytrainer.glade:175 msgid " _Waypoints Editor" -msgstr "Editor de waypoints" +msgstr "Editor de _waypoints" -#: glade/pytrainer.glade:182 +#: glade/pytrainer.glade:191 msgid "Tools" msgstr "Herramientas" -#: glade/pytrainer.glade:192 -#: glade/pytrainer.glade:13379 +#: glade/pytrainer.glade:201 +#: glade/pytrainer.glade:8842 msgid "Extensions" msgstr "Extensiones" -#: glade/pytrainer.glade:202 +#: glade/pytrainer.glade:211 msgid "GPS Device Plugins" msgstr "Plugins de dispositivos GPS" -#: glade/pytrainer.glade:216 +#: glade/pytrainer.glade:225 msgid "_Help" -msgstr "Ayuda" +msgstr "_Ayuda" -#: glade/pytrainer.glade:336 +#: glade/pytrainer.glade:345 +#: build/lib/pytrainer/gui/windowmain.py:63 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:715 +#: build/lib/pytrainer/gui/windowimportdata.py:255 +#: build/lib/pytrainer/gui/windowprofile.py:69 +#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:715 +#: pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowprofile.py:69 -#: pytrainer/gui/windowmain.py:57 -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:677 msgid "Sport" msgstr "Deporte" -#: glade/pytrainer.glade:362 +#: glade/pytrainer.glade:371 msgid "All Sports" msgstr "Todos los deportes" -#: glade/pytrainer.glade:471 -#: glade/pytrainer.glade:836 -#: glade/pytrainer.glade:864 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:499 -#: glade/pytrainer.glade:892 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:527 +#: glade/pytrainer.glade:564 msgid "<b>Sport:</b>" msgstr "<b>Deporte:</b>" -#: glade/pytrainer.glade:555 -#: glade/pytrainer.glade:2994 -#: glade/pytrainer.glade:4122 -#: glade/pytrainer.glade:5264 -#: glade/pytrainer.glade:6559 -msgid "<b>Time:</b>" -msgstr "<b>Tiempo:</b>" +#: glade/pytrainer.glade:592 +#: glade/pytrainer.glade:3212 +#: glade/pytrainer.glade:4340 +#: glade/pytrainer.glade:5482 +#: glade/pytrainer.glade:6777 +msgid "<b>Duration:</b>" +msgstr "<b>Duración:</b>" -#: glade/pytrainer.glade:584 -#: glade/pytrainer.glade:3191 -#: glade/pytrainer.glade:4292 -#: glade/pytrainer.glade:5434 -#: glade/pytrainer.glade:6783 +#: glade/pytrainer.glade:621 +#: glade/pytrainer.glade:3409 +#: glade/pytrainer.glade:4510 +#: glade/pytrainer.glade:5652 +#: glade/pytrainer.glade:7001 msgid "<b>Speed:</b>" msgstr "<b>Velocidad:</b>" -#: glade/pytrainer.glade:612 -#: glade/pytrainer.glade:3500 -#: glade/pytrainer.glade:4656 -#: glade/pytrainer.glade:5798 -#: glade/pytrainer.glade:6953 +#: glade/pytrainer.glade:649 +#: glade/pytrainer.glade:3718 +#: glade/pytrainer.glade:4874 +#: glade/pytrainer.glade:6016 +#: glade/pytrainer.glade:7171 msgid "<b>Pace:</b>" msgstr "<b>Ritmo:</b>" -#: glade/pytrainer.glade:640 +#: glade/pytrainer.glade:677 msgid "<b>Ascent:</b>" msgstr "<b>Ascenso:</b>" -#: glade/pytrainer.glade:668 +#: glade/pytrainer.glade:705 +msgid "<b>Calories:</b>" +msgstr "<b>Calorías: </b>" + +#: glade/pytrainer.glade:732 msgid "<b>Comments:</b>" msgstr "<b>Comentarios:</b>" -#: glade/pytrainer.glade:696 -#: glade/pytrainer.glade:1379 -#: glade/pytrainer.glade:3247 -#: glade/pytrainer.glade:3304 -#: glade/pytrainer.glade:4348 -#: glade/pytrainer.glade:4517 -#: glade/pytrainer.glade:5490 -#: glade/pytrainer.glade:5659 -#: glade/pytrainer.glade:6839 -#: glade/pytrainer.glade:6867 -#: pytrainer/gui/windowmain.py:167 -#: pytrainer/gui/windowmain.py:168 -#: pytrainer/gui/windowmain.py:274 -#: pytrainer/gui/windowmain.py:275 -#: pytrainer/gui/windowmain.py:373 -#: pytrainer/gui/windowmain.py:374 -#: pytrainer/gui/windowmain.py:451 -#: pytrainer/gui/windowmain.py:452 +#: glade/pytrainer.glade:760 +#: glade/pytrainer.glade:1585 +#: glade/pytrainer.glade:3465 +#: glade/pytrainer.glade:3522 +#: glade/pytrainer.glade:4566 +#: glade/pytrainer.glade:4735 +#: glade/pytrainer.glade:5708 +#: glade/pytrainer.glade:5877 +#: glade/pytrainer.glade:7057 +#: glade/pytrainer.glade:7085 +#: build/lib/pytrainer/gui/windowmain.py:177 +#: build/lib/pytrainer/gui/windowmain.py:178 +#: build/lib/pytrainer/gui/windowmain.py:311 +#: build/lib/pytrainer/gui/windowmain.py:312 +#: build/lib/pytrainer/gui/windowmain.py:411 +#: build/lib/pytrainer/gui/windowmain.py:412 +#: build/lib/pytrainer/gui/windowmain.py:489 +#: build/lib/pytrainer/gui/windowmain.py:490 +#: pytrainer/gui/windowmain.py:177 +#: pytrainer/gui/windowmain.py:178 +#: pytrainer/gui/windowmain.py:311 +#: pytrainer/gui/windowmain.py:312 +#: pytrainer/gui/windowmain.py:411 +#: pytrainer/gui/windowmain.py:412 +#: pytrainer/gui/windowmain.py:489 +#: pytrainer/gui/windowmain.py:490 msgid "km/h" msgstr "Km/h" -#: glade/pytrainer.glade:724 -#: glade/pytrainer.glade:1089 -#: glade/pytrainer.glade:3528 -#: glade/pytrainer.glade:3584 -#: glade/pytrainer.glade:4712 -#: glade/pytrainer.glade:4740 -#: glade/pytrainer.glade:5854 -#: glade/pytrainer.glade:5882 -#: glade/pytrainer.glade:7010 -#: glade/pytrainer.glade:7038 -#: pytrainer/gui/windowmain.py:169 -#: pytrainer/gui/windowmain.py:170 -#: pytrainer/gui/windowmain.py:276 -#: pytrainer/gui/windowmain.py:277 -#: pytrainer/gui/windowmain.py:375 -#: pytrainer/gui/windowmain.py:376 -#: pytrainer/gui/windowmain.py:453 -#: pytrainer/gui/windowmain.py:454 +#: glade/pytrainer.glade:788 +#: glade/pytrainer.glade:1267 +#: glade/pytrainer.glade:3746 +#: glade/pytrainer.glade:3802 +#: glade/pytrainer.glade:4930 +#: glade/pytrainer.glade:4958 +#: glade/pytrainer.glade:6072 +#: glade/pytrainer.glade:6100 +#: glade/pytrainer.glade:7228 +#: glade/pytrainer.glade:7256 +#: build/lib/pytrainer/gui/windowmain.py:179 +#: build/lib/pytrainer/gui/windowmain.py:180 +#: build/lib/pytrainer/gui/windowmain.py:313 +#: build/lib/pytrainer/gui/windowmain.py:314 +#: build/lib/pytrainer/gui/windowmain.py:413 +#: build/lib/pytrainer/gui/windowmain.py:414 +#: build/lib/pytrainer/gui/windowmain.py:491 +#: build/lib/pytrainer/gui/windowmain.py:492 +#: pytrainer/gui/windowmain.py:179 +#: pytrainer/gui/windowmain.py:180 +#: pytrainer/gui/windowmain.py:313 +#: pytrainer/gui/windowmain.py:314 +#: pytrainer/gui/windowmain.py:413 +#: pytrainer/gui/windowmain.py:414 +#: pytrainer/gui/windowmain.py:491 +#: pytrainer/gui/windowmain.py:492 msgid "min/km" msgstr "min/km" -#: glade/pytrainer.glade:752 -#: glade/pytrainer.glade:1145 -#: pytrainer/gui/windowmain.py:171 -#: pytrainer/gui/windowmain.py:172 +#: glade/pytrainer.glade:816 +#: glade/pytrainer.glade:1323 +#: build/lib/pytrainer/gui/windowmain.py:181 +#: build/lib/pytrainer/gui/windowmain.py:182 +#: build/lib/pytrainer/gui/windowmain.py:1022 +#: build/lib/pytrainer/gui/windowmain.py:1024 +#: pytrainer/gui/windowmain.py:181 +#: pytrainer/gui/windowmain.py:182 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/windowmain.py:1024 msgid "m" msgstr "m" -#: glade/pytrainer.glade:780 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:808 -#: glade/pytrainer.glade:1117 -#: glade/pytrainer.glade:2040 -#: glade/pytrainer.glade:2068 -#: glade/pytrainer.glade:2096 -#: glade/pytrainer.glade:2264 -#: glade/pytrainer.glade:3696 -#: glade/pytrainer.glade:4852 -#: glade/pytrainer.glade:5994 -msgid " " -msgstr " " - -#: glade/pytrainer.glade:920 +#: glade/pytrainer.glade:985 msgid "<b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:948 -#: glade/pytrainer.glade:2966 -#: glade/pytrainer.glade:4094 -#: glade/pytrainer.glade:5236 -#: glade/pytrainer.glade:6531 +#: glade/pytrainer.glade:1013 +#: glade/pytrainer.glade:3184 +#: glade/pytrainer.glade:4312 +#: glade/pytrainer.glade:5454 +#: glade/pytrainer.glade:6749 msgid "<b>Distance:</b>" msgstr "<b>Distancia:</b>" -#: glade/pytrainer.glade:977 +#: glade/pytrainer.glade:1042 msgid "<b>Max Speed</b>" msgstr "<b>Pico velocidad:</b>" -#: glade/pytrainer.glade:1005 -#: glade/pytrainer.glade:3556 -#: glade/pytrainer.glade:4684 -#: glade/pytrainer.glade:5826 -#: glade/pytrainer.glade:6982 +#: glade/pytrainer.glade:1070 +#: glade/pytrainer.glade:3774 +#: glade/pytrainer.glade:4902 +#: glade/pytrainer.glade:6044 +#: glade/pytrainer.glade:7200 msgid "<b>Max Pace:</b>" msgstr "<b>Pico ritmo:</b>" -#: glade/pytrainer.glade:1033 +#: glade/pytrainer.glade:1098 msgid "<b>Descent:</b>" msgstr "<b>Descenso:</b>" -#: glade/pytrainer.glade:1061 -msgid " " -msgstr "" +#: glade/pytrainer.glade:1351 +#: glade/pytrainer.glade:3606 +#: glade/pytrainer.glade:4650 +#: glade/pytrainer.glade:5792 +#: glade/pytrainer.glade:6608 +msgid "Cal" +msgstr "Cal" -#: glade/pytrainer.glade:1211 -#: glade/pytrainer.glade:2910 -#: glade/pytrainer.glade:4038 -#: glade/pytrainer.glade:5180 -#: glade/pytrainer.glade:6755 +#: glade/pytrainer.glade:1417 +#: glade/pytrainer.glade:3128 +#: glade/pytrainer.glade:4256 +#: glade/pytrainer.glade:5398 +#: glade/pytrainer.glade:6973 msgid "Km" msgstr "km" -#: glade/pytrainer.glade:1244 -#: glade/pytrainer.glade:1294 -#: glade/pytrainer.glade:1344 -#: glade/pytrainer.glade:3028 -#: glade/pytrainer.glade:3078 -#: glade/pytrainer.glade:3128 -#: glade/pytrainer.glade:4206 -#: glade/pytrainer.glade:4256 -#: glade/pytrainer.glade:5348 -#: glade/pytrainer.glade:5398 -#: glade/pytrainer.glade:6643 -#: glade/pytrainer.glade:6693 +#: glade/pytrainer.glade:1450 +#: glade/pytrainer.glade:1500 +#: glade/pytrainer.glade:1550 +#: glade/pytrainer.glade:3246 +#: glade/pytrainer.glade:3296 +#: glade/pytrainer.glade:3346 +#: glade/pytrainer.glade:4424 +#: glade/pytrainer.glade:4474 +#: glade/pytrainer.glade:5566 +#: glade/pytrainer.glade:5616 +#: glade/pytrainer.glade:6861 +#: glade/pytrainer.glade:6911 msgid "00" msgstr "00" -#: glade/pytrainer.glade:1269 -#: glade/pytrainer.glade:1319 -#: glade/pytrainer.glade:3053 -#: glade/pytrainer.glade:3103 -#: glade/pytrainer.glade:4181 -#: glade/pytrainer.glade:4231 -#: glade/pytrainer.glade:5323 -#: glade/pytrainer.glade:5373 -#: glade/pytrainer.glade:6618 -#: glade/pytrainer.glade:6668 -#: glade/pytrainer.glade:8788 -#: glade/pytrainer.glade:8833 +#: glade/pytrainer.glade:1475 +#: glade/pytrainer.glade:1525 +#: glade/pytrainer.glade:3271 +#: glade/pytrainer.glade:3321 +#: glade/pytrainer.glade:4399 +#: glade/pytrainer.glade:4449 +#: glade/pytrainer.glade:5541 +#: glade/pytrainer.glade:5591 +#: glade/pytrainer.glade:6836 +#: glade/pytrainer.glade:6886 msgid ":" msgstr ":" -#: glade/pytrainer.glade:1413 -#: glade/pytrainer.glade:2375 -#: glade/pytrainer.glade:2937 -#: glade/pytrainer.glade:3219 -#: glade/pytrainer.glade:3360 -#: glade/pytrainer.glade:3444 -#: glade/pytrainer.glade:3724 -#: glade/pytrainer.glade:3752 -#: glade/pytrainer.glade:4065 -#: glade/pytrainer.glade:4320 -#: glade/pytrainer.glade:4404 -#: glade/pytrainer.glade:4600 -#: glade/pytrainer.glade:4880 -#: glade/pytrainer.glade:5207 -#: glade/pytrainer.glade:5462 -#: glade/pytrainer.glade:5546 -#: glade/pytrainer.glade:5742 -#: glade/pytrainer.glade:6022 -#: glade/pytrainer.glade:6362 -#: glade/pytrainer.glade:6446 -#: glade/pytrainer.glade:6502 -#: glade/pytrainer.glade:6811 -#: glade/pytrainer.glade:7094 -#: glade/pytrainer.glade:7122 -#: glade/pytrainer.glade:7150 -#: glade/pytrainer.glade:7178 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:1520 +#: glade/pytrainer.glade:1726 msgid " <b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:1634 +#: glade/pytrainer.glade:1840 msgid "" "Profile\n" "Speed\n" "Pace\n" -"Heart Rate" +"Heart Rate\n" +"Cadence" msgstr "" "Perfil\n" "Velocidad\n" "Ritmo\n" "Pulsaciones" -#: glade/pytrainer.glade:1653 -#: glade/pytrainer.glade:5038 -#: glade/pytrainer.glade:6180 -#: glade/pytrainer.glade:7336 +#: glade/pytrainer.glade:1860 +#: glade/pytrainer.glade:5256 +#: glade/pytrainer.glade:6398 +#: glade/pytrainer.glade:7554 msgid "Versus" msgstr "contra" -#: glade/pytrainer.glade:1678 +#: glade/pytrainer.glade:1885 msgid "" "None\n" "Profile\n" "Speed\n" "Pace\n" "Heart Rate\n" +"Cadence\n" msgstr "" "Nada\n" "Perfil\n" @@ -325,140 +309,119 @@ "Ritmo\n" "Pulsaciones\n" -#: glade/pytrainer.glade:1843 +#: glade/pytrainer.glade:1905 +msgid "Show Laps" +msgstr "Mostras vueltas" + +#: glade/pytrainer.glade:2061 msgid "<b>Beats:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:1871 -#: glade/pytrainer.glade:3332 -#: glade/pytrainer.glade:4376 -#: glade/pytrainer.glade:5518 -#: glade/pytrainer.glade:6334 +#: glade/pytrainer.glade:2089 +#: glade/pytrainer.glade:3550 +#: glade/pytrainer.glade:4594 +#: glade/pytrainer.glade:5736 +#: glade/pytrainer.glade:6552 msgid "<b>Calories: </b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:1899 -#: glade/pytrainer.glade:3612 -#: glade/pytrainer.glade:4796 -#: glade/pytrainer.glade:5938 -#: glade/pytrainer.glade:7066 +#: glade/pytrainer.glade:2117 +#: glade/pytrainer.glade:3830 +#: glade/pytrainer.glade:5014 +#: glade/pytrainer.glade:6156 +#: glade/pytrainer.glade:7284 msgid "<b>Max Beats:</b>" msgstr "<b>Pico pulsaciones:</b>" -#: glade/pytrainer.glade:1927 +#: glade/pytrainer.glade:2145 msgid "<b>HR Zones Method:</b>" msgstr "<b>Método de cálculo:</b>" -#: glade/pytrainer.glade:1956 +#: glade/pytrainer.glade:2174 msgid "<b>HR Zone5:</b>" msgstr "<b>Máximo esfuerzo:</b>" -#: glade/pytrainer.glade:1984 -#: glade/pytrainer.glade:2348 +#: glade/pytrainer.glade:2202 +#: glade/pytrainer.glade:2566 msgid " bpm" msgstr "ppm" -#: glade/pytrainer.glade:2012 +#: glade/pytrainer.glade:2230 msgid " Cal" msgstr "Cal" -#: glade/pytrainer.glade:2124 +#: glade/pytrainer.glade:2342 msgid "<b>HR Zone4:</b>" msgstr "<b>Anaeróbica:</b>" -#: glade/pytrainer.glade:2152 +#: glade/pytrainer.glade:2370 msgid "<b>HR Zone3:</b>" msgstr "<b>Aeróbica:</b>" -#: glade/pytrainer.glade:2180 +#: glade/pytrainer.glade:2398 msgid "<b>HR Zone2:</b>" msgstr "<b>Quemagrasas:</b>" -#: glade/pytrainer.glade:2208 +#: glade/pytrainer.glade:2426 msgid "<b>HR Zone1:</b>" msgstr "<b>Recuperación:</b>" -#: glade/pytrainer.glade:2236 -#: glade/pytrainer.glade:2292 -#: glade/pytrainer.glade:2320 -#: glade/pytrainer.glade:3668 -#: glade/pytrainer.glade:4489 -#: glade/pytrainer.glade:4824 -#: glade/pytrainer.glade:5631 -#: glade/pytrainer.glade:5966 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:2403 -#: glade/pytrainer.glade:2430 -#: glade/pytrainer.glade:2458 -#: glade/pytrainer.glade:2486 -#: glade/pytrainer.glade:2514 -#: glade/pytrainer.glade:3472 -#: glade/pytrainer.glade:3640 -#: glade/pytrainer.glade:4628 -#: glade/pytrainer.glade:4768 -#: glade/pytrainer.glade:5770 -#: glade/pytrainer.glade:5910 -#: glade/pytrainer.glade:6474 -#: glade/pytrainer.glade:6895 +#: glade/pytrainer.glade:2621 +#: glade/pytrainer.glade:2648 +#: glade/pytrainer.glade:2676 +#: glade/pytrainer.glade:2704 +#: glade/pytrainer.glade:2732 +#: glade/pytrainer.glade:3690 +#: glade/pytrainer.glade:3858 +#: glade/pytrainer.glade:4846 +#: glade/pytrainer.glade:4986 +#: glade/pytrainer.glade:5988 +#: glade/pytrainer.glade:6128 +#: glade/pytrainer.glade:6692 +#: glade/pytrainer.glade:7113 msgid "bpm" msgstr "ppm" -#: glade/pytrainer.glade:2542 -#, fuzzy -msgid " " -msgstr " " - -#: glade/pytrainer.glade:2580 +#: glade/pytrainer.glade:2798 msgid " <b>Heart Rate:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2757 -#: glade/pytrainer.glade:8150 -#: glade/pytrainer.glade:12008 +#: glade/pytrainer.glade:2975 +#: glade/pytrainer.glade:8368 msgid "label-2147483648" msgstr " " -#: glade/pytrainer.glade:2795 -#, fuzzy +#: glade/pytrainer.glade:3013 msgid "label-2147483647" -msgstr " " +msgstr "" -#: glade/pytrainer.glade:2851 +#: glade/pytrainer.glade:3069 msgid "Record" msgstr "Registro" -#: glade/pytrainer.glade:3276 -#: glade/pytrainer.glade:4461 -#: glade/pytrainer.glade:5603 -#: glade/pytrainer.glade:6924 +#: glade/pytrainer.glade:3494 +#: glade/pytrainer.glade:4679 +#: glade/pytrainer.glade:5821 +#: glade/pytrainer.glade:7142 msgid "<b>Max Speed:</b>" msgstr "<b>Velocidad máxima:</b>" -#: glade/pytrainer.glade:3388 -#: glade/pytrainer.glade:4432 -#: glade/pytrainer.glade:5574 -#: glade/pytrainer.glade:6390 -msgid "Cal" -msgstr "Cal" - -#: glade/pytrainer.glade:3416 -#: glade/pytrainer.glade:4572 -#: glade/pytrainer.glade:5714 -#: glade/pytrainer.glade:6418 +#: glade/pytrainer.glade:3634 +#: glade/pytrainer.glade:4790 +#: glade/pytrainer.glade:5932 +#: glade/pytrainer.glade:6636 msgid "<b>Beats avg:</b>" msgstr "<b>Media pulsaciones:</b>" -#: glade/pytrainer.glade:3790 +#: glade/pytrainer.glade:4008 msgid " <b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:3865 +#: glade/pytrainer.glade:4083 msgid "Value" msgstr "Valor" -#: glade/pytrainer.glade:3890 +#: glade/pytrainer.glade:4108 msgid "" "Stage Profile\n" "Stage Velocity\n" @@ -468,29 +431,28 @@ "Velocidad de Etapa\n" "Perfil/Velocidad de Etapa" -#: glade/pytrainer.glade:3979 +#: glade/pytrainer.glade:4197 msgid "Day" msgstr "Día" -#: glade/pytrainer.glade:4156 -#: glade/pytrainer.glade:5298 -#: glade/pytrainer.glade:6593 +#: glade/pytrainer.glade:4374 +#: glade/pytrainer.glade:5516 +#: glade/pytrainer.glade:6811 msgid "000" msgstr "000" -#: glade/pytrainer.glade:4545 -#: glade/pytrainer.glade:5687 -#: glade/pytrainer.glade:8986 +#: glade/pytrainer.glade:4763 +#: glade/pytrainer.glade:5905 msgid " " msgstr " " -#: glade/pytrainer.glade:4918 +#: glade/pytrainer.glade:5136 msgid " <b>Week:</b>" msgstr "<b>Semana:</b>" -#: glade/pytrainer.glade:5018 -#: glade/pytrainer.glade:6160 -#: glade/pytrainer.glade:7316 +#: glade/pytrainer.glade:5236 +#: glade/pytrainer.glade:6378 +#: glade/pytrainer.glade:7534 msgid "" "Distance\n" "Time\n" @@ -504,9 +466,9 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:5063 -#: glade/pytrainer.glade:6205 -#: glade/pytrainer.glade:7361 +#: glade/pytrainer.glade:5281 +#: glade/pytrainer.glade:6423 +#: glade/pytrainer.glade:7579 msgid "" "None\n" "Distance\n" @@ -522,713 +484,633 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:5132 +#: glade/pytrainer.glade:5350 msgid "Week" msgstr "Semana" -#: glade/pytrainer.glade:6060 +#: glade/pytrainer.glade:6278 msgid " <b>Month:</b>" msgstr "<b>Mes:</b>" -#: glade/pytrainer.glade:6275 +#: glade/pytrainer.glade:6493 msgid "Month" msgstr "Mes" -#: glade/pytrainer.glade:7216 +#: glade/pytrainer.glade:7434 msgid " <b>Year:</b>" msgstr "<b>Año:</b>" -#: glade/pytrainer.glade:7431 +#: glade/pytrainer.glade:7649 msgid "Year" msgstr "Año" -#: glade/pytrainer.glade:7474 +#: glade/pytrainer.glade:7692 msgid "label154" msgstr " " -#: glade/pytrainer.glade:7511 +#: glade/pytrainer.glade:7729 msgid "<b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:7556 +#: glade/pytrainer.glade:7774 msgid "Search" msgstr "Buscar" -#: glade/pytrainer.glade:7603 +#: glade/pytrainer.glade:7821 msgid "Columns" msgstr "Columnas" -#: glade/pytrainer.glade:7678 +#: glade/pytrainer.glade:7896 msgid "label155" msgstr " " -#: glade/pytrainer.glade:7812 +#: glade/pytrainer.glade:8030 msgid "Type:" msgstr "Tipo:" -#: glade/pytrainer.glade:7840 +#: glade/pytrainer.glade:8058 msgid "" "Font\n" "Restaurant\n" "Scenic Area\n" "Summit" msgstr "" +"Fuente\n" +"Restaurante\n" +"Mirador\n" +"Cumbre" -#: glade/pytrainer.glade:7861 +#: glade/pytrainer.glade:8079 msgid "Latitude: " msgstr "<b>Latitud:</b>" -#: glade/pytrainer.glade:7889 +#: glade/pytrainer.glade:8107 msgid " Name:" msgstr "Nombre:" -#: glade/pytrainer.glade:7917 +#: glade/pytrainer.glade:8135 msgid "Longitude:" msgstr "<b>Longitud:</b>" -#: glade/pytrainer.glade:7945 -#: glade/pytrainer.glade:13567 -#: glade/pytrainer.glade:13890 +#: glade/pytrainer.glade:8163 +#: glade/pytrainer.glade:9030 +#: glade/pytrainer.glade:9353 msgid "Description:" msgstr "<b>Descripción:</b>" -#: glade/pytrainer.glade:8065 +#: glade/pytrainer.glade:8283 msgid "<b> Waypoint: </b>" msgstr "<b> Waypoint: </b>" -#: glade/pytrainer.glade:8198 +#: glade/pytrainer.glade:8416 msgid "label162" msgstr " " -#: glade/pytrainer.glade:8338 +#: glade/pytrainer.glade:8556 msgid "label163" msgstr " " -#: glade/pytrainer.glade:8363 -msgid "New Entry" -msgstr "Nueva entrada" - -#: glade/pytrainer.glade:8436 -msgid "Title:" -msgstr "Título:" - -#: glade/pytrainer.glade:8485 -msgid "GPX File:" -msgstr "Archivo GPX" - -#: glade/pytrainer.glade:8555 -msgid "Calculate Values" -msgstr "Calcular valores" - -#: glade/pytrainer.glade:8574 -msgid "Sport:" -msgstr "Deporte:" - -#: glade/pytrainer.glade:8625 -msgid "<b>Main</b>" -msgstr "<b>Principal</b>" - -#: glade/pytrainer.glade:8686 -msgid "Distance (Km):" -msgstr "Distancia (Km):" - -#: glade/pytrainer.glade:8715 -#: glade/pytrainer.glade:8912 -#: glade/pytrainer.glade:9193 -#: glade/pytrainer.glade:9439 -#: glade/pytrainer.glade:9907 -#: glade/pytrainer.glade:12638 -msgid "Calculate" -msgstr "Calcular" - -#: glade/pytrainer.glade:8734 -msgid "Time:" -msgstr "Tiempo:" - -#: glade/pytrainer.glade:8932 -msgid "Date:" -msgstr "Fecha:" - -#: glade/pytrainer.glade:9052 -#: glade/pytrainer.glade:12688 -msgid "<b>General</b>" -msgstr "<b>General:</b>" - -#: glade/pytrainer.glade:9113 -msgid "Max (km/h):" -msgstr "Punta (Km/h)" - -#: glade/pytrainer.glade:9164 -msgid "Velocity (km/h)" -msgstr "Velocidad (km/h)" - -#: glade/pytrainer.glade:9239 -msgid "<b>Velocity</b>" -msgstr "<b>Velocidad</b>" - -#: glade/pytrainer.glade:9275 -msgid "Quick Entry" -msgstr "Nueva entrada" - -#: glade/pytrainer.glade:9335 -msgid "Max (min/km):" -msgstr "Max (min/km)" - -#: glade/pytrainer.glade:9387 -msgid "Pace (min/km):" -msgstr "Ritmo (min/km)" - -#: glade/pytrainer.glade:9462 -msgid "<b>Pace</b>" -msgstr "<b>Ritmo</b>" - -#: glade/pytrainer.glade:9523 -msgid "Ascent:" -msgstr "Ascenso:" - -#: glade/pytrainer.glade:9575 -msgid "Descent:" -msgstr "Descenso:" - -#: glade/pytrainer.glade:9630 -msgid "<b>Accumulated Altitude Change</b>" -msgstr "<b>Desnivel acumulado:</b>" - -#: glade/pytrainer.glade:9691 -msgid "Max (bpm):" -msgstr "Pulsaciones máximas" - -#: glade/pytrainer.glade:9720 -msgid "Heart rate:" -msgstr "Pulsaciones" - -#: glade/pytrainer.glade:9794 -#: pytrainer/gui/windowmain.py:681 -#: pytrainer/monthgraph.py:77 -#: pytrainer/yeargraph.py:78 -#: pytrainer/weekgraph.py:119 -msgid "Calories" -msgstr "Calorías" - -#: glade/pytrainer.glade:9845 -msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" -msgstr "<small><b>Nota:</a> para el cálculo de calorías es necesario introducir el valor de MET del deporte (en Preferencias -> Deporte)</small>" - -#: glade/pytrainer.glade:9962 -msgid "<b>Heart Rate</b>" -msgstr "<b>Pulsaciones</b>" - -#: glade/pytrainer.glade:9998 -msgid "Advanced" -msgstr "Avanzado" - -#: glade/pytrainer.glade:10095 -msgid "<b>Comments</b>" -msgstr "<b>Comentarios</b>" - -#: glade/pytrainer.glade:10124 -msgid "Comments" -msgstr "Comentarios" - -#: glade/pytrainer.glade:10229 -msgid "Preferences" -msgstr "Preferencias" - -#: glade/pytrainer.glade:10303 -msgid "Metric system" -msgstr "Sistema métrico" - -#: glade/pytrainer.glade:10325 -msgid "U.S. customary units" -msgstr "Sistema americano" - -#: glade/pytrainer.glade:10351 -msgid "<b>System of Measurement</b>" -msgstr "<b>Sistema de medida</b>" - -#: glade/pytrainer.glade:10411 -msgid "Database type:" -msgstr "Tipo de base de datos" - -#: glade/pytrainer.glade:10439 -msgid "Database host:" -msgstr "Servidor base de datos" - -#: glade/pytrainer.glade:10488 -msgid "Database name:" -msgstr "Nombre base de datos" - -#: glade/pytrainer.glade:10556 -msgid "Database user:" -msgstr "Usuario base de datos" - -#: glade/pytrainer.glade:10584 -msgid "Database pass:" -msgstr "Contraseña base de datos" - -#: glade/pytrainer.glade:10658 -msgid "<b>Database</b>" -msgstr "<b>Base de datos:</b>" - -#: glade/pytrainer.glade:10718 -msgid "Use this port for internal connections: " -msgstr "Use este puerto para conexiones internas" - -#: glade/pytrainer.glade:10769 -msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" -msgstr "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" - -#: glade/pytrainer.glade:10801 -msgid "<b>Port Connnection</b>" -msgstr "<b>Puerto de conexión:</b>" - -#: glade/pytrainer.glade:10837 -msgid "General" -msgstr "General" - -#: glade/pytrainer.glade:10890 -msgid "User name:" -msgstr "Nombre de usuario:" - -#: glade/pytrainer.glade:10918 -msgid "Gender:" -msgstr "Género:" - -#: glade/pytrainer.glade:10964 -msgid "Height:" -msgstr "Altura:" - -#: glade/pytrainer.glade:11035 -msgid "Date of birth:" -msgstr "Fecha de nacimiento:" - -#: glade/pytrainer.glade:11147 -msgid "Weight:" -msgstr "Peso:" - -#: glade/pytrainer.glade:11179 -msgid "<b>Athlete Details</b>" -msgstr "<b>Datos personales</b>" - -#: glade/pytrainer.glade:11208 -msgid "Athlete" -msgstr "Atleta" - -#: glade/pytrainer.glade:11391 -msgid "<b>Sport List</b>" -msgstr "<b>Lista de deportes:</b>" - -#: glade/pytrainer.glade:11420 -msgid "llist" -msgstr "" - -#: glade/pytrainer.glade:11500 -#: glade/pytrainer.glade:13511 -#: glade/pytrainer.glade:14002 -msgid "Name:" -msgstr "Nombre:" - -#: glade/pytrainer.glade:11528 -msgid "M.E.T.:" -msgstr "M.E.T.:" - -#: glade/pytrainer.glade:11577 -msgid "Extra Weight:" -msgstr "Peso extra:" - -#: glade/pytrainer.glade:11651 -#: glade/pytrainer.glade:12249 -msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" -msgstr "Más información sobre el coeficiente M.E.T. en Wikipedia" - -#: glade/pytrainer.glade:11755 -msgid "<b>Add New Sport</b>" -msgstr "<b>Añadir nuevo deporte</b>" - -#: glade/pytrainer.glade:11784 -msgid "new" -msgstr "nuevo" - -#: glade/pytrainer.glade:11844 -msgid "" -"Deleting a sport removes associated records.\n" -"Continue?" -msgstr "" -"Si borra un deporte elimina sus registros asociados.\n" -"¿Desea continuar?" - -#: glade/pytrainer.glade:11984 -msgid "<b>Delete Sport</b>" -msgstr "<b>Borrar deporte</b>" - -#: glade/pytrainer.glade:12044 -msgid "delete" -msgstr "borrar" - -#: glade/pytrainer.glade:12103 -msgid "Name" -msgstr "Nombre" - -#: glade/pytrainer.glade:12152 -msgid "M.E.T." -msgstr "M.E.T." - -#: glade/pytrainer.glade:12201 -#: pytrainer/gui/windowprofile.py:69 -msgid "Extra Weight" -msgstr "Peso extra" - -#: glade/pytrainer.glade:12359 -msgid "<b>Edit Sport</b>" -msgstr "<b>Editar deporte</b>" - -#: glade/pytrainer.glade:12383 -#, fuzzy -msgid "<b>lalaal</b>" -msgstr "<b>Base de datos:</b>" - -#: glade/pytrainer.glade:12419 -msgid "edit" -msgstr "editar" - -#: glade/pytrainer.glade:12448 -msgid "Sports" -msgstr "Deportes" - -#: glade/pytrainer.glade:12507 -msgid "Maximum heart rate:" -msgstr "Pulsaciones máximas:" - -#: glade/pytrainer.glade:12535 -msgid "Resting heart rate:" -msgstr "Pulsaciones en reposo:" - -#: glade/pytrainer.glade:12609 -msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" -msgstr "<small><b>Nota:</b> el número máximo de pulsaciones se calcula con la siguiente fórmula: 220 menos su edad. </small>" - -#: glade/pytrainer.glade:12748 -msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" -msgstr "<small><b>Nota:</b> rellene todos los campos relativos a pulsaciones si usa el método Karvonen</small>" - -#: glade/pytrainer.glade:12777 -msgid "Percentages based method" -msgstr "Basado en porcentajes" - -#: glade/pytrainer.glade:12799 -#: pytrainer/gui/windowmain.py:254 -msgid "Karvonen method" -msgstr "Karvonen" - -#: glade/pytrainer.glade:12821 -msgid "Select how to calculate your heart rate zones." -msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca" - -#: glade/pytrainer.glade:12853 -msgid "<b>Heart Rate Zones</b>" -msgstr "<b>Zonas de frecuencia cardiaca</b>" - -#: glade/pytrainer.glade:12889 -#: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:85 -#: pytrainer/heartrategraph.py:38 -msgid "Heart Rate" -msgstr "Pulsaciones" - -#: glade/pytrainer.glade:12994 +#: glade/pytrainer.glade:8581 msgid "Calendar" msgstr "Calendario" -#: glade/pytrainer.glade:13196 +#: glade/pytrainer.glade:8783 msgid "Edit Record" msgstr "Editar registro" -#: glade/pytrainer.glade:13217 +#: glade/pytrainer.glade:8804 msgid "Show graph in classic view" msgstr "Mostrar en vista clásica" -#: glade/pytrainer.glade:13253 -msgid "warning" -msgstr "advertencia" - -#: glade/pytrainer.glade:13455 +#: glade/pytrainer.glade:8918 msgid "<b>Extension Details</b>" msgstr "<b>Detalles de la extensión</b>" -#: glade/pytrainer.glade:13483 +#: glade/pytrainer.glade:8946 msgid "name-entry" msgstr "Nombre" -#: glade/pytrainer.glade:13539 -#: glade/pytrainer.glade:13946 +#: glade/pytrainer.glade:8974 +#: glade/pytrainer.glade:9465 +msgid "Name:" +msgstr "Nombre:" + +#: glade/pytrainer.glade:9002 +#: glade/pytrainer.glade:9409 msgid "Status:" msgstr "Estado:" -#: glade/pytrainer.glade:13595 -#: glade/pytrainer.glade:13918 +#: glade/pytrainer.glade:9058 +#: glade/pytrainer.glade:9381 msgid "status-entry" msgstr "Estado" -#: glade/pytrainer.glade:13623 +#: glade/pytrainer.glade:9086 msgid "description-entry" msgstr "Descripción" -#: glade/pytrainer.glade:13758 +#: glade/pytrainer.glade:9221 msgid "Plugins" msgstr "Plugins" -#: glade/pytrainer.glade:13833 +#: glade/pytrainer.glade:9296 msgid "<b>Plugin Details</b>" msgstr "<b>Detalles del plugin:</b>" -#: glade/pytrainer.glade:13862 +#: glade/pytrainer.glade:9325 msgid "description-entry " msgstr "Descripción" -#: glade/pytrainer.glade:13974 +#: glade/pytrainer.glade:9437 msgid "nameEntry" msgstr "Nombre entrada" -#: glade/pytrainer.glade:14145 +#: glade/pytrainer.glade:9608 msgid "Select track record" msgstr "Seleccione uno de los tracks" -#: pytrainer/main.py:394 +#: pytrainer/main.py:416 +#: build/lib/pytrainer/main.py:416 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: pytrainer/main.py:408 +#: pytrainer/main.py:430 +#: build/lib/pytrainer/main.py:430 msgid "Delete this waypoint?" msgstr "¿Borrar este waypoint?" -#: pytrainer/gui/windowprofile.py:51 -msgid "Male" -msgstr "Varón" - -#: pytrainer/gui/windowprofile.py:52 -msgid "Female" -msgstr "Mujer" - -#: pytrainer/gui/windowprofile.py:69 -msgid "MET" -msgstr "M.E.T." - -#: pytrainer/gui/windowplugins.py:70 -#: pytrainer/gui/windowplugins.py:97 -#: pytrainer/gui/windowextensions.py:70 -msgid "Enable" -msgstr "Activo" - -#: pytrainer/gui/windowplugins.py:72 -#: pytrainer/gui/windowplugins.py:96 -#: pytrainer/gui/windowextensions.py:72 -msgid "Disable" -msgstr "Desactivo" - -#: pytrainer/gui/windowplugins.py:81 -#: pytrainer/gui/windowextensions.py:81 -#, python-format -msgid "%s settings" -msgstr "%s opciones" - -#: pytrainer/gui/windowplugins.py:104 -msgid "Ok" -msgstr "Ok" - -#: pytrainer/gui/windowmain.py:57 -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:64 +#: build/lib/pytrainer/gui/windowmain.py:63 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:70 +#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:70 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:57 +#: build/lib/pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:63 +msgid "Start" +msgstr "Comienzo" + +#: build/lib/pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:63 msgid "Kilometer" msgstr "Kilómetros" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:674 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:712 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:712 msgid "Title" msgstr "Título" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:675 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:713 +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:713 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:676 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:714 +#: build/lib/pytrainer/gui/windowimportdata.py:255 +#: build/lib/pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:714 +#: pytrainer/gui/windowimportdata.py:255 #: pytrainer/extensions/googlemaps.py:91 msgid "Distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:678 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:716 +#: build/lib/pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:716 #: pytrainer/extensions/googlemaps.py:91 msgid "Time" msgstr "Tiempo" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:679 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:717 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:717 msgid "Beats" msgstr "Pulsaciones" -#: pytrainer/gui/windowmain.py:60 -#: pytrainer/gui/windowmain.py:680 +#: build/lib/pytrainer/gui/windowmain.py:66 +#: build/lib/pytrainer/gui/windowmain.py:718 +#: pytrainer/gui/windowmain.py:66 +#: pytrainer/gui/windowmain.py:718 msgid "Average" msgstr "Media" -#: pytrainer/gui/windowmain.py:64 +#: build/lib/pytrainer/gui/windowmain.py:70 +#: pytrainer/gui/windowmain.py:70 msgid "Waypoint" msgstr "Waypoint" -#: pytrainer/gui/windowmain.py:158 -#: pytrainer/gui/windowmain.py:267 -#: pytrainer/gui/windowmain.py:366 -#: pytrainer/gui/windowmain.py:444 +#: build/lib/pytrainer/gui/windowmain.py:168 +#: build/lib/pytrainer/gui/windowmain.py:304 +#: build/lib/pytrainer/gui/windowmain.py:404 +#: build/lib/pytrainer/gui/windowmain.py:482 +#: pytrainer/gui/windowmain.py:168 +#: pytrainer/gui/windowmain.py:304 +#: pytrainer/gui/windowmain.py:404 +#: pytrainer/gui/windowmain.py:482 msgid "miles" msgstr "millas" -#: pytrainer/gui/windowmain.py:159 -#: pytrainer/gui/windowmain.py:160 -#: pytrainer/gui/windowmain.py:268 -#: pytrainer/gui/windowmain.py:269 -#: pytrainer/gui/windowmain.py:367 -#: pytrainer/gui/windowmain.py:368 -#: pytrainer/gui/windowmain.py:445 -#: pytrainer/gui/windowmain.py:446 +#: build/lib/pytrainer/gui/windowmain.py:169 +#: build/lib/pytrainer/gui/windowmain.py:170 +#: build/lib/pytrainer/gui/windowmain.py:305 +#: build/lib/pytrainer/gui/windowmain.py:306 +#: build/lib/pytrainer/gui/windowmain.py:405 +#: build/lib/pytrainer/gui/windowmain.py:406 +#: build/lib/pytrainer/gui/windowmain.py:483 +#: build/lib/pytrainer/gui/windowmain.py:484 +#: pytrainer/gui/windowmain.py:169 +#: pytrainer/gui/windowmain.py:170 +#: pytrainer/gui/windowmain.py:305 +#: pytrainer/gui/windowmain.py:306 +#: pytrainer/gui/windowmain.py:405 +#: pytrainer/gui/windowmain.py:406 +#: pytrainer/gui/windowmain.py:483 +#: pytrainer/gui/windowmain.py:484 msgid "miles/h" -msgstr "" +msgstr "millas/h" -#: pytrainer/gui/windowmain.py:161 -#: pytrainer/gui/windowmain.py:162 -#: pytrainer/gui/windowmain.py:270 -#: pytrainer/gui/windowmain.py:271 -#: pytrainer/gui/windowmain.py:369 -#: pytrainer/gui/windowmain.py:370 -#: pytrainer/gui/windowmain.py:447 -#: pytrainer/gui/windowmain.py:448 +#: build/lib/pytrainer/gui/windowmain.py:171 +#: build/lib/pytrainer/gui/windowmain.py:172 +#: build/lib/pytrainer/gui/windowmain.py:307 +#: build/lib/pytrainer/gui/windowmain.py:308 +#: build/lib/pytrainer/gui/windowmain.py:407 +#: build/lib/pytrainer/gui/windowmain.py:408 +#: build/lib/pytrainer/gui/windowmain.py:485 +#: build/lib/pytrainer/gui/windowmain.py:486 +#: pytrainer/gui/windowmain.py:171 +#: pytrainer/gui/windowmain.py:172 +#: pytrainer/gui/windowmain.py:307 +#: pytrainer/gui/windowmain.py:308 +#: pytrainer/gui/windowmain.py:407 +#: pytrainer/gui/windowmain.py:408 +#: pytrainer/gui/windowmain.py:485 +#: pytrainer/gui/windowmain.py:486 msgid "min/mile" msgstr "min/milla" -#: pytrainer/gui/windowmain.py:163 -#: pytrainer/gui/windowmain.py:164 +#: build/lib/pytrainer/gui/windowmain.py:173 +#: build/lib/pytrainer/gui/windowmain.py:174 +#: pytrainer/gui/windowmain.py:173 +#: pytrainer/gui/windowmain.py:174 msgid "feet" msgstr "pies" -#: pytrainer/gui/windowmain.py:166 -#: pytrainer/gui/windowmain.py:273 -#: pytrainer/gui/windowmain.py:372 -#: pytrainer/gui/windowmain.py:450 +#: build/lib/pytrainer/gui/windowmain.py:176 +#: build/lib/pytrainer/gui/windowmain.py:310 +#: build/lib/pytrainer/gui/windowmain.py:410 +#: build/lib/pytrainer/gui/windowmain.py:488 +#: build/lib/pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:176 +#: pytrainer/gui/windowmain.py:310 +#: pytrainer/gui/windowmain.py:410 +#: pytrainer/gui/windowmain.py:488 #: pytrainer/extensions/googlemaps.py:91 msgid "km" msgstr "Km" -#: pytrainer/gui/windowmain.py:256 +#: build/lib/pytrainer/gui/windowmain.py:291 +#: pytrainer/gui/windowmain.py:291 +msgid "Karvonen method" +msgstr "Karvonen" + +#: build/lib/pytrainer/gui/windowmain.py:293 +#: pytrainer/gui/windowmain.py:293 msgid "Percentages method" msgstr "basado en porcentajes" -#: pytrainer/gui/dialogselecttrack.py:40 -msgid "Track Name" -msgstr "Nombre de la ruta" +#: build/lib/pytrainer/gui/windowmain.py:719 +#: build/lib/pytrainer/monthgraph.py:77 +#: build/lib/pytrainer/yeargraph.py:78 +#: build/lib/pytrainer/weekgraph.py:123 +#: pytrainer/gui/windowmain.py:719 +#: pytrainer/monthgraph.py:77 +#: pytrainer/yeargraph.py:78 +#: pytrainer/weekgraph.py:123 +msgid "Calories" +msgstr "Calorías" -#: pytrainer/gui/drawArea.py:142 +#: build/lib/pytrainer/gui/windowmain.py:1016 +#: pytrainer/gui/windowmain.py:1016 +msgid "lap" +msgstr "vuelta" + +#: build/lib/pytrainer/gui/windowmain.py:1022 +#: build/lib/pytrainer/gui/drawArea.py:143 +#: build/lib/pytrainer/extensions/googlemaps.py:89 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/drawArea.py:143 #: pytrainer/extensions/googlemaps.py:89 msgid "h" -msgstr "" +msgstr "h" -#: pytrainer/gui/drawArea.py:143 +#: build/lib/pytrainer/gui/windowmain.py:1022 +#: build/lib/pytrainer/gui/windowmain.py:1024 +#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/windowmain.py:1024 +msgid "s" +msgstr "s" + +#: build/lib/pytrainer/gui/windowimportdata.py:82 +#: pytrainer/gui/windowimportdata.py:82 +msgid "No file selected" +msgstr "Ningún fichero seleccionado" + +#: build/lib/pytrainer/gui/windowimportdata.py:189 +#: pytrainer/gui/windowimportdata.py:189 +msgid "GPS device found" +msgstr "Dispositivos GPS encontrado" + +#: build/lib/pytrainer/gui/windowimportdata.py:192 +#: pytrainer/gui/windowimportdata.py:192 +msgid "GPS device <b>not</b> found" +msgstr "Dispositivo GPS <b>no</b> encontrado" + +#: build/lib/pytrainer/gui/windowimportdata.py:199 +#: pytrainer/gui/windowimportdata.py:199 +msgid "This tool was not found on the system" +msgstr "No se ha encontrado esta herramienta en el sistema" + +#: build/lib/pytrainer/gui/windowimportdata.py:201 +#: pytrainer/gui/windowimportdata.py:201 +msgid " Homepage" +msgstr "Página de inicio" + +#: build/lib/pytrainer/gui/windowimportdata.py:255 +#: pytrainer/gui/windowimportdata.py:255 +msgid "Start Time" +msgstr "Hora de comienzo" + +#: build/lib/pytrainer/gui/windowimportdata.py:255 +#: pytrainer/gui/windowimportdata.py:255 +msgid "Duration" +msgstr "<b>Duración:</b>" + +#: build/lib/pytrainer/gui/windowimportdata.py:255 +#: pytrainer/gui/windowimportdata.py:255 +msgid "Notes" +msgstr "Notas" + +#: build/lib/pytrainer/gui/windowimportdata.py:404 +#: pytrainer/gui/windowimportdata.py:404 +#, python-format +msgid "Found file of type: %s" +msgstr "Tipo de fichero encontrado: %s" + +#: build/lib/pytrainer/gui/windowimportdata.py:413 +#: pytrainer/gui/windowimportdata.py:413 +msgid "Found in database" +msgstr "Encontrado en base de datos" + +#: build/lib/pytrainer/gui/windowimportdata.py:428 +#: pytrainer/gui/windowimportdata.py:428 +msgid "Unknown file type" +msgstr "Tipo de fichero desconocido" + +#: build/lib/pytrainer/gui/windowimportdata.py:430 +#: pytrainer/gui/windowimportdata.py:430 +msgid "File selected is of unknown or unsupported file type" +msgstr "Fichero seleccionado desconocido o no soportado" + +#: build/lib/pytrainer/gui/windowimportdata.py:457 +#: pytrainer/gui/windowimportdata.py:457 +msgid "Importing one activity" +msgstr "Importando una actividad" + +#: build/lib/pytrainer/gui/windowimportdata.py:458 +#: pytrainer/gui/windowimportdata.py:458 +msgid "Imported one activity" +msgstr "Una actividad importada" + +#: build/lib/pytrainer/gui/windowimportdata.py:460 +#: pytrainer/gui/windowimportdata.py:460 +#, python-format +msgid "Importing %d activities" +msgstr "Importando %d actividades" + +#: build/lib/pytrainer/gui/windowimportdata.py:461 +#: pytrainer/gui/windowimportdata.py:461 +#, python-format +msgid "Imported %d activities" +msgstr "Importadas %d actividades" + +#: build/lib/pytrainer/gui/windowimportdata.py:469 +#: pytrainer/gui/windowimportdata.py:469 +msgid "Import Success" +msgstr "Importación satisfactoria" + +#: build/lib/pytrainer/gui/drawArea.py:144 +#: build/lib/pytrainer/extensions/googlemaps.py:89 +#: pytrainer/gui/drawArea.py:144 #: pytrainer/extensions/googlemaps.py:89 msgid "min" msgstr "min" -#: pytrainer/gui/windowextensions.py:104 -#: pytrainer/gui/windowextensions.py:117 -msgid "OK" -msgstr "Ok" +#: build/lib/pytrainer/gui/windowprofile.py:51 +#: pytrainer/gui/windowprofile.py:51 +msgid "Male" +msgstr "Varón" -#: pytrainer/lib/gpx.py:90 -msgid "No Name" -msgstr "Sin nombre" +#: build/lib/pytrainer/gui/windowprofile.py:52 +#: pytrainer/gui/windowprofile.py:52 +msgid "Female" +msgstr "Mujer" -#: pytrainer/lib/gpx.py:97 -msgid "No Data" -msgstr "Sin datos" +#: build/lib/pytrainer/gui/windowprofile.py:69 +#: pytrainer/gui/windowprofile.py:69 +msgid "MET" +msgstr "M.E.T." -#: pytrainer/lib/heartrate.py:46 -msgid "Moderate activity" -msgstr "Actividad moderada" +#: build/lib/pytrainer/gui/windowprofile.py:69 +#: pytrainer/gui/windowprofile.py:69 +msgid "Extra Weight" +msgstr "Peso extra" -#: pytrainer/lib/heartrate.py:47 -msgid "Weight Control" -msgstr "Control de peso" +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 +#: pytrainer/gui/dialogselecttrack.py:40 +msgid "Track Name" +msgstr "Nombre de la ruta" -#: pytrainer/lib/heartrate.py:48 -msgid "Aerobic" -msgstr "Aeróbico" +#: build/lib/pytrainer/gui/windowextensions.py:70 +#: build/lib/pytrainer/gui/windowplugins.py:70 +#: build/lib/pytrainer/gui/windowplugins.py:97 +#: pytrainer/gui/windowextensions.py:70 +#: pytrainer/gui/windowplugins.py:70 +#: pytrainer/gui/windowplugins.py:97 +msgid "Enable" +msgstr "Activo" -#: pytrainer/lib/heartrate.py:49 -msgid "Anaerobic" -msgstr "Anaeróbico" +#: build/lib/pytrainer/gui/windowextensions.py:72 +#: build/lib/pytrainer/gui/windowplugins.py:72 +#: build/lib/pytrainer/gui/windowplugins.py:96 +#: pytrainer/gui/windowextensions.py:72 +#: pytrainer/gui/windowplugins.py:72 +#: pytrainer/gui/windowplugins.py:96 +msgid "Disable" +msgstr "Desactivo" -#: pytrainer/lib/heartrate.py:50 -msgid "VO2 MAX" -msgstr "VO2 máximo" +#: build/lib/pytrainer/gui/windowextensions.py:81 +#: build/lib/pytrainer/gui/windowplugins.py:81 +#: pytrainer/gui/windowextensions.py:81 +#: pytrainer/gui/windowplugins.py:81 +#, python-format +msgid "%s settings" +msgstr "%s opciones" +#: build/lib/pytrainer/gui/windowextensions.py:104 +#: build/lib/pytrainer/gui/windowextensions.py:117 +#: pytrainer/gui/windowextensions.py:104 +#: pytrainer/gui/windowextensions.py:117 +msgid "OK" +msgstr "Ok" + +#: build/lib/pytrainer/gui/windowplugins.py:104 +#: pytrainer/gui/windowplugins.py:104 +msgid "Ok" +msgstr "Ok" + +#: build/lib/pytrainer/recordgraph.py:93 +#: build/lib/pytrainer/recordgraph.py:95 +#: build/lib/pytrainer/recordgraph.py:97 +#: build/lib/pytrainer/recordgraph.py:99 +#: build/lib/pytrainer/recordgraph.py:101 +#: build/lib/pytrainer/monthgraph.py:69 +#: build/lib/pytrainer/heartrategraph.py:38 +#: build/lib/pytrainer/yeargraph.py:70 +#: build/lib/pytrainer/daygraph.py:52 +#: build/lib/pytrainer/daygraph.py:54 +#: build/lib/pytrainer/daygraph.py:56 +#: build/lib/pytrainer/weekgraph.py:115 +#: pytrainer/recordgraph.py:93 +#: pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:99 +#: pytrainer/recordgraph.py:101 +#: pytrainer/monthgraph.py:69 +#: pytrainer/heartrategraph.py:38 +#: pytrainer/yeargraph.py:70 #: pytrainer/daygraph.py:52 #: pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:79 -#: pytrainer/recordgraph.py:81 -#: pytrainer/recordgraph.py:83 -#: pytrainer/recordgraph.py:85 -#: pytrainer/heartrategraph.py:38 -#: pytrainer/monthgraph.py:69 -#: pytrainer/yeargraph.py:70 -#: pytrainer/weekgraph.py:111 +#: pytrainer/weekgraph.py:115 msgid "Distance (km)" msgstr "Distancia (Km)" +#: build/lib/pytrainer/recordgraph.py:93 +#: build/lib/pytrainer/daygraph.py:52 +#: pytrainer/recordgraph.py:93 #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:79 msgid "Height (m)" msgstr "Altura (m)" +#: build/lib/pytrainer/recordgraph.py:93 +#: build/lib/pytrainer/daygraph.py:52 +#: pytrainer/recordgraph.py:93 #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:79 msgid "Stage Profile" msgstr "Perfil de Etapa" -#: pytrainer/daygraph.py:54 -msgid "Velocity (Km/h)" -msgstr "Velocidad (km/h)" - -#: pytrainer/daygraph.py:54 -msgid "Velocity" -msgstr "Velocidad" - -#: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:85 -#: pytrainer/heartrategraph.py:38 -msgid "Beats (bpm)" -msgstr "Media pulsaciones (ppm)" - -#: pytrainer/recordgraph.py:81 +#: build/lib/pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:95 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" -#: pytrainer/recordgraph.py:81 +#: build/lib/pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:95 msgid "Speed" msgstr "Velocidad" -#: pytrainer/recordgraph.py:83 +#: build/lib/pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:97 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" -#: pytrainer/recordgraph.py:83 +#: build/lib/pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:97 msgid "Pace" msgstr "Ritmo" +#: build/lib/pytrainer/recordgraph.py:99 +#: build/lib/pytrainer/heartrategraph.py:38 +#: build/lib/pytrainer/daygraph.py:56 +#: pytrainer/recordgraph.py:99 +#: pytrainer/heartrategraph.py:38 +#: pytrainer/daygraph.py:56 +msgid "Beats (bpm)" +msgstr "Media pulsaciones (ppm)" + +#: build/lib/pytrainer/recordgraph.py:99 +#: build/lib/pytrainer/heartrategraph.py:38 +#: build/lib/pytrainer/daygraph.py:56 +#: pytrainer/recordgraph.py:99 +#: pytrainer/heartrategraph.py:38 +#: pytrainer/daygraph.py:56 +msgid "Heart Rate" +msgstr "Pulsaciones" + +#: build/lib/pytrainer/recordgraph.py:101 +#: pytrainer/recordgraph.py:101 +msgid "Cadence (rpm)" +msgstr "Cadencia (rpm)" + +#: build/lib/pytrainer/recordgraph.py:101 +#: pytrainer/recordgraph.py:101 +msgid "Cadence" +msgstr "Cadence" + +#: build/lib/pytrainer/lib/gpx.py:93 +#: pytrainer/lib/gpx.py:93 +msgid "No Name" +msgstr "Sin nombre" + +#: build/lib/pytrainer/lib/gpx.py:100 +#: pytrainer/lib/gpx.py:100 +msgid "No Data" +msgstr "Sin datos" + +#: build/lib/pytrainer/lib/heartrate.py:46 +#: pytrainer/lib/heartrate.py:46 +msgid "Moderate activity" +msgstr "Actividad moderada" + +#: build/lib/pytrainer/lib/heartrate.py:47 +#: pytrainer/lib/heartrate.py:47 +msgid "Weight Control" +msgstr "Control de peso" + +#: build/lib/pytrainer/lib/heartrate.py:48 +#: pytrainer/lib/heartrate.py:48 +msgid "Aerobic" +msgstr "Aeróbico" + +#: build/lib/pytrainer/lib/heartrate.py:49 +#: pytrainer/lib/heartrate.py:49 +msgid "Anaerobic" +msgstr "Anaeróbico" + +#: build/lib/pytrainer/lib/heartrate.py:50 +#: pytrainer/lib/heartrate.py:50 +msgid "VO2 MAX" +msgstr "VO2 máximo" + +#: build/lib/pytrainer/monthgraph.py:69 +#: build/lib/pytrainer/monthgraph.py:71 +#: build/lib/pytrainer/monthgraph.py:73 +#: build/lib/pytrainer/monthgraph.py:75 +#: build/lib/pytrainer/monthgraph.py:77 #: pytrainer/monthgraph.py:69 #: pytrainer/monthgraph.py:71 #: pytrainer/monthgraph.py:73 @@ -1237,57 +1119,83 @@ msgid "day" msgstr "día" +#: build/lib/pytrainer/monthgraph.py:69 +#: build/lib/pytrainer/weekgraph.py:115 #: pytrainer/monthgraph.py:69 -#: pytrainer/weekgraph.py:111 +#: pytrainer/weekgraph.py:115 msgid "Daily Distance" msgstr "Distancia" +#: build/lib/pytrainer/monthgraph.py:71 +#: build/lib/pytrainer/yeargraph.py:72 +#: build/lib/pytrainer/weekgraph.py:117 #: pytrainer/monthgraph.py:71 #: pytrainer/yeargraph.py:72 -#: pytrainer/weekgraph.py:113 +#: pytrainer/weekgraph.py:117 msgid "Time (hours)" msgstr "Tiempo en horas" +#: build/lib/pytrainer/monthgraph.py:71 +#: build/lib/pytrainer/weekgraph.py:117 #: pytrainer/monthgraph.py:71 -#: pytrainer/weekgraph.py:113 +#: pytrainer/weekgraph.py:117 msgid "Daily Time" msgstr "Tiempo diario" +#: build/lib/pytrainer/monthgraph.py:73 +#: build/lib/pytrainer/yeargraph.py:74 +#: build/lib/pytrainer/weekgraph.py:119 #: pytrainer/monthgraph.py:73 #: pytrainer/yeargraph.py:74 -#: pytrainer/weekgraph.py:115 +#: pytrainer/weekgraph.py:119 msgid "Average Heart Rate (bpm)" msgstr "Pulsaciones medias (ppm)" +#: build/lib/pytrainer/monthgraph.py:73 +#: build/lib/pytrainer/weekgraph.py:119 #: pytrainer/monthgraph.py:73 -#: pytrainer/weekgraph.py:115 +#: pytrainer/weekgraph.py:119 msgid "Daily Average Heart Rate" msgstr "Pulsaciones diarias" +#: build/lib/pytrainer/monthgraph.py:75 +#: build/lib/pytrainer/yeargraph.py:76 +#: build/lib/pytrainer/weekgraph.py:121 #: pytrainer/monthgraph.py:75 #: pytrainer/yeargraph.py:76 -#: pytrainer/weekgraph.py:117 +#: pytrainer/weekgraph.py:121 msgid "Average Speed (km/h)" msgstr "Velocidad media (km/h)" +#: build/lib/pytrainer/monthgraph.py:75 +#: build/lib/pytrainer/weekgraph.py:121 #: pytrainer/monthgraph.py:75 -#: pytrainer/weekgraph.py:117 +#: pytrainer/weekgraph.py:121 msgid "Daily Average Speed" msgstr "medias diarias" +#: build/lib/pytrainer/monthgraph.py:77 +#: build/lib/pytrainer/weekgraph.py:123 #: pytrainer/monthgraph.py:77 -#: pytrainer/weekgraph.py:119 +#: pytrainer/weekgraph.py:123 msgid "Daily Calories" msgstr "Calorías diarias" -#: pytrainer/waypoint.py:80 -msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" -msgstr "Parece que el archivo gpx contiene salidas de varios dias. Probablementenecesitarás editar tu archivo gpx" +#: build/lib/pytrainer/record.py:61 +#: pytrainer/record.py:61 +msgid "Edit Entry" +msgstr "Editar entrada" -#: pytrainer/record.py:368 +#: build/lib/pytrainer/record.py:373 +#: pytrainer/record.py:373 msgid "pyTrainer cant import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" +#: build/lib/pytrainer/yeargraph.py:70 +#: build/lib/pytrainer/yeargraph.py:72 +#: build/lib/pytrainer/yeargraph.py:74 +#: build/lib/pytrainer/yeargraph.py:76 +#: build/lib/pytrainer/yeargraph.py:78 #: pytrainer/yeargraph.py:70 #: pytrainer/yeargraph.py:72 #: pytrainer/yeargraph.py:74 @@ -1296,28 +1204,244 @@ msgid "month" msgstr "mes" +#: build/lib/pytrainer/yeargraph.py:70 #: pytrainer/yeargraph.py:70 msgid "Monthly Distance" msgstr "Distancia" +#: build/lib/pytrainer/yeargraph.py:72 #: pytrainer/yeargraph.py:72 msgid "Monthly Time" msgstr "Tiempo mensual" +#: build/lib/pytrainer/yeargraph.py:74 #: pytrainer/yeargraph.py:74 msgid "Monthly Average Heart Rate" msgstr "Pulsaciones medias mensuales" +#: build/lib/pytrainer/yeargraph.py:76 #: pytrainer/yeargraph.py:76 msgid "Monthly Average Speed" msgstr "medias mensuales" +#: build/lib/pytrainer/yeargraph.py:78 #: pytrainer/yeargraph.py:78 msgid "Monthly Calories" msgstr "Calorías mensuales" -#~ msgid "None" -#~ msgstr "Ninguno" +#: build/lib/pytrainer/waypoint.py:80 +#: pytrainer/waypoint.py:80 +msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" +msgstr "Parece que el archivo gpx contiene salidas de varios dias. Probablementenecesitarás editar tu archivo gpx" + +#: build/lib/pytrainer/daygraph.py:54 +#: pytrainer/daygraph.py:54 +msgid "Velocity (Km/h)" +msgstr "Velocidad (km/h)" + +#: build/lib/pytrainer/daygraph.py:54 +#: pytrainer/daygraph.py:54 +msgid "Velocity" +msgstr "Velocidad" + +#: import/file_gpxplus.py:45 +msgid "GPS eXchange file" +msgstr "Fichero de intercambio GPS" + +#: import/file_garmintcxv1.py:46 +msgid "Garmin training center database file version 1" +msgstr "Versión 1 del fichero Garmin training center database" + +#: import/tool_gpsbabel.py:38 +msgid "GPSBabel" +msgstr "GPSBabel" + +#: import/tool_garmintools.py:38 +msgid "Garmintools" +msgstr "Garmintools" + +#: import/tool_gant.py:38 +msgid "Gant" +msgstr "Gant" + +#: import/file_garmintools.py:45 +msgid "Garmin tools dump file" +msgstr "Fichero de volcado de datos de Garmintools" + +#: import/file_garmintcxv2.py:45 +msgid "Garmin training center database file version 2" +msgstr "Versión 2 del fichero Garmin training center database" + +#~ msgid " " +#~ msgstr " " +#~ msgid " " +#~ msgstr " " +#~ msgid "<b>Time:</b>" +#~ msgstr "<b>Tiempo:</b>" +#~ msgid "New Entry" +#~ msgstr "Nueva entrada" +#~ msgid "Title:" +#~ msgstr "Título:" +#~ msgid "GPX File:" +#~ msgstr "Archivo GPX" +#~ msgid "Calculate Values" +#~ msgstr "Calcular valores" +#~ msgid "Sport:" +#~ msgstr "Deporte:" +#~ msgid "<b>Main</b>" +#~ msgstr "<b>Principal</b>" +#~ msgid "Distance (Km):" +#~ msgstr "Distancia (Km):" +#~ msgid "Calculate" +#~ msgstr "Calcular" +#~ msgid "Time:" +#~ msgstr "Tiempo:" +#~ msgid "Date:" +#~ msgstr "Fecha:" +#~ msgid "<b>General</b>" +#~ msgstr "<b>General:</b>" +#~ msgid "Max (km/h):" +#~ msgstr "Punta (Km/h)" +#~ msgid "Velocity (km/h)" +#~ msgstr "Velocidad (km/h)" +#~ msgid "<b>Velocity</b>" +#~ msgstr "<b>Velocidad</b>" +#~ msgid "Max (min/km):" +#~ msgstr "Max (min/km)" +#~ msgid "Pace (min/km):" +#~ msgstr "Ritmo (min/km)" +#~ msgid "<b>Pace</b>" +#~ msgstr "<b>Ritmo</b>" +#~ msgid "Ascent:" +#~ msgstr "Ascenso:" +#~ msgid "Descent:" +#~ msgstr "Descenso:" +#~ msgid "<b>Accumulated Altitude Change</b>" +#~ msgstr "<b>Desnivel acumulado:</b>" +#~ msgid "Max (bpm):" +#~ msgstr "Pulsaciones máximas" +#~ msgid "Heart rate:" +#~ msgstr "Pulsaciones" +#~ msgid "" +#~ "<small><b>Note:</b> In order to calculate the calories you must set the " +#~ "sport MET (in Preferences->Sport) </small>" +#~ msgstr "" +#~ "<small><b>Nota:</a> para el cálculo de calorías es necesario introducir " +#~ "el valor de MET del deporte (en Preferencias -> Deporte)</small>" +#~ msgid "<b>Heart Rate</b>" +#~ msgstr "<b>Pulsaciones</b>" +#~ msgid "Advanced" +#~ msgstr "Avanzado" +#~ msgid "<b>Comments</b>" +#~ msgstr "<b>Comentarios</b>" +#~ msgid "Comments" +#~ msgstr "Comentarios" +#~ msgid "Preferences" +#~ msgstr "Preferencias" +#~ msgid "Metric system" +#~ msgstr "Sistema métrico" +#~ msgid "U.S. customary units" +#~ msgstr "Sistema americano" +#~ msgid "<b>System of Measurement</b>" +#~ msgstr "<b>Sistema de medida</b>" +#~ msgid "Database type:" +#~ msgstr "Tipo de base de datos" +#~ msgid "Database host:" +#~ msgstr "Servidor base de datos" +#~ msgid "Database name:" +#~ msgstr "Nombre base de datos" +#~ msgid "Database user:" +#~ msgstr "Usuario base de datos" +#~ msgid "Database pass:" +#~ msgstr "Contraseña base de datos" +#~ msgid "<b>Database</b>" +#~ msgstr "<b>Base de datos:</b>" +#~ msgid "Use this port for internal connections: " +#~ msgstr "Use este puerto para conexiones internas" +#~ msgid "" +#~ "<small><b>Note:</b> Change this only if you know what you are doing</" +#~ "small>" +#~ msgstr "" +#~ "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" +#~ msgid "<b>Port Connnection</b>" +#~ msgstr "<b>Puerto de conexión:</b>" +#~ msgid "General" +#~ msgstr "General" +#~ msgid "User name:" +#~ msgstr "Nombre de usuario:" +#~ msgid "Gender:" +#~ msgstr "Género:" +#~ msgid "Height:" +#~ msgstr "Altura:" +#~ msgid "Date of birth:" +#~ msgstr "Fecha de nacimiento:" +#~ msgid "Weight:" +#~ msgstr "Peso:" +#~ msgid "<b>Athlete Details</b>" +#~ msgstr "<b>Datos personales</b>" +#~ msgid "Athlete" +#~ msgstr "Atleta" +#~ msgid "<b>Sport List</b>" +#~ msgstr "<b>Lista de deportes:</b>" +#~ msgid "M.E.T.:" +#~ msgstr "M.E.T.:" +#~ msgid "Extra Weight:" +#~ msgstr "Peso extra:" +#~ msgid "" +#~ "More information on determining yor M.E.T sport coefficient on Wikipedia" +#~ msgstr "Más información sobre el coeficiente M.E.T. en Wikipedia" +#~ msgid "<b>Add New Sport</b>" +#~ msgstr "<b>Añadir nuevo deporte</b>" +#~ msgid "new" +#~ msgstr "nuevo" +#~ msgid "" +#~ "Deleting a sport removes associated records.\n" +#~ "Continue?" +#~ msgstr "" +#~ "Si borra un deporte elimina sus registros asociados.\n" +#~ "¿Desea continuar?" +#~ msgid "<b>Delete Sport</b>" +#~ msgstr "<b>Borrar deporte</b>" +#~ msgid "delete" +#~ msgstr "borrar" +#~ msgid "Name" +#~ msgstr "Nombre" +#~ msgid "M.E.T." +#~ msgstr "M.E.T." +#~ msgid "<b>Edit Sport</b>" +#~ msgstr "<b>Editar deporte</b>" + +#, fuzzy +#~ msgid "<b>lalaal</b>" +#~ msgstr "<b>Base de datos:</b>" +#~ msgid "edit" +#~ msgstr "editar" +#~ msgid "Sports" +#~ msgstr "Deportes" +#~ msgid "Maximum heart rate:" +#~ msgstr "Pulsaciones máximas:" +#~ msgid "Resting heart rate:" +#~ msgstr "Pulsaciones en reposo:" +#~ msgid "" +#~ "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the " +#~ "number 220 minus your age. </small>" +#~ msgstr "" +#~ "<small><b>Nota:</b> el número máximo de pulsaciones se calcula con la " +#~ "siguiente fórmula: 220 menos su edad. </small>" +#~ msgid "" +#~ "<small><b>NOTE:</b> in order to use the Karvonen method you must cover " +#~ "the Resting hr field.</small>" +#~ msgstr "" +#~ "<small><b>Nota:</b> rellene todos los campos relativos a pulsaciones si " +#~ "usa el método Karvonen</small>" +#~ msgid "Percentages based method" +#~ msgstr "Basado en porcentajes" +#~ msgid "Select how to calculate your heart rate zones." +#~ msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca" +#~ msgid "<b>Heart Rate Zones</b>" +#~ msgstr "<b>Zonas de frecuencia cardiaca</b>" +#~ msgid "warning" +#~ msgstr "advertencia" #~ msgid "January" #~ msgstr "Enero" #~ msgid "Febrary" This was sent by the SourceForge.net collaborative development platform, ... [truncated message content] |