[Pkg-running-devel] [SCM] Debian package for pytrainer branch, master, updated. debian/1.8.0-4-1-g5847b98

Christian PERRIER bubulle at debian.org
Sat Nov 26 17:14:17 UTC 2011


The following commit has been merged in the master branch:
commit 5847b984b08c7b847140c4e2bf3fb1f0e33e3888
Author: Christian PERRIER <bubulle at debian.org>
Date:   Tue Nov 15 07:48:08 2011 +0100

    Merge upstream 1.9.0

diff --git a/CHANGES b/CHANGES
index 487aeca..b10fbad 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,69 @@
 See the pytrainer roadmap for more information http://sourceforge.net/apps/trac/pytrainer/roadmap
 
-- PyTrainer changes for 1.8.0:
+- pytrainer changes for 1.9.0:
+
+* Known issues
+
+    - Can't maximize main window. Issue related to graph subtab in register tab - tickets #113 #124
+
+* New functionality or improvement
+
+    - Updated DE localization. Thanks to Erik Pfannenstein from Debian DE group and Andreas Mair - [923] [927]
+    - Added portuguese localization (thanks to Pedro Ribeiro) - [896]
+    - Option added in localization script (utils/translator.sh) to generate only .pot file - [888 - 892] 
+    - Galician localization (thanks to Kaptan) - [885 - 887] [893]
+    - Manpage for pytrainer - #125 [872] [874]
+    - Create sport service - #138 [838] [840 - 845] [850] [850 - 856] [875] [880]
+    - Provide means to run all unit tests - #139 [837]
+    - Discrete version migration - #132 [815 - 836] [839] [864] [865] [899 - 906] [911]
+    - Totals tab - #60 [766] [800] [801] [802] [803]
+    - Display projected times in record view, including ranking - #116 [782] [785] [811]
+    - Ascent and descent figures shown in all views. Added time spent moving and paused in record view (thanks to Friso) - #114 [781]
+    - Assign graph color to sports - #111 [780]
+    - Display laps information on record summary page - #109 #122 [768 - 772] [775] [777] [778] [788] [812] [813]
+    - Coloring Google Maps path by speed/pace - thanks to Jonathan - #107 [765] 
+    - Added swedish localization (thanks to Per) - #98 [756 - 760]
+    - Added startup option for choosing console or file logging. When "console" is chosen all logging messsages are sent to stdout instead of a log file. [755]
+
+* Fixes
+
+    - Syncing calculations of distance, time, speed and pace. Normalized pace format - #71 #152 [916] [918 - 919] [922] [924] [928]
+    - pytrainer quits when exporting activities in csv format [912]
+    - Importing TCXv2 files failed - [907 - 909]
+    - Date value was not saved in "Athlete" tab - #149 [898]
+    - Fixed encoding issue that prevented some days of the week and associated information to be shown in stacked bars graph under week tab [897]
+    - Cannot edit record created from GPX import with null sport reference - #147 [881]
+    - pytrainer crashes when closing edit record dialog - #146 [879]
+    - Added zero padding to overcome lap order issue - #145 [878]
+    - Updated french localization - thanks to Vincent, Pierr [876] [895]
+    - Heartrate figures from profile are retrieved independently so only those which fail are set to default value [873]
+    - Active/Rest times are not calculated for activities with only one lap - [811]
+    - Activity's data (equipment and title) missing when importing activity from file - #105 #137 [866 - 868]
+    - Wrong duration calculation when breaks are present - #103 [858 - 862]
+    - GUI problems when resizing - #113 [857] [877] [882]
+    - GPX file import fails - #141 [849]
+    - Enabling localization for some labels - #99 [846] [847]
+    - Broken MySQL support - #130 [810] [817] [818]
+    - Moving from GtkMozEmbed to WebKit - thanks to Christian - #131 [809]
+    - Support US units and display units in analytics view - [808]
+    - Start time can be changed in manually entered activities - #127 [807]
+    - Sort records in record tree view by time by default - #128 [806]
+    - Graphical improvements - [795] [796] [797] [798] [799] [805]
+    - Improved OSM performance through caching and also anonymize sensitive date before upload - [790] [791] [792]
+    - Failed to build stacked bars graphic in week, month and year tabs - #123 [789]
+    - Changed the way OS is checked to allow pytrainer run on other POSIX in addition to GNU/LINUX - thanks to Christian - #120 [784]
+    - Renaming danish suffix in po file to avoid confusion - #119 [783]
+    - Try using Google Maps Elevation API if all else fails - #102 [779]
+    - Updated ES localization [773] [774] [776] [804] [848] [863] [883]
+    - Better management of wrong/corrupted data - #118 [767] [786] [787] - [793] [794]
+    - Elevation correction extension not handling properly errors #102 [764]
+    - Equipment management fixes - #95 [763] #96 [762]
+    - Distance data is retrieved from laps if present, calculated from trackpoints otherwise - #101 [761]
+    - Remove non iso-8859-1 characters [754]
+    - Fix so only once instance of preferences dialog can be open at a time - #74 [753]
+
+
+- pytrainer changes for 1.8.0:
 
 * New functionality
     - Equipment management (thx to Nathan) [571] [572] [573] [598] [678] [679] [680] [685] [698] [699] [707] [708] [711] [717] [718] #12
@@ -65,7 +128,7 @@ See the pytrainer roadmap for more information http://sourceforge.net/apps/trac/
     - Update DB check to ensure time == duration [736]
     - Updating credits [740] [743] 
 
-- PyTrainer changes for 1.7.2:
+- pytrainer changes for 1.7.2:
 
     * Lap DB table created and code changed to populate and use the table [507] [508] [509]
     * Moved some global variables to class variables in main.py [513]
@@ -98,7 +161,7 @@ See the pytrainer roadmap for more information http://sourceforge.net/apps/trac/
     - plugins tab added - provides alternative way of viewing and running import plugins [512]
     - device import NOT functional 
 
-- PyTrainer changes for 1.7.1:
+- pytrainer changes for 1.7.1:
 
     * New import plugin - Garmintools - svn [430], [431], [436], [452], [453], [459], [460], [461], [463], [464], [486], [487], [488]
     - both file (dump file) and device import implemented
@@ -131,7 +194,7 @@ See the pytrainer roadmap for more information http://sourceforge.net/apps/trac/
     - file import functional
     - device import NOT functional 
 
-- PyTrainer changes for 1.7.0:
+- pytrainer changes for 1.7.0:
 
 Updated Spanish translation (svn rev 420,423,424)
 Updated French translation (svn rev 421)
@@ -151,7 +214,7 @@ Improving import from TCXv1 format (svn rev 354,371,375,376)
 Several improvements in plugins handling (svn rev 350,353,360,378,422)
 Import GPX files (svn rev 349)
 
-- PyTrainer tasks for 1.6.0.9:
+- pytrainer tasks for 1.6.0.9:
 
 Added dynamic loading and unloading of plugin menu items (svn rev 344)
 Removal of decommissioned plugin (garmin301) and addition of new ones (garmingpx). Update of project data (version and url) (svn rev 343)
@@ -162,7 +225,7 @@ Major improvements in graphs (thanks to Fiz) (svn revs 339, 336, 332, 331)
 Updated german translation - bug ID: 2811507 (thanks to Noèl) (svn revs 338, 333)
 Minor project and license information updated (svn revs 337, 335, 334, 329)
 
-- PyTrainer tasks for 1.6.0.8:
+- pytrainer tasks for 1.6.0.8:
 
 Rotating log file support added (rev 322, http://sourceforge.net/tracker/?func=detail&aid=2717142&group_id=213157&atid=1024595)
 Translations reviewed and added script to facilitate them (rev 319-321,323)
@@ -171,7 +234,7 @@ Changed potential problems when dealing with date objects using MySQL as DB (rev
 Removing redundant calls improving graphical performance (rev 310, linked to http://sourceforge.net/tracker/?func=detail&aid=2717135&group_id=213157&atid=1024592, not yet fully fixed)
 Optimizing xml files parsing when retrieving data from them (rev 309)
 
-- PyTrainer tasks for 1.6.0.7:
+- pytrainer tasks for 1.6.0.7:
 
 Removing pytrainer gui minimal window size (svn rev 304)
 Ordered shutdown of logging stuff (svn rev 303)
@@ -185,7 +248,7 @@ Fixed bug where track record was supposed to be updated in database. Type cast w
 Bug #2100647 - Quick entry doesn't work if no gpx file - Fixed (svn rev. 287)
 FR #2126411 - Package python-sqlite2 not needed anymore: http://www.python.org/doc/2.5.2/lib/module-sqlite3.html (svn rev. 286)
 
-- PyTrainer tasks for 1.6.0.6:
+- pytrainer tasks for 1.6.0.6:
 
 Close button in "About" dialog now works. Migrating from Glade to GTKBuilder
 Fixed some properties in pytrainer.desktop (ID#2126616)
@@ -193,30 +256,30 @@ Added COPYING file with GPLv2 (ID#2126413)
 Removal of garmin301 plugin
 Fixed some issues with MySql tables creation (email from Jonas Liljenfeldt)
 
-- PyTrainer tasks for 1.6.0.5:
+- pytrainer tasks for 1.6.0.5:
 
 mozpytrainer launch script with log level support -> DONE (24.08.2008)
 MET and extra weight values swapped when adding a new sport -> DONE (22.08.2008)
-PyTrainer crashes when adding an activity which sport is not yet in DB -> DONE (31.08.2008) 
+pytrainer crashes when adding an activity which sport is not yet in DB -> DONE (31.08.2008) 
 Should be enough to check timestamps when adding new activities -> DONE (31.08.2008)
 Correct initialization of pace and maxpace values -> DONE (31.08.2008)
 
-- PyTrainer tasks for 1.6.0.4:
+- pytrainer tasks for 1.6.0.4:
 
 Added support for date_time_utc field when importing new tracks via file upload
 pytrainer/profile.py: fixed logging issue when removing sport from database
 
-- PyTrainer tasks for 1.6.0.3:
+- pytrainer tasks for 1.6.0.3:
 
 Complete review of migration scripts. Special attention to ~/.pytrainer/conf.xml file -> DONE (31.07.2008)
 Number output always with two figures to avoid confusion -> DONE (02.08.2008)
 
-- PyTrainer tasks for 1.6.0.2:
+- pytrainer tasks for 1.6.0.2:
 
 Check paces in DB (maxspeed<->maxpace | average<->pace) -> DONE (19.07.2008)
 Error when updating records because of new date_time_utc field in DB -> FIXED (20.07.2008)
 
-- PyTrainer tasks for 1.6.0.1:
+- pytrainer tasks for 1.6.0.1:
 
 Adjust migration scripts
 	Sports saved in ddbb (new column in table sports) -> id_sports in table sports (nothing to do)
diff --git a/INSTALL b/INSTALL
index ff43762..92a3508 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,33 +1,39 @@
-PyTrainer basic installation
+pytrainer basic installation
 ===========================
 
 These are generic installation instructions to use with *.tar.gz files
 
 1.- Dependency Overview
 
-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.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
-SOAPpy-0.11.6
-python-lxml-2.2.3
-libxml2-python-2.7.6
-libxml2-2.7.6
-libxslt-python-1.1.26
-libxslt-1.1.26
-sqlite-3.6.20 (sqlite is preferred as db than mysql)
-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)
-garmintools-0.10 ("Garmin via garmintools" aka garmintools_full)
+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
+
+python >= 2.5 (python >= 3.0 not checked on 2011/11!)
+distutils >= 2.5 (python-devel, to run installation from tarball)
+dateutil >= 1.5 (python-dateutil)
+GTK+ >= 2.6.0
+PyGTK >= 2.6.0
+libglade >= 2.6.4 (libglade, pygtk2-libglade)
+pywebkitgtk >= 1.1.8 (see ticket #131)
+matplotlib >= 0.99.x (python-matplotlib)
+python-lxml >= 2.2
+libxml2 >= 2.7.8
+libxml2-python >= 2.7.8
+libxslt >= 1.1.26
+libxslt-python >= 1.1.26
+sqlite >= 3.2.0 (sqlite is preferred to mysql as database, MySQL-python has been reported to be installed if so)
+sqlalchemy >= 0.6.4
+sqlalchemy-migrate >= 0.6.0
+zenity >= 2.30
+
+- Only needed if correspondent plugin or extension is enabled:
+gpsbabel == 1.3.5 ("GoogleEarth" and "Garmin via GPSBabel 1.3.5" aka "garmin_hr")
+garmintools >= 0.10 ("Import from Garmin GPS device (via garmintools)" aka "garmintools_full" plugin)
+wordpresslib (already distributed within pytrainer tarball, wordpress extension)
+httplib2 >= 0.6.0 (wordpress extension)
+SOAPpy >= 0.11.6 (dotclear extension)
+GDAL (Elevation correction, via "gdal-python" or "python-gdal")
 
 2.- Installation process
 
@@ -42,4 +48,4 @@ For more information about the process, please check http://docs.python.org/dist
 
 3.- USB access
 
-Currently PyTrainer is using gpsbabel (http://www.gpsbabel.org) to retrieve information from the Garmin device. There are some problems regarding driver to access usb ports, please take a look at http://www.gpsbabel.org/os/Linux_Hotplug.html
+pytrainer can use gpsbabel (http://www.gpsbabel.org) to retrieve information from Garmin devices. There are some problems regarding driver to access usb ports, please take a look at http://www.gpsbabel.org/os/Linux_Hotplug.html
diff --git a/bin/pytrainer b/bin/pytrainer
index 71c8ad2..a28cf62 100755
--- a/bin/pytrainer
+++ b/bin/pytrainer
@@ -95,25 +95,6 @@ gettext.install("pytrainer", gettext_path, unicode=1)
 sys.path.insert(0, site_path)
 from pytrainer.main import pyTrainer
 
-#Determine xulrunner location
-xulrunners = glob.glob("/usr/li*/xulrunner*/xulrunner")
-if len(xulrunners) == 0:
-    #Didnt find any - fall back to old approach
-    xul_env = commands.getstatusoutput("find /usr/li* -name xulrunner -exec dirname {} \; 2>/dev/null")[1]
-elif len(xulrunners) == 1:
-    #Found just one location - use that
-    xul_env = os.path.dirname(xulrunners[0])
-else:
-    #Found more than one - need to choose one...
-    max_version = None
-    for item in xulrunners:
-        xul_dir = os.path.dirname(item)
-        max_version = _max(max_version, xul_dir)
-    xul_env = max_version
-
-print "Using xulrunner dir: %s" % xul_env
-os.environ['MOZILLA_FIVE_HOME'] = xul_env
-
 def main():
     pytrainer = pyTrainer(None, data_path)
 
diff --git a/extensions/fixelevation/fixelevation.py b/extensions/fixelevation/fixelevation.py
index b47f7c2..66f3a7d 100644
--- a/extensions/fixelevation/fixelevation.py
+++ b/extensions/fixelevation/fixelevation.py
@@ -42,16 +42,7 @@ class fixelevation:
             PYTRAINER = "{%s}" % pyt_ns
             self._trkpt_path = '{%s}trk/{%s}trkseg/{%s}trkpt' % (self._xmlns, self._xmlns, self._xmlns)
 
-            """
-            Replace elevation from GPX by data from SRTM.
-            TODO (Arnd) make a function within class fixelevation out of this for better reuse
-            """
-            for trkpt in self._data.findall(self._trkpt_path):
-                lat = float(trkpt.attrib['lat'])
-                lon = float(trkpt.attrib['lon'])
-            
-                ele = trkpt.find('{%s}ele' % self._xmlns)
-                ele_new = self._srtm.get_elevation(lat, lon)
+            def addExt(trackpoint, ele_new):
                 #Add new elevation to extension tag
                 '''
                 <extensions>
@@ -61,22 +52,66 @@ class fixelevation:
                 ext = etree.Element("extensions")
                 py_ele = etree.SubElement(ext, PYTRAINER + "ele", method="srtm_bilinear")
                 py_ele.text = str(ele_new)
-                
-                #print etree.tostring(ext)
-                
-                
+                trackpoint.append(ext)
+
+            """
+            Replace elevation from GPX by data from SRTM.
+            TODO (Arnd) make a function within class fixelevation out of this for better reuse
+            """
+            trackpoints = self._data.findall(self._trkpt_path)
+            for trkpt in trackpoints:
+                lat = float(trkpt.attrib['lat'])
+                lon = float(trkpt.attrib['lon'])
+            
+                ele = trkpt.find('{%s}ele' % self._xmlns)
+                ele_new = self._srtm.get_elevation(lat, lon)
+
                 if not ele_new:
                     ele_fixed = False
                     break 
-                    
-                #if ele is not None:
-                #    #ele.text = str(ele_new)
-                #    ele.append(ext)
-                #else:
-                #    ele = etree.Element('ele')
-                #    ele.append(py_ele)
-                trkpt.append(ext)
+
+                addExt(trkpt, ele_new)
                 
+            if not ele_fixed:
+                # Try Google maps elevation API
+                import cjson, urllib2, math
+                steps = len(trackpoints) / 300
+
+                path = ''
+                lat_prev, long_prev = 0, 0
+                t = 0
+                for t in xrange(0,len(trackpoints),steps):
+                    lat = float(trackpoints[t].attrib['lat'])
+                    lon = float(trackpoints[t].attrib['lon'])
+                    encoded_lat, lat_prev = encode_coord(lat, lat_prev)
+                    encoded_long, long_prev = encode_coord(lon, long_prev)
+                    path += encoded_lat + encoded_long
+                    t += 1
+                url = "http://maps.googleapis.com/maps/api/elevation/json?sensor=true&samples=%d&path=enc:" % int((len(trackpoints) / steps))
+                url += path
+ 
+                try:
+                    google_ele = cjson.decode(urllib2.urlopen(url).read())
+                    if google_ele['status'] == "OK":
+                        t_idx = 0
+                        ele_points = len(google_ele['results'])
+                        for ele_new in xrange(0,ele_points):
+                            addExt(trackpoints[t_idx], google_ele['results'][ele_new]['elevation'])
+                            for intermediate in xrange(ele_new+1, ele_new+steps):
+                                if intermediate<len(trackpoints):
+                                    if ele_new==ele_points-1:
+                                        calculated = google_ele['results'][ele_new]['elevation']
+                                    else:
+                                        ele1 = google_ele['results'][ele_new]['elevation']
+                                        ele2 = google_ele['results'][ele_new+1]['elevation']
+                                        calculated = (ele1 * (intermediate-ele_new)  + ele2 * (steps - (intermediate-ele_new))) / steps
+                                    t_idx += 1
+                                    addExt(trackpoints[t_idx], calculated)
+                            t_idx += 1
+                        ele_fixed = True
+                except urllib2.HTTPError:
+                    pass
+
             if ele_fixed:
                 # Write out to original *.gpx.                         
                 self._data.write( gpx_file, 
@@ -100,3 +135,24 @@ class fixelevation:
         else:
             logging.error("ELE GPX file: %s NOT found!!!" % (gpx_file))
         logging.debug("<<")
+        
+def encode_coord(x, prev):
+    val = int(x * 1e5)
+    return encode_signed(val - prev), val
+
+def encode_signed(n):
+    tmp = n << 1
+    if n < 0:
+        tmp = ~tmp
+    return encode_unsigned(tmp)
+
+def encode_unsigned(n):
+    b = []
+    while n >= 32:
+        b.append(n & 31)
+        n = n >> 5
+    b = [(c | 0x20) for c in b]
+    b.append(n)
+    b = [(i + 63) for i in b]
+    return ''.join([chr(i) for i in b])
+
diff --git a/extensions/openstreetmap/OSM_AnonSelection.glade b/extensions/openstreetmap/OSM_AnonSelection.glade
new file mode 100644
index 0000000..f7fa697
--- /dev/null
+++ b/extensions/openstreetmap/OSM_AnonSelection.glade
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<glade-interface>
+  <!-- interface-requires gtk+ 2.16 -->
+  <!-- interface-naming-policy project-wide -->
+  <widget class="GtkWindow" id="OSM_AnonSelection">
+    <property name="title" translatable="yes">Select your private area</property>
+    <property name="modal">True</property>
+    <property name="window_position">center</property>
+    <property name="default_width">600</property>
+    <property name="default_height">400</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <widget class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <widget class="GtkVBox" id="mapBox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <placeholder/>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="hbox1">
+            <property name="visible">True</property>
+            <property name="spacing">3</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkButton" id="buttonOk">
+                <property name="label" translatable="yes">_Ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="on_buttonOk_clicked" object=""BLA2""/>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkButton" id="buttonCancel">
+                <property name="label" translatable="yes">_Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="on_buttonCancel_clicked" object=""BLA""/>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/extensions/openstreetmap/conf.xml b/extensions/openstreetmap/conf.xml
index de49090..bd583b3 100644
--- a/extensions/openstreetmap/conf.xml
+++ b/extensions/openstreetmap/conf.xml
@@ -10,4 +10,5 @@
 >
 <conf-values variable="username" value=""/>
 <conf-values variable="password" value=""/>
+<conf-values variable="privPolygon" value=""/>
 </pytrainer-extension>
diff --git a/extensions/openstreetmap/openstreetmap.py b/extensions/openstreetmap/openstreetmap.py
index c2608ee..42cdc55 100644
--- a/extensions/openstreetmap/openstreetmap.py
+++ b/extensions/openstreetmap/openstreetmap.py
@@ -11,6 +11,10 @@ from lxml import etree
 import httplib, httplib2
 import urllib2
 import mimetools, mimetypes
+from json import dumps, loads       #   for deserializing JSON data form javascript
+
+from pytrainer.extensions.mapviewer import MapViewer
+from pytrainer.extensions.osm import Osm
 
 class openstreetmap:
     def __init__(self, parent = None, pytrainer_main = None, conf_dir = None, options = None):
@@ -21,22 +25,21 @@ class openstreetmap:
         self.description = " "
         self.tags = ""
         self.visibility = "private"
+        self.mozTitle=""               # Keeps embedded mozilla document title while displaying map for private area selection
+        self.privBounds=[]             # Bounds of areas to be anonymized 
 
     def run(self, id, activity=None):  #TODO Convert to use activity...
         logging.debug(">>")
-        uri = "http://api.openstreetmap.org/api/0.6/gpx/create" #URI for uploading traces to OSM
-        if 'username' not in self.options or self.options['username'] == "" or 'password' not in self.options or self.options['password'] == "":
-            logging.error("Must have username and password configured")
-            msg = _("Must have username and password configured")
-            md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
-            md.set_title(_("Openstreetmap Extension Error"))
-            md.run()
-            md.destroy()
-            return
-        username = self.options['username']
-        password = self.options['password']
-        gpx_file = "%s/gpx/%s.gpx" % (self.conf_dir, id)
-        if os.path.isfile(gpx_file):
+        try:
+            uri = "http://api.openstreetmap.org/api/0.6/gpx/create" #URI for uploading traces to OSM
+            if 'username' not in self.options or self.options['username'] == "" or 'password' not in self.options or self.options['password'] == "":
+                logging.error("Must have username and password configured")
+                raise Exception("Must have username and password configured")
+            username = self.options['username']
+            password = self.options['password']
+            gpx_file = "%s/gpx/%s.gpx" % (self.conf_dir, id)
+            if not os.path.isfile(gpx_file):
+                raise Exception(str(gps_file) + ' File not found')
             #GPX file is ok and found, so open it
             logging.debug("GPX file: %s found, size: %d" % (gpx_file, os.path.getsize(gpx_file)))
             f = open(gpx_file, 'r')
@@ -57,7 +60,7 @@ class openstreetmap:
                 logging.debug("User abort")
                 return
             if self.makeanon:
-                logging.debug("User requested anonymising of GPX data")
+                logging.debug("User requested anonymizing of GPX data")
                 f.close()                   #Close standard gpxfile
                 gpx_file = self.make_gpx_private(gpx_file)
                 f = open(gpx_file, 'r')     #Open anonymous gpxfile in readonly mode
@@ -100,15 +103,20 @@ class openstreetmap:
             md.set_modal(False)
             md.run()
             md.destroy()
-
-        else:
-            logging.error("GPX file: %s NOT found!!!" % (gpx_file))
-        logging.debug("<<")
+        except Exception as e:
+                msg = _("Error while uploading file to OSM: " + str(e))
+                md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
+                md.set_title(_("Openstreetmap Extension Error"))
+                md.run()
+                md.destroy()
+                return
+        finally:
+            logging.debug("<<")
 
     def display_options_window(self):
         self.prefwindow = gtk.Dialog(title=_("Please add any additional information for this upload"), parent=None, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
         self.prefwindow.set_modal(False)
-        table = gtk.Table(1,2)
+        table = gtk.Table(1,3)
         self.entryList = []
         #Add description
         label = gtk.Label("<b>Description</b>")
@@ -143,7 +151,12 @@ class openstreetmap:
         checkbutton = gtk.CheckButton()
         table.attach(checkbutton,1,2,3,4)
         self.entryList.append(checkbutton)
-        #Buld dialog and show
+        #Add anon area selection button
+        button = gtk.Button("Area selection")
+        button.connect("clicked",self.areaSelect)
+        table.attach(button,1,2,4,5)
+        self.entryList.append(button)
+        #Build dialog and show
         self.prefwindow.vbox.pack_start(table)
         self.prefwindow.show_all()
         self.prefwindow.connect("response", self.on_options_ok_clicked)
@@ -163,6 +176,80 @@ class openstreetmap:
         self.makeanon = self.entryList[3].get_active()
         logging.debug("Description: %s, tags: %s, visibility: %s, makeanon: %s" % ( self.description, self.tags, self.visibility, self.makeanon) )
 
+    def areaSelect(self,dc):
+        """
+            Open a window with OSM map so user could select his private/anonymized area - 
+            all GPX dots in this area will be removed before uploading to OSM
+        """       
+        try:
+            wTree = gtk.glade.XML(self.pytrainer_main.data_path+"extensions/openstreetmap/OSM_AnonSelection.glade")
+            self.privAreaWindow = wTree.get_widget("OSM_AnonSelection")
+            dic = {
+                "on_buttonOk_clicked" : self.privArea_Ok,
+                "on_buttonCancel_clicked" : self.privArea_Cancel
+            }
+            wTree.signal_autoconnect( dic )
+            mapviewer = MapViewer(self.pytrainer_main.data_path, pytrainer_main=self.pytrainer_main, box=wTree.get_widget("mapBox"))
+            json=None
+            if self.options.has_key('privPolygon'):
+                json=self.options['privPolygon']
+            htmlfile = Osm(data_path=self.pytrainer_main.data_path, waypoint=json, pytrainer_main=self.pytrainer_main).selectArea()
+            mapviewer.display_map(htmlfile=htmlfile)
+            mapviewer.moz.connect('title', self.parseTitle) 
+            self.privAreaWindow.show()
+
+        except Exception as e:
+                msg = "Could not init map selection screen, Error: " + str(e)
+                md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
+                md.set_title(_("Error"))
+                md.run()
+                md.destroy()
+                return                
+
+    def parseTitle(self, moz):
+        "Event fired when document title was changed -> meaning polygon was changed"
+        if moz.get_title() != "":
+            self.mozTitle=str(moz.get_title())
+
+    def privArea_Cancel(self,button):
+        "Event fired when cancel button was pressed"
+        self.privAreaWindow.destroy()
+        
+    def privArea_Ok(self,button):
+        "Event fired when ok button was pressed"
+        logging.debug(">> privArea_Ok")
+        # save new private area polygon if changed
+        if self.mozTitle=="":
+            return
+        # try parsing JSON
+        try:
+            # verify json is correct by deserializing and serializing it
+            polygonString=dumps(loads(self.mozTitle))
+            # try saving
+            extensionDir = self.pytrainer_main.data_path + "/extensions" + "/openstreetmap"
+            if not os.path.isdir(extensionDir):
+                loggin.error(str(e))
+                print ("Could not find extension path: " + str(extensionDir))
+                raise Exception("Could not find extension path: " + str(extensionDir))
+            # save new options
+            self.options['privPolygon'] = polygonString
+            # convert dictionary to a lists set
+            savedOptions = []
+            for key in self.options:
+                savedOptions.append((key,self.options[key]))
+            # write new xml config file
+            self.parent.setExtensionConfParams(extensionDir, savedOptions)
+        except Exception as e:
+            logging.error(str(e))    
+            print "Error while saving extension configuration: " + str(e)
+            msg = _(str(e))
+            md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
+            md.set_title(_("Error while saving extension configuration"))
+            md.run()
+            md.destroy()
+        finally:
+            self.privAreaWindow.destroy()
+                                
     def multipart_encode(self, fields, files, boundary = None, buffer = None):
         '''
             Multipart encode data for posting
@@ -176,7 +263,6 @@ class openstreetmap:
             buffer += '--%s\r\n' % boundary
             buffer += 'Content-Disposition: form-data; name="%s"' % key
             buffer += '\r\n\r\n' + value + '\r\n'
-        print files
         for (key, fd) in files:
             file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
             filename = os.path.basename(fd.name)
@@ -202,15 +288,19 @@ class openstreetmap:
         filen = os.path.basename(gpx_file)
         tmpdir = self.pytrainer_main.profile.tmpdir
         anon_gpx_file = "%s/%s" % (tmpdir, filen)
-        
-        # Filtered home area, example Berlin
-        # corners NorthEast and SouthWest       
-        #TODO This needs to be a config item....
-        NE_LAT = 52.518
-        NE_LON = 13.408
-        SW_LAT = 52.4
-        SW_LON = 13.3
 
+        # get saved private area polygon
+        pP=loads(self.options['privPolygon'])
+        pP=pP['geometry']['coordinates'][0]
+        # converts polygon's 2D matrix into a vector of just the lats or lons
+        vector = lambda lonLat: [pP[i][lonLat] for i in range(len(pP))] # 0:lon, 1:lat
+        # try reading private area's bounds, stored as [lon,lat]
+        NE_LAT = max([pP[i][1] for i in range(len(pP))])
+        NE_LON = max([pP[i][0] for i in range(len(pP))])
+        SW_LAT = min([pP[i][1] for i in range(len(pP))])
+        SW_LON = min([pP[i][0] for i in range(len(pP))])
+        logging.info("Anonymizing Area: NE:%f,%f -> SW: %f,%f" % (NE_LON, NE_LAT, SW_LON, SW_LAT))
+            
         # Config parameters, not used yet
         FILTER_BOX = True
         ERASE_TIME  = True
diff --git a/glade/newrecord.glade b/glade/newrecord.glade
index a16ea80..c97bbda 100644
--- a/glade/newrecord.glade
+++ b/glade/newrecord.glade
@@ -560,7 +560,7 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <signal name="clicked" handler="on_calcaverage_clicked"/>
+                                <signal name="clicked" handler="on_calcavs_clicked"/>
                               </widget>
                               <packing>
                                 <property name="left_attach">4</property>
@@ -620,7 +620,7 @@
               <widget class="GtkVBox" id="vbox26">
                 <property name="visible">True</property>
                 <child>
-                  <widget class="GtkFrame" id="frame20">
+                  <widget class="GtkFrame" id="framePace">
                     <property name="visible">True</property>
                     <property name="border_width">5</property>
                     <property name="label_xalign">0</property>
@@ -651,7 +651,6 @@
                             <child>
                               <widget class="GtkEntry" id="rcd_maxpace">
                                 <property name="visible">True</property>
-                                <property name="sensitive">False</property>
                                 <property name="can_focus">True</property>
                                 <property name="invisible_char">●</property>
                                 <property name="width_chars">7</property>
@@ -680,7 +679,6 @@
                             <child>
                               <widget class="GtkEntry" id="rcd_pace">
                                 <property name="visible">True</property>
-                                <property name="sensitive">False</property>
                                 <property name="can_focus">True</property>
                                 <property name="invisible_char">●</property>
                                 <property name="width_chars">7</property>
@@ -699,7 +697,7 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <signal name="clicked" handler="on_calcpace_clicked"/>
+                                <signal name="clicked" handler="on_calcavs_clicked"/>
                               </widget>
                               <packing>
                                 <property name="left_attach">4</property>
@@ -730,7 +728,7 @@
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkFrame" id="frame21">
+                  <widget class="GtkFrame" id="frameElevation">
                     <property name="visible">True</property>
                     <property name="border_width">5</property>
                     <property name="label_xalign">0</property>
@@ -825,7 +823,7 @@
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkFrame" id="frame22">
+                  <widget class="GtkFrame" id="frameBeats">
                     <property name="visible">True</property>
                     <property name="border_width">5</property>
                     <property name="label_xalign">0</property>
diff --git a/glade/profile.glade b/glade/profile.glade
index 001b4e9..fbf1382 100644
--- a/glade/profile.glade
+++ b/glade/profile.glade
@@ -591,6 +591,7 @@
                                   <widget class="GtkTreeView" id="sportTreeView">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
+                                    <signal name="row_activated" handler="on_sporttreeview_row_activated"/>
                                   </widget>
                                 </child>
                               </widget>
@@ -808,8 +809,8 @@
                                   </widget>
                                   <packing>
                                     <property name="right_attach">3</property>
-                                    <property name="top_attach">4</property>
-                                    <property name="bottom_attach">5</property>
+                                    <property name="top_attach">5</property>
+                                    <property name="bottom_attach">6</property>
                                     <property name="x_options">GTK_FILL</property>
                                     <property name="y_options"></property>
                                   </packing>
@@ -841,6 +842,42 @@
                                     <property name="y_options"></property>
                                   </packing>
                                 </child>
+		                        <child>
+		                          <widget class="GtkHBox" id="hboxcolor">
+		                            <property name="visible">True</property>
+		                            <child>
+		                              <widget class="GtkImage" id="newcolor">
+		                                <property name="visible">True</property>
+		                                <property name="can_focus">True</property>
+		                                <property name="receives_default">False</property>
+		                              </widget>
+		                              <packing>
+		                              </packing>
+		                            </child>
+		                            <child>
+		                              <widget class="GtkButton" id="buttoncolor">
+		                                <property name="label">gtk-edit</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_editcolor_clicked"/>
+		                              </widget>
+		                              <packing>
+		                                <property name="expand">False</property>
+		                                <property name="fill">False</property>
+		                                <property name="position">1</property>
+		                              </packing>
+		                            </child>
+                                  </widget>
+                                  <packing>
+                                    <property name="left_attach">1</property>
+                                    <property name="right_attach">2</property>
+                                    <property name="top_attach">4</property>
+                                    <property name="bottom_attach">5</property>
+                                    <property name="y_options"></property>
+                                  </packing>
+                                </child>
                                 <child>
                                   <placeholder/>
                                 </child>
@@ -1188,8 +1225,8 @@ Continue?</property>
                                   </widget>
                                   <packing>
                                     <property name="right_attach">2</property>
-                                    <property name="top_attach">4</property>
-                                    <property name="bottom_attach">5</property>
+                                    <property name="top_attach">5</property>
+                                    <property name="bottom_attach">6</property>
                                     <property name="x_options">GTK_FILL</property>
                                     <property name="y_options"></property>
                                   </packing>
@@ -1198,7 +1235,7 @@ Continue?</property>
                                   <widget class="GtkLabel" id="label-9">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">Maxiumum Pace</property>
+                                    <property name="label" translatable="yes">Maximum Pace</property>
                                   </widget>
                                   <packing>
                                     <property name="top_attach">3</property>
@@ -1221,6 +1258,55 @@ Continue?</property>
                                     <property name="y_options"></property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label-10">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Color</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="top_attach">4</property>
+                                    <property name="bottom_attach">5</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options"></property>
+                                  </packing>
+                                </child>
+		                        <child>
+		                          <widget class="GtkHBox" id="hboxcolor">
+		                            <property name="visible">True</property>
+		                            <child>
+		                              <widget class="GtkImage" id="editcolor">
+		                                <property name="visible">True</property>
+		                                <property name="can_focus">True</property>
+		                                <property name="receives_default">False</property>
+		                              </widget>
+		                              <packing>
+		                              </packing>
+		                            </child>
+		                            <child>
+		                              <widget class="GtkButton" id="buttoncolor">
+		                                <property name="label">gtk-edit</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_editcolor_clicked"/>
+		                              </widget>
+		                              <packing>
+		                                <property name="expand">False</property>
+		                                <property name="fill">False</property>
+		                                <property name="position">1</property>
+		                              </packing>
+		                            </child>
+		                          </widget>
+		                          <packing>
+		                            <property name="left_attach">1</property>
+		                            <property name="right_attach">2</property>
+		                            <property name="top_attach">4</property>
+		                            <property name="bottom_attach">5</property>
+		                            <property name="y_options"></property>
+		                          </packing>
+		                        </child>
                               </widget>
                               <packing>
                                 <property name="position">0</property>
@@ -1751,51 +1837,6 @@ Debug</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="labelCheck">
-                            <property name="visible">True</property>
-                            <property name="xalign">0</property>
-                            <property name="xpad">5</property>
-                            <property name="ypad">5</property>
-                            <property name="label" translatable="yes">Check</property>
-                          </widget>
-                          <packing>
-                            <property name="top_attach">2</property>
-                            <property name="bottom_attach">3</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkCheckButton" id="checkbuttonCheck">
-                            <property name="label">--check</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="draw_indicator">True</property>
-                            <signal name="toggled" handler="on_checkbuttonCheck_toggled"/>
-                          </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_padding">10</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkLabel" id="labelCheckDescription">
-                            <property name="visible">True</property>
-                            <property name="xalign">0</property>
-                            <property name="xpad">5</property>
-                            <property name="label" translatable="yes"><small>Was a configuration and database check requested?</small></property>
-                            <property name="use_markup">True</property>
-                          </widget>
-                          <packing>
-                            <property name="left_attach">2</property>
-                            <property name="right_attach">3</property>
-                            <property name="top_attach">2</property>
-                            <property name="bottom_attach">3</property>
-                          </packing>
-                        </child>
-                        <child>
                           <widget class="GtkLabel" id="labelNewGraph">
                             <property name="visible">True</property>
                             <property name="xalign">0</property>
diff --git a/glade/pytrainer.glade b/glade/pytrainer.glade
index 8148211..c1d51df 100644
--- a/glade/pytrainer.glade
+++ b/glade/pytrainer.glade
@@ -342,7 +342,7 @@
                                             <child>
                                               <widget class="GtkTable" id="table13">
                                                 <property name="visible">True</property>
-                                                <property name="n_rows">11</property>
+                                                <property name="n_rows">9</property>
                                                 <property name="n_columns">6</property>
                                                 <property name="column_spacing">3</property>
                                                 <property name="row_spacing">6</property>
@@ -787,6 +787,7 @@
                                                     <child>
                                                       <widget class="GtkTextView" id="record_comments">
                                                         <property name="width_request">440</property>
+                                                        <property name="height_request">25</property>
                                                         <property name="visible">True</property>
                                                         <property name="can_focus">True</property>
                                                         <property name="editable">False</property>
@@ -928,13 +929,44 @@
                                                   <placeholder/>
                                                 </child>
                                                 <child>
-                                                  <placeholder/>
+                                                  <widget class="GtkLabel" id="label42">
+                                                    <property name="visible">True</property>
+                                                    <property name="xalign">0</property>
+                                                    <property name="label" translatable="yes"><b>Active / Rest:</b></property>
+                                                    <property name="use_markup">True</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="left_attach">3</property>
+                                                    <property name="right_attach">4</property>
+                                                    <property name="top_attach">5</property>
+                                                    <property name="bottom_attach">6</property>
+                                                  </packing>
                                                 </child>
                                                 <child>
-                                                  <placeholder/>
+                                                  <widget class="GtkLabel" id="record_runrest">
+                                                    <property name="visible">True</property>
+                                                    <property name="xalign">1</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="left_attach">4</property>
+                                                    <property name="right_attach">5</property>
+                                                    <property name="top_attach">5</property>
+                                                    <property name="bottom_attach">6</property>
+                                                  </packing>
                                                 </child>
                                                 <child>
-                                                  <placeholder/>
+                                                  <widget class="GtkLabel" id="label50">
+                                                    <property name="visible">True</property>
+                                                    <property name="xalign">0</property>
+                                                    <property name="xpad">5</property>
+                                                    <property name="label" translatable="yes">h:m:s</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="left_attach">5</property>
+                                                    <property name="right_attach">6</property>
+                                                    <property name="top_attach">5</property>
+                                                    <property name="bottom_attach">6</property>
+                                                  </packing>
                                                 </child>
                                               </widget>
                                               <packing>
@@ -944,12 +976,45 @@
                                               </packing>
                                             </child>
                                             <child>
-                                              <widget class="GtkLabel" id="label2">
+                                              <widget class="GtkFrame" id="frame_laps">
                                                 <property name="visible">True</property>
-                                                <property name="label">   </property>
+                                                <property name="label_xalign">0</property>
+                                                <child>
+                                                  <widget class="GtkAlignment" id="alignment12l">
+                                                    <property name="visible">True</property>
+                                                    <property name="left_padding">12</property>
+                                                    <property name="right_padding">12</property>
+                                                    <child>
+                                                      <widget class="GtkScrolledWindow" id="scrolledwindow2l">
+                                                        <property name="visible">True</property>
+                                                        <property name="can_focus">True</property>
+                                                        <property name="hscrollbar_policy">automatic</property>
+                                                        <property name="vscrollbar_policy">automatic</property>
+                                                        <child>
+                                                          <widget class="GtkTreeView" id="lapsTreeView">
+                                                            <property name="visible">True</property>
+                                                            <property name="can_focus">True</property>
+                                                            <property name="has_tooltip">True</property>
+                                                          </widget>
+                                                        </child>
+                                                      </widget>
+                                                    </child>
+                                                  </widget>
+                                                </child>
+                                                <child>
+                                                  <widget class="GtkLabel" id="label14">
+                                                    <property name="visible">True</property>
+                                                    <property name="label" translatable="yes"><b>Laps</b></property>
+                                                    <property name="use_markup">True</property>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="type">label_item</property>
+                                                  </packing>
+                                                </child>
                                               </widget>
                                               <packing>
-                                                <property name="position">1</property>
+                                                <property name="padding">5</property>
+                                                <property name="position">2</property>
                                               </packing>
                                             </child>
                                             <child>
@@ -996,9 +1061,8 @@
                                                 </child>
                                               </widget>
                                               <packing>
-                                                <property name="expand">False</property>
                                                 <property name="fill">False</property>
-                                                <property name="position">2</property>
+                                                <property name="position">3</property>
                                               </packing>
                                             </child>
                                           </widget>
@@ -1156,7 +1220,6 @@ Cadence
                                         <property name="visible">True</property>
                                         <child>
                                           <widget class="GtkScrolledWindow" id="scrolledwindowGraphOptions">
-                                            <property name="height_request">100</property>
                                             <property name="visible">True</property>
                                             <property name="can_focus">True</property>
                                             <property name="hscrollbar_policy">automatic</property>
@@ -1316,7 +1379,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonY1Min">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">0 -500 1000 1 10 0</property>
                                                             <signal name="value_changed" handler="on_spinbuttonY1_value_changed"/>
@@ -1334,7 +1397,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonY1Max">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">0 -500 1000 1 10 0</property>
                                                             <signal name="value_changed" handler="on_spinbuttonY1_value_changed"/>
@@ -1397,7 +1460,7 @@ Cadence
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
                                                             <property name="max_length">2</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="adjustment">1 1 10 1 1 0</property>
                                                             <signal name="value_changed" handler="on_spinbuttonY1LineWeight_value_changed"/>
                                                           </widget>
@@ -1439,7 +1502,7 @@ Cadence
                                                             <property name="sensitive">False</property>
                                                             <property name="can_focus">True</property>
                                                             <property name="max_length">2</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="adjustment">1 0 10 1 1 0</property>
                                                           </widget>
                                                           <packing>
@@ -1531,7 +1594,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonY2Min">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">0 -500 1000 1 10 0</property>
                                                           </widget>
@@ -1548,7 +1611,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonY2Max">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">1 -500 1000 1 10 0</property>
                                                           </widget>
@@ -1618,7 +1681,7 @@ Cadence
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
                                                             <property name="max_length">2</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="adjustment">1 0 10 1 1 0</property>
                                                           </widget>
                                                           <packing>
@@ -1650,7 +1713,7 @@ Cadence
                                                             <property name="sensitive">False</property>
                                                             <property name="can_focus">True</property>
                                                             <property name="max_length">2</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="adjustment">1 0 10 1 1 0</property>
                                                           </widget>
                                                           <packing>
@@ -1727,7 +1790,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonXMin">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">0 -500 1000 1 10 0</property>
                                                           </widget>
@@ -1744,7 +1807,7 @@ Cadence
                                                           <widget class="GtkSpinButton" id="spinbuttonXMax">
                                                             <property name="visible">True</property>
                                                             <property name="can_focus">True</property>
-                                                            <property name="invisible_char">●</property>
+                                                            <property name="invisible_char">&#x25CF;</property>
                                                             <property name="width_chars">4</property>
                                                             <property name="adjustment">0 -500 1000 1 10 0</property>
                                                           </widget>
@@ -1985,6 +2048,32 @@ Cadence
                                           <packing>
                                             <property name="expand">False</property>
                                             <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="labelMapLineType">
+                                            <property name="visible">True</property>
+                                            <property name="xalign">1</property>
+                                            <property name="label" translatable="yes"><small>Show:</small></property>
+                                            <property name="use_markup">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="padding">5</property>
+                                            <property name="position">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkComboBoxEntry" id="comboMapLineType">
+                                            <property name="visible">True</property>
+                                            <property name="items" translatable="yes">None
+Speed
+Heart rate
+Cadence</property>
+                                            <signal name="changed" handler="on_comboMapLineType_changed"/>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
                                             <property name="position">3</property>
                                           </packing>
                                         </child>
@@ -1997,8 +2086,7 @@ Cadence
                                           </widget>
                                           <packing>
                                             <property name="padding">5</property>
-                                            <property name="pack_type">end</property>
-                                            <property name="position">2</property>
+                                            <property name="position">4</property>
                                           </packing>
                                         </child>
                                         <child>
@@ -2015,7 +2103,7 @@ Cadence
                                             <property name="expand">False</property>
                                             <property name="fill">False</property>
                                             <property name="pack_type">end</property>
-                                            <property name="position">1</property>
+                                            <property name="position">5</property>
                                           </packing>
                                         </child>
                                         <child>
@@ -2645,6 +2733,336 @@ Cadence
                                     <property name="type">tab</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <widget class="GtkFrame" id="frame_analytics">
+                                    <property name="visible">True</property>
+                                    <property name="border_width">6</property>
+                                    <property name="label_xalign">0</property>
+                                    <property name="shadow_type">none</property>
+		                            <child>
+		                              <widget class="GtkVBox" id="analytics_vbox_">
+		                                <property name="visible">True</property>
+			                            <child>
+				                          <widget class="GtkHBox" id="analytics_hbox_">
+				                            <property name="visible">True</property>
+					                        <child>
+					                          <widget class="GtkFrame" id="frame_projected">
+					                            <property name="visible">True</property>
+					                            <property name="label_xalign">0</property>
+				                                <child>
+				                                  <widget class="GtkAlignment" id="alignment_analytics">
+				                                    <property name="visible">True</property>
+				                                    <property name="left_padding">12</property>
+			                                        <property name="can_focus">False</property>
+			                                        <child>
+			                                          <widget class="GtkTreeView" id="analyticsTreeView">
+			                                            <property name="visible">True</property>
+				                                        <property name="can_focus">True</property>
+				                                        <property name="headers-clickable">False</property>
+			                                          </widget>
+			                                        </child>
+				                                  </widget>
+				                                </child>
+					                            <child>
+					                              <widget class="GtkLabel" id="labelprojected">
+					                                <property name="visible">True</property>
+					                                <property name="label" translatable="yes"><b>Projected times</b></property>
+					                                <property name="use_markup">True</property>
+					                              </widget>
+					                              <packing>
+					                                <property name="type">label_item</property>
+					                            <property name="padding">10</property>
+					                              </packing>
+					                            </child>
+					                          </widget>
+					                          <packing>
+			                                    <property name="expand">False</property>
+					                            <property name="padding">10</property>
+					                            <property name="position">2</property>
+					                          </packing>
+					                        </child>
+					                        <child>
+					                          <widget class="GtkFrame" id="frame_ranking">
+					                            <property name="visible">True</property>
+					                            <property name="label_xalign">0</property>
+				                                <child>
+				                                  <widget class="GtkAlignment" id="alignment_ranking">
+				                                    <property name="visible">True</property>
+				                                    <property name="left_padding">12</property>
+			                                        <child>
+			                                          <widget class="GtkVBox" id="vbox_ranking">
+						                                <property name="visible">True</property>
+					                                    <child>
+					                                      <widget class="GtkLabel" id="label11125">
+					                                        <property name="visible">True</property>
+					                                        <property name="xalign">0</property>
+					                                        <property name="label" translatable="yes"><i>Rank relative to same-sport activities for distances ± x%:</i></property>
+					                                        <property name="use_markup">True</property>
+					                                      </widget>
+					                                    </child>
+							                            <child>
+					                                      <widget class="GtkHBox" id="hbox_ranking">
+								                            <property name="visible">True</property>
+										                    <child>
+								                              <widget class="GtkVBox" id="alignment_ranking2">
+											                    <property name="visible">True</property>
+									                            <child>
+									                              <widget class="GtkHScale" id="slider_ranking">
+									                                <property name="visible">True</property>
+									                                <property name="sensitive">True</property>
+																	<property name="adjustment">5 0 20 1 0 0</property>
+										                            <signal name="value-changed" handler="on_change_rank_percentage"/>
+													              </widget>
+									                              <packing>
+									                                <property name="expand">False</property>
+									                              </packing>
+									                            </child>
+									                            <child>
+									                              <widget class="GtkTable" id="table_ranking">
+									                                <property name="visible">True</property>
+										                            <property name="border_width">10</property>
+										                            <property name="n_rows">5</property>
+										                            <property name="n_columns">2</property>
+										                            <property name="column_spacing">3</property>
+										                            <property name="row_spacing">5</property>
+										                            <child>
+										                              <widget class="GtkLabel" id="label11125">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Range:</b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">0</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label11125">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Rank:</b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">1</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label11127">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Speed: </b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">2</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="wssdadadsada">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Avg speed:</b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">3</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label-2">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Standard deviation:</b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">4</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label-3">
+										                                <property name="width_request">90</property>
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="label" translatable="yes"><b>Deviation:</b></property>
+										                                <property name="use_markup">True</property>
+										                              </widget>
+										                              <packing>
+										                                <property name="top_attach">5</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_range">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">0</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_rank">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">1</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_speed">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">2</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_avg">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">3</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_stddev">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">4</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+										                            <child>
+										                              <widget class="GtkLabel" id="label_ranking_dev">
+										                                <property name="visible">True</property>
+										                                <property name="xalign">0</property>
+										                                <property name="xpad">5</property>
+										                                <property name="label"></property>
+										                              </widget>
+										                              <packing>
+										                                <property name="left_attach">1</property>
+										                                <property name="top_attach">5</property>
+										                                <property name="x_options">GTK_FILL</property>
+										                                <property name="y_options"></property>
+										                              </packing>
+										                            </child>
+									                              </widget>
+									                            </child>
+							                                  </widget>
+													          <packing>
+													            <property name="padding">10</property>
+													          </packing>
+							                                </child>
+							                                <child>
+							                                  <widget class="GtkTreeView" id="rankingTreeView">
+							                                    <property name="visible">True</property>
+								                                <property name="can_focus">True</property>
+								                                <property name="headers-clickable">False</property>
+							                                  </widget>
+													          <packing>
+													            <property name="padding">10</property>
+													          </packing>
+							                                </child>
+								                          </widget>
+								                        </child>
+			                                          </widget>
+			                                        </child>
+				                                  </widget>
+				                                </child>
+					                            <child>
+					                              <widget class="GtkLabel" id="label_ranking">
+					                                <property name="visible">True</property>
+					                                <property name="label" translatable="yes"><b>Ranking</b></property>
+					                                <property name="use_markup">True</property>
+					                              </widget>
+					                              <packing>
+					                                <property name="type">label_item</property>
+					                              </packing>
+					                            </child>
+		                                      </widget>
+		                                    </child>
+			                              </widget>
+			                              <packing>
+	                                        <property name="expand">False</property>
+			                                <property name="padding">10</property>
+			                                <property name="position">3</property>
+			                              </packing>
+			                            </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label14anal">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes"><b>Analytics:</b></property>
+                                            <property name="use_markup">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="type">label_item</property>
+                                          </packing>
+                                        </child>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">4</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkImage" id="image28pre">
+                                    <property name="visible">True</property>
+                                    <property name="pixbuf">glasses.png</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">4</property>
+                                    <property name="tab_fill">False</property>
+                                    <property name="type">tab</property>
+                                  </packing>
+                                </child>
                               </widget>
                             </child>
                             <child>
@@ -3132,13 +3550,44 @@ Cadence
                                               </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label31">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property>
+                                                <property name="use_markup">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="day_ascdesc">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">1</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">4</property>
+                                                <property name="right_attach">5</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label32">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="xpad">5</property>
+                                                <property name="label" translatable="yes">m</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">5</property>
+                                                <property name="right_attach">6</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                           </widget>
                                         </child>
@@ -3744,13 +4193,44 @@ Stage Profile/velocity</property>
                                               </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label33">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property>
+                                                <property name="use_markup">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="weeka_ascdesc">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">1</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">4</property>
+                                                <property name="right_attach">5</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label34">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="xpad">5</property>
+                                                <property name="label" translatable="yes">m</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">5</property>
+                                                <property name="right_attach">6</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                           </widget>
                                         </child>
@@ -4367,13 +4847,44 @@ Calories</property>
                                               </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label36">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property>
+                                                <property name="use_markup">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="montha_ascdesc">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">1</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">4</property>
+                                                <property name="right_attach">5</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label49">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="xpad">5</property>
+                                                <property name="label" translatable="yes">m</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">5</property>
+                                                <property name="right_attach">6</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                           </widget>
                                         </child>
@@ -4989,13 +5500,44 @@ Calories</property>
                                               </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label35">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property>
+                                                <property name="use_markup">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="yeara_ascdesc">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">1</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">4</property>
+                                                <property name="right_attach">5</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkLabel" id="label41">
+                                                <property name="visible">True</property>
+                                                <property name="xalign">0</property>
+                                                <property name="xpad">5</property>
+                                                <property name="label" translatable="yes">m</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="left_attach">5</property>
+                                                <property name="right_attach">6</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                              </packing>
                                             </child>
                                           </widget>
                                         </child>
@@ -5269,7 +5811,7 @@ Calories</property>
                                             <property name="left_padding">12</property>
                                             <child>
                                               <widget class="GtkHBox" id="boxAthleteGraph">
-                                                <property name="height_request">150</property>
+                                                <property name="height_request">30</property>
                                                 <property name="visible">True</property>
                                                 <child>
                                                   <placeholder/>
@@ -5320,7 +5862,7 @@ Calories</property>
                                           </widget>
                                         </child>
                                         <child>
-                                          <widget class="GtkLabel" id="label14">
+                                          <widget class="GtkLabel" id="label15">
                                             <property name="visible">True</property>
                                             <property name="label" translatable="yes"><b>History</b></property>
                                             <property name="use_markup">True</property>
@@ -5356,6 +5898,321 @@ Calories</property>
                                 <property name="type">tab</property>
                               </packing>
                             </child>
+                            <child>
+                              <widget class="GtkHBox" id="statsarea">
+                                <property name="visible">True</property>
+                                <child>
+                                  <widget class="GtkVPaned" id="vbox3">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="position">160</property>
+                                    <child>
+                                      <widget class="GtkFrame" id="frame9">
+                                        <property name="visible">True</property>
+                                        <property name="label_xalign">0</property>
+                                        <child>
+                                          <widget class="GtkAlignment" id="alignment10">
+                                            <property name="visible">True</property>
+                                            <property name="left_padding">12</property>
+                                            <child>
+                                              <widget class="GtkScrolledWindow" id="scrolledwindow_stats">
+        					                    <property name="visible">True</property>
+        					                    <property name="can_focus">True</property>
+        					                    <property name="hscrollbar_policy">automatic</property>
+        					                    <property name="vscrollbar_policy">automatic</property>
+        					                    <child>
+                                              	  <widget class="GtkTreeView" id="statsTreeView">
+                                                  <property name="visible">True</property>
+                                                  <property name="can_focus">True</property>
+                                                  <signal name="button_press_event" handler="on_sportstatsTreeView_button_press"/>
+                                              	  </widget>
+                                            	</child>
+                                              </widget>  
+					                        </child>
+                                          </widget>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label27">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes"><b>Sports</b></property>
+                                            <property name="use_markup">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="type">label_item</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="resize">False</property>
+                                        <property name="shrink">True</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkFrame" id="frame1123">
+                                        <property name="visible">True</property>
+                                        <property name="label_xalign">0</property>
+                                        <child>
+                                          <widget class="GtkAlignment" id="alignment101">
+                                            <property name="visible">True</property>
+                                            <property name="left_padding">12</property>
+                                            <child>
+                                              <widget class="GtkHBox" id="total_vbox">
+                                                <property name="visible">True</property>
+                                                <property name="border_width">5</property>
+                                                <property name="spacing">8</property>
+                                                <child>
+                                                  <widget class="GtkVBox" id="vbox123">
+                                                    <property name="visible">True</property>
+                                                    <child>
+                                                      <widget class="GtkComboBoxEntry" id="total_combovalue">
+                                                        <property name="visible">True</property>
+                                                        <property name="items" translatable="yes">Distance
+Time
+Average Heart Rate
+Average Speed
+Calories</property>
+                                                        <signal name="changed" handler="on_total_combovalue_changed"/>
+                                                      </widget>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="position">0</property>
+                                                      </packing>
+                                                    </child>
+                                                    <child>
+                                                      <widget class="GtkLabel" id="label-39">
+                                                        <property name="visible">True</property>
+                                                        <property name="label" translatable="yes">Versus</property>
+                                                      </widget>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="fill">False</property>
+                                                        <property name="position">1</property>
+                                                      </packing>
+                                                    </child>
+                                                    <child>
+                                                      <widget class="GtkComboBoxEntry" id="total_combovalue2">
+                                                        <property name="visible">True</property>
+                                                        <property name="items" translatable="yes">None
+Distance
+Time
+Average Heart Rate
+Average Speed
+Calories</property>
+                                                        <signal name="changed" handler="on_total_combovalue_changed"/>
+                                                      </widget>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="position">2</property>
+                                                      </packing>
+                                                    </child>
+                                                    <child>
+                                                      <widget class="GtkTable" id="table3">
+                                                        <property name="visible">True</property>
+                                                        <property name="n_rows">4</property>
+                                                        <property name="n_columns">2</property>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="label19">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">1</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="label" translatable="yes">Total distance:</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="label28">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">1</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="label" translatable="yes">Total duration:</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">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="labelTotalDistance">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">0</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="xpad">5</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="left_attach">1</property>
+                                                            <property name="right_attach">2</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="labelTotalDuration">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">0</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="xpad">5</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="left_attach">1</property>
+                                                            <property name="right_attach">2</property>
+                                                            <property name="top_attach">1</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="label21a">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">1</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="label" translatable="yes">Start date:</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="top_attach">3</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="label22a">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">1</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="label" translatable="yes">End date:</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="top_attach">4</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="labelStartDate">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">0</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="xpad">5</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="left_attach">1</property>
+                                                            <property name="right_attach">4</property>
+                                                            <property name="top_attach">3</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <widget class="GtkLabel" id="labelEndDate">
+                                                            <property name="visible">True</property>
+                                                            <property name="xalign">0</property>
+                                                            <property name="yalign">0</property>
+                                                            <property name="xpad">5</property>
+                                                          </widget>
+                                                          <packing>
+                                                            <property name="left_attach">1</property>
+                                                            <property name="right_attach">4</property>
+                                                            <property name="top_attach">4</property>
+                                                            <property name="x_options">GTK_FILL</property>
+                                                            <property name="y_options">GTK_SHRINK</property>
+                                                            <property name="x_padding">10</property>
+                                                            <property name="y_padding">10</property>
+                                                          </packing>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                        <child>
+                                                          <placeholder/>
+                                                        </child>
+                                                      </widget>
+                                                      <packing>
+                                                        <property name="position">3</property>
+                                                      </packing>
+                                                    </child>
+                                                  </widget>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="position">0</property>
+                                                  </packing>
+                                                </child>
+                                              </widget>
+                                            </child>
+                                          </widget>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label271">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes"><b>All</b></property>
+                                            <property name="use_markup">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="type">label_item</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="resize">False</property>
+                                        <property name="shrink">True</property>
+                                      </packing>
+                                    </child>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="position">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label29">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Totals</property>
+                              </widget>
+                              <packing>
+                                <property name="position">7</property>
+                                <property name="tab_fill">False</property>
+                                <property name="type">tab</property>
+                              </packing>
+                            </child>
                           </widget>
                           <packing>
                             <property name="position">1</property>
@@ -5379,7 +6236,7 @@ Calories</property>
                     <property name="visible">True</property>
                     <child>
                       <widget class="GtkHBox" id="hbox36">
-                        <property name="height_request">43</property>
+                        <property name="height_request">40</property>
                         <property name="visible">True</property>
                         <property name="border_width">8</property>
                         <property name="spacing">8</property>
@@ -5399,7 +6256,7 @@ Calories</property>
                           <widget class="GtkEntry" id="lsa_searchvalue">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="invisible_char">●</property>
+                            <property name="invisible_char">&#x25CF;</property>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
@@ -5523,6 +6380,7 @@ Last 12 months</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <signal name="button_press_event" handler="on_allRecordTreeView_button_press"/>
+                            <signal name="row_activated" handler="on_recordTree_clicked"/>
                           </widget>
                         </child>
                       </widget>
@@ -5545,13 +6403,13 @@ Last 12 months</property>
                   <widget class="GtkVBox" id="waypointarea">
                     <property name="visible">True</property>
                     <child>
-                      <widget class="GtkFrame" id="frame10">
+                      <widget class="GtkFrame" id="frame12">
                         <property name="visible">True</property>
                         <property name="border_width">9</property>
                         <property name="label_xalign">0</property>
                         <property name="shadow_type">in</property>
                         <child>
-                          <widget class="GtkAlignment" id="alignment10">
+                          <widget class="GtkAlignment" id="alignment15">
                             <property name="visible">True</property>
                             <property name="left_padding">12</property>
                             <child>
@@ -5564,7 +6422,7 @@ Last 12 months</property>
                                   <widget class="GtkHBox" id="hbox44">
                                     <property name="visible">True</property>
                                     <child>
-                                      <widget class="GtkLabel" id="label-39">
+                                      <widget class="GtkLabel" id="label-40">
                                         <property name="visible">True</property>
                                       </widget>
                                       <packing>
@@ -5613,7 +6471,7 @@ Last 12 months</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label-40">
+                                  <widget class="GtkLabel" id="label-41">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
                                     <property name="label" translatable="yes">Type:</property>
@@ -5642,7 +6500,7 @@ Summit</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label-41">
+                                  <widget class="GtkLabel" id="label-42">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
                                     <property name="label" translatable="yes">Latitude: </property>
@@ -5656,7 +6514,7 @@ Summit</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label-42">
+                                  <widget class="GtkLabel" id="label-43">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
                                     <property name="label" translatable="yes"> Name:</property>
@@ -5668,7 +6526,7 @@ Summit</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label-43">
+                                  <widget class="GtkLabel" id="label-44">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
                                     <property name="label" translatable="yes">Longitude:</property>
@@ -5684,7 +6542,7 @@ Summit</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label-44">
+                                  <widget class="GtkLabel" id="label-45">
                                     <property name="visible">True</property>
                                     <property name="xalign">0</property>
                                     <property name="label" translatable="yes">Description:</property>
@@ -5701,7 +6559,7 @@ Summit</property>
                                   <widget class="GtkEntry" id="waypoint_longitude">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char">&#x25CF;</property>
                                   </widget>
                                   <packing>
                                     <property name="left_attach">3</property>
@@ -5716,7 +6574,7 @@ Summit</property>
                                   <widget class="GtkEntry" id="waypoint_description">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char">&#x25CF;</property>
                                   </widget>
                                   <packing>
                                     <property name="left_attach">1</property>
@@ -5731,7 +6589,7 @@ Summit</property>
                                   <widget class="GtkEntry" id="waypoint_latitude">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char">&#x25CF;</property>
                                   </widget>
                                   <packing>
                                     <property name="left_attach">3</property>
@@ -5744,7 +6602,7 @@ Summit</property>
                                   <widget class="GtkEntry" id="waypoint_name">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char">&#x25CF;</property>
                                   </widget>
                                   <packing>
                                     <property name="left_attach">1</property>
@@ -5761,7 +6619,7 @@ Summit</property>
                           </widget>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label-45">
+                          <widget class="GtkLabel" id="label-46">
                             <property name="visible">True</property>
                             <property name="label" translatable="yes"><b> Waypoint: </b></property>
                             <property name="use_markup">True</property>
@@ -5846,7 +6704,7 @@ Summit</property>
           </widget>
         </child>
         <child>
-          <widget class="GtkLabel" id="label15">
+          <widget class="GtkLabel" id="label30">
             <property name="visible">True</property>
             <property name="label">label162</property>
           </widget>
diff --git a/import/file_garmintcxv2.py b/import/file_garmintcxv2.py
index e137a85..b220fda 100644
--- a/import/file_garmintcxv2.py
+++ b/import/file_garmintcxv2.py
@@ -19,6 +19,7 @@
 
 import logging
 import os
+import traceback
 from lxml import etree
 from pytrainer.lib.date import Date
 
@@ -46,23 +47,43 @@ class garmintcxv2():
 		return self.activitiesSummary
 
 	def getDetails(self, activity, startTime):
-		points = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Trackpoint")
-		while True:
-			lastPoint = points[-1]
-			try:
-				distance = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters")
-				if distance is None:
+		logging.debug(">>")
+		distance = 0
+		duration = 0
+		laps = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Lap")
+		if laps:
+			for lap in laps:
+				lap_duration = float(lap.findtext(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}TotalTimeSeconds"))
+				lap_distance = float(lap.findtext(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters"))
+				logging.debug("Lap distance (m): %f | duration (s): %f" % (lap_distance, lap_duration))
+				distance += lap_distance
+				duration += lap_duration
+			hours = int(duration)//3600
+			minutes = (int(duration)/60)%60
+			seconds = int(duration)%60
+			duration_hhmmss = "%02d:%02d:%02d" % (hours, minutes, seconds)       
+			logging.debug("Activity distance (m): %f | duration (hh:mm:ss - s): %s - %f" % (distance, duration_hhmmss, duration))
+        	else:
+			points = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Trackpoint")
+			while True:
+				lastPoint = points[-1]
+				try:
+					distance = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters")
+					if distance is None:
+						points = points[:-1]
+						continue
+					time = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Time")
+					distance = distance.text
+					time = time.text
+					break
+				except:
+					#Try again without the last point (i.e work from end until find time and distance)
 					points = points[:-1]
 					continue
-				time = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Time")
-				distance = distance.text
-				time = time.text
-				break
-			except:
-				#Try again without the last point (i.e work from end until find time and distance)
-				points = points[:-1]
-				continue
-		return float(distance), self.getDateTime(time)[0]-startTime[0]
+			duration_hhmmss = self.getDateTime(time)[0]-startTime[0]
+			logging.debug("Activity distance (m): %f | duration (hh:mm:ss): %s" % (distance, duration_hhmmss))
+		logging.debug("<<")
+		return float(distance), duration_hhmmss
 
 	def testFile(self, filename):
 		logging.debug('>>')
@@ -95,7 +116,7 @@ class garmintcxv2():
 				#print self.activitiesSummary
 				return True
 		except:
-			#Not valid file
+			logging.debug("Traceback: %s" % traceback.format_exc())
 			return False 
 		return False
 
diff --git a/locale/da/LC_MESSAGES/Makefile b/locale/da/LC_MESSAGES/Makefile
index 6da4637..192c357 100755
--- a/locale/da/LC_MESSAGES/Makefile
+++ b/locale/da/LC_MESSAGES/Makefile
@@ -1,7 +1,7 @@
 default:
-	msgfmt pytrainer_dk.po -o ./pytrainer.mo
+	msgfmt pytrainer_da.po -o ./pytrainer.mo
 
 merge:
-	msgmerge pytrainer_dk.po pytrainer_dk.po_new > pytrainer_dk.po.tmp
-	mv pytrainer_de.pk.tmp pytrainer_dk.po
-	rm pytrainer_dk.po_new
+	msgmerge pytrainer_da.po pytrainer_da.po_new > pytrainer_da.po.tmp
+	mv pytrainer_da.po.tmp pytrainer_da.po
+	rm pytrainer_da.po_new
diff --git a/locale/da/LC_MESSAGES/pytrainer_dk.po b/locale/da/LC_MESSAGES/pytrainer_da.po
similarity index 100%
copy from locale/da/LC_MESSAGES/pytrainer_dk.po
copy to locale/da/LC_MESSAGES/pytrainer_da.po
diff --git a/locale/de/LC_MESSAGES/pytrainer_de.po b/locale/de/LC_MESSAGES/pytrainer_de.po
index 8167357..cf7b95e 100644
--- a/locale/de/LC_MESSAGES/pytrainer_de.po
+++ b/locale/de/LC_MESSAGES/pytrainer_de.po
@@ -1,583 +1,2243 @@
-# German translations for vud package.
-# Copyright (C) 2006 THE vud'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the vud package.
+# German translations for pytrainer package.
+# Copyright (C) 2006 THE PYTRAINER'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the pytrainer package.
 # Fiz Vazquez <vud1 at sindominio.net>, 2006.
-#
+# Erik Pfannenstein <debianignatz at gmx.de>, 2011.
+# Andreas Mair <amair.sob at googlemail.com>, 2011.
 msgid ""
 msgstr ""
-"Project-Id-Version: vud 1\n"
+"Project-Id-Version: pytrainer 1.9.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-21 11:53+0200\n"
-"PO-Revision-Date: 2009-06-24 14:55+0100\n"
-"Last-Translator: Noèl Köthe <noel at debian.org>\n"
-"Language-Team: German <translation-team-de at lists.sourceforge.net>\n"
+"POT-Creation-Date: 2011-11-12 16:59+0100\n"
+"PO-Revision-Date: 2011-11-12 10:41+0100\n"
+"Last-Translator: Andreas Mair <amair.sob at googlemail.com>\n"
+"Language-Team: debian-l10n-german at lists.debian.org\n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: glade/pytrainer.glade:10
-msgid "window1"
+"X-Generator: Virtaal 0.7.0\n"
+
+#: glade/calendar.glade:7
+msgid "Calendar"
+msgstr "Kalender"
+
+#: glade/equipment.glade:109
+msgid "<b>Equipment List</b>"
+msgstr "<b>Liste der Ausrüstungsgegenstände</b>"
+
+#: glade/equipment.glade:149 glade/equipment.glade:406
+#: pytrainer/gui/equipment.py:98
+msgid "Description"
+msgstr "Beschreibung"
+
+#: glade/equipment.glade:174 glade/equipment.glade:431
+msgid "Life Expectancy"
+msgstr "Lebenserwartung"
+
+#: glade/equipment.glade:211 glade/equipment.glade:467
+msgid "Prior Usage"
+msgstr "Vorherige Nutzung"
+
+#: glade/equipment.glade:243 glade/equipment.glade:499
+#: pytrainer/gui/equipment.py:102
+msgid "Active"
+msgstr "Aktiv"
+
+#: glade/equipment.glade:277 glade/equipment.glade:533
+#: pytrainer/gui/windowimportdata.py:353
+msgid "Notes"
+msgstr "Notizen"
+
+#: glade/equipment.glade:366
+msgid "<b>Add New Equipment</b>"
+msgstr "<b>Ausrüstung hinzufügen</b>"
+
+#: glade/equipment.glade:622
+msgid "<b>Edit Equipment</b>"
+msgstr "<b>Ausrüstung bearbeiten</b>"
+
+#: glade/equipment.glade:651
+msgid "Really delete the equipment item?"
+msgstr "Diesen Ausrüstungsgegenstand wirklich löschen?"
+
+#: glade/equipment.glade:704
+msgid "<b>Delete Equipment</b>"
+msgstr "<b>Ausrüstung löschen</b>"
+
+#: glade/extensions.glade:9 glade/pytrainer.glade:163
+msgid "Extensions"
+msgstr "Erweiterungen"
+
+#: glade/extensions.glade:54
+msgid "<b>Extension Details</b>"
+msgstr "<b>Erweiterungsdetails</b>"
+
+#: glade/extensions.glade:67
+msgid "name-entry"
+msgstr "name-entry"
+
+#: glade/extensions.glade:82 glade/plugins.glade:144 glade/profile.glade:728
+#: glade/pytrainer.glade:5703
+msgid "Name:"
+msgstr "Name:"
+
+#: glade/extensions.glade:96 glade/plugins.glade:115
+msgid "Status:"
+msgstr "Status:"
+
+#: glade/extensions.glade:110 glade/plugins.glade:86
+#: glade/pytrainer.glade:6548
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: glade/extensions.glade:124 glade/plugins.glade:100
+msgid "status-entry"
+msgstr "status-entry"
+
+#: glade/extensions.glade:139
+msgid "description-entry"
+msgstr "description-entry"
+
+#: glade/importdata.glade:7 glade/importdata.glade:325
+msgid "Import"
+msgstr "Importieren"
+
+#: glade/importdata.glade:36
+msgid ""
+"Test 1\n"
+"Test 2"
 msgstr ""
+"Test 1\n"
+"Test 2"
 
-#: glade/pytrainer.glade:40
-msgid "_File"
-msgstr "_Datei"
+#: glade/importdata.glade:46
+msgid "<b>Select your GPS device</b>"
+msgstr "<b>Wählen Sie Ihr GPS-Gerät</b>"
 
-#: glade/pytrainer.glade:64
-msgid "_Export as text separated by commas"
-msgstr "_Export als kommaseparierte Liste"
+#: glade/importdata.glade:64
+msgid "Import from GPS Device is not yet implemented"
+msgstr "Das Importieren von einem GPS-Gerät ist noch nicht implementiert"
 
-#: glade/pytrainer.glade:104
-msgid "_Edit"
-msgstr "_Bearbeiten"
+#: glade/importdata.glade:92
+msgid "<b>Tools</b>"
+msgstr "<b>Werkzeuge</b>"
 
-#: glade/pytrainer.glade:126
-msgid "_View"
-msgstr "_Ansicht"
+#: glade/importdata.glade:111
+msgid "Rescan"
+msgstr "Erneut scannen"
 
-#: glade/pytrainer.glade:135
-msgid "_Classic View"
-msgstr "_Klassisch"
+#: glade/importdata.glade:115
+msgid "Rescan system for available tools"
+msgstr "System erneut nach verfügbaren Werkzeugen durchsuchen"
 
-#: glade/pytrainer.glade:145
-msgid "_List View"
-msgstr "_Liste"
+#: glade/importdata.glade:168
+msgid "<b>Import from GPS Device</b>"
+msgstr "<b>Von GPS-Gerät importieren</b>"
 
-#: glade/pytrainer.glade:160
-msgid "_Help"
-msgstr "_Hilfe"
+#: glade/importdata.glade:221
+msgid "Remove selected files and the associated activities"
+msgstr "Ausgewählte Dateien und die verbundenen Aktivitäten löschen"
 
-#: glade/pytrainer.glade:283
-#: glade/pytrainer.glade:3262
-#: pytrainer/main.py:69
-#: pytrainer/main.py:72
-msgid "Sport"
-msgstr "Sportart"
+#: glade/importdata.glade:239
+msgid "Add files to import activities from"
+msgstr "Dateien hinzufügen, um Aktivitäten zu importieren"
 
-#: glade/pytrainer.glade:309
-msgid "All Sports"
-msgstr "Alle Sportarten"
+#: glade/importdata.glade:264
+msgid "<b>Add file(s) to import activities from</b>"
+msgstr "<b>Datei(en) hinzufügen, um Aktivitäten zu importieren</b>"
 
-#: glade/pytrainer.glade:404
-#: glade/pytrainer.glade:1061
-#: glade/pytrainer.glade:1322
-#: glade/pytrainer.glade:2045
-#: glade/pytrainer.glade:2306
-msgid "<b>Distance:</b>"
-msgstr "<b>Distanz:</b>"
+#: glade/importdata.glade:307
+msgid "<b>Select activities to import</b>"
+msgstr "<b>Aktivitäten auswählen, die Importiert werden sollen</b>"
 
-#: glade/pytrainer.glade:432
-#: glade/pytrainer.glade:1140
-#: glade/pytrainer.glade:1350
-#: glade/pytrainer.glade:2124
-#: glade/pytrainer.glade:2334
-msgid "<b>Time:</b>"
-msgstr "<b>Zeit:</b>"
+#: glade/importdata.glade:330
+msgid "Import selected activities"
+msgstr "Ausgewählte Aktivitäten importieren"
 
-#: glade/pytrainer.glade:460
-msgid "<b>Beats avg:</b>"
-msgstr "<b>Durschn. Puls:</b>"
+#: glade/importdata.glade:347
+msgid "Close Import dialog"
+msgstr "Import-Dialog schließen"
 
-#: glade/pytrainer.glade:488
-#: glade/pytrainer.glade:1406
-#: glade/pytrainer.glade:2390
-msgid "<b>Average:</b>"
-msgstr "<b>Durchschnitt:</b>"
+#: glade/importdata.glade:387
+msgid "<b>Import from File</b>"
+msgstr "<b>Importieren aus Datei</b>"
 
-#: glade/pytrainer.glade:516
-#: glade/pytrainer.glade:1434
-#: glade/pytrainer.glade:2418
-msgid "<b>Calories: </b>"
-msgstr "<b>Kalorien: </b>"
+#: glade/importdata.glade:464
+msgid "<b>Plugins</b>"
+msgstr "<b>Erweiterungen</b>"
 
-#: glade/pytrainer.glade:544
-#: glade/pytrainer.glade:1089
-#: glade/pytrainer.glade:2073
-msgid "Km"
-msgstr "km"
+#: glade/importdata.glade:491
+msgid "Import from GPS Device"
+msgstr "Vom GPS-Gerät importieren"
 
-#: glade/pytrainer.glade:572
-msgid "bpm"
-msgstr "bpm"
+#: glade/importdata.glade:510
+msgid "Import from File"
+msgstr "Aus Datei importieren"
 
-#: glade/pytrainer.glade:600
-msgid "km/h"
-msgstr "km/h"
+#: glade/importdata.glade:525
+msgid "Launch 'File Select' on start"
+msgstr "Beim Starten »Dateiauswahl« öffnen"
 
-#: glade/pytrainer.glade:628
-msgid "Cal"
-msgstr "Kal"
-
-#: glade/pytrainer.glade:705
-#: glade/pytrainer.glade:750
-#: glade/pytrainer.glade:1194
-#: glade/pytrainer.glade:1239
-#: glade/pytrainer.glade:1623
-#: glade/pytrainer.glade:1668
-#: glade/pytrainer.glade:2178
-#: glade/pytrainer.glade:2223
-#: glade/pytrainer.glade:2607
-#: glade/pytrainer.glade:2652
-#: glade/pytrainer.glade:3538
-#: glade/pytrainer.glade:3583
-msgid ":"
-msgstr ""
+#: glade/importdata.glade:530
+msgid "Automatically start the file selection dialog"
+msgstr "Dateiauswahl-Dialog automatisch starten"
 
-#: glade/pytrainer.glade:912
-msgid "<b>Date:</b>"
-msgstr "<b>Datum:</b>"
+#: glade/importdata.glade:546 glade/plugins.glade:9
+msgid "Plugins"
+msgstr "Erweiterungen"
 
-#: glade/pytrainer.glade:997
-msgid "Day"
-msgstr "Tag"
+#: glade/importdata.glade:572
+msgid "<b>Default to Tab</b>"
+msgstr "<b>Seite, die beim Öffnen angezeigt wird</b>"
 
-#: glade/pytrainer.glade:1378
-#: glade/pytrainer.glade:2362
-msgid "<b>Beats:</b>"
-msgstr "<b>Puls:</b>"
-
-#: glade/pytrainer.glade:1462
-#: glade/pytrainer.glade:2446
-msgid "Km/day"
-msgstr "km/Tag"
-
-#: glade/pytrainer.glade:1490
-#: glade/pytrainer.glade:2474
-msgid "bpm/day"
-msgstr "bpm/Tag"
-
-#: glade/pytrainer.glade:1518
-#: glade/pytrainer.glade:2502
-msgid "km/h/day"
-msgstr "km/h/Tag"
-
-#: glade/pytrainer.glade:1546
-#: glade/pytrainer.glade:2530
-msgid "cal/day"
-msgstr "Kalorien/Tag"
-
-#: glade/pytrainer.glade:1723
-#: glade/pytrainer.glade:2707
-msgid "time/day"
-msgstr "Zeit/Tag"
-
-#: glade/pytrainer.glade:1837
-msgid "<b>Month:</b>"
-msgstr "<b>Monat:</b>"
+#: glade/importdata.glade:595
+msgid "Reset"
+msgstr "Zurücksetzen"
 
-#: glade/pytrainer.glade:1912
-#: glade/pytrainer.glade:2896
-msgid "Value"
-msgstr "Wert"
+#: glade/importdata.glade:611 pytrainer/gui/filechooser.py:41
+msgid "Save"
+msgstr "Sichern"
 
-#: glade/pytrainer.glade:1937
-#: glade/pytrainer.glade:2921
-msgid ""
-"Kilometers\n"
-"Time\n"
-"Beats\n"
-"Average\n"
-"Calories"
-msgstr ""
-"Kilometer\n"
-"Zeit\n"
-"Puls\n"
-"Durchschnitt\n"
-"Kalorien"
+#: glade/importdata.glade:670
+msgid "<b>Options</b>"
+msgstr "<b>Optionen</b>"
 
-#: glade/pytrainer.glade:1981
-msgid "Month"
-msgstr "Monat"
+#: glade/importdata.glade:702
+msgid "<b>Select file to import from</b>"
+msgstr "<b>Wählen Sie die zu importierende Datei</b>"
 
-#: glade/pytrainer.glade:2821
-msgid "<b>Year:</b>"
-msgstr "<b>Jahr:</b>"
+#: glade/importdata.glade:731
+msgid "Tab"
+msgstr "Tabulator"
 
-#: glade/pytrainer.glade:2965
-msgid "Year"
-msgstr "Jahr"
+#: glade/importdata.glade:746
+msgid "Comma"
+msgstr "Komma"
 
-#: glade/pytrainer.glade:3008
-msgid "label154"
-msgstr ""
+#: glade/importdata.glade:763
+msgid "Other"
+msgstr "Anderes"
 
-#: glade/pytrainer.glade:3061
-msgid "label155"
-msgstr ""
+#: glade/importdata.glade:799
+msgid "Read File"
+msgstr "Datei lesen"
 
-#: glade/pytrainer.glade:3105
-#: glade/pytrainer.glade:3894
-msgid "New Entry"
-msgstr "Neuer Eintrag"
+#: glade/importdata.glade:820
+msgid "<b>File delimiter</b>"
+msgstr "<b>Trennzeichen</b>"
 
-#: glade/pytrainer.glade:3152
-#: pytrainer/main.py:72
+#: glade/importdata.glade:864 pytrainer/gui/windowmain.py:116
+#: pytrainer/gui/windowmain.py:131 pytrainer/gui/windowmain.py:184
+#: pytrainer/gui/windowmain.py:1498 pytrainer/gui/dialogselecttrack.py:40
 msgid "Date"
 msgstr "Datum"
 
-#: glade/pytrainer.glade:3203
+#: glade/importdata.glade:877 glade/importdata.glade:918
+#: glade/importdata.glade:933 glade/importdata.glade:1128
+#: glade/importdata.glade:1143 glade/importdata.glade:1158
+#: glade/importdata.glade:1173 glade/importdata.glade:1188
+#: glade/importdata.glade:1203 glade/importdata.glade:1218
+#: glade/importdata.glade:1233 glade/importdata.glade:1248
+#: glade/importdata.glade:1263 glade/importdata.glade:1278
+#: glade/importdata.glade:1293
+msgid "Exclude"
+msgstr "Ausschließen"
+
+#: glade/importdata.glade:892 pytrainer/recordgraph.py:134
+#: pytrainer/recordgraph.py:136 pytrainer/recordgraph.py:138
+#: pytrainer/recordgraph.py:140 pytrainer/recordgraph.py:142
+#: pytrainer/recordgraph.py:144 pytrainer/recordgraph.py:146
+#: pytrainer/monthgraph.py:26 pytrainer/heartrategraph.py:36
+#: pytrainer/totalgraph.py:24 pytrainer/yeargraph.py:26
+#: pytrainer/daygraph.py:52 pytrainer/daygraph.py:54 pytrainer/daygraph.py:56
+#: pytrainer/weekgraph.py:28
+msgid "Distance (km)"
+msgstr "Strecke (km)"
+
+#: glade/importdata.glade:905
+msgid "Duration (sec)"
+msgstr "Dauer (s)"
+
+#: glade/importdata.glade:947
+msgid "<b>PyTrainer Field</b>"
+msgstr "<b>PyTrainer-Feld</b>"
+
+#: glade/importdata.glade:958
+msgid "<b>File Column</b>"
+msgstr "<b>Spalte in Datei</b>"
+
+#: glade/importdata.glade:972 pytrainer/gui/windowmain.py:115
+#: pytrainer/gui/windowmain.py:1497
+msgid "Title"
+msgstr "Titel"
+
+#: glade/importdata.glade:985
+msgid "Descent (m)"
+msgstr "Abstieg (m)"
+
+#: glade/importdata.glade:998
+msgid "Accent (m)"
+msgstr "Aufstieg (m)"
+
+#: glade/importdata.glade:1011
+msgid "Calories (kcal)"
+msgstr "Kalorien (kcal)"
+
+#: glade/importdata.glade:1024
+msgid "Max Speed (km/h)"
+msgstr "Höchstgeschwindigkeit (km/h)"
+
+#: glade/importdata.glade:1037 pytrainer/monthgraph.py:29
+#: pytrainer/totalgraph.py:27 pytrainer/yeargraph.py:29
+#: pytrainer/weekgraph.py:31
+msgid "Average Speed (km/h)"
+msgstr "Durchschnittsgeschwindigkeit (km/h)"
+
+#: glade/importdata.glade:1050 glade/pytrainer.glade:277
+#: pytrainer/gui/windowmain.py:110 pytrainer/gui/windowmain.py:118
+#: pytrainer/gui/windowmain.py:140 pytrainer/gui/windowmain.py:1500
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:211
+#: pytrainer/gui/windowprofile.py:65
+msgid "Sport"
+msgstr "Sportart"
+
+#: glade/importdata.glade:1063
+msgid "Average Heartrate (bpm)"
+msgstr "Durchschnitts-Herzfrequenz (bpm)"
+
+#: glade/importdata.glade:1076
+msgid "Max Heartrate (bpm)"
+msgstr "Höchste Herzfrequenz (bpm)"
+
+#: glade/importdata.glade:1089 pytrainer/recordgraph.py:138
+msgid "Pace (min/km)"
+msgstr "Tempo (min/km)"
+
+#: glade/importdata.glade:1102
+msgid "Max Pace (min/km)"
+msgstr "Höchsttempo (min/km)"
+
+#: glade/importdata.glade:1115 glade/newrecord.glade:1092
+#: pytrainer/gui/windowmain.py:167
+msgid "Comments"
+msgstr "Kommentare"
+
+#: glade/importdata.glade:1309
+msgid "Force sport to:"
+msgstr "erzwinge Sportart:"
+
+#: glade/importdata.glade:1323 glade/newrecord.glade:404
 msgid " "
+msgstr " "
+
+#: glade/importdata.glade:1394
+msgid "<b>Map Columns</b>"
+msgstr "<b>Spalten zuordnen</b>"
+
+#: glade/importdata.glade:1414
+msgid ""
+"<small>This is an experiemental import for delimited files\n"
+"1) Select a file\n"
+"2) Click 'Read File' to analyse the file\n"
+"3) Map columns in the file to pytrainer data elements (Date is required)\n"
+"4) Click 'Import Data'</small>"
 msgstr ""
+"<small>Experimenteller Import für strukturierte Dateien\n"
+"1) Eine Datei auswählen\n"
+"2) »Datei lesen« anklicken, um die Datei zu analysieren\n"
+"3) Die Spalten in der Datei den PyTrainer Feldern zuordnen (Datum ist "
+"zwingend)\n"
+"4) »Daten importieren« anklicken</small>"
+
+#: glade/importdata.glade:1427
+msgid "Import Data"
+msgstr "Daten importieren"
+
+#: glade/importdata.glade:1467
+msgid "<b>Import from CSV</b>"
+msgstr "<b>CSV-Datei importieren</b>"
+
+#: glade/newrecord.glade:7 pytrainer/gui/windowmain.py:2164
+msgid "New Entry"
+msgstr "Neuer Eintrag"
 
-#: glade/pytrainer.glade:3317
-#: pytrainer/main.py:72
-msgid "Title"
-msgstr "Titel"
+#: glade/newrecord.glade:61
+msgid "Title:"
+msgstr "Titel:"
 
-#: glade/pytrainer.glade:3378
-msgid "Beats avg (bpm)"
-msgstr "Durchschnittlicher Puls (bpm)"
+#: glade/newrecord.glade:85
+msgid "GPX File:"
+msgstr "GPX-Datei:"
 
-#: glade/pytrainer.glade:3434
-msgid "Distance (Km)"
-msgstr "Distanz (km)"
+#: glade/newrecord.glade:129
+msgid "Calculate Values"
+msgstr "Werte berechnen"
 
-#: glade/pytrainer.glade:3484
-msgid "Time"
-msgstr "Zeit"
+#: glade/newrecord.glade:149
+msgid "Sport:"
+msgstr "Sportart:"
+
+#: glade/newrecord.glade:184
+msgid "<b>Main</b>"
+msgstr "<b>Hauptsächlich</b>"
+
+#: glade/newrecord.glade:221
+msgid "Distance (Km):"
+msgstr "Strecke (km):"
+
+#: glade/newrecord.glade:230 glade/newrecord.glade:355
+#: glade/newrecord.glade:558 glade/newrecord.glade:695
+#: glade/newrecord.glade:956 glade/profile.glade:1548
+msgid "Calculate"
+msgstr "Berechnen"
+
+#: glade/newrecord.glade:248
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: glade/newrecord.glade:279 glade/newrecord.glade:306
+msgid ":"
+msgstr ":"
+
+#: glade/newrecord.glade:376
+msgid "Date:"
+msgstr "Datum:"
+
+#: glade/newrecord.glade:445
+msgid "Start Time:"
+msgstr "Startzeit:"
+
+#: glade/newrecord.glade:461
+msgid "12:00:00"
+msgstr "12:00:00"
+
+#: glade/newrecord.glade:486 glade/profile.glade:1586
+msgid "<b>General</b>"
+msgstr "<b>Allgemein</b>"
 
-#: glade/pytrainer.glade:3638
+#: glade/newrecord.glade:522
+msgid "Max (km/h):"
+msgstr "Maximal (km/h):"
+
+#: glade/newrecord.glade:547
 msgid "Average (km/h)"
 msgstr "Durchschnitt (km/h)"
 
-#: glade/pytrainer.glade:3688
-msgid "Calculate Distance"
-msgstr "Distanz berechnen"
+#: glade/newrecord.glade:593
+msgid "<b>Speed</b>"
+msgstr "<b>Geschwindigkeit</b>"
+
+#: glade/newrecord.glade:612
+msgid "Quick Entry"
+msgstr "Schneller Eintrag"
+
+#: glade/newrecord.glade:644
+msgid "Max (min/km):"
+msgstr "Maximal (min/km):"
+
+#: glade/newrecord.glade:670
+msgid "Pace (min/km):"
+msgstr "Tempo (min/km):"
+
+#: glade/newrecord.glade:716
+msgid "<b>Pace</b>"
+msgstr "<b>Tempo</b>"
+
+#: glade/newrecord.glade:752
+msgid "Ascent:"
+msgstr "Anstieg:"
 
-#: glade/pytrainer.glade:3708
-msgid "Calculate Time"
-msgstr "Zeit berechnen"
+#: glade/newrecord.glade:778
+msgid "Descent:"
+msgstr "Abstieg:"
 
-#: glade/pytrainer.glade:3728
-msgid "Calculate Average"
-msgstr "Durchschnitt berechnen"
+#: glade/newrecord.glade:811
+msgid "<b>Accumulated Altitude Change</b>"
+msgstr "<b>Aufgerechneter Höhenunterschied</b>"
 
-#: glade/pytrainer.glade:3769
+#: glade/newrecord.glade:848
+msgid "Max (bpm):"
+msgstr "Maximal (bpm):"
+
+#: glade/newrecord.glade:860
+msgid "Heart rate:"
+msgstr "Herzfrequenz:"
+
+#: glade/newrecord.glade:900 pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:165 pytrainer/gui/windowmain.py:1504
+#: pytrainer/monthgraph.py:30 pytrainer/totalgraph.py:28
+#: pytrainer/yeargraph.py:30 pytrainer/weekgraph.py:32
 msgid "Calories"
 msgstr "Kalorien"
 
-#: glade/pytrainer.glade:3825
+#: glade/newrecord.glade:929
+msgid ""
+"<small><b>Note:</b> In order to calculate the calories you must set the "
+"sport MET (in Preferences->Sport) </small>"
+msgstr ""
+"<small><b>Achtung:</b> Um die Kalorien zu berechnen, müssen Sie als Sportart "
+"»M.E.T.« angeben (in Einstellungen->Sportart)</small>"
+
+#: glade/newrecord.glade:1003
+msgid "<b>Heart Rate</b>"
+msgstr "<b>Herzfrequenz</b>"
+
+#: glade/newrecord.glade:1025
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: glade/newrecord.glade:1077
 msgid "<b>Comments</b>"
-msgstr "<b>Komentare</b>"
+msgstr "<b>Kommentare</b>"
 
-#: glade/pytrainer.glade:3999
-#: glade/pytrainer.glade:5586
-msgid "window2"
-msgstr ""
+#: glade/newrecord.glade:1132
+msgid "<i>There are no active equipment items.</i>"
+msgstr "<i>Es gibt keine aktiven Ausrüstungsgegenstände.</i>"
 
-#: glade/pytrainer.glade:4044
-msgid "Name"
-msgstr "Name"
+#: glade/newrecord.glade:1186
+msgid "<b>Associated Equipment</b>"
+msgstr "<b>Zugehörige Ausrüstung</b>"
 
-#: glade/pytrainer.glade:4072
-msgid "Gender"
-msgstr "Geschlecht"
+#: glade/newrecord.glade:1201 glade/profile.glade:1446
+msgid "Equipment"
+msgstr "Ausrüstung"
 
-#: glade/pytrainer.glade:4100
-msgid "Weight"
-msgstr "Gewicht"
+#: glade/plugins.glade:53
+msgid "<b>Plugin Details</b>"
+msgstr "<b>Erweiterungsdetails</b>"
+
+#: glade/plugins.glade:68
+msgid "description-entry "
+msgstr "description-entry "
+
+#: glade/plugins.glade:129
+msgid "nameEntry"
+msgstr "nameEntry"
+
+#: glade/profile.glade:7
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: glade/profile.glade:37
+msgid "Metric system"
+msgstr "Metrisches System"
+
+#: glade/profile.glade:53
+msgid "U.S. customary units"
+msgstr "In den USA gebräuchliche Einheiten"
 
-#: glade/pytrainer.glade:4128
-msgid "Height"
-msgstr "Größe"
+#: glade/profile.glade:74
+msgid "<b>System of Measurement</b>"
+msgstr "<b>Maßsystem</b>"
 
-#: glade/pytrainer.glade:4219
-msgid "Age"
-msgstr "Alter"
+#: glade/profile.glade:103 glade/pytrainer.glade:2111
+msgid "Google"
+msgstr "Google"
 
-#: glade/pytrainer.glade:4292
-msgid "Profile"
-msgstr "Profil"
+#: glade/profile.glade:118 glade/pytrainer.glade:2094
+msgid "Open Street Map"
+msgstr "OpenStreetMap"
 
-#: glade/pytrainer.glade:4322
+#: glade/profile.glade:140
+msgid "<b>Default Map Viewer</b>"
+msgstr "<b>Voreingestellter Kartenbetrachter</b>"
+
+#: glade/profile.glade:176
+msgid "Database type:"
+msgstr "Typ:"
+
+#: glade/profile.glade:187
+msgid "Database host:"
+msgstr "Host:"
+
+#: glade/profile.glade:213
+msgid "Database name:"
+msgstr "Name:"
+
+#: glade/profile.glade:252
+msgid "Database user:"
+msgstr "Benutzer:"
+
+#: glade/profile.glade:267
+msgid "Database pass:"
+msgstr "Passwort:"
+
+#: glade/profile.glade:318
 msgid "<b>Database</b>"
 msgstr "<b>Datenbank</b>"
 
-#: glade/pytrainer.glade:4356
-msgid "Database Type"
-msgstr "Datenbank Typ"
+#: glade/profile.glade:340
+msgid "General"
+msgstr "Allgemein"
 
-#: glade/pytrainer.glade:4384
-msgid "Database Host"
-msgstr "Datenbank Host"
+#: glade/profile.glade:369
+msgid "User name:"
+msgstr "Benutzername:"
 
-#: glade/pytrainer.glade:4433
-msgid "Database Pass"
-msgstr "Datenbank Passwort"
+#: glade/profile.glade:380
+msgid "Gender:"
+msgstr "Geschlecht:"
 
-#: glade/pytrainer.glade:4482
-msgid "Database User "
-msgstr "Datenbank User"
+#: glade/profile.glade:407 glade/pytrainer.glade:5728
+msgid "Height:"
+msgstr "Größe:"
 
-#: glade/pytrainer.glade:4531
-msgid "Database Name"
-msgstr "Datenbank Name"
+#: glade/profile.glade:447 glade/pytrainer.glade:5715
+msgid "Date of birth:"
+msgstr "Geburtsdatum:"
 
-#: glade/pytrainer.glade:4612
-msgid "Database"
-msgstr "Datenbank"
+#: glade/profile.glade:520
+msgid "Weight:"
+msgstr "Gewicht:"
 
-#: glade/pytrainer.glade:4650
-msgid "<b>Sport list</b>"
-msgstr "<b>Sportartenliste: </b>"
+#: glade/profile.glade:542 glade/pytrainer.glade:5790
+msgid "<b>Athlete Details</b>"
+msgstr "<b>Athleten-Details</b>"
 
-#: glade/pytrainer.glade:4801
+#: glade/profile.glade:557 glade/pytrainer.glade:5893
+msgid "Athlete"
+msgstr "Athlet"
+
+#: glade/profile.glade:672
+msgid "<b>Sport List</b>"
+msgstr "<b>Sportartenliste</b>"
+
+#: glade/profile.glade:684
 msgid "llist"
+msgstr "llist"
+
+#: glade/profile.glade:739
+msgid "M.E.T.:"
+msgstr "M.E.T.:"
+
+#: glade/profile.glade:766
+msgid "Extra Weight:"
+msgstr "Zusätzliches Gewicht:"
+
+#: glade/profile.glade:802 glade/profile.glade:1218
+msgid ""
+"More information on determining yor M.E.T sport coefficient on Wikipedia"
 msgstr ""
+"Weitere Informationen zur Berechnung Ihres M.E.T.-Sportkoeffizienten finden "
+"Sie in der Wikipedia"
+
+#: glade/profile.glade:822
+msgid "Maximum Pace:"
+msgstr "Höchsttempo:"
 
-#: glade/pytrainer.glade:4830
-msgid "<b>Add new Sport</b>"
+#: glade/profile.glade:950
+msgid "<b>Add New Sport</b>"
 msgstr "<b>Sportart hinzufügen</b>"
 
-#: glade/pytrainer.glade:4990
+#: glade/profile.glade:965
 msgid "new"
 msgstr "neu"
 
-#: glade/pytrainer.glade:5025
-msgid "<b>Delete sport</b>"
-msgstr "<b>Sportart löschen</b>"
-
-#: glade/pytrainer.glade:5088
+#: glade/profile.glade:996
 msgid ""
-"You are going to remove a sport. When you delete a \n"
-"sport you delete the records asociated. Are you sure \n"
-"that you want do it?"
+"Deleting a sport removes associated records.\n"
+"Continue?"
 msgstr ""
-"Sie löschen eine Sportart. Wenn Sie eine Sportart \n"
-"löschen, dann werden auch die gespeicherten Daten \n"
-"dieser gelöscht. Sind Sie sicher, dass Sie das möchten?"
+"Beim Löschen einer Sportart werden auch die zugehörigen Aktivitäten "
+"entfernt.\n"
+"Fortfahren?"
+
+#: glade/profile.glade:1078
+msgid "<b>Delete Sport</b>"
+msgstr "<b>Sportart löschen</b>"
 
-#: glade/pytrainer.glade:5225
+#: glade/profile.glade:1110
 msgid "delete"
 msgstr "löschen"
 
-#: glade/pytrainer.glade:5260
-msgid "<b>Edit sport</b>"
+#: glade/profile.glade:1143
+msgid "Name"
+msgstr "Name"
+
+#: glade/profile.glade:1166
+msgid "M.E.T."
+msgstr "M.E.T.:"
+
+#: glade/profile.glade:1193 pytrainer/gui/windowprofile.py:65
+msgid "Extra Weight"
+msgstr "Zusätzliches Gewicht:"
+
+#: glade/profile.glade:1238 pytrainer/gui/windowprofile.py:65
+msgid "Maximum Pace"
+msgstr "Höchsttempo:"
+
+#: glade/profile.glade:1265 pytrainer/gui/windowmain.py:188
+#: pytrainer/gui/windowprofile.py:65
+msgid "Color"
+msgstr "Farbe"
+
+#: glade/profile.glade:1375
+msgid "<b>Edit Sport</b>"
 msgstr "<b>Sportart bearbeiten</b>"
 
-#: glade/pytrainer.glade:5323
-msgid "New name"
-msgstr "Neuer Name"
+#: glade/profile.glade:1386
+msgid "<b>lalaal</b>"
+msgstr "<b>lalaal</b>"
 
-#: glade/pytrainer.glade:5452
+#: glade/profile.glade:1408
 msgid "edit"
 msgstr "bearbeiten"
 
-#: glade/pytrainer.glade:5481
+#: glade/profile.glade:1424
 msgid "Sports"
 msgstr "Sportarten"
 
-#: glade/pytrainer.glade:5710
-msgid "pytrainer"
-msgstr "pytrainer"
+#: glade/profile.glade:1479
+msgid "Maximum heart rate:"
+msgstr "Höchste Herzfrequenz:"
 
-#: glade/pytrainer.glade:5711
-msgid "(c) Fiz Vazquez <vud1 at sindominio.net>"
-msgstr "© Fiz Vazquez <vud1 at sindominio.net>"
+#: glade/profile.glade:1490
+msgid "Resting heart rate:"
+msgstr "Ruhe-Herzfrequenz:"
 
-#: glade/pytrainer.glade:5712
-msgid "The training tool for the gnu people"
-msgstr "Das Trainingstoll für die GNU Leute"
+#: glade/profile.glade:1535
+msgid ""
+"<small><b>Note:</b> Maximum heart rate is calculated by subtracting the "
+"number 220 minus your age. </small>"
+msgstr ""
+"<small><b>Achtung:</b> Die maximale Herzfrequenz wird durch Abziehen Ihres "
+"Alters von der Zahl 220 berechnet.</small>"
 
-#: glade/pytrainer.glade:5713
+#: glade/profile.glade:1622
 msgid ""
-"(C) Fiz Vazquez\n"
-"\n"
-"  This program is free software; you can redistribute \n"
-"  it and/or modify it under the terms of the GNU \n"
-"  General Public License as published by the Free \n"
-"  Software Foundation; either version 2 of the License, \n"
-"  or (at your option) any later version.\n"
-"\n"
-"  This program is distributed in the hope that it will be \n"
-"  useful, but WITHOUT ANY WARRANTY; without even the\n"
-"  implied warranty of MERCHANTABILITY or FITNESS FOR \n"
-"  A PARTICULAR PURPOSE.  See the GNU General Public \n"
-"  License <http://www.opensource.org/gpl-license.html>\n"
-"  for more details.\n"
-"\n"
-"  You can found the license on Debian systems in the file\n"
-"  /usr/share/common-licenses/GPL\n"
+"<small><b>NOTE:</b> in order to use the Karvonen method you must cover the "
+"Resting hr field.</small>"
 msgstr ""
+"<small><b>Achtung:</b> Um die Karvonen-Methode anzuwenden, müssen Sie das "
+"Ruhe-Herzfrequenz-Feld ausfüllen.</small>"
+
+#: glade/profile.glade:1635
+msgid "Percentages based method"
+msgstr "Prozentbasierte Methode"
+
+#: glade/profile.glade:1651 pytrainer/gui/windowmain.py:794
+msgid "Karvonen method"
+msgstr "Karvonen-Methode"
+
+#: glade/profile.glade:1672
+msgid "Select how to calculate your heart rate zones."
+msgstr "Wählen Sie, wie Ihre Herzfrequenzzonen ermittelt werden sollen."
+
+#: glade/profile.glade:1711
+msgid "<b>Heart Rate Zones</b>"
+msgstr "<b>Herzfrequenzzonen</b>"
+
+#: glade/profile.glade:1733 pytrainer/recordgraph.py:140
+#: pytrainer/lib/activity.py:443 pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455 pytrainer/lib/activity.py:525
+#: pytrainer/heartrategraph.py:36 pytrainer/daygraph.py:56
+msgid "Heart Rate"
+msgstr "Herzfrequenz"
 
-#: glade/pytrainer.glade:5733
-msgid "pytrainer.e-oss.net"
-msgstr "pytrainer.e-oss.net"
+#: glade/profile.glade:1759
+msgid "Log Level"
+msgstr "Protokollierungsstufe"
 
-#: glade/pytrainer.glade:5735
+#: glade/profile.glade:1767
 msgid ""
-"Catalan: Eloi Crespillo Itchart <eloi at ikuszen.com>\n"
-"French: Dj <dj at djremixtheblog.be>\n"
-"Polish: Seweryn Kokot <skokot at po.opole.pl>\n"
-"german: Aleks <aleks at schnecklecker.de>\n"
-"Spanish: Fiz vazquez <vud1 at sindominio.net>"
+"Error\n"
+"Warning\n"
+"Info\n"
+"Debug"
 msgstr ""
+"Fehler\n"
+"Warnung\n"
+"Info\n"
+"Debug"
 
-#: glade/pytrainer.glade:5750
-msgid "Export "
-msgstr "Exportieren"
+#: glade/profile.glade:1785
+msgid "<small>What level of detail is written to the log?</small>"
+msgstr "<small>Wie detailliert soll das Protokoll sein?</small>"
 
-#: glade/pytrainer.glade:5821
-msgid "Edit Record"
-msgstr "Bearbeite Eintrag"
+#: glade/profile.glade:1799
+msgid "Validate"
+msgstr "Überprüfen"
+
+#: glade/profile.glade:1829
+msgid ""
+"<small>Do the plugins attempt to validate the input file before processing?</"
+"small>"
+msgstr ""
+"<small>Versuchen die Erweiterungen, die Eingabedatei vor der Verarbeitung zu "
+"überprüfen?</small>"
+
+#: glade/profile.glade:1845
+msgid "New Graph"
+msgstr "Neuer Graph"
 
-#: glade/pytrainer.glade:5842
-msgid "Show in classic view"
-msgstr "Zeige in klassischer Ansicht"
+#: glade/profile.glade:1874
+msgid "<small>Want to use experimental new approach to graphing?</small>"
+msgstr ""
+"<small>Wollen Sie eine experimentelle neue Herangehensweise zur "
+"Graphenzeichnung verwenden?</small>"
 
-#: glade/pytrainer.glade:5878
-msgid "dialog1"
+#: glade/profile.glade:1917
+msgid ""
+"<small>This screen shows the state of command line configurable options for "
+"pytrainer. These options can be changed here which will affect the current "
+"instance of pytrainer, they will not be remembered next time though</small>"
 msgstr ""
+"<small>Dieser Bildschirm zeigt den Status der über Kommandozeile "
+"einstellbaren Optionen für PyTrainer. Diese Optionen können hier geändert "
+"werden und betreffen die derzeit laufende PyTrainer-Instanz, werden aber bis "
+"zum nächsten Starten vergessen.</small>"
+
+#: glade/profile.glade:1938
+msgid "Startup Parameters"
+msgstr "Startparameter"
+
+#: glade/pytrainer.glade:24
+msgid "_File"
+msgstr "_Datei"
+
+#: glade/pytrainer.glade:39
+msgid "_Import"
+msgstr "_Importieren"
+
+#: glade/pytrainer.glade:60
+msgid "_Export as Text Separated by Commas"
+msgstr "_Exportieren als CSV-Datei"
+
+#: glade/pytrainer.glade:94
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: glade/pytrainer.glade:114
+msgid "_View"
+msgstr "_Ansicht"
+
+#: glade/pytrainer.glade:121
+msgid " _Classic View"
+msgstr "_Klassische Ansicht"
+
+#: glade/pytrainer.glade:131
+msgid " _List View"
+msgstr "_Listenansicht"
+
+#: glade/pytrainer.glade:141
+msgid " _Waypoints Editor"
+msgstr "_Wegpunkt-Editor"
+
+#: glade/pytrainer.glade:155
+msgid "Tools"
+msgstr "Werkzeuge"
 
-#: pytrainer/main.py:69
-#: pytrainer/main.py:72
+#: glade/pytrainer.glade:172
+msgid "GPS Device Plugins"
+msgstr "GPS-Geräteerweiterungen"
+
+#: glade/pytrainer.glade:185
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: glade/pytrainer.glade:290 glade/pytrainer.glade:6324
+msgid "All Sports"
+msgstr "Alle Sportarten"
+
+#: glade/pytrainer.glade:396
+msgid "<b>Sport:</b>"
+msgstr "<b>Sportart:</b>"
+
+#: glade/pytrainer.glade:408 glade/pytrainer.glade:3144
+#: glade/pytrainer.glade:3786 glade/pytrainer.glade:4440
+#: glade/pytrainer.glade:5170
+msgid "<b>Duration:</b>"
+msgstr "<b>Dauer:</b>"
+
+#: glade/pytrainer.glade:423 glade/pytrainer.glade:3234
+#: glade/pytrainer.glade:3865 glade/pytrainer.glade:4519
+#: glade/pytrainer.glade:5272
+msgid "<b>Speed:</b>"
+msgstr "<b>Geschwindigkeit:</b>"
+
+#: glade/pytrainer.glade:437 glade/pytrainer.glade:3402
+#: glade/pytrainer.glade:4060 glade/pytrainer.glade:4714
+#: glade/pytrainer.glade:5367
+msgid "<b>Pace:</b>"
+msgstr "<b>Tempo:</b>"
+
+#: glade/pytrainer.glade:451
+msgid "<b>Ascent:</b>"
+msgstr "<b>Anstieg:</b>"
+
+#: glade/pytrainer.glade:465
+msgid "<b>Calories:</b>"
+msgstr "<b>Kalorien: </b>"
+
+#: glade/pytrainer.glade:479
+msgid "<b>Comments:</b>"
+msgstr "<b>Kommentare:</b>"
+
+#: glade/pytrainer.glade:614
+msgid "<b>Date:</b>"
+msgstr "<b>Datum:</b>"
+
+#: glade/pytrainer.glade:628 glade/pytrainer.glade:3130
+#: glade/pytrainer.glade:3772 glade/pytrainer.glade:4426
+#: glade/pytrainer.glade:5156
+msgid "<b>Distance:</b>"
+msgstr "<b>Strecke:</b>"
+
+#: glade/pytrainer.glade:645
+msgid "<b>Max Speed</b>"
+msgstr "<b>Höchstgeschwindigkeit:</b>"
+
+#: glade/pytrainer.glade:661 glade/pytrainer.glade:3432
+#: glade/pytrainer.glade:4074 glade/pytrainer.glade:4728
+#: glade/pytrainer.glade:5382
+msgid "<b>Max Pace:</b>"
+msgstr "<b>Höchsttempo:</b>"
+
+#: glade/pytrainer.glade:677
+msgid "<b>Descent:</b>"
+msgstr "<b>Abstieg:</b>"
+
+#: glade/pytrainer.glade:769 glade/pytrainer.glade:3342
+#: glade/pytrainer.glade:3940 glade/pytrainer.glade:4594
+#: glade/pytrainer.glade:5082
+msgid "Cal"
+msgstr "cal"
+
+#: glade/pytrainer.glade:809 glade/pytrainer.glade:3104
+#: glade/pytrainer.glade:3746 glade/pytrainer.glade:4400
+#: glade/pytrainer.glade:5259 pytrainer/gui/windowmain.py:109
+msgid "Km"
+msgstr "km"
+
+#: glade/pytrainer.glade:824 glade/pytrainer.glade:3264
+#: glade/pytrainer.glade:3297 glade/pytrainer.glade:3895
+#: glade/pytrainer.glade:3988 glade/pytrainer.glade:4549
+#: glade/pytrainer.glade:4642 glade/pytrainer.glade:5302
+#: glade/pytrainer.glade:5318 pytrainer/gui/windowmain.py:920
+#: pytrainer/gui/windowmain.py:921 pytrainer/gui/windowmain.py:1049
+#: pytrainer/gui/windowmain.py:1050 pytrainer/gui/windowmain.py:1131
+#: pytrainer/gui/windowmain.py:1132 pytrainer/lib/activity.py:203
+msgid "km/h"
+msgstr "km/h"
+
+#: glade/pytrainer.glade:839
+msgid "<b>Equipment:</b>"
+msgstr "<b>Ausrüstung:</b>"
+
+#: glade/pytrainer.glade:935
+msgid "<b>Active / Rest:</b>"
+msgstr "<b>Aktiv / Ruhe:</b>"
+
+#: glade/pytrainer.glade:962
+msgid "h:m:s"
+msgstr "h:m:s"
+
+#: glade/pytrainer.glade:1007
+msgid "<b>Laps</b>"
+msgstr "<b>Runden</b>"
+
+#: glade/pytrainer.glade:1078
+msgid " <b>Title:</b>"
+msgstr "<b>Titel:</b>"
+
+#: glade/pytrainer.glade:1128 pytrainer/gui/windowmain.py:1726
+msgid "Show graph display options"
+msgstr "Optionen zur Graphendarstellung anzeigen"
+
+#: glade/pytrainer.glade:1146
+msgid ""
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+"Percentage\n"
+"Zone"
+msgstr ""
+"Profil\n"
+"Geschwindigkeit\n"
+"Tempo\n"
+"Herzfrequenz\n"
+"Rhythmus\n"
+"Prozente\n"
+"Zone"
+
+#: glade/pytrainer.glade:1163 glade/pytrainer.glade:4311
+#: glade/pytrainer.glade:4965 glade/pytrainer.glade:5618
+#: glade/pytrainer.glade:5984
+msgid "Versus"
+msgstr "Gegen"
+
+#: glade/pytrainer.glade:1174
+msgid ""
+"None\n"
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+msgstr ""
+"Nichts\n"
+"Profil\n"
+"Geschwindigkeit\n"
+"Tempo\n"
+"Herzfrequenz\n"
+"Rhythmus\n"
+
+#: glade/pytrainer.glade:1320
+msgid "<small>Graph Display Options</small>"
+msgstr "<small>Graphendarstellungs-Optionen</small>"
+
+#: glade/pytrainer.glade:1345 glade/pytrainer.glade:1560
+#: glade/pytrainer.glade:1780
+msgid "<small>Limits</small>"
+msgstr "<small>Grenzen</small>"
+
+#: glade/pytrainer.glade:1357 glade/pytrainer.glade:1572
+#: glade/pytrainer.glade:1826
+msgid "<small>Min</small>"
+msgstr "<small>Min</small>"
+
+#: glade/pytrainer.glade:1369 glade/pytrainer.glade:1584
+#: glade/pytrainer.glade:1838
+msgid "<small>Max</small>"
+msgstr "<small>Max</small>"
+
+#: glade/pytrainer.glade:1418 glade/pytrainer.glade:1640
+msgid "<small>Color</small>"
+msgstr "<small>Farbe</small>"
+
+#: glade/pytrainer.glade:1449 glade/pytrainer.glade:1653
+msgid "<small>Weight</small>"
+msgstr "<small>Gewicht</small>"
+
+#: glade/pytrainer.glade:1479
+msgid "Y1"
+msgstr "Y1"
+
+#: glade/pytrainer.glade:1490 glade/pytrainer.glade:1701
+msgid "<small>Smoothing</small>"
+msgstr "<small>Glättung</small>"
+
+#: glade/pytrainer.glade:1630
+msgid "Y2"
+msgstr "Y2"
+
+#: glade/pytrainer.glade:1770
+msgid "X"
+msgstr "X"
+
+#: glade/pytrainer.glade:1851
+msgid "<small>Distance</small>"
+msgstr "<small>Strecke:</small>"
+
+#: glade/pytrainer.glade:1880
+msgid "<small>Time</small>"
+msgstr "<small>Zeit</small>"
+
+#: glade/pytrainer.glade:1941
+msgid "Show Laps"
+msgstr "Runden anzeigen"
+
+#: glade/pytrainer.glade:1980
+msgid "Reset Graph"
+msgstr "Graph zurücksetzen"
+
+#: glade/pytrainer.glade:2042
+msgid "Redraw Map"
+msgstr "Karte neu zeichnen"
+
+#: glade/pytrainer.glade:2058
+msgid "<small>Show:</small>"
+msgstr "<small>Zeigen:</small>"
+
+#: glade/pytrainer.glade:2069
+msgid ""
+"None\n"
+"Speed\n"
+"Heart rate\n"
+"Cadence"
+msgstr ""
+"Nichts\n"
+"Geschwindigkeit\n"
+"Herzfrequenz\n"
+"Rhythmus"
+
+#: glade/pytrainer.glade:2084
+msgid "<small>Display map using:</small>"
+msgstr "<small>Zum Anzeigen der Karte verwenden:</small>"
+
+#: glade/pytrainer.glade:2185
+msgid "<b>Beats:</b>"
+msgstr "<b>Schläge:</b>"
+
+#: glade/pytrainer.glade:2197 glade/pytrainer.glade:3312
+#: glade/pytrainer.glade:3910 glade/pytrainer.glade:4564
+#: glade/pytrainer.glade:5052
+msgid "<b>Calories: </b>"
+msgstr "<b>Kalorien: </b>"
+
+#: glade/pytrainer.glade:2211 glade/pytrainer.glade:3464
+#: glade/pytrainer.glade:4138 glade/pytrainer.glade:4792
+#: glade/pytrainer.glade:5430
+msgid "<b>Max Beats:</b>"
+msgstr "<b>Höchste Schlaganzahl:</b>"
+
+#: glade/pytrainer.glade:2225
+msgid "<b>HR Zones Method:</b>"
+msgstr "<b>HF-Zonen-Methode:</b>"
+
+#: glade/pytrainer.glade:2240
+msgid "<b>HR Zone5:</b>"
+msgstr "<b>HF-Zone5:</b>"
+
+#: glade/pytrainer.glade:2255 glade/pytrainer.glade:2454
+msgid " bpm"
+msgstr " bpm"
+
+#: glade/pytrainer.glade:2271
+msgid " Cal"
+msgstr " cal"
+
+#: glade/pytrainer.glade:2329
+msgid "<b>HR Zone4:</b>"
+msgstr "<b>HF-Zone4:</b>"
+
+#: glade/pytrainer.glade:2345
+msgid "<b>HR Zone3:</b>"
+msgstr "<b>HF-Zone3:</b>"
+
+#: glade/pytrainer.glade:2361
+msgid "<b>HR Zone2:</b>"
+msgstr "<b>HF-Zone2:</b>"
+
+#: glade/pytrainer.glade:2377
+msgid "<b>HR Zone1:</b>"
+msgstr "<b>HF-Zone1:</b>"
+
+#: glade/pytrainer.glade:2479 glade/pytrainer.glade:2491
+#: glade/pytrainer.glade:2506 glade/pytrainer.glade:2521
+#: glade/pytrainer.glade:2536 glade/pytrainer.glade:3387
+#: glade/pytrainer.glade:3481 glade/pytrainer.glade:4045
+#: glade/pytrainer.glade:4123 glade/pytrainer.glade:4699
+#: glade/pytrainer.glade:4777 glade/pytrainer.glade:5127
+#: glade/pytrainer.glade:5334 pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:525
+msgid "bpm"
+msgstr "bpm"
+
+#: glade/pytrainer.glade:2581
+msgid " <b>Heart Rate:</b>"
+msgstr " <b>Herzfrequenz:</b>"
+
+#: glade/pytrainer.glade:2769
+msgid "<b>Projected times</b>"
+msgstr "<b>Geplante Zeiten</b>"
+
+#: glade/pytrainer.glade:2799
+msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>"
+msgstr ""
+"<i>Relativ zu sportgleichen Aktivitäten für Distanzen ± x% anordnen:</i>"
+
+#: glade/pytrainer.glade:2832
+msgid "<b>Range:</b>"
+msgstr "<b>Bereich:</b>"
+
+#: glade/pytrainer.glade:2845
+msgid "<b>Rank:</b>"
+msgstr "<b>Rang:</b>"
+
+#: glade/pytrainer.glade:2858
+msgid "<b>Speed: </b>"
+msgstr "<b>Geschwindigkeit:</b>"
+
+#: glade/pytrainer.glade:2871
+msgid "<b>Avg speed:</b>"
+msgstr "<b>Durchschnittsgeschwindigkeit:</b>"
+
+#: glade/pytrainer.glade:2884
+msgid "<b>Standard deviation:</b>"
+msgstr "<b>Standardabweichung</b>"
+
+#: glade/pytrainer.glade:2898
+msgid "<b>Deviation:</b>"
+msgstr "<b>Abweichung:</b>"
+
+#: glade/pytrainer.glade:3017
+msgid "<b>Ranking</b>"
+msgstr "<b>Rangfolge</b>"
+
+#: glade/pytrainer.glade:3043
+msgid "<b>Analytics:</b>"
+msgstr "<b>Analysen:</b>"
+
+#: glade/pytrainer.glade:3071
+msgid "Record"
+msgstr "Eintrag"
+
+#: glade/pytrainer.glade:3280 glade/pytrainer.glade:3956
+#: glade/pytrainer.glade:4610 glade/pytrainer.glade:5350
+msgid "<b>Max Speed:</b>"
+msgstr "<b>Höchstgeschwindigkeit:</b>"
+
+#: glade/pytrainer.glade:3357 glade/pytrainer.glade:4015
+#: glade/pytrainer.glade:4669 glade/pytrainer.glade:5097
+msgid "<b>Beats avg:</b>"
+msgstr "<b>Durchschn. Schläge:</b>"
+
+#: glade/pytrainer.glade:3417 glade/pytrainer.glade:3449
+#: glade/pytrainer.glade:4091 glade/pytrainer.glade:4107
+#: glade/pytrainer.glade:4745 glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:5399 glade/pytrainer.glade:5415
+#: pytrainer/gui/windowmain.py:922 pytrainer/gui/windowmain.py:923
+#: pytrainer/gui/windowmain.py:1051 pytrainer/gui/windowmain.py:1052
+#: pytrainer/gui/windowmain.py:1133 pytrainer/gui/windowmain.py:1134
+#: pytrainer/lib/activity.py:204
+msgid "min/km"
+msgstr "min/km"
+
+#: glade/pytrainer.glade:3556 glade/pytrainer.glade:4199
+#: glade/pytrainer.glade:4853 glade/pytrainer.glade:5506
+msgid "<b>Total Asc/Desc:</b>"
+msgstr "<b>Gesamter An-/Abstieg:</b>"
+
+#: glade/pytrainer.glade:3583 glade/pytrainer.glade:4226
+#: glade/pytrainer.glade:4880 glade/pytrainer.glade:5533
+#: pytrainer/gui/windowmain.py:2070 pytrainer/gui/windowmain.py:2072
+#: pytrainer/lib/activity.py:205
+msgid "m"
+msgstr "m"
+
+#: glade/pytrainer.glade:3602
+msgid " <b>Date:</b>"
+msgstr "<b>Datum:</b>"
+
+#: glade/pytrainer.glade:3645
+msgid "Value"
+msgstr "Wert"
+
+#: glade/pytrainer.glade:3656
+msgid ""
+"Stage Profile\n"
+"Stage Velocity\n"
+"Stage Profile/velocity"
+msgstr ""
+"Profil bereitstellen\n"
+"Geschwindigkeit bereitstellen\n"
+"Profil/Geschwindigkeit bereitstellen"
+
+#: glade/pytrainer.glade:3712
+msgid "Day"
+msgstr "Tag"
+
+#: glade/pytrainer.glade:4245
+msgid " <b>Week:</b>"
+msgstr "<b>Woche:</b>"
+
+#: glade/pytrainer.glade:4296 glade/pytrainer.glade:4950
+#: glade/pytrainer.glade:5603 glade/pytrainer.glade:5969
+msgid ""
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Strecke\n"
+"Zeit\n"
+"Durchschnitts-Herzfrequenz\n"
+"Durchschnittsgeschwindigkeit\n"
+"Kalorien"
+
+#: glade/pytrainer.glade:4322 glade/pytrainer.glade:4976
+#: glade/pytrainer.glade:5629 glade/pytrainer.glade:5995
+msgid ""
+"None\n"
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Nichts\n"
+"Strecke\n"
+"Zeit\n"
+"Duchschnittliche Herzfrequenz\n"
+"Durchschnittsgeschwindigkeit\n"
+"Kalorien"
+
+#: glade/pytrainer.glade:4366
+msgid "Week"
+msgstr "Woche"
+
+#: glade/pytrainer.glade:4899
+msgid " <b>Month:</b>"
+msgstr "<b>Monat:</b>"
+
+#: glade/pytrainer.glade:5019
+msgid "Month"
+msgstr "Monat"
+
+#: glade/pytrainer.glade:5552
+msgid " <b>Year:</b>"
+msgstr "<b>Jahr:</b>"
+
+#: glade/pytrainer.glade:5672
+msgid "Year"
+msgstr "Jahr"
+
+#: glade/pytrainer.glade:5826
+msgid "<b>Graph</b>"
+msgstr "<b>Graph:</b>"
+
+#: glade/pytrainer.glade:5867
+msgid "<b>History</b>"
+msgstr "<b>Geschichte</b>"
+
+#: glade/pytrainer.glade:5937
+msgid "<b>Sports</b>"
+msgstr "<b>Sportarten</b>"
+
+#: glade/pytrainer.glade:6018
+msgid "Total distance:"
+msgstr "Gesamtstrecke:"
+
+#: glade/pytrainer.glade:6032
+msgid "Total duration:"
+msgstr "Gesamtdauer:"
+
+#: glade/pytrainer.glade:6081
+msgid "Start date:"
+msgstr "Startdatum:"
+
+#: glade/pytrainer.glade:6096
+msgid "End date:"
+msgstr "Enddatum:"
+
+#: glade/pytrainer.glade:6182
+msgid "<b>All</b>"
+msgstr "<b>Alles</b>"
+
+#: glade/pytrainer.glade:6208
+msgid "Totals"
+msgstr "Insgesamt"
+
+#: glade/pytrainer.glade:6246
+msgid "<b>Title:</b>"
+msgstr "<b>Titel:</b>"
+
+#: glade/pytrainer.glade:6269
+msgid "Search"
+msgstr "Suche"
+
+#: glade/pytrainer.glade:6293 pytrainer/lib/listview.py:3
+#: pytrainer/lib/listview.py:10
+msgid "All Distances"
+msgstr "Alle Strecken"
+
+#: glade/pytrainer.glade:6302 pytrainer/lib/listview.py:35
+msgid "All Durations"
+msgstr "Alle Laufzeiten"
+
+#: glade/pytrainer.glade:6312
+msgid ""
+"All time\n"
+"Last 4 weeks\n"
+"Last 6 months\n"
+"Last 12 months"
+msgstr ""
+"Seit Anbeginn der Zeit\n"
+"Letzte 4 Wochen\n"
+"Letzte 6 Wochen\n"
+"Letzte 12 Wochen"
+
+#: glade/pytrainer.glade:6349
+msgid "Columns"
+msgstr "Spalten"
+
+#: glade/pytrainer.glade:6477
+msgid "Type:"
+msgstr "Typ:"
+
+#: glade/pytrainer.glade:6490
+msgid ""
+"Font\n"
+"Restaurant\n"
+"Scenic Area\n"
+"Summit"
+msgstr ""
+"Schrift\n"
+"Restaurant\n"
+"Landschaft\n"
+"Gipfel"
+
+#: glade/pytrainer.glade:6506
+msgid "Latitude: "
+msgstr "Breitengrad: "
+
+#: glade/pytrainer.glade:6520
+msgid " Name:"
+msgstr "Name:"
+
+#: glade/pytrainer.glade:6532
+msgid "Longitude:"
+msgstr "Längengrad:"
+
+#: glade/pytrainer.glade:6624
+msgid "<b> Waypoint: </b>"
+msgstr "<b>Wegpunkt:</b>"
+
+#: glade/pytrainer.glade:6808
+msgid "Edit Record"
+msgstr "Eintrag bearbeiten"
+
+#: glade/pytrainer.glade:6822
+msgid "Show graph in classic view"
+msgstr "Graphen in klassischer Ansicht zeigen"
+
+#: glade/pytrainer.glade:6836
+msgid "Merge tracks"
+msgstr "Strecken zusammenführen"
+
+#: glade/selecttrackdialog.glade:7
+msgid "Select track record"
+msgstr "Streckeneintrag bearbeiten"
+
+#: glade/warning.glade:7 glade/warning.glade:38
+msgid "Warning"
+msgstr "Warnung"
+
+#: pytrainer/gui/windowmain.py:107
+msgid "Miles"
+msgstr "Meilen"
+
+#: pytrainer/gui/windowmain.py:110 pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:127 pytrainer/gui/windowmain.py:130
+#: pytrainer/gui/windowmain.py:139 pytrainer/gui/windowmain.py:173
+#: pytrainer/gui/windowmain.py:182
 msgid "id"
 msgstr "ID"
 
-#: pytrainer/main.py:69
-msgid "Kilometer"
-msgstr "Kilometer"
-
-#: pytrainer/main.py:72
+#: pytrainer/gui/windowmain.py:110
+msgid "Start"
+msgstr "Start"
+
+#: pytrainer/gui/windowmain.py:117 pytrainer/gui/windowmain.py:157
+#: pytrainer/gui/windowmain.py:175 pytrainer/gui/windowmain.py:185
+#: pytrainer/gui/windowmain.py:573 pytrainer/gui/windowmain.py:1499
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:211
+#: pytrainer/lib/activity.py:323 pytrainer/lib/activity.py:334
+#: pytrainer/lib/activity.py:406 pytrainer/lib/activity.py:417
+#: pytrainer/lib/activity.py:426 pytrainer/lib/activity.py:435
+#: pytrainer/lib/activity.py:444 pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:463 pytrainer/lib/activity.py:524
+#: pytrainer/extensions/googlemaps.py:129 pytrainer/extensions/osm.py:105
 msgid "Distance"
-msgstr "Distanz (km)"
+msgstr "Strecke"
+
+#: pytrainer/gui/windowmain.py:119 pytrainer/gui/windowmain.py:158
+#: pytrainer/gui/windowmain.py:176 pytrainer/gui/windowmain.py:186
+#: pytrainer/gui/windowmain.py:574 pytrainer/gui/windowmain.py:1501
+#: pytrainer/extensions/googlemaps.py:129 pytrainer/extensions/osm.py:104
+msgid "Time"
+msgstr "Zeit"
 
-#: pytrainer/main.py:196
-msgid "January"
-msgstr "Januar"
+#: pytrainer/gui/windowmain.py:120
+msgid "⌀ HR"
+msgstr "⌀ HF"
 
-#: pytrainer/main.py:197
-msgid "Febrary"
-msgstr "Februar"
+#: pytrainer/gui/windowmain.py:121
+msgid "⌀ Speed"
+msgstr "⌀ Geschwindigkeit"
 
-#: pytrainer/main.py:198
-msgid "March"
-msgstr "März"
+#: pytrainer/gui/windowmain.py:127
+msgid "Waypoint"
+msgstr "Wegpunkt"
 
-#: pytrainer/main.py:199
-msgid "April"
-msgstr "April"
+#: pytrainer/gui/windowmain.py:132
+msgid "Weight"
+msgstr "Gewicht"
+
+#: pytrainer/gui/windowmain.py:133
+msgid "Body Fat %"
+msgstr "Körperfett %"
+
+#: pytrainer/gui/windowmain.py:134
+msgid "Resting HR"
+msgstr "Ruhe-Herzfrequenz"
+
+#: pytrainer/gui/windowmain.py:135 pytrainer/gui/windowmain.py:147
+#: pytrainer/gui/windowmain.py:164
+msgid "Max HR"
+msgstr "Höchste Herzfrequenz"
+
+#: pytrainer/gui/windowmain.py:141
+msgid "Records"
+msgstr "Einträge"
+
+#: pytrainer/gui/windowmain.py:142
+msgid "Total duration"
+msgstr "Gesamtdauer"
+
+#: pytrainer/gui/windowmain.py:143
+msgid "Total distance"
+msgstr "Gesamtstrecke"
+
+#: pytrainer/gui/windowmain.py:144 pytrainer/gui/windowmain.py:159
+msgid "Avg speed"
+msgstr "Durchschnittsgeschwindigkeit"
+
+#: pytrainer/gui/windowmain.py:145 pytrainer/gui/windowmain.py:160
+msgid "Max speed"
+msgstr "Höchste Geschwindigkeit"
+
+#: pytrainer/gui/windowmain.py:146 pytrainer/gui/windowmain.py:163
+msgid "Avg HR"
+msgstr "Durchschnittliche Herzfrequenz"
+
+#: pytrainer/gui/windowmain.py:148
+msgid "Max duration"
+msgstr "Höchste Dauer"
 
-#: pytrainer/main.py:200
-msgid "May"
-msgstr "Mai"
+#: pytrainer/gui/windowmain.py:149
+msgid "Max distance"
+msgstr "Längste Strecke"
 
-#: pytrainer/main.py:201
-msgid "June"
-msgstr "Juni"
+#: pytrainer/gui/windowmain.py:155
+msgid "Lap"
+msgstr "Runde"
 
-#: pytrainer/main.py:202
-msgid "July"
-msgstr "Juli"
+#: pytrainer/gui/windowmain.py:156
+msgid "Trigger"
+msgstr "Auslöser"
 
-#: pytrainer/main.py:203
-msgid "August"
-msgstr "August"
+#: pytrainer/gui/windowmain.py:161
+msgid "Avg pace"
+msgstr "Durchschnittstempo"
 
-#: pytrainer/main.py:204
-msgid "September"
-msgstr "September"
+#: pytrainer/gui/windowmain.py:162
+msgid "Max pace"
+msgstr "Höchsttempo"
+
+#: pytrainer/gui/windowmain.py:166
+msgid "Intensity"
+msgstr "Intensität"
+
+#: pytrainer/gui/windowmain.py:174
+msgid "Race"
+msgstr "Rennen"
+
+#: pytrainer/gui/windowmain.py:183
+msgid "Rank"
+msgstr "Rang"
+
+#: pytrainer/gui/windowmain.py:187 pytrainer/recordgraph.py:136
+#: pytrainer/lib/activity.py:335 pytrainer/lib/activity.py:425
+#: pytrainer/lib/activity.py:427
+msgid "Speed"
+msgstr "Geschwindigkeit"
+
+#: pytrainer/gui/windowmain.py:319
+msgid "d"
+msgstr "d"
+
+#: pytrainer/gui/windowmain.py:563
+msgid "Show on X Axis"
+msgstr "Auf der X-Achse zeigen"
+
+#: pytrainer/gui/windowmain.py:564
+msgid "Show on Y1 Axis"
+msgstr "Auf der Y1-Achse zeigen"
+
+#: pytrainer/gui/windowmain.py:565
+msgid "Show on Y2 Axis"
+msgstr "Auf der Y2-Achse zeigen"
+
+#: pytrainer/gui/windowmain.py:566
+msgid "Axis Limits"
+msgstr "Achsenbegrenzungen"
+
+#: pytrainer/gui/windowmain.py:575
+msgid "Laps"
+msgstr "Runden"
+
+#: pytrainer/gui/windowmain.py:576
+msgid "Left Axis Grid"
+msgstr "Gitternetz links der Achse"
+
+#: pytrainer/gui/windowmain.py:577
+msgid "Right Axis Grid"
+msgstr "Gitternetz rechts der Achse"
+
+#: pytrainer/gui/windowmain.py:578
+msgid "X Axis Grid"
+msgstr "X-Achsen-Gitternetz"
+
+#: pytrainer/gui/windowmain.py:639
+msgid "Reset Limits"
+msgstr "Begrenzungen zurücksetzen"
+
+#: pytrainer/gui/windowmain.py:641
+msgid "Set Limits"
+msgstr "Begrenzungen setzen"
+
+#: pytrainer/gui/windowmain.py:796
+msgid "Percentages method"
+msgstr "Prozentuale Methode"
+
+#: pytrainer/gui/windowmain.py:809
+msgid "800 m"
+msgstr "800 m"
+
+#: pytrainer/gui/windowmain.py:810
+msgid "1500 m"
+msgstr "1500 m"
+
+#: pytrainer/gui/windowmain.py:811
+msgid "5K"
+msgstr "5 km"
+
+#: pytrainer/gui/windowmain.py:812
+msgid "7K"
+msgstr "7 km"
+
+#: pytrainer/gui/windowmain.py:813
+msgid "10K"
+msgstr "10 km"
+
+#: pytrainer/gui/windowmain.py:814
+msgid "Half marathon"
+msgstr "Halbmarathon"
+
+#: pytrainer/gui/windowmain.py:815
+msgid "Marathon"
+msgstr "Marathon"
+
+#: pytrainer/gui/windowmain.py:816
+msgid "100K"
+msgstr "100 km"
+
+#: pytrainer/gui/windowmain.py:913 pytrainer/gui/windowmain.py:1042
+#: pytrainer/gui/windowmain.py:1124 pytrainer/lib/activity.py:197
+msgid "miles"
+msgstr "Meilen"
+
+#: pytrainer/gui/windowmain.py:914 pytrainer/gui/windowmain.py:915
+#: pytrainer/gui/windowmain.py:1043 pytrainer/gui/windowmain.py:1044
+#: pytrainer/gui/windowmain.py:1125 pytrainer/gui/windowmain.py:1126
+#: pytrainer/lib/activity.py:198
+msgid "miles/h"
+msgstr "Meilen/h"
+
+#: pytrainer/gui/windowmain.py:916 pytrainer/gui/windowmain.py:917
+#: pytrainer/gui/windowmain.py:1045 pytrainer/gui/windowmain.py:1046
+#: pytrainer/gui/windowmain.py:1127 pytrainer/gui/windowmain.py:1128
+#: pytrainer/lib/activity.py:199
+msgid "min/mile"
+msgstr "min/Meile"
+
+#: pytrainer/gui/windowmain.py:919 pytrainer/gui/windowmain.py:1048
+#: pytrainer/gui/windowmain.py:1130 pytrainer/lib/activity.py:202
+msgid "km"
+msgstr "km"
+
+#: pytrainer/gui/windowmain.py:1502 pytrainer/recordgraph.py:144
+msgid "Beats"
+msgstr "Schläge"
+
+#: pytrainer/gui/windowmain.py:1503
+msgid "Average"
+msgstr "Durchschnitt"
+
+#: pytrainer/gui/windowmain.py:1722
+msgid "Hide graph display options"
+msgstr "Graphenanzeige-Optionen verstecken"
+
+#: pytrainer/gui/windowmain.py:2060
+msgid "lap"
+msgstr "Runde"
+
+#: pytrainer/gui/windowmain.py:2070 pytrainer/gui/drawArea.py:165
+#: pytrainer/extensions/googlemaps.py:127 pytrainer/extensions/osm.py:102
+msgid "h"
+msgstr "h"
+
+#: pytrainer/gui/windowmain.py:2070 pytrainer/gui/windowmain.py:2072
+msgid "s"
+msgstr "s"
+
+#: pytrainer/gui/windowmain.py:2160 pytrainer/record.py:67
+msgid "Edit Entry"
+msgstr "Neuer Eintrag"
 
-#: pytrainer/main.py:205
-msgid "October"
-msgstr "Oktober"
+#: pytrainer/gui/windowmain.py:2171
+msgid "Delete Entry"
+msgstr "Eintrag löschen"
 
-#: pytrainer/main.py:206
-msgid "November"
-msgstr "November"
+#: pytrainer/gui/windowmain.py:2195
+msgid "Create Athlete Entry"
+msgstr "Athleteneintrag erstellen"
 
-#: pytrainer/main.py:207
-msgid "December"
-msgstr "Dezember"
+#: pytrainer/gui/windowmain.py:2199
+msgid "Edit Athlete Entry"
+msgstr "Athleteneintrag bearbeiten"
 
-#: pytrainer/main.py:317
-msgid "You are going to remove one database entry. Are you sure yo want do it?"
-msgstr "Sie entfernen einen Datenbankeintrag. Sind Sie sicher?"
+#: pytrainer/gui/windowmain.py:2212
+msgid "<b>Date</b>"
+msgstr "<b>Datum</b>"
 
-#: pytrainer/monthgraph.py:37
-#: pytrainer/monthgraph.py:39
-#: pytrainer/monthgraph.py:41
-#: pytrainer/monthgraph.py:43
-#: pytrainer/monthgraph.py:45
+#: pytrainer/gui/windowmain.py:2228
+msgid "<b>Weight</b>"
+msgstr "<b>Gewicht</b>"
+
+#: pytrainer/gui/windowmain.py:2236
+msgid "<b>Body Fat</b>"
+msgstr "<b>Körperfett</b>"
+
+#: pytrainer/gui/windowmain.py:2244
+msgid "<b>Resting Heart Rate</b>"
+msgstr "<b>Ruhe-Herzfrequenz</b>"
+
+#: pytrainer/gui/windowmain.py:2252
+msgid "<b>Max Heart Rate</b>"
+msgstr "<b>Höchste Herzfrequenz:</b>"
+
+#: pytrainer/gui/windowmain.py:2280 pytrainer/main.py:447
+msgid "Delete this database entry?"
+msgstr "Diesen Datenbankeintrag löschen?"
+
+#: pytrainer/gui/windowmain.py:2282
+msgid "Are you sure?"
+msgstr "Sind Sie sicher?"
+
+#: pytrainer/gui/windowimportdata.py:117
+msgid "No file selected"
+msgstr "Keine Datei ausgewählt"
+
+#: pytrainer/gui/windowimportdata.py:162
+msgid "Configure"
+msgstr "Konfigurieren"
+
+#: pytrainer/gui/windowimportdata.py:163
+msgid "Run"
+msgstr "Ausführen"
+
+#: pytrainer/gui/windowimportdata.py:171
+msgid "Disabled"
+msgstr "abgeschaltet"
+
+#: pytrainer/gui/windowimportdata.py:173
+msgid "Enabled"
+msgstr "eingeschaltet"
+
+#: pytrainer/gui/windowimportdata.py:253
+msgid "GPS device found"
+msgstr "GPS-Gerät gefunden"
+
+#: pytrainer/gui/windowimportdata.py:256
+msgid "GPS device <b>not</b> found"
+msgstr "GPS-Gerät <b>nicht</b> gefunden"
+
+#: pytrainer/gui/windowimportdata.py:263
+msgid "This tool was not found on the system"
+msgstr "Dieses Hilfsprogramm wurde auf dem System nicht gefunden"
+
+#: pytrainer/gui/windowimportdata.py:265
+msgid " Homepage"
+msgstr "Homepage"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "File"
+msgstr "Datei"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Type"
+msgstr "Typ"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Activities"
+msgstr "Aktivitäten"
+
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:211
+msgid "Start Time"
+msgstr "Startzeit"
+
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:211
+msgid "Duration"
+msgstr "Dauer"
+
+#: pytrainer/gui/windowimportdata.py:499
+msgid "Imported into database"
+msgstr "In Datenbank importiert"
+
+#: pytrainer/gui/windowimportdata.py:543 pytrainer/gui/windowextensions.py:81
+#: pytrainer/gui/windowplugins.py:80
+#, python-format
+msgid "%s settings"
+msgstr "%s Einstellungen"
+
+#: pytrainer/gui/windowimportdata.py:558 pytrainer/gui/windowextensions.py:70
+#: pytrainer/gui/windowplugins.py:71 pytrainer/gui/windowplugins.py:95
+msgid "Disable"
+msgstr "ausschalten"
+
+#: pytrainer/gui/windowimportdata.py:559 pytrainer/gui/windowextensions.py:72
+#: pytrainer/gui/windowplugins.py:69 pytrainer/gui/windowplugins.py:96
+msgid "Enable"
+msgstr "einschalten"
+
+#: pytrainer/gui/windowimportdata.py:566 pytrainer/gui/windowplugins.py:103
+msgid "Ok"
+msgstr "OK"
+
+#: pytrainer/gui/windowimportdata.py:626
+msgid "Saving options"
+msgstr "Speicheroptionen"
+
+#: pytrainer/gui/windowimportdata.py:628
+msgid "Options saved"
+msgstr "Optionen gespeichert"
+
+#: pytrainer/gui/windowimportdata.py:653
+msgid "Importing one activity"
+msgstr "Eine Aktivität wird importiert"
+
+#: pytrainer/gui/windowimportdata.py:654
+msgid "Imported one activity"
+msgstr "Eine Aktivität importiert"
+
+#: pytrainer/gui/windowimportdata.py:656
+#, python-format
+msgid "Importing %d activities"
+msgstr "%d Aktivitäten werden importiert"
+
+#: pytrainer/gui/windowimportdata.py:657
+#, python-format
+msgid "Imported %d activities"
+msgstr "%d Aktivitäten importiert"
+
+#: pytrainer/gui/windowimportdata.py:676
+msgid "Choose a file (or files) to import activities from"
+msgstr ""
+"Wählen Sie eine (oder mehrere) Datei(en), um daraus Aktivitäten zu "
+"importieren"
+
+#: pytrainer/gui/windowimportdata.py:691 pytrainer/gui/windowimportdata.py:692
+#, python-format
+msgid "Found file of type: %s"
+msgstr "Datei des Typs %s gefunden"
+
+#: pytrainer/gui/windowimportdata.py:716
+msgid "Found in database"
+msgstr "In Datenbank gefunden"
+
+#: pytrainer/gui/windowimportdata.py:731 pytrainer/gui/windowimportdata.py:732
+#, python-format
+msgid "File %s is of unknown or unsupported file type"
+msgstr "Datei %s hat einen unbekannten oder nicht unterstützten Dateityp"
+
+#: pytrainer/gui/windowimportdata.py:805
+#, python-format
+msgid "Column %d"
+msgstr "Spalte %d"
+
+#: pytrainer/gui/drawArea.py:166 pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+msgid "min"
+msgstr "min"
+
+#: pytrainer/gui/drawArea.py:410
+msgid "rest"
+msgstr "Ruhe"
+
+#: pytrainer/gui/windowrecord.py:211
+msgid "GPX File"
+msgstr "GPX-Datei"
+
+#: pytrainer/gui/windowprofile.py:47
+msgid "Male"
+msgstr "Männlich"
+
+#: pytrainer/gui/windowprofile.py:48
+msgid "Female"
+msgstr "Weiblich"
+
+#: pytrainer/gui/windowprofile.py:65
+msgid "MET"
+msgstr "MET"
+
+#: pytrainer/gui/windowprofile.py:296
+msgid "Sport Creation Error"
+msgstr "Fehler beim Erstellen der Sportart"
+
+#: pytrainer/gui/equipment.py:101
+msgid "Usage"
+msgstr "Verwendung"
+
+#: pytrainer/gui/dialogselecttrack.py:40
+msgid "Track Name"
+msgstr "Name der Strecke"
+
+#: pytrainer/gui/drawGraph.py:170
+msgid "Athlete Data"
+msgstr "Athletendaten"
+
+#: pytrainer/gui/windowextensions.py:112 pytrainer/gui/windowextensions.py:125
+msgid "OK"
+msgstr "OK"
+
+#: pytrainer/recordgraph.py:134 pytrainer/daygraph.py:52
+msgid "Height (m)"
+msgstr "Größe (m)"
+
+#: pytrainer/recordgraph.py:134 pytrainer/daygraph.py:52
+msgid "Stage Profile"
+msgstr "Abschnittsprofil"
+
+#: pytrainer/recordgraph.py:136
+msgid "Speed (Km/h)"
+msgstr "Geschwindigkeit (km/h)"
+
+#: pytrainer/recordgraph.py:138 pytrainer/lib/activity.py:324
+#: pytrainer/lib/activity.py:434 pytrainer/lib/activity.py:436
+msgid "Pace"
+msgstr "Tempo"
+
+#: pytrainer/recordgraph.py:140 pytrainer/heartrategraph.py:36
+#: pytrainer/daygraph.py:56
+msgid "Beats (bpm)"
+msgstr "Schläge (bpm)"
+
+#: pytrainer/recordgraph.py:142
+msgid "Cadence (rpm)"
+msgstr "Rhythmus (rpm)"
+
+#: pytrainer/recordgraph.py:142 pytrainer/lib/activity.py:462
+#: pytrainer/lib/activity.py:464
+msgid "Cadence"
+msgstr "Rhythmus"
+
+#: pytrainer/recordgraph.py:144
+msgid "Beats (%)"
+msgstr "Schläge (%)"
+
+#: pytrainer/recordgraph.py:146
+msgid "Zone"
+msgstr "Zone"
+
+#: pytrainer/profile.py:114
+msgid "Moderate activity"
+msgstr "Moderate Aktivität"
+
+#: pytrainer/profile.py:115
+msgid "Weight Control"
+msgstr "Gewichtskontrolle"
+
+#: pytrainer/profile.py:116
+msgid "Aerobic"
+msgstr "Sauerstoffabhängig"
+
+#: pytrainer/profile.py:117
+msgid "Anaerobic"
+msgstr "Sauerstoffunabhängig"
+
+#: pytrainer/profile.py:118
+msgid "VO2 MAX"
+msgstr "VO2 MAX"
+
+#: pytrainer/lib/listview.py:32
+msgid "All Time"
+msgstr "Gesamte Zeit"
+
+#: pytrainer/lib/listview.py:32
+msgid "Last 4 Weeks"
+msgstr "Letzte vier Wochen"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 6 Months"
+msgstr "Letzte sechs Monate"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 12 Months"
+msgstr "Letzte zwölf Monate"
+
+#: pytrainer/lib/listview.py:36
+msgid "<1 Hour"
+msgstr "unter einer Stunde"
+
+#: pytrainer/lib/listview.py:37
+msgid "1-2 Hours"
+msgstr "ein bis zwei Stunden"
+
+#: pytrainer/lib/listview.py:38
+msgid ">2 Hours"
+msgstr "über zwei Stunden"
+
+#: pytrainer/lib/gpx.py:129
+msgid "No Name"
+msgstr "Kein Name"
+
+#: pytrainer/lib/gpx.py:137
+msgid "No Data"
+msgstr "Keine Daten"
+
+#: pytrainer/lib/activity.py:200
+msgid "feet"
+msgstr "Fuß"
+
+#: pytrainer/lib/activity.py:322
+msgid "Pace by Lap"
+msgstr "Tempo pro Runde"
+
+#: pytrainer/lib/activity.py:328 pytrainer/lib/activity.py:339
+#: pytrainer/lib/activity.py:411 pytrainer/lib/activity.py:421
+#: pytrainer/lib/activity.py:430 pytrainer/lib/activity.py:439
+#: pytrainer/lib/activity.py:448 pytrainer/lib/activity.py:458
+#: pytrainer/lib/activity.py:467 pytrainer/lib/activity.py:529
+msgid "Time (seconds)"
+msgstr "Zeit (Sekunden)"
+
+#: pytrainer/lib/activity.py:333
+msgid "Speed by Lap"
+msgstr "Geschwindigkeit pro Runde"
+
+#: pytrainer/lib/activity.py:405 pytrainer/lib/activity.py:407
+msgid "Elevation"
+msgstr "Höhenlage"
+
+#: pytrainer/lib/activity.py:416 pytrainer/lib/activity.py:418
+msgid "Corrected Elevation"
+msgstr "Berichtigte Höhenlage"
+
+#: pytrainer/lib/activity.py:453
+#, python-format
+msgid "Heart Rate (% of max)"
+msgstr "Herzfrequenz (% des Maximums)"
+
+#: pytrainer/lib/activity.py:455
+msgid "%"
+msgstr "%"
+
+#: pytrainer/lib/activity.py:464
+msgid "rpm"
+msgstr "rpm"
+
+#: pytrainer/lib/activity.py:523
+msgid "Heart Rate zone"
+msgstr "Herzfrequenz-Zone"
+
+#: pytrainer/monthgraph.py:26 pytrainer/monthgraph.py:27
+#: pytrainer/monthgraph.py:28 pytrainer/monthgraph.py:29
+#: pytrainer/monthgraph.py:30
 msgid "day"
 msgstr "Tag"
 
-#: pytrainer/monthgraph.py:37
-#: pytrainer/yeargraph.py:37
-msgid "kilometers"
-msgstr "Kilometer"
+#: pytrainer/monthgraph.py:26 pytrainer/weekgraph.py:28
+msgid "Daily Distance"
+msgstr "Tägliche Entfernung"
 
-#: pytrainer/monthgraph.py:37
-msgid "daily kilometers"
-msgstr "tägliche Kilometer"
+#: pytrainer/monthgraph.py:27 pytrainer/totalgraph.py:25
+#: pytrainer/yeargraph.py:27 pytrainer/weekgraph.py:29
+msgid "Time (hours)"
+msgstr "Zeit (Stunden)"
 
-#: pytrainer/monthgraph.py:39
-#: pytrainer/yeargraph.py:39
-msgid "time in hours"
-msgstr "Zeit in Stunden"
+#: pytrainer/monthgraph.py:27 pytrainer/weekgraph.py:29
+msgid "Daily Time"
+msgstr "Tägliche Zeit"
 
-#: pytrainer/monthgraph.py:39
-msgid "daily time"
-msgstr "tägliche Zeit"
+#: pytrainer/monthgraph.py:28 pytrainer/totalgraph.py:26
+#: pytrainer/yeargraph.py:28 pytrainer/weekgraph.py:30
+msgid "Average Heart Rate (bpm)"
+msgstr "Durchschnittliche Herzfrequenz (bpm)"
 
-#: pytrainer/monthgraph.py:41
-#: pytrainer/yeargraph.py:41
-msgid "beats per minute"
-msgstr "Herzschläge pro Minute"
+#: pytrainer/monthgraph.py:28 pytrainer/weekgraph.py:30
+msgid "Daily Average Heart Rate"
+msgstr "Tägliche Durchschnitts-Herzfrequenz"
 
-#: pytrainer/monthgraph.py:41
-msgid "daily beats"
-msgstr "täglicher Puls"
+#: pytrainer/monthgraph.py:29 pytrainer/weekgraph.py:31
+msgid "Daily Average Speed"
+msgstr "Tägliche Durchschnittsgeschwindigkeit"
 
-#: pytrainer/monthgraph.py:43
-#: pytrainer/yeargraph.py:43
-msgid "average (hm/h)"
-msgstr "Durchschnitt (km/h)"
+#: pytrainer/monthgraph.py:30 pytrainer/weekgraph.py:32
+msgid "Daily Calories"
+msgstr "Tägliche Kalorien"
 
-#: pytrainer/monthgraph.py:43
-msgid "daily averages"
-msgstr "täglicher Durchschnitt"
+#: pytrainer/totalgraph.py:24 pytrainer/totalgraph.py:25
+#: pytrainer/totalgraph.py:26 pytrainer/totalgraph.py:27
+#: pytrainer/totalgraph.py:28
+msgid "year"
+msgstr "Jahr"
 
-#: pytrainer/monthgraph.py:45
-#: pytrainer/yeargraph.py:45
-msgid "calories"
-msgstr "Kalorien"
+#: pytrainer/totalgraph.py:24
+msgid "Annual Distance"
+msgstr "Jährliche Strecke"
+
+#: pytrainer/totalgraph.py:25
+msgid "Annual Time"
+msgstr "Jährliche Zeit"
+
+#: pytrainer/totalgraph.py:26
+msgid "Annual Average Heart Rate"
+msgstr "Jährliche Durchschnitts-Herzfrequenz"
+
+#: pytrainer/totalgraph.py:27
+msgid "Annual Average Speed"
+msgstr "Jährliche Durchschnittsgeschwindigkeit"
 
-#: pytrainer/monthgraph.py:45
-msgid "daily calories"
-msgstr "tägliche Kalorien"
+#: pytrainer/totalgraph.py:28
+msgid "Annual Calories"
+msgstr "Jährliche Kalorien"
 
-#: pytrainer/yeargraph.py:37
-#: pytrainer/yeargraph.py:39
-#: pytrainer/yeargraph.py:41
-#: pytrainer/yeargraph.py:43
-#: pytrainer/yeargraph.py:45
+#: pytrainer/athlete.py:52
+msgid "lb"
+msgstr "lb"
+
+#: pytrainer/athlete.py:54
+msgid "kg"
+msgstr "kg"
+
+#: pytrainer/record.py:56
+msgid "Modify details before importing"
+msgstr "Dateien vor dem Import bearbeiten"
+
+#: pytrainer/record.py:474
+msgid "pyTrainer can't import data from your gpx file"
+msgstr "PyTrainer kann keine Daten aus Ihrer GPX-Datei importieren"
+
+#: pytrainer/yeargraph.py:26 pytrainer/yeargraph.py:27
+#: pytrainer/yeargraph.py:28 pytrainer/yeargraph.py:29
+#: pytrainer/yeargraph.py:30
 msgid "month"
 msgstr "Monat"
 
-#: pytrainer/yeargraph.py:37
-msgid "monthly kilometers"
-msgstr "monatliche Kilometer"
+#: pytrainer/yeargraph.py:26
+msgid "Monthly Distance"
+msgstr "Monatliche Strecke"
+
+#: pytrainer/yeargraph.py:27
+msgid "Monthly Time"
+msgstr "Monatliche Zeit"
+
+#: pytrainer/yeargraph.py:28
+msgid "Monthly Average Heart Rate"
+msgstr "Monatliche Duchschnitts-Herzfrequenz"
+
+#: pytrainer/yeargraph.py:29
+msgid "Monthly Average Speed"
+msgstr "Monats-Durchschnittsgeschwindigkeit"
+
+#: pytrainer/yeargraph.py:30
+msgid "Monthly Calories"
+msgstr "Monatliche Kalorien"
+
+#: pytrainer/waypoint.py:87
+msgid ""
+"The gpx file seems to be a several days records. Perhaps you will need to "
+"edit your gpx file"
+msgstr ""
+"Diese GPX-Datei scheint ein Eintrag über mehrere Tage zu sein. Vielleicht "
+"werden Sie Ihre GPX-Datei bearbeiten müssen."
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity (Km/h)"
+msgstr "Schnelligkeit (km/h)"
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity"
+msgstr "Schnelligkeit"
+
+#: pytrainer/main.py:463
+msgid "Delete this waypoint?"
+msgstr "Diesen Wegpunkt löschen?"
+
+#: import/file_gpxplus.py:41
+msgid "GPS eXchange file"
+msgstr "GPS-eXchange-Datei"
+
+#: import/file_kml20.py:47
+msgid "Geodistance kml version 2.0 file"
+msgstr "Geodistance kml-Datei Version 2.0"
+
+#: import/file_garmintcxv1.py:45
+msgid "Garmin training center database file version 1"
+msgstr "Garmin Trainings-Center Datenbankdatei Version 1"
+
+#: import/file_gpxplusNokia.py:41
+msgid "Nokia Export - GPS eXchange file"
+msgstr "Nokia Export - GPS eXchange-Datei"
+
+#: import/tool_gpsbabel.py:37
+msgid "GPSBabel"
+msgstr "GPSBabel"
+
+#: import/tool_garmintools.py:37
+msgid "Garmintools"
+msgstr "Garmintools"
+
+#: import/tool_gant.py:37
+msgid "Gant"
+msgstr "Gant"
+
+#: import/file_garmintools.py:44
+msgid "Garmin tools dump file"
+msgstr "Garmintools Dump-Datei"
+
+#: import/file_garmintcxv2.py:44
+msgid "Garmin training center database file version 2"
+msgstr "Garmin Trainings-Center Datenbankdatei Version 2"
+
+#: extensions/fixelevation/fixelevation.py:129
+msgid "Elevation Correction Complete"
+msgstr "Korrektur der Höhenlage abgeschlossen"
+
+#: extensions/openstreetmap/openstreetmap.py:82
+msgid ""
+"Posting GPX trace to Openstreetmap\n"
+"\n"
+"Please wait this could take several minutes"
+msgstr ""
+"GPX-Spur wird zu OpenStreetMap hochgeladen\n"
+"\n"
+"Bitte haben Sie Geduld, dies kann einige Minuten dauern"
+
+#: extensions/openstreetmap/openstreetmap.py:84
+msgid "Openstreetmap Extension Processing"
+msgstr "OpenStreetMap-Erweiterung arbeitet"
+
+#: extensions/openstreetmap/openstreetmap.py:102
+msgid "Openstreetmap Extension Upload Complete"
+msgstr "OpenStreetMap-Erweiterung hat das Hochladen abgeschlossen"
+
+#: extensions/openstreetmap/openstreetmap.py:107
+msgid "Error while uploading file to OSM: "
+msgstr "Fehler beim Hochladen der Datei zu OSM: "
+
+#: extensions/openstreetmap/openstreetmap.py:109
+msgid "Openstreetmap Extension Error"
+msgstr "OpenStreetMap-Erweiterungs-Fehler"
 
-#: pytrainer/yeargraph.py:39
-msgid "monthly time"
-msgstr "monatliche Zeit"
+#: extensions/openstreetmap/openstreetmap.py:117
+msgid "Please add any additional information for this upload"
+msgstr "Bitte fügen Sie diesem Upload jede zusätzliche Information bei"
 
-#: pytrainer/yeargraph.py:41
-msgid "monthly beats"
-msgstr "monatlicher Puls"
+#: extensions/openstreetmap/openstreetmap.py:204
+msgid "Error"
+msgstr "Fehler"
 
-#: pytrainer/yeargraph.py:43
-msgid "monthly averages"
-msgstr "monatlicher Durchschnitt"
+#: extensions/openstreetmap/openstreetmap.py:247
+msgid "Error while saving extension configuration"
+msgstr "Fehler beim Speichern der Erweiterungs-Konfiguration"
 
-#: pytrainer/yeargraph.py:45
-msgid "monthly calories"
-msgstr "monatliche Kalorien"
+#: extensions/wordpress/wordpress.py:46
+msgid "Posting to Wordpress blog"
+msgstr "Hochladen zum Wordpress-Blog"
 
-#~ msgid "Kj/day"
-#~ msgstr "Kj/Tag"
-#~ msgid "Press Here to create the database"
-#~ msgstr "Klicken, um die Datenbank zu kreieren"
+#: extensions/wordpress/wordpress.py:48
+msgid "Wordpress Extension Processing"
+msgstr "Worpress-Erweiterung arbeitet"
 
+#: extensions/wordpress/wordpress.py:144
+msgid "Wordpress Extension Upload Complete"
+msgstr "Wordpress-Erweiterung Hochladen abgeschlossen"
diff --git a/locale/es/LC_MESSAGES/pytrainer_es.po b/locale/es/LC_MESSAGES/pytrainer_es.po
index d9156ee..90a3858 100644
--- a/locale/es/LC_MESSAGES/pytrainer_es.po
+++ b/locale/es/LC_MESSAGES/pytrainer_es.po
@@ -5,17 +5,19 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: pytrainer 1.7.2\n"
+"Project-Id-Version: pytrainer 1.9\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-24 13:39+0100\n"
-"PO-Revision-Date: 2010-11-24 13:43+0100\n"
+"POT-Creation-Date: 2011-09-08 17:28+0200\n"
+"PO-Revision-Date: 2011-08-28 13:29+0100\n"
 "Last-Translator: David Garcia Granda <dgranda at gmail.com>\n"
-"Language-Team: Spanish <es at li.org>\n"
+"Language-Team: Spanish <pytrainer-devel at lists.sourceforge.net>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Spanish\n"
+"X-Poedit-Country: SPAIN\n"
 
 #: glade/calendar.glade:7
 msgid "Calendar"
@@ -25,29 +27,26 @@ msgstr "Calendario"
 msgid "<b>Equipment List</b>"
 msgstr "<b>Lista de material</b>"
 
-#: glade/equipment.glade:149
-#: glade/equipment.glade:406
+#: glade/equipment.glade:149 glade/equipment.glade:406
+#: pytrainer/gui/equipment.py:98
 msgid "Description"
 msgstr "Descripción"
 
-#: glade/equipment.glade:174
-#: glade/equipment.glade:431
+#: glade/equipment.glade:174 glade/equipment.glade:431
 msgid "Life Expectancy"
 msgstr "Vida útil esperada"
 
-#: glade/equipment.glade:211
-#: glade/equipment.glade:467
+#: glade/equipment.glade:211 glade/equipment.glade:467
 msgid "Prior Usage"
 msgstr "Uso anterior"
 
-#: glade/equipment.glade:243
-#: glade/equipment.glade:499
+#: glade/equipment.glade:243 glade/equipment.glade:499
+#: pytrainer/gui/equipment.py:102
 msgid "Active"
 msgstr "Habilitado"
 
-#: glade/equipment.glade:277
-#: glade/equipment.glade:533
-#: pytrainer/gui/windowimportdata.py:352
+#: glade/equipment.glade:277 glade/equipment.glade:533
+#: pytrainer/gui/windowimportdata.py:353
 msgid "Notes"
 msgstr "Notas"
 
@@ -67,8 +66,7 @@ msgstr "¿Confirma que desea borrar el material?"
 msgid "<b>Delete Equipment</b>"
 msgstr "<b>Borrar material</b>"
 
-#: glade/extensions.glade:9
-#: glade/pytrainer.glade:163
+#: glade/extensions.glade:9 glade/pytrainer.glade:163
 msgid "Extensions"
 msgstr "Extensiones"
 
@@ -80,26 +78,21 @@ msgstr "<b>Detalles de la extensión</b>"
 msgid "name-entry"
 msgstr "Nombre"
 
-#: glade/extensions.glade:82
-#: glade/plugins.glade:144
-#: glade/profile.glade:727
-#: glade/pytrainer.glade:5161
+#: glade/extensions.glade:82 glade/plugins.glade:144 glade/profile.glade:728
+#: glade/pytrainer.glade:5703
 msgid "Name:"
 msgstr "Nombre:"
 
-#: glade/extensions.glade:96
-#: glade/plugins.glade:115
+#: glade/extensions.glade:96 glade/plugins.glade:115
 msgid "Status:"
 msgstr "Estado:"
 
-#: glade/extensions.glade:110
-#: glade/plugins.glade:86
-#: glade/pytrainer.glade:5690
+#: glade/extensions.glade:110 glade/plugins.glade:86
+#: glade/pytrainer.glade:6548
 msgid "Description:"
 msgstr "<b>Descripción:</b>"
 
-#: glade/extensions.glade:124
-#: glade/plugins.glade:100
+#: glade/extensions.glade:124 glade/plugins.glade:100
 msgid "status-entry"
 msgstr "Estado"
 
@@ -107,8 +100,7 @@ msgstr "Estado"
 msgid "description-entry"
 msgstr "Descripción"
 
-#: glade/importdata.glade:7
-#: glade/importdata.glade:325
+#: glade/importdata.glade:7 glade/importdata.glade:325
 msgid "Import"
 msgstr "Importar"
 
@@ -192,8 +184,7 @@ msgstr "Arrancar 'Selección de fichero' en el comienzo"
 msgid "Automatically start the file selection dialog"
 msgstr "Lanzar proceso de selección de fichero automáticamente"
 
-#: glade/importdata.glade:546
-#: glade/plugins.glade:9
+#: glade/importdata.glade:546 glade/plugins.glade:9
 msgid "Plugins"
 msgstr "Plugins"
 
@@ -237,47 +228,31 @@ msgstr "Leer archivo"
 msgid "<b>File delimiter</b>"
 msgstr "<b>Delimitador en el archivo</b>"
 
-#: glade/importdata.glade:864
-#: pytrainer/gui/windowmain.py:109
-#: pytrainer/gui/windowmain.py:124
-#: pytrainer/gui/windowmain.py:1147
-#: pytrainer/gui/dialogselecttrack.py:40
+#: glade/importdata.glade:864 pytrainer/gui/windowmain.py:116
+#: pytrainer/gui/windowmain.py:131 pytrainer/gui/windowmain.py:184
+#: pytrainer/gui/windowmain.py:1494 pytrainer/gui/dialogselecttrack.py:40
 msgid "Date"
 msgstr "Fecha"
 
-#: glade/importdata.glade:877
-#: glade/importdata.glade:918
-#: glade/importdata.glade:933
-#: glade/importdata.glade:1128
-#: glade/importdata.glade:1143
-#: glade/importdata.glade:1158
-#: glade/importdata.glade:1173
-#: glade/importdata.glade:1188
-#: glade/importdata.glade:1203
-#: glade/importdata.glade:1218
-#: glade/importdata.glade:1233
-#: glade/importdata.glade:1248
-#: glade/importdata.glade:1263
-#: glade/importdata.glade:1278
+#: glade/importdata.glade:877 glade/importdata.glade:918
+#: glade/importdata.glade:933 glade/importdata.glade:1128
+#: glade/importdata.glade:1143 glade/importdata.glade:1158
+#: glade/importdata.glade:1173 glade/importdata.glade:1188
+#: glade/importdata.glade:1203 glade/importdata.glade:1218
+#: glade/importdata.glade:1233 glade/importdata.glade:1248
+#: glade/importdata.glade:1263 glade/importdata.glade:1278
 #: glade/importdata.glade:1293
 msgid "Exclude"
 msgstr "Descartar"
 
-#: glade/importdata.glade:892
-#: pytrainer/recordgraph.py:134
-#: pytrainer/recordgraph.py:136
-#: pytrainer/recordgraph.py:138
-#: pytrainer/recordgraph.py:140
-#: pytrainer/recordgraph.py:142
-#: pytrainer/recordgraph.py:144
-#: pytrainer/recordgraph.py:146
-#: pytrainer/monthgraph.py:70
-#: pytrainer/heartrategraph.py:36
-#: pytrainer/yeargraph.py:70
-#: pytrainer/daygraph.py:52
-#: pytrainer/daygraph.py:54
-#: pytrainer/daygraph.py:56
-#: pytrainer/weekgraph.py:115
+#: glade/importdata.glade:892 pytrainer/recordgraph.py:134
+#: pytrainer/recordgraph.py:136 pytrainer/recordgraph.py:138
+#: pytrainer/recordgraph.py:140 pytrainer/recordgraph.py:142
+#: pytrainer/recordgraph.py:144 pytrainer/recordgraph.py:146
+#: pytrainer/monthgraph.py:26 pytrainer/heartrategraph.py:36
+#: pytrainer/totalgraph.py:24 pytrainer/yeargraph.py:26
+#: pytrainer/daygraph.py:52 pytrainer/daygraph.py:54 pytrainer/daygraph.py:56
+#: pytrainer/weekgraph.py:28
 msgid "Distance (km)"
 msgstr "Distancia (km)"
 
@@ -293,9 +268,8 @@ msgstr "<b>Campo en PyTrainer</b>"
 msgid "<b>File Column</b>"
 msgstr "<b>Columna en el archivo</b>"
 
-#: glade/importdata.glade:972
-#: pytrainer/gui/windowmain.py:108
-#: pytrainer/gui/windowmain.py:1146
+#: glade/importdata.glade:972 pytrainer/gui/windowmain.py:115
+#: pytrainer/gui/windowmain.py:1493
 msgid "Title"
 msgstr "Título"
 
@@ -315,21 +289,17 @@ msgstr "Calorías (kcal)"
 msgid "Max Speed (km/h)"
 msgstr "Velocidad Máx. (km/h)"
 
-#: glade/importdata.glade:1037
-#: pytrainer/monthgraph.py:76
-#: pytrainer/yeargraph.py:76
-#: pytrainer/weekgraph.py:121
+#: glade/importdata.glade:1037 pytrainer/monthgraph.py:29
+#: pytrainer/totalgraph.py:27 pytrainer/yeargraph.py:29
+#: pytrainer/weekgraph.py:31
 msgid "Average Speed (km/h)"
 msgstr "Velocidad media (km/h)"
 
-#: glade/importdata.glade:1050
-#: glade/pytrainer.glade:277
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:111
-#: pytrainer/gui/windowmain.py:1149
-#: pytrainer/gui/windowimportdata.py:352
-#: pytrainer/gui/windowrecord.py:210
-#: pytrainer/gui/windowprofile.py:59
+#: glade/importdata.glade:1050 glade/pytrainer.glade:277
+#: pytrainer/gui/windowmain.py:110 pytrainer/gui/windowmain.py:118
+#: pytrainer/gui/windowmain.py:140 pytrainer/gui/windowmain.py:1496
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:210
+#: pytrainer/gui/windowprofile.py:65
 msgid "Sport"
 msgstr "Deporte"
 
@@ -341,8 +311,7 @@ msgstr "Pulsaciones medias (ppm)"
 msgid "Max Heartrate (bpm)"
 msgstr "Pulsaciones máximas (ppm)"
 
-#: glade/importdata.glade:1089
-#: pytrainer/recordgraph.py:138
+#: glade/importdata.glade:1089 pytrainer/recordgraph.py:138
 msgid "Pace (min/km)"
 msgstr "Ritmo (min/km)"
 
@@ -350,8 +319,8 @@ msgstr "Ritmo (min/km)"
 msgid "Max Pace (min/km)"
 msgstr "Ritmo máximo(min/km)"
 
-#: glade/importdata.glade:1115
-#: glade/newrecord.glade:1094
+#: glade/importdata.glade:1115 glade/newrecord.glade:1094
+#: pytrainer/gui/windowmain.py:167
 msgid "Comments"
 msgstr "Comentarios"
 
@@ -359,8 +328,7 @@ msgstr "Comentarios"
 msgid "Force sport to:"
 msgstr "Forzar deporte a:"
 
-#: glade/importdata.glade:1323
-#: glade/newrecord.glade:404
+#: glade/importdata.glade:1323 glade/newrecord.glade:404
 msgid " "
 msgstr " "
 
@@ -379,7 +347,8 @@ msgstr ""
 "<small>Se trata de importar ficheros delimitados de manera experimental\n"
 "1) Seleccione un fichero\n"
 "2) Pulse 'Leer fichero\" para analizarlo\n"
-"3) Asigne las columnas del fichero a elementos de datos de Pytrainer (la fecha obligatoria)\n"
+"3) Asigne las columnas del fichero a elementos de datos de Pytrainer (la "
+"fecha obligatoria)\n"
 "4) Pulse 'Importar datos'</small>"
 
 #: glade/importdata.glade:1427
@@ -390,8 +359,7 @@ msgstr "Importar datos"
 msgid "<b>Import from CSV</b>"
 msgstr "<b>Importar desde fichero CSV</b>"
 
-#: glade/newrecord.glade:7
-#: pytrainer/gui/windowmain.py:1769
+#: glade/newrecord.glade:7 pytrainer/gui/windowmain.py:2160
 msgid "New Entry"
 msgstr "Nueva entrada"
 
@@ -419,12 +387,9 @@ msgstr "<b>Principal</b>"
 msgid "Distance (Km):"
 msgstr "Distancia (km):"
 
-#: glade/newrecord.glade:230
-#: glade/newrecord.glade:355
-#: glade/newrecord.glade:558
-#: glade/newrecord.glade:697
-#: glade/newrecord.glade:958
-#: glade/profile.glade:1462
+#: glade/newrecord.glade:230 glade/newrecord.glade:355
+#: glade/newrecord.glade:558 glade/newrecord.glade:697
+#: glade/newrecord.glade:958 glade/profile.glade:1548
 msgid "Calculate"
 msgstr "Calcular"
 
@@ -432,8 +397,7 @@ msgstr "Calcular"
 msgid "Duration:"
 msgstr "Duración:"
 
-#: glade/newrecord.glade:279
-#: glade/newrecord.glade:306
+#: glade/newrecord.glade:279 glade/newrecord.glade:306
 msgid ":"
 msgstr ":"
 
@@ -449,18 +413,17 @@ msgstr "Hora de comienzo:"
 msgid "12:00:00"
 msgstr "12:00:00"
 
-#: glade/newrecord.glade:486
-#: glade/profile.glade:1500
+#: glade/newrecord.glade:486 glade/profile.glade:1586
 msgid "<b>General</b>"
 msgstr "<b>General:</b>"
 
 #: glade/newrecord.glade:522
 msgid "Max (km/h):"
-msgstr "Punta (km/h)"
+msgstr "Velocidad Máx. (km/h):"
 
 #: glade/newrecord.glade:547
 msgid "Average (km/h)"
-msgstr "Media (km/h)"
+msgstr "Velocidad media (km/h)"
 
 #: glade/newrecord.glade:593
 msgid "<b>Speed</b>"
@@ -472,11 +435,11 @@ msgstr "Entrada"
 
 #: glade/newrecord.glade:644
 msgid "Max (min/km):"
-msgstr "Max (min/km)"
+msgstr "Máx (min/km):"
 
 #: glade/newrecord.glade:671
 msgid "Pace (min/km):"
-msgstr "Ritmo (min/km)"
+msgstr "Ritmo (min/km):"
 
 #: glade/newrecord.glade:718
 msgid "<b>Pace</b>"
@@ -496,24 +459,26 @@ msgstr "<b>Desnivel acumulado:</b>"
 
 #: glade/newrecord.glade:850
 msgid "Max (bpm):"
-msgstr "Pulsaciones máximas"
+msgstr "Pico (ppm)"
 
 #: glade/newrecord.glade:862
 msgid "Heart rate:"
-msgstr "Pulsaciones"
+msgstr "Pulsaciones:"
 
-#: glade/newrecord.glade:902
-#: pytrainer/gui/windowmain.py:115
-#: pytrainer/gui/windowmain.py:1153
-#: pytrainer/monthgraph.py:78
-#: pytrainer/yeargraph.py:78
-#: pytrainer/weekgraph.py:123
+#: glade/newrecord.glade:902 pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:165 pytrainer/gui/windowmain.py:1500
+#: pytrainer/monthgraph.py:30 pytrainer/totalgraph.py:28
+#: pytrainer/yeargraph.py:30 pytrainer/weekgraph.py:32
 msgid "Calories"
 msgstr "Calorías"
 
 #: glade/newrecord.glade:931
-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>"
+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:1005
 msgid "<b>Heart Rate</b>"
@@ -535,8 +500,7 @@ msgstr "<i>No hay piezas de material activas</i>"
 msgid "<b>Associated Equipment</b>"
 msgstr "<b>Material asociado</b>"
 
-#: glade/newrecord.glade:1203
-#: glade/profile.glade:1360
+#: glade/newrecord.glade:1203 glade/profile.glade:1446
 msgid "Equipment"
 msgstr "Equipamiento"
 
@@ -568,13 +532,11 @@ msgstr "Sistema americano"
 msgid "<b>System of Measurement</b>"
 msgstr "<b>Sistema de medida</b>"
 
-#: glade/profile.glade:103
-#: glade/pytrainer.glade:2023
+#: glade/profile.glade:103 glade/pytrainer.glade:2111
 msgid "Google"
 msgstr "Google"
 
-#: glade/profile.glade:118
-#: glade/pytrainer.glade:2006
+#: glade/profile.glade:118 glade/pytrainer.glade:2094
 msgid "Open Street Map"
 msgstr "Open Street Map"
 
@@ -618,13 +580,11 @@ msgstr "Nombre de usuario:"
 msgid "Gender:"
 msgstr "Género:"
 
-#: glade/profile.glade:407
-#: glade/pytrainer.glade:5186
+#: glade/profile.glade:407 glade/pytrainer.glade:5728
 msgid "Height:"
 msgstr "Altura:"
 
-#: glade/profile.glade:447
-#: glade/pytrainer.glade:5173
+#: glade/profile.glade:447 glade/pytrainer.glade:5715
 msgid "Date of birth:"
 msgstr "Fecha de nacimiento:"
 
@@ -632,50 +592,48 @@ msgstr "Fecha de nacimiento:"
 msgid "Weight:"
 msgstr "Peso:"
 
-#: glade/profile.glade:542
-#: glade/pytrainer.glade:5248
+#: glade/profile.glade:542 glade/pytrainer.glade:5790
 msgid "<b>Athlete Details</b>"
 msgstr "<b>Datos personales</b>"
 
-#: glade/profile.glade:557
-#: glade/pytrainer.glade:5351
+#: glade/profile.glade:557 glade/pytrainer.glade:5893
 msgid "Athlete"
 msgstr "Atleta"
 
-#: glade/profile.glade:671
+#: glade/profile.glade:672
 msgid "<b>Sport List</b>"
 msgstr "<b>Lista de deportes</b>"
 
-#: glade/profile.glade:683
+#: glade/profile.glade:684
 msgid "llist"
 msgstr "lista"
 
-#: glade/profile.glade:738
+#: glade/profile.glade:739
 msgid "M.E.T.:"
 msgstr "M.E.T.:"
 
-#: glade/profile.glade:765
+#: glade/profile.glade:766
 msgid "Extra Weight:"
 msgstr "Peso extra:"
 
-#: glade/profile.glade:801
-#: glade/profile.glade:1181
-msgid "More information on determining yor M.E.T sport coefficient on Wikipedia"
+#: glade/profile.glade:802 glade/profile.glade:1218
+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:821
+#: glade/profile.glade:822
 msgid "Maximum Pace:"
 msgstr "Ritmo más rápido:"
 
-#: glade/profile.glade:913
+#: glade/profile.glade:950
 msgid "<b>Add New Sport</b>"
 msgstr "<b>Añadir nuevo deporte</b>"
 
-#: glade/profile.glade:928
+#: glade/profile.glade:965
 msgid "new"
 msgstr "nuevo"
 
-#: glade/profile.glade:959
+#: glade/profile.glade:996
 msgid ""
 "Deleting a sport removes associated records.\n"
 "Continue?"
@@ -683,96 +641,103 @@ msgstr ""
 "Si borra un deporte elimina sus registros asociados.\n"
 "¿Desea continuar?"
 
-#: glade/profile.glade:1041
+#: glade/profile.glade:1078
 msgid "<b>Delete Sport</b>"
 msgstr "<b>Borrar deporte</b>"
 
-#: glade/profile.glade:1073
+#: glade/profile.glade:1110
 msgid "delete"
 msgstr "borrar"
 
-#: glade/profile.glade:1106
+#: glade/profile.glade:1143
 msgid "Name"
 msgstr "Nombre"
 
-#: glade/profile.glade:1129
+#: glade/profile.glade:1166
 msgid "M.E.T."
 msgstr "M.E.T."
 
-#: glade/profile.glade:1156
-#: pytrainer/gui/windowprofile.py:59
+#: glade/profile.glade:1193 pytrainer/gui/windowprofile.py:65
 msgid "Extra Weight"
 msgstr "Peso extra"
 
-#: glade/profile.glade:1201
-msgid "Maxiumum Pace"
-msgstr "Ritmo más rápido:"
+#: glade/profile.glade:1238 pytrainer/gui/windowprofile.py:65
+msgid "Maximum Pace"
+msgstr "Ritmo más rápido"
+
+#: glade/profile.glade:1265 pytrainer/gui/windowmain.py:188
+#: pytrainer/gui/windowprofile.py:65
+msgid "Color"
+msgstr "Color"
 
-#: glade/profile.glade:1289
+#: glade/profile.glade:1375
 msgid "<b>Edit Sport</b>"
 msgstr "<b>Editar deporte</b>"
 
-#: glade/profile.glade:1300
+#: glade/profile.glade:1386
 msgid "<b>lalaal</b>"
 msgstr "<b>lalaal</b>"
 
-#: glade/profile.glade:1322
+#: glade/profile.glade:1408
 msgid "edit"
 msgstr "editar"
 
-#: glade/profile.glade:1338
+#: glade/profile.glade:1424
 msgid "Sports"
 msgstr "Deportes"
 
-#: glade/profile.glade:1393
+#: glade/profile.glade:1479
 msgid "Maximum heart rate:"
 msgstr "Pulsaciones máximas:"
 
-#: glade/profile.glade:1404
+#: glade/profile.glade:1490
 msgid "Resting heart rate:"
 msgstr "Pulsaciones en reposo:"
 
-#: glade/profile.glade:1449
-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:1535
+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:1536
-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:1622
+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:1549
+#: glade/profile.glade:1635
 msgid "Percentages based method"
 msgstr "Basado en porcentajes"
 
-#: glade/profile.glade:1565
-#: pytrainer/gui/windowmain.py:614
+#: glade/profile.glade:1651 pytrainer/gui/windowmain.py:790
 msgid "Karvonen method"
 msgstr "Karvonen"
 
-#: glade/profile.glade:1586
+#: glade/profile.glade:1672
 msgid "Select how to calculate your heart rate zones."
 msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca"
 
-#: glade/profile.glade:1625
+#: glade/profile.glade:1711
 msgid "<b>Heart Rate Zones</b>"
 msgstr "<b>Zonas de frecuencia cardiaca</b>"
 
-#: glade/profile.glade:1647
-#: pytrainer/recordgraph.py:140
-#: pytrainer/lib/activity.py:433
-#: pytrainer/lib/activity.py:435
-#: pytrainer/lib/activity.py:445
-#: pytrainer/lib/activity.py:515
-#: pytrainer/heartrategraph.py:36
-#: pytrainer/daygraph.py:56
+#: glade/profile.glade:1733 pytrainer/recordgraph.py:140
+#: pytrainer/lib/activity.py:443 pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455 pytrainer/lib/activity.py:525
+#: pytrainer/heartrategraph.py:36 pytrainer/daygraph.py:56
 msgid "Heart Rate"
 msgstr "Pulsaciones"
 
-#: glade/profile.glade:1673
+#: glade/profile.glade:1759
 msgid "Log Level"
 msgstr "Nivel de log"
 
-#: glade/profile.glade:1681
+#: glade/profile.glade:1767
 msgid ""
 "Error\n"
 "Warning\n"
@@ -784,39 +749,52 @@ msgstr ""
 "Información\n"
 "Depuración"
 
-#: glade/profile.glade:1699
+#: glade/profile.glade:1785
 msgid "<small>What level of detail is written to the log?</small>"
 msgstr "<small>¿Qué nivel de detalle existe en el fichero de log?</small>"
 
-#: glade/profile.glade:1713
+#: glade/profile.glade:1799
 msgid "Validate"
 msgstr "Validar"
 
-#: glade/profile.glade:1743
-msgid "<small>Do the plugins attempt to validate the input file before processing?</small>"
-msgstr "<small>¿Intentan los plugins validar el fichero de entrada antes de procesarlo?</small>"
+#: glade/profile.glade:1829
+msgid ""
+"<small>Do the plugins attempt to validate the input file before processing?</"
+"small>"
+msgstr ""
+"<small>¿Intentan los plugins validar el fichero de entrada antes de "
+"procesarlo?</small>"
 
-#: glade/profile.glade:1759
+#: glade/profile.glade:1845
 msgid "Check"
 msgstr "Comprobación"
 
-#: glade/profile.glade:1788
+#: glade/profile.glade:1874
 msgid "<small>Was a configuration and database check requested?</small>"
-msgstr "<small>¿Existió una petición para comprobar la configuración y la base de datos?</small>"
+msgstr ""
+"<small>¿Existió una petición para comprobar la configuración y la base de "
+"datos?</small>"
 
-#: glade/profile.glade:1804
+#: glade/profile.glade:1890
 msgid "New Graph"
 msgstr "Nuevo gráfico"
 
-#: glade/profile.glade:1833
+#: glade/profile.glade:1919
 msgid "<small>Want to use experimental new approach to graphing?</small>"
 msgstr "<small>¿Desea usar los nuevos gráficos (experimental)?</small>"
 
-#: glade/profile.glade:1876
-msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>"
-msgstr "<small>Esta pantalla muestra el estado de las opciones que se pueden configurar mediante línea de comandos para PyTrainer. Los cambios que se hagan únicamente tendrán efecto en la presente ejecución de pytrainer y no serán recordados en el futuro</small>"
+#: glade/profile.glade:1962
+msgid ""
+"<small>This screen shows the state of command line configurable options for "
+"pytrainer. These options can be changed here which will affect the current "
+"instance of pytrainer, they will not be remembered next time though</small>"
+msgstr ""
+"<small>Esta pantalla muestra el estado de las opciones que se pueden "
+"configurar mediante línea de comandos para PyTrainer. Los cambios que se "
+"hagan únicamente tendrán efecto en la presente ejecución de pytrainer y no "
+"serán recordados en el futuro</small>"
 
-#: glade/profile.glade:1897
+#: glade/profile.glade:1983
 msgid "Startup Parameters"
 msgstr "Configuración inicio"
 
@@ -864,8 +842,7 @@ msgstr "Plugins de dispositivos GPS"
 msgid "_Help"
 msgstr "_Ayuda"
 
-#: glade/pytrainer.glade:290
-#: glade/pytrainer.glade:5467
+#: glade/pytrainer.glade:290 glade/pytrainer.glade:6324
 msgid "All Sports"
 msgstr "Deportes"
 
@@ -873,27 +850,21 @@ msgstr "Deportes"
 msgid "<b>Sport:</b>"
 msgstr "<b>Deporte:</b>"
 
-#: glade/pytrainer.glade:408
-#: glade/pytrainer.glade:2726
-#: glade/pytrainer.glade:3337
-#: glade/pytrainer.glade:3960
-#: glade/pytrainer.glade:4659
+#: glade/pytrainer.glade:408 glade/pytrainer.glade:3144
+#: glade/pytrainer.glade:3786 glade/pytrainer.glade:4440
+#: glade/pytrainer.glade:5170
 msgid "<b>Duration:</b>"
 msgstr "<b>Duración:</b>"
 
-#: glade/pytrainer.glade:423
-#: glade/pytrainer.glade:2816
-#: glade/pytrainer.glade:3416
-#: glade/pytrainer.glade:4039
-#: glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:423 glade/pytrainer.glade:3234
+#: glade/pytrainer.glade:3865 glade/pytrainer.glade:4519
+#: glade/pytrainer.glade:5272
 msgid "<b>Speed:</b>"
 msgstr "<b>Velocidad:</b>"
 
-#: glade/pytrainer.glade:437
-#: glade/pytrainer.glade:2984
-#: glade/pytrainer.glade:3611
-#: glade/pytrainer.glade:4234
-#: glade/pytrainer.glade:4856
+#: glade/pytrainer.glade:437 glade/pytrainer.glade:3402
+#: glade/pytrainer.glade:4060 glade/pytrainer.glade:4714
+#: glade/pytrainer.glade:5367
 msgid "<b>Pace:</b>"
 msgstr "<b>Ritmo:</b>"
 
@@ -913,11 +884,9 @@ msgstr "<b>Comentarios:</b>"
 msgid "<b>Date:</b>"
 msgstr "<b>Fecha:</b>"
 
-#: glade/pytrainer.glade:628
-#: glade/pytrainer.glade:2712
-#: glade/pytrainer.glade:3323
-#: glade/pytrainer.glade:3946
-#: glade/pytrainer.glade:4645
+#: glade/pytrainer.glade:628 glade/pytrainer.glade:3130
+#: glade/pytrainer.glade:3772 glade/pytrainer.glade:4426
+#: glade/pytrainer.glade:5156
 msgid "<b>Distance:</b>"
 msgstr "<b>Distancia:</b>"
 
@@ -925,11 +894,9 @@ msgstr "<b>Distancia:</b>"
 msgid "<b>Max Speed</b>"
 msgstr "<b>Pico velocidad:</b>"
 
-#: glade/pytrainer.glade:661
-#: glade/pytrainer.glade:3014
-#: glade/pytrainer.glade:3625
-#: glade/pytrainer.glade:4248
-#: glade/pytrainer.glade:4871
+#: glade/pytrainer.glade:661 glade/pytrainer.glade:3432
+#: glade/pytrainer.glade:4074 glade/pytrainer.glade:4728
+#: glade/pytrainer.glade:5382
 msgid "<b>Max Pace:</b>"
 msgstr "<b>Pico ritmo:</b>"
 
@@ -937,56 +904,54 @@ msgstr "<b>Pico ritmo:</b>"
 msgid "<b>Descent:</b>"
 msgstr "<b>Descenso:</b>"
 
-#: glade/pytrainer.glade:769
-#: glade/pytrainer.glade:2924
-#: glade/pytrainer.glade:3491
-#: glade/pytrainer.glade:4114
-#: glade/pytrainer.glade:4571
+#: glade/pytrainer.glade:769 glade/pytrainer.glade:3342
+#: glade/pytrainer.glade:3940 glade/pytrainer.glade:4594
+#: glade/pytrainer.glade:5082
 msgid "Cal"
 msgstr "Cal"
 
-#: glade/pytrainer.glade:808
-#: glade/pytrainer.glade:2686
-#: glade/pytrainer.glade:3297
-#: glade/pytrainer.glade:3920
-#: glade/pytrainer.glade:4748
-#: pytrainer/gui/windowmain.py:102
+#: glade/pytrainer.glade:809 glade/pytrainer.glade:3104
+#: glade/pytrainer.glade:3746 glade/pytrainer.glade:4400
+#: glade/pytrainer.glade:5259 pytrainer/gui/windowmain.py:109
 msgid "Km"
 msgstr "km"
 
-#: glade/pytrainer.glade:823
-#: glade/pytrainer.glade:2846
-#: glade/pytrainer.glade:2879
-#: glade/pytrainer.glade:3446
-#: glade/pytrainer.glade:3539
-#: glade/pytrainer.glade:4069
-#: glade/pytrainer.glade:4162
-#: glade/pytrainer.glade:4791
-#: glade/pytrainer.glade:4807
-#: pytrainer/gui/windowmain.py:631
-#: pytrainer/gui/windowmain.py:632
-#: pytrainer/gui/windowmain.py:754
-#: pytrainer/gui/windowmain.py:755
-#: pytrainer/gui/windowmain.py:832
-#: pytrainer/gui/windowmain.py:833
-#: pytrainer/lib/activity.py:202
+#: glade/pytrainer.glade:824 glade/pytrainer.glade:3264
+#: glade/pytrainer.glade:3297 glade/pytrainer.glade:3895
+#: glade/pytrainer.glade:3988 glade/pytrainer.glade:4549
+#: glade/pytrainer.glade:4642 glade/pytrainer.glade:5302
+#: glade/pytrainer.glade:5318 pytrainer/gui/windowmain.py:916
+#: pytrainer/gui/windowmain.py:917 pytrainer/gui/windowmain.py:1045
+#: pytrainer/gui/windowmain.py:1046 pytrainer/gui/windowmain.py:1127
+#: pytrainer/gui/windowmain.py:1128 pytrainer/lib/activity.py:203
 msgid "km/h"
 msgstr "km/h"
 
-#: glade/pytrainer.glade:838
+#: glade/pytrainer.glade:839
 msgid "<b>Equipment:</b>"
 msgstr "<b>Material:</b>"
 
-#: glade/pytrainer.glade:1014
+#: glade/pytrainer.glade:935
+msgid "<b>Active / Rest:</b>"
+msgstr "<b>Activo / Descanso:</b>"
+
+#: glade/pytrainer.glade:962
+msgid "h:m:s"
+msgstr "h:m:s"
+
+#: glade/pytrainer.glade:1007
+msgid "<b>Laps</b>"
+msgstr "<b>Vueltas</b>"
+
+#: glade/pytrainer.glade:1078
 msgid " <b>Title:</b>"
 msgstr "<b>Título:</b>"
 
-#: glade/pytrainer.glade:1064
-#: pytrainer/gui/windowmain.py:1375
+#: glade/pytrainer.glade:1128 pytrainer/gui/windowmain.py:1722
 msgid "Show graph display options"
 msgstr "Mostrar opciones del gráfico"
 
-#: glade/pytrainer.glade:1082
+#: glade/pytrainer.glade:1146
 msgid ""
 "Profile\n"
 "Speed\n"
@@ -1004,14 +969,13 @@ msgstr ""
 "Porcentaje\n"
 "Zona"
 
-#: glade/pytrainer.glade:1099
-#: glade/pytrainer.glade:3831
-#: glade/pytrainer.glade:4454
-#: glade/pytrainer.glade:5076
+#: glade/pytrainer.glade:1163 glade/pytrainer.glade:4311
+#: glade/pytrainer.glade:4965 glade/pytrainer.glade:5618
+#: glade/pytrainer.glade:5984
 msgid "Versus"
 msgstr "contra"
 
-#: glade/pytrainer.glade:1110
+#: glade/pytrainer.glade:1174
 msgid ""
 "None\n"
 "Profile\n"
@@ -1026,199 +990,238 @@ msgstr ""
 "Ritmo\n"
 "Pulsaciones\n"
 
-#: glade/pytrainer.glade:1257
+#: glade/pytrainer.glade:1320
 msgid "<small>Graph Display Options</small>"
 msgstr "<small>Opciones de visualización gráfica</small>"
 
-#: glade/pytrainer.glade:1282
-#: glade/pytrainer.glade:1497
-#: glade/pytrainer.glade:1717
+#: glade/pytrainer.glade:1345 glade/pytrainer.glade:1560
+#: glade/pytrainer.glade:1780
 msgid "<small>Limits</small>"
 msgstr "<small>Límites</small>"
 
-#: glade/pytrainer.glade:1294
-#: glade/pytrainer.glade:1509
-#: glade/pytrainer.glade:1763
+#: glade/pytrainer.glade:1357 glade/pytrainer.glade:1572
+#: glade/pytrainer.glade:1826
 msgid "<small>Min</small>"
 msgstr "<small>Mín</small>"
 
-#: glade/pytrainer.glade:1306
-#: glade/pytrainer.glade:1521
-#: glade/pytrainer.glade:1775
+#: glade/pytrainer.glade:1369 glade/pytrainer.glade:1584
+#: glade/pytrainer.glade:1838
 msgid "<small>Max</small>"
 msgstr "<small>Máx</small>"
 
-#: glade/pytrainer.glade:1355
-#: glade/pytrainer.glade:1577
+#: glade/pytrainer.glade:1418 glade/pytrainer.glade:1640
 msgid "<small>Color</small>"
 msgstr "<small>Color</small>"
 
-#: glade/pytrainer.glade:1386
-#: glade/pytrainer.glade:1590
+#: glade/pytrainer.glade:1449 glade/pytrainer.glade:1653
 msgid "<small>Weight</small>"
 msgstr "<small>Peso</small>"
 
-#: glade/pytrainer.glade:1416
+#: glade/pytrainer.glade:1479
 msgid "Y1"
 msgstr "Y1"
 
-#: glade/pytrainer.glade:1427
-#: glade/pytrainer.glade:1638
+#: glade/pytrainer.glade:1490 glade/pytrainer.glade:1701
 msgid "<small>Smoothing</small>"
 msgstr "<small>Suavizado</small>"
 
-#: glade/pytrainer.glade:1567
+#: glade/pytrainer.glade:1630
 msgid "Y2"
 msgstr "Y2"
 
-#: glade/pytrainer.glade:1707
+#: glade/pytrainer.glade:1770
 msgid "X"
 msgstr "X"
 
-#: glade/pytrainer.glade:1788
+#: glade/pytrainer.glade:1851
 msgid "<small>Distance</small>"
 msgstr "<small>Distancia</small>"
 
-#: glade/pytrainer.glade:1817
+#: glade/pytrainer.glade:1880
 msgid "<small>Time</small>"
 msgstr "<small>Tiempo</small>"
 
-#: glade/pytrainer.glade:1878
+#: glade/pytrainer.glade:1941
 msgid "Show Laps"
 msgstr "Mostras vueltas"
 
-#: glade/pytrainer.glade:1917
+#: glade/pytrainer.glade:1980
 msgid "Reset Graph"
 msgstr "Resetear"
 
-#: glade/pytrainer.glade:1979
+#: glade/pytrainer.glade:2042
 msgid "Redraw Map"
 msgstr "Restaurar"
 
-#: glade/pytrainer.glade:1995
+#: glade/pytrainer.glade:2058
+msgid "<small>Show:</small>"
+msgstr "<small>Mostrar:</small>"
+
+#: glade/pytrainer.glade:2069
+msgid ""
+"None\n"
+"Speed\n"
+"Heart rate\n"
+"Cadence"
+msgstr ""
+"Nada\n"
+"Velocidad\n"
+"Pulsaciones\n"
+"Cadencia"
+
+#: glade/pytrainer.glade:2084
 msgid "<small>Display map using:</small>"
 msgstr "<small>Opciones de visualización de mapas:</small>"
 
-#: glade/pytrainer.glade:2097
+#: glade/pytrainer.glade:2185
 msgid "<b>Beats:</b>"
 msgstr "<b>Pulsaciones:</b>"
 
-#: glade/pytrainer.glade:2109
-#: glade/pytrainer.glade:2894
-#: glade/pytrainer.glade:3461
-#: glade/pytrainer.glade:4084
-#: glade/pytrainer.glade:4541
+#: glade/pytrainer.glade:2197 glade/pytrainer.glade:3312
+#: glade/pytrainer.glade:3910 glade/pytrainer.glade:4564
+#: glade/pytrainer.glade:5052
 msgid "<b>Calories: </b>"
 msgstr "<b>Calorías: </b>"
 
-#: glade/pytrainer.glade:2123
-#: glade/pytrainer.glade:3046
-#: glade/pytrainer.glade:3689
-#: glade/pytrainer.glade:4312
-#: glade/pytrainer.glade:4919
+#: glade/pytrainer.glade:2211 glade/pytrainer.glade:3464
+#: glade/pytrainer.glade:4138 glade/pytrainer.glade:4792
+#: glade/pytrainer.glade:5430
 msgid "<b>Max Beats:</b>"
 msgstr "<b>Pico pulsaciones:</b>"
 
-#: glade/pytrainer.glade:2137
+#: glade/pytrainer.glade:2225
 msgid "<b>HR Zones Method:</b>"
 msgstr "<b>Método de cálculo:</b>"
 
-#: glade/pytrainer.glade:2152
+#: glade/pytrainer.glade:2240
 msgid "<b>HR Zone5:</b>"
 msgstr "<b>Máximo esfuerzo:</b>"
 
-#: glade/pytrainer.glade:2167
-#: glade/pytrainer.glade:2366
+#: glade/pytrainer.glade:2255 glade/pytrainer.glade:2454
 msgid " bpm"
 msgstr "ppm"
 
-#: glade/pytrainer.glade:2183
+#: glade/pytrainer.glade:2271
 msgid " Cal"
 msgstr "Cal"
 
-#: glade/pytrainer.glade:2241
+#: glade/pytrainer.glade:2329
 msgid "<b>HR Zone4:</b>"
 msgstr "<b>Anaeróbica:</b>"
 
-#: glade/pytrainer.glade:2257
+#: glade/pytrainer.glade:2345
 msgid "<b>HR Zone3:</b>"
 msgstr "<b>Aeróbica:</b>"
 
-#: glade/pytrainer.glade:2273
+#: glade/pytrainer.glade:2361
 msgid "<b>HR Zone2:</b>"
 msgstr "<b>Quemagrasas:</b>"
 
-#: glade/pytrainer.glade:2289
+#: glade/pytrainer.glade:2377
 msgid "<b>HR Zone1:</b>"
 msgstr "<b>Recuperación:</b>"
 
-#: glade/pytrainer.glade:2391
-#: glade/pytrainer.glade:2403
-#: glade/pytrainer.glade:2418
-#: glade/pytrainer.glade:2433
-#: glade/pytrainer.glade:2448
-#: glade/pytrainer.glade:2969
-#: glade/pytrainer.glade:3063
-#: glade/pytrainer.glade:3596
-#: glade/pytrainer.glade:3674
-#: glade/pytrainer.glade:4219
-#: glade/pytrainer.glade:4297
-#: glade/pytrainer.glade:4616
-#: glade/pytrainer.glade:4823
-#: pytrainer/lib/activity.py:435
-#: pytrainer/lib/activity.py:515
+#: glade/pytrainer.glade:2479 glade/pytrainer.glade:2491
+#: glade/pytrainer.glade:2506 glade/pytrainer.glade:2521
+#: glade/pytrainer.glade:2536 glade/pytrainer.glade:3387
+#: glade/pytrainer.glade:3481 glade/pytrainer.glade:4045
+#: glade/pytrainer.glade:4123 glade/pytrainer.glade:4699
+#: glade/pytrainer.glade:4777 glade/pytrainer.glade:5127
+#: glade/pytrainer.glade:5334 pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:525
 msgid "bpm"
 msgstr "ppm"
 
-#: glade/pytrainer.glade:2493
+#: glade/pytrainer.glade:2581
 msgid " <b>Heart Rate:</b>"
 msgstr "<b>Pulsaciones:</b>"
 
-#: glade/pytrainer.glade:2653
+#: glade/pytrainer.glade:2769
+msgid "<b>Projected times</b>"
+msgstr "<b>Tiempos estimados</b>"
+
+#: glade/pytrainer.glade:2799
+msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>"
+msgstr "<i>Historial en distancias similares ± x%: </i>"
+
+#: glade/pytrainer.glade:2832
+msgid "<b>Range:</b>"
+msgstr "<b>Horquilla:</b>"
+
+#: glade/pytrainer.glade:2845
+msgid "<b>Rank:</b>"
+msgstr "<b>Posición:</b>"
+
+#: glade/pytrainer.glade:2858
+msgid "<b>Speed: </b>"
+msgstr "<b>Velocidad: </b>"
+
+#: glade/pytrainer.glade:2871
+msgid "<b>Avg speed:</b>"
+msgstr "<b>Velocidad media:</b>"
+
+#: glade/pytrainer.glade:2884
+msgid "<b>Standard deviation:</b>"
+msgstr "<b>Desviación estándar:</b>"
+
+#: glade/pytrainer.glade:2898
+msgid "<b>Deviation:</b>"
+msgstr "<b>Desviación:</b>"
+
+#: glade/pytrainer.glade:3017
+msgid "<b>Ranking</b>"
+msgstr "<b>Clasificación</b>"
+
+#: glade/pytrainer.glade:3043
+msgid "<b>Analytics:</b>"
+msgstr "<b>Estadísticas:</b>"
+
+#: glade/pytrainer.glade:3071
 msgid "Record"
 msgstr "Registro"
 
-#: glade/pytrainer.glade:2862
-#: glade/pytrainer.glade:3507
-#: glade/pytrainer.glade:4130
-#: glade/pytrainer.glade:4839
+#: glade/pytrainer.glade:3280 glade/pytrainer.glade:3956
+#: glade/pytrainer.glade:4610 glade/pytrainer.glade:5350
 msgid "<b>Max Speed:</b>"
 msgstr "<b>Velocidad máxima:</b>"
 
-#: glade/pytrainer.glade:2939
-#: glade/pytrainer.glade:3566
-#: glade/pytrainer.glade:4189
-#: glade/pytrainer.glade:4586
+#: glade/pytrainer.glade:3357 glade/pytrainer.glade:4015
+#: glade/pytrainer.glade:4669 glade/pytrainer.glade:5097
 msgid "<b>Beats avg:</b>"
 msgstr "<b>Media pulsaciones:</b>"
 
-#: glade/pytrainer.glade:2999
-#: glade/pytrainer.glade:3031
-#: glade/pytrainer.glade:3642
-#: glade/pytrainer.glade:3658
-#: glade/pytrainer.glade:4265
-#: glade/pytrainer.glade:4281
-#: glade/pytrainer.glade:4888
-#: glade/pytrainer.glade:4904
-#: pytrainer/gui/windowmain.py:633
-#: pytrainer/gui/windowmain.py:634
-#: pytrainer/gui/windowmain.py:756
-#: pytrainer/gui/windowmain.py:757
-#: pytrainer/gui/windowmain.py:834
-#: pytrainer/gui/windowmain.py:835
-#: pytrainer/lib/activity.py:203
+#: glade/pytrainer.glade:3417 glade/pytrainer.glade:3449
+#: glade/pytrainer.glade:4091 glade/pytrainer.glade:4107
+#: glade/pytrainer.glade:4745 glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:5399 glade/pytrainer.glade:5415
+#: pytrainer/gui/windowmain.py:918 pytrainer/gui/windowmain.py:919
+#: pytrainer/gui/windowmain.py:1047 pytrainer/gui/windowmain.py:1048
+#: pytrainer/gui/windowmain.py:1129 pytrainer/gui/windowmain.py:1130
+#: pytrainer/lib/activity.py:204
 msgid "min/km"
 msgstr "min/km"
 
-#: glade/pytrainer.glade:3153
+#: glade/pytrainer.glade:3556 glade/pytrainer.glade:4199
+#: glade/pytrainer.glade:4853 glade/pytrainer.glade:5506
+msgid "<b>Total Asc/Desc:</b>"
+msgstr "<b>Desnivel pos/neg:</b>"
+
+#: glade/pytrainer.glade:3583 glade/pytrainer.glade:4226
+#: glade/pytrainer.glade:4880 glade/pytrainer.glade:5533
+#: pytrainer/gui/windowmain.py:2066 pytrainer/gui/windowmain.py:2068
+#: pytrainer/lib/activity.py:205
+msgid "m"
+msgstr "m"
+
+#: glade/pytrainer.glade:3602
 msgid " <b>Date:</b>"
 msgstr "<b>Fecha:</b>"
 
-#: glade/pytrainer.glade:3196
+#: glade/pytrainer.glade:3645
 msgid "Value"
 msgstr "Valor"
 
-#: glade/pytrainer.glade:3207
+#: glade/pytrainer.glade:3656
 msgid ""
 "Stage Profile\n"
 "Stage Velocity\n"
@@ -1228,17 +1231,16 @@ msgstr ""
 "Velocidad de Etapa\n"
 "Perfil/Velocidad de Etapa"
 
-#: glade/pytrainer.glade:3263
+#: glade/pytrainer.glade:3712
 msgid "Day"
 msgstr "Día"
 
-#: glade/pytrainer.glade:3765
+#: glade/pytrainer.glade:4245
 msgid " <b>Week:</b>"
 msgstr "<b>Semana:</b>"
 
-#: glade/pytrainer.glade:3816
-#: glade/pytrainer.glade:4439
-#: glade/pytrainer.glade:5061
+#: glade/pytrainer.glade:4296 glade/pytrainer.glade:4950
+#: glade/pytrainer.glade:5603 glade/pytrainer.glade:5969
 msgid ""
 "Distance\n"
 "Time\n"
@@ -1252,9 +1254,8 @@ msgstr ""
 "Velocidad media\n"
 "Calorías"
 
-#: glade/pytrainer.glade:3842
-#: glade/pytrainer.glade:4465
-#: glade/pytrainer.glade:5087
+#: glade/pytrainer.glade:4322 glade/pytrainer.glade:4976
+#: glade/pytrainer.glade:5629 glade/pytrainer.glade:5995
 msgid ""
 "None\n"
 "Distance\n"
@@ -1270,51 +1271,80 @@ msgstr ""
 "Velocidad media\n"
 "Calorías"
 
-#: glade/pytrainer.glade:3886
+#: glade/pytrainer.glade:4366
 msgid "Week"
 msgstr "Semana"
 
-#: glade/pytrainer.glade:4388
+#: glade/pytrainer.glade:4899
 msgid " <b>Month:</b>"
 msgstr "<b>Mes:</b>"
 
-#: glade/pytrainer.glade:4508
+#: glade/pytrainer.glade:5019
 msgid "Month"
 msgstr "Mes"
 
-#: glade/pytrainer.glade:5010
+#: glade/pytrainer.glade:5552
 msgid " <b>Year:</b>"
 msgstr "<b>Año:</b>"
 
-#: glade/pytrainer.glade:5130
+#: glade/pytrainer.glade:5672
 msgid "Year"
 msgstr "Año"
 
-#: glade/pytrainer.glade:5284
+#: glade/pytrainer.glade:5826
 msgid "<b>Graph</b>"
 msgstr "<b>Gráfico</b>"
 
-#: glade/pytrainer.glade:5325
+#: glade/pytrainer.glade:5867
 msgid "<b>History</b>"
 msgstr "<b>Histórico</b>"
 
-#: glade/pytrainer.glade:5389
+#: glade/pytrainer.glade:5937
+msgid "<b>Sports</b>"
+msgstr "<b>Deportes</b>"
+
+#: glade/pytrainer.glade:6018
+msgid "Total distance:"
+msgstr "Distancia:"
+
+#: glade/pytrainer.glade:6032
+msgid "Total duration:"
+msgstr "Duración:"
+
+#: glade/pytrainer.glade:6081
+msgid "Start date:"
+msgstr "Fecha de comienzo:"
+
+#: glade/pytrainer.glade:6096
+msgid "End date:"
+msgstr "Fecha fin:"
+
+#: glade/pytrainer.glade:6182
+msgid "<b>All</b>"
+msgstr "<b>Todos</b>"
+
+#: glade/pytrainer.glade:6208
+msgid "Totals"
+msgstr "Totales"
+
+#: glade/pytrainer.glade:6246
 msgid "<b>Title:</b>"
 msgstr "<b>Título:</b>"
 
-#: glade/pytrainer.glade:5412
+#: glade/pytrainer.glade:6269
 msgid "Search"
 msgstr "Buscar"
 
-#: glade/pytrainer.glade:5436
+#: glade/pytrainer.glade:6293 pytrainer/lib/listview.py:3
+#: pytrainer/lib/listview.py:10
 msgid "All Distances"
 msgstr "Distancia"
 
-#: glade/pytrainer.glade:5445
+#: glade/pytrainer.glade:6302 pytrainer/lib/listview.py:35
 msgid "All Durations"
 msgstr "Duración"
 
-#: glade/pytrainer.glade:5455
+#: glade/pytrainer.glade:6312
 msgid ""
 "All time\n"
 "Last 4 weeks\n"
@@ -1326,15 +1356,15 @@ msgstr ""
 "Últimos 6 meses\n"
 "Últimos 12 meses"
 
-#: glade/pytrainer.glade:5492
+#: glade/pytrainer.glade:6349
 msgid "Columns"
 msgstr "Columnas"
 
-#: glade/pytrainer.glade:5619
+#: glade/pytrainer.glade:6477
 msgid "Type:"
 msgstr "Tipo:"
 
-#: glade/pytrainer.glade:5632
+#: glade/pytrainer.glade:6490
 msgid ""
 "Font\n"
 "Restaurant\n"
@@ -1346,31 +1376,31 @@ msgstr ""
 "Mirador\n"
 "Cumbre"
 
-#: glade/pytrainer.glade:5648
+#: glade/pytrainer.glade:6506
 msgid "Latitude: "
 msgstr "<b>Latitud:</b>"
 
-#: glade/pytrainer.glade:5662
+#: glade/pytrainer.glade:6520
 msgid " Name:"
 msgstr "Nombre:"
 
-#: glade/pytrainer.glade:5674
+#: glade/pytrainer.glade:6532
 msgid "Longitude:"
 msgstr "<b>Longitud:</b>"
 
-#: glade/pytrainer.glade:5766
+#: glade/pytrainer.glade:6624
 msgid "<b> Waypoint: </b>"
 msgstr "<b> Waypoint: </b>"
 
-#: glade/pytrainer.glade:5950
+#: glade/pytrainer.glade:6808
 msgid "Edit Record"
 msgstr "Editar entrada"
 
-#: glade/pytrainer.glade:5964
+#: glade/pytrainer.glade:6822
 msgid "Show graph in classic view"
 msgstr "Mostrar gráfico en vista clásica"
 
-#: glade/pytrainer.glade:5978
+#: glade/pytrainer.glade:6836
 msgid "Merge tracks"
 msgstr "Combinar entrenamientos"
 
@@ -1378,351 +1408,448 @@ msgstr "Combinar entrenamientos"
 msgid "Select track record"
 msgstr "Seleccione uno de los tracks"
 
-#: glade/warning.glade:7
-#: glade/warning.glade:38
+#: glade/warning.glade:7 glade/warning.glade:38
 msgid "Warning"
 msgstr "Advertencia"
 
-#: pytrainer/gui/windowmain.py:100
+#: pytrainer/gui/windowmain.py:107
 msgid "Miles"
 msgstr "Millas"
 
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:107
-#: pytrainer/gui/windowmain.py:120
-#: pytrainer/gui/windowmain.py:123
+#: pytrainer/gui/windowmain.py:110 pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:127 pytrainer/gui/windowmain.py:130
+#: pytrainer/gui/windowmain.py:139 pytrainer/gui/windowmain.py:173
+#: pytrainer/gui/windowmain.py:182
 msgid "id"
 msgstr "id"
 
-#: pytrainer/gui/windowmain.py:103
+#: pytrainer/gui/windowmain.py:110
 msgid "Start"
 msgstr "Comienzo"
 
-#: pytrainer/gui/windowmain.py:110
-#: pytrainer/gui/windowmain.py:393
-#: pytrainer/gui/windowmain.py:1148
-#: pytrainer/gui/windowimportdata.py:352
-#: pytrainer/gui/windowrecord.py:210
-#: pytrainer/lib/activity.py:313
-#: pytrainer/lib/activity.py:324
-#: pytrainer/lib/activity.py:396
-#: pytrainer/lib/activity.py:407
-#: pytrainer/lib/activity.py:416
-#: pytrainer/lib/activity.py:425
-#: pytrainer/lib/activity.py:434
-#: pytrainer/lib/activity.py:444
-#: pytrainer/lib/activity.py:453
-#: pytrainer/lib/activity.py:514
-#: pytrainer/extensions/googlemaps.py:71
-#: pytrainer/extensions/osm.py:50
+#: pytrainer/gui/windowmain.py:117 pytrainer/gui/windowmain.py:157
+#: pytrainer/gui/windowmain.py:175 pytrainer/gui/windowmain.py:185
+#: pytrainer/gui/windowmain.py:569 pytrainer/gui/windowmain.py:1495
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:210
+#: pytrainer/lib/activity.py:323 pytrainer/lib/activity.py:334
+#: pytrainer/lib/activity.py:406 pytrainer/lib/activity.py:417
+#: pytrainer/lib/activity.py:426 pytrainer/lib/activity.py:435
+#: pytrainer/lib/activity.py:444 pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:463 pytrainer/lib/activity.py:524
+#: pytrainer/extensions/googlemaps.py:129 pytrainer/extensions/osm.py:105
 msgid "Distance"
 msgstr "Distancia"
 
-#: pytrainer/gui/windowmain.py:112
-#: pytrainer/gui/windowmain.py:394
-#: pytrainer/gui/windowmain.py:1150
-#: pytrainer/extensions/googlemaps.py:71
-#: pytrainer/extensions/osm.py:50
+#: pytrainer/gui/windowmain.py:119 pytrainer/gui/windowmain.py:158
+#: pytrainer/gui/windowmain.py:176 pytrainer/gui/windowmain.py:186
+#: pytrainer/gui/windowmain.py:570 pytrainer/gui/windowmain.py:1497
+#: pytrainer/extensions/googlemaps.py:129 pytrainer/extensions/osm.py:104
 msgid "Time"
 msgstr "Tiempo"
 
-#: pytrainer/gui/windowmain.py:113
+#: pytrainer/gui/windowmain.py:120
 msgid "⌀ HR"
 msgstr "⌀ FC"
 
-#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:121
 msgid "⌀ Speed"
 msgstr "⌀ Velocidad"
 
-#: pytrainer/gui/windowmain.py:120
+#: pytrainer/gui/windowmain.py:127
 msgid "Waypoint"
 msgstr "Waypoint"
 
-#: pytrainer/gui/windowmain.py:125
+#: pytrainer/gui/windowmain.py:132
 msgid "Weight"
 msgstr "Peso"
 
-#: pytrainer/gui/windowmain.py:126
+#: pytrainer/gui/windowmain.py:133
 msgid "Body Fat %"
 msgstr "Grasa corporal %"
 
-#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:134
 msgid "Resting HR"
 msgstr "FC en reposo"
 
-#: pytrainer/gui/windowmain.py:128
+#: pytrainer/gui/windowmain.py:135 pytrainer/gui/windowmain.py:147
+#: pytrainer/gui/windowmain.py:164
 msgid "Max HR"
 msgstr "FC max"
 
-#: pytrainer/gui/windowmain.py:395
+#: pytrainer/gui/windowmain.py:141
+msgid "Records"
+msgstr "Registros"
+
+#: pytrainer/gui/windowmain.py:142
+msgid "Total duration"
+msgstr "Duración"
+
+#: pytrainer/gui/windowmain.py:143
+msgid "Total distance"
+msgstr "Distancia"
+
+#: pytrainer/gui/windowmain.py:144 pytrainer/gui/windowmain.py:159
+msgid "Avg speed"
+msgstr "Velocidad"
+
+#: pytrainer/gui/windowmain.py:145 pytrainer/gui/windowmain.py:160
+msgid "Max speed"
+msgstr "Velocidad Máx."
+
+#: pytrainer/gui/windowmain.py:146 pytrainer/gui/windowmain.py:163
+msgid "Avg HR"
+msgstr "FC med"
+
+#: pytrainer/gui/windowmain.py:148
+msgid "Max duration"
+msgstr "Duración"
+
+#: pytrainer/gui/windowmain.py:149
+msgid "Max distance"
+msgstr "Distancia"
+
+#: pytrainer/gui/windowmain.py:155
+msgid "Lap"
+msgstr "Vuelta"
+
+#: pytrainer/gui/windowmain.py:156
+msgid "Trigger"
+msgstr "Activador"
+
+#: pytrainer/gui/windowmain.py:161
+msgid "Avg pace"
+msgstr "Ritmo"
+
+#: pytrainer/gui/windowmain.py:162
+msgid "Max pace"
+msgstr "Pico ritmo"
+
+#: pytrainer/gui/windowmain.py:166
+msgid "Intensity"
+msgstr "Intensidad"
+
+#: pytrainer/gui/windowmain.py:174
+msgid "Race"
+msgstr "Carrera"
+
+#: pytrainer/gui/windowmain.py:183
+msgid "Rank"
+msgstr "Posición"
+
+#: pytrainer/gui/windowmain.py:187 pytrainer/recordgraph.py:136
+#: pytrainer/lib/activity.py:335 pytrainer/lib/activity.py:425
+#: pytrainer/lib/activity.py:427
+msgid "Speed"
+msgstr "Velocidad"
+
+#: pytrainer/gui/windowmain.py:319
+msgid "d"
+msgstr "d"
+
+#: pytrainer/gui/windowmain.py:559
+msgid "Show on X Axis"
+msgstr "Mostrar en eje X"
+
+#: pytrainer/gui/windowmain.py:560
+msgid "Show on Y1 Axis"
+msgstr "Mostrar en eje Y1"
+
+#: pytrainer/gui/windowmain.py:561
+msgid "Show on Y2 Axis"
+msgstr "Mostrar en eje Y2"
+
+#: pytrainer/gui/windowmain.py:562
+msgid "Axis Limits"
+msgstr "Límites de ejes"
+
+#: pytrainer/gui/windowmain.py:571
 msgid "Laps"
 msgstr "Vueltas"
 
-#: pytrainer/gui/windowmain.py:396
+#: pytrainer/gui/windowmain.py:572
 msgid "Left Axis Grid"
 msgstr "Cuadrícula eje izquierdo"
 
-#: pytrainer/gui/windowmain.py:397
+#: pytrainer/gui/windowmain.py:573
 msgid "Right Axis Grid"
 msgstr "Cuadrícula eje derecho"
 
-#: pytrainer/gui/windowmain.py:398
+#: pytrainer/gui/windowmain.py:574
 msgid "X Axis Grid"
 msgstr "Cuadrícula eje X"
 
-#: pytrainer/gui/windowmain.py:459
+#: pytrainer/gui/windowmain.py:635
 msgid "Reset Limits"
 msgstr "Borrar límites"
 
-#: pytrainer/gui/windowmain.py:461
+#: pytrainer/gui/windowmain.py:637
 msgid "Set Limits"
 msgstr "Establecer límites"
 
-#: pytrainer/gui/windowmain.py:616
+#: pytrainer/gui/windowmain.py:792
 msgid "Percentages method"
 msgstr "basado en porcentajes"
 
-#: pytrainer/gui/windowmain.py:624
-#: pytrainer/gui/windowmain.py:747
-#: pytrainer/gui/windowmain.py:825
-#: pytrainer/lib/activity.py:196
+#: pytrainer/gui/windowmain.py:805
+msgid "800 m"
+msgstr "800 m"
+
+#: pytrainer/gui/windowmain.py:806
+msgid "1500 m"
+msgstr "1500 m"
+
+#: pytrainer/gui/windowmain.py:807
+msgid "5K"
+msgstr "5 km"
+
+#: pytrainer/gui/windowmain.py:808
+msgid "7K"
+msgstr "7 km"
+
+#: pytrainer/gui/windowmain.py:809
+msgid "10K"
+msgstr "10 km"
+
+#: pytrainer/gui/windowmain.py:810
+msgid "Half marathon"
+msgstr "Media maratón"
+
+#: pytrainer/gui/windowmain.py:811
+msgid "Marathon"
+msgstr "Maratón"
+
+#: pytrainer/gui/windowmain.py:812
+msgid "100K"
+msgstr "100 km"
+
+#: pytrainer/gui/windowmain.py:909 pytrainer/gui/windowmain.py:1038
+#: pytrainer/gui/windowmain.py:1120 pytrainer/lib/activity.py:197
 msgid "miles"
 msgstr "millas"
 
-#: pytrainer/gui/windowmain.py:625
-#: pytrainer/gui/windowmain.py:626
-#: pytrainer/gui/windowmain.py:748
-#: pytrainer/gui/windowmain.py:749
-#: pytrainer/gui/windowmain.py:826
-#: pytrainer/gui/windowmain.py:827
-#: pytrainer/lib/activity.py:197
+#: pytrainer/gui/windowmain.py:910 pytrainer/gui/windowmain.py:911
+#: pytrainer/gui/windowmain.py:1039 pytrainer/gui/windowmain.py:1040
+#: pytrainer/gui/windowmain.py:1121 pytrainer/gui/windowmain.py:1122
+#: pytrainer/lib/activity.py:198
 msgid "miles/h"
 msgstr "millas/h"
 
-#: pytrainer/gui/windowmain.py:627
-#: pytrainer/gui/windowmain.py:628
-#: pytrainer/gui/windowmain.py:750
-#: pytrainer/gui/windowmain.py:751
-#: pytrainer/gui/windowmain.py:828
-#: pytrainer/gui/windowmain.py:829
-#: pytrainer/lib/activity.py:198
+#: pytrainer/gui/windowmain.py:912 pytrainer/gui/windowmain.py:913
+#: pytrainer/gui/windowmain.py:1041 pytrainer/gui/windowmain.py:1042
+#: pytrainer/gui/windowmain.py:1123 pytrainer/gui/windowmain.py:1124
+#: pytrainer/lib/activity.py:199
 msgid "min/mile"
 msgstr "min/milla"
 
-#: pytrainer/gui/windowmain.py:630
-#: pytrainer/gui/windowmain.py:753
-#: pytrainer/gui/windowmain.py:831
-#: pytrainer/lib/activity.py:201
+#: pytrainer/gui/windowmain.py:915 pytrainer/gui/windowmain.py:1044
+#: pytrainer/gui/windowmain.py:1126 pytrainer/lib/activity.py:202
 msgid "km"
 msgstr "km"
 
-#: pytrainer/gui/windowmain.py:1151
-#: pytrainer/recordgraph.py:144
+#: pytrainer/gui/windowmain.py:1498 pytrainer/recordgraph.py:144
 msgid "Beats"
 msgstr "Pulsaciones"
 
-#: pytrainer/gui/windowmain.py:1152
+#: pytrainer/gui/windowmain.py:1499
 msgid "Average"
 msgstr "Media"
 
-#: pytrainer/gui/windowmain.py:1371
+#: pytrainer/gui/windowmain.py:1718
 msgid "Hide graph display options"
 msgstr "Ocultar configuración de visualización gráfica"
 
-#: pytrainer/gui/windowmain.py:1669
+#: pytrainer/gui/windowmain.py:2056
 msgid "lap"
 msgstr "vuelta"
 
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/drawArea.py:165
-#: pytrainer/extensions/googlemaps.py:69
-#: pytrainer/extensions/osm.py:48
+#: pytrainer/gui/windowmain.py:2066 pytrainer/gui/drawArea.py:165
+#: pytrainer/extensions/googlemaps.py:127 pytrainer/extensions/osm.py:102
 msgid "h"
 msgstr "h"
 
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
-#: pytrainer/lib/activity.py:204
-msgid "m"
-msgstr "m"
-
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
+#: pytrainer/gui/windowmain.py:2066 pytrainer/gui/windowmain.py:2068
 msgid "s"
 msgstr "s"
 
-#: pytrainer/gui/windowmain.py:1765
-#: pytrainer/record.py:63
+#: pytrainer/gui/windowmain.py:2156 pytrainer/record.py:67
 msgid "Edit Entry"
 msgstr "Editar entrada"
 
-#: pytrainer/gui/windowmain.py:1776
+#: pytrainer/gui/windowmain.py:2167
 msgid "Delete Entry"
 msgstr "Borrar entrada"
 
-#: pytrainer/gui/windowmain.py:1800
+#: pytrainer/gui/windowmain.py:2191
 msgid "Create Athlete Entry"
 msgstr "Crear entrada de atleta"
 
-#: pytrainer/gui/windowmain.py:1804
+#: pytrainer/gui/windowmain.py:2195
 msgid "Edit Athlete Entry"
 msgstr "Editar atleta"
 
-#: pytrainer/gui/windowmain.py:1885
-#: pytrainer/main.py:433
+#: pytrainer/gui/windowmain.py:2208
+msgid "<b>Date</b>"
+msgstr "<b>Fecha</b>"
+
+#: pytrainer/gui/windowmain.py:2224
+msgid "<b>Weight</b>"
+msgstr "<b>Peso</b>"
+
+#: pytrainer/gui/windowmain.py:2232
+msgid "<b>Body Fat</b>"
+msgstr "<b>Grasa corporal</b>"
+
+#: pytrainer/gui/windowmain.py:2240
+msgid "<b>Resting Heart Rate</b>"
+msgstr "<b>Pulsaciones en reposo</b>"
+
+#: pytrainer/gui/windowmain.py:2248
+msgid "<b>Max Heart Rate</b>"
+msgstr "<b>Pulsaciones máx</b>"
+
+#: pytrainer/gui/windowmain.py:2276 pytrainer/main.py:451
 msgid "Delete this database entry?"
 msgstr "¿Borrar esta entrada de la base de datos?"
 
-#: pytrainer/gui/windowmain.py:1887
+#: pytrainer/gui/windowmain.py:2278
 msgid "Are you sure?"
 msgstr "¿Está seguro?"
 
-#: pytrainer/gui/windowimportdata.py:116
+#: pytrainer/gui/windowimportdata.py:117
 msgid "No file selected"
 msgstr "Ningún fichero seleccionado"
 
-#: pytrainer/gui/windowimportdata.py:161
+#: pytrainer/gui/windowimportdata.py:162
 msgid "Configure"
 msgstr "Configurar"
 
-#: pytrainer/gui/windowimportdata.py:162
+#: pytrainer/gui/windowimportdata.py:163
 msgid "Run"
 msgstr "Ejecutar"
 
-#: pytrainer/gui/windowimportdata.py:170
+#: pytrainer/gui/windowimportdata.py:171
 msgid "Disabled"
 msgstr "Desactivo"
 
-#: pytrainer/gui/windowimportdata.py:172
+#: pytrainer/gui/windowimportdata.py:173
 msgid "Enabled"
 msgstr "Activo"
 
-#: pytrainer/gui/windowimportdata.py:252
+#: pytrainer/gui/windowimportdata.py:253
 msgid "GPS device found"
 msgstr "Dispositivos GPS encontrado"
 
-#: pytrainer/gui/windowimportdata.py:255
+#: pytrainer/gui/windowimportdata.py:256
 msgid "GPS device <b>not</b> found"
 msgstr "Dispositivo GPS <b>no</b> encontrado"
 
-#: pytrainer/gui/windowimportdata.py:262
+#: pytrainer/gui/windowimportdata.py:263
 msgid "This tool was not found on the system"
 msgstr "No se ha encontrado esta herramienta en el sistema"
 
-#: pytrainer/gui/windowimportdata.py:264
+#: pytrainer/gui/windowimportdata.py:265
 msgid " Homepage"
 msgstr "Página de inicio"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "File"
 msgstr "Archivo"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "Type"
 msgstr "Tipo"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "Activities"
 msgstr "Actividades"
 
-#: pytrainer/gui/windowimportdata.py:352
-#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:210
 msgid "Start Time"
 msgstr "Hora de comienzo"
 
-#: pytrainer/gui/windowimportdata.py:352
-#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/gui/windowimportdata.py:353 pytrainer/gui/windowrecord.py:210
 msgid "Duration"
 msgstr "Duración"
 
-#: pytrainer/gui/windowimportdata.py:501
+#: pytrainer/gui/windowimportdata.py:499
 msgid "Imported into database"
 msgstr "Importado a base de datos"
 
-#: pytrainer/gui/windowimportdata.py:545
-#: pytrainer/gui/windowextensions.py:81
+#: pytrainer/gui/windowimportdata.py:543 pytrainer/gui/windowextensions.py:81
 #: pytrainer/gui/windowplugins.py:80
 #, python-format
 msgid "%s settings"
 msgstr "%s opciones"
 
-#: pytrainer/gui/windowimportdata.py:560
-#: pytrainer/gui/windowextensions.py:70
-#: pytrainer/gui/windowplugins.py:71
-#: pytrainer/gui/windowplugins.py:95
+#: pytrainer/gui/windowimportdata.py:558 pytrainer/gui/windowextensions.py:70
+#: pytrainer/gui/windowplugins.py:71 pytrainer/gui/windowplugins.py:95
 msgid "Disable"
 msgstr "Desactivo"
 
-#: pytrainer/gui/windowimportdata.py:561
-#: pytrainer/gui/windowextensions.py:72
-#: pytrainer/gui/windowplugins.py:69
-#: pytrainer/gui/windowplugins.py:96
+#: pytrainer/gui/windowimportdata.py:559 pytrainer/gui/windowextensions.py:72
+#: pytrainer/gui/windowplugins.py:69 pytrainer/gui/windowplugins.py:96
 msgid "Enable"
 msgstr "Activo"
 
-#: pytrainer/gui/windowimportdata.py:568
-#: pytrainer/gui/windowplugins.py:103
+#: pytrainer/gui/windowimportdata.py:566 pytrainer/gui/windowplugins.py:103
 msgid "Ok"
 msgstr "Ok"
 
-#: pytrainer/gui/windowimportdata.py:628
+#: pytrainer/gui/windowimportdata.py:626
 msgid "Saving options"
 msgstr "Guardar configuración"
 
-#: pytrainer/gui/windowimportdata.py:630
+#: pytrainer/gui/windowimportdata.py:628
 msgid "Options saved"
 msgstr "Configuración guardada"
 
-#: pytrainer/gui/windowimportdata.py:655
+#: pytrainer/gui/windowimportdata.py:653
 msgid "Importing one activity"
 msgstr "Importando una actividad"
 
-#: pytrainer/gui/windowimportdata.py:656
+#: pytrainer/gui/windowimportdata.py:654
 msgid "Imported one activity"
 msgstr "Una actividad importada"
 
-#: pytrainer/gui/windowimportdata.py:658
+#: pytrainer/gui/windowimportdata.py:656
 #, python-format
 msgid "Importing %d activities"
 msgstr "Importando %d actividades"
 
-#: pytrainer/gui/windowimportdata.py:659
+#: pytrainer/gui/windowimportdata.py:657
 #, python-format
 msgid "Imported %d activities"
 msgstr "Importadas %d actividades"
 
-#: pytrainer/gui/windowimportdata.py:678
+#: pytrainer/gui/windowimportdata.py:676
 msgid "Choose a file (or files) to import activities from"
 msgstr "Seleccione fichero/s desde el/los que importar actividades"
 
-#: pytrainer/gui/windowimportdata.py:693
-#: pytrainer/gui/windowimportdata.py:694
+#: pytrainer/gui/windowimportdata.py:691 pytrainer/gui/windowimportdata.py:692
 #, python-format
 msgid "Found file of type: %s"
 msgstr "Tipo de fichero encontrado: %s"
 
-#: pytrainer/gui/windowimportdata.py:718
+#: pytrainer/gui/windowimportdata.py:716
 msgid "Found in database"
 msgstr "Encontrado en base de datos"
 
-#: pytrainer/gui/windowimportdata.py:733
-#: pytrainer/gui/windowimportdata.py:734
+#: pytrainer/gui/windowimportdata.py:731 pytrainer/gui/windowimportdata.py:732
 #, python-format
 msgid "File %s is of unknown or unsupported file type"
 msgstr "Fichero %s seleccionado desconocido o no soportado"
 
-#: pytrainer/gui/windowimportdata.py:807
+#: pytrainer/gui/windowimportdata.py:805
 #, python-format
 msgid "Column %d"
 msgstr "Columna %d"
 
-#: pytrainer/gui/drawArea.py:166
-#: pytrainer/extensions/googlemaps.py:69
-#: pytrainer/extensions/osm.py:48
+#: pytrainer/gui/drawArea.py:166 pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
 msgid "min"
 msgstr "min"
 
-#: pytrainer/gui/drawArea.py:399
+#: pytrainer/gui/drawArea.py:410
 msgid "rest"
 msgstr "descanso"
 
@@ -1730,21 +1857,25 @@ msgstr "descanso"
 msgid "GPX File"
 msgstr "Archivo GPX"
 
-#: pytrainer/gui/windowprofile.py:41
+#: pytrainer/gui/windowprofile.py:47
 msgid "Male"
 msgstr "Varón"
 
-#: pytrainer/gui/windowprofile.py:42
+#: pytrainer/gui/windowprofile.py:48
 msgid "Female"
 msgstr "Mujer"
 
-#: pytrainer/gui/windowprofile.py:59
+#: pytrainer/gui/windowprofile.py:65
 msgid "MET"
 msgstr "M.E.T."
 
-#: pytrainer/gui/windowprofile.py:59
-msgid "Maximum Pace"
-msgstr "Ritmo más rápido"
+#: pytrainer/gui/windowprofile.py:314
+msgid "Sport Creation Error"
+msgstr "Fallo en la creación de deporte"
+
+#: pytrainer/gui/equipment.py:101
+msgid "Usage"
+msgstr "Uso"
 
 #: pytrainer/gui/dialogselecttrack.py:40
 msgid "Track Name"
@@ -1754,18 +1885,15 @@ msgstr "Nombre de la ruta"
 msgid "Athlete Data"
 msgstr "Datos del atleta"
 
-#: pytrainer/gui/windowextensions.py:112
-#: pytrainer/gui/windowextensions.py:125
+#: pytrainer/gui/windowextensions.py:112 pytrainer/gui/windowextensions.py:125
 msgid "OK"
 msgstr "Ok"
 
-#: pytrainer/recordgraph.py:134
-#: pytrainer/daygraph.py:52
+#: pytrainer/recordgraph.py:134 pytrainer/daygraph.py:52
 msgid "Height (m)"
 msgstr "Altura (m)"
 
-#: pytrainer/recordgraph.py:134
-#: pytrainer/daygraph.py:52
+#: pytrainer/recordgraph.py:134 pytrainer/daygraph.py:52
 msgid "Stage Profile"
 msgstr "Perfil de Etapa"
 
@@ -1773,22 +1901,12 @@ msgstr "Perfil de Etapa"
 msgid "Speed (Km/h)"
 msgstr "Velocidad (km/h)"
 
-#: pytrainer/recordgraph.py:136
-#: pytrainer/lib/activity.py:325
-#: pytrainer/lib/activity.py:415
-#: pytrainer/lib/activity.py:417
-msgid "Speed"
-msgstr "Velocidad"
-
-#: pytrainer/recordgraph.py:138
-#: pytrainer/lib/activity.py:314
-#: pytrainer/lib/activity.py:424
-#: pytrainer/lib/activity.py:426
+#: pytrainer/recordgraph.py:138 pytrainer/lib/activity.py:324
+#: pytrainer/lib/activity.py:434 pytrainer/lib/activity.py:436
 msgid "Pace"
 msgstr "Ritmo"
 
-#: pytrainer/recordgraph.py:140
-#: pytrainer/heartrategraph.py:36
+#: pytrainer/recordgraph.py:140 pytrainer/heartrategraph.py:36
 #: pytrainer/daygraph.py:56
 msgid "Beats (bpm)"
 msgstr "Media pulsaciones (ppm)"
@@ -1797,9 +1915,8 @@ msgstr "Media pulsaciones (ppm)"
 msgid "Cadence (rpm)"
 msgstr "Cadencia (rpm)"
 
-#: pytrainer/recordgraph.py:142
-#: pytrainer/lib/activity.py:452
-#: pytrainer/lib/activity.py:454
+#: pytrainer/recordgraph.py:142 pytrainer/lib/activity.py:462
+#: pytrainer/lib/activity.py:464
 msgid "Cadence"
 msgstr "Cadence"
 
@@ -1811,131 +1928,169 @@ msgstr "Pulsaciones (%)"
 msgid "Zone"
 msgstr "Zona"
 
-#: pytrainer/profile.py:109
+#: pytrainer/profile.py:114
 msgid "Moderate activity"
 msgstr "Actividad moderada"
 
-#: pytrainer/profile.py:110
+#: pytrainer/profile.py:115
 msgid "Weight Control"
 msgstr "Control de peso"
 
-#: pytrainer/profile.py:111
+#: pytrainer/profile.py:116
 msgid "Aerobic"
 msgstr "Aeróbico"
 
-#: pytrainer/profile.py:112
+#: pytrainer/profile.py:117
 msgid "Anaerobic"
 msgstr "Anaeróbico"
 
-#: pytrainer/profile.py:113
+#: pytrainer/profile.py:118
 msgid "VO2 MAX"
 msgstr "VO2 máximo"
 
-#: pytrainer/lib/gpx.py:122
+#: pytrainer/lib/listview.py:32
+msgid "All Time"
+msgstr "Fecha"
+
+#: pytrainer/lib/listview.py:32
+msgid "Last 4 Weeks"
+msgstr "Últimas 4 semanas"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 6 Months"
+msgstr "Últimos 6 meses"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 12 Months"
+msgstr "Últimos 12 meses"
+
+#: pytrainer/lib/listview.py:36
+msgid "<1 Hour"
+msgstr "< 1 hora"
+
+#: pytrainer/lib/listview.py:37
+msgid "1-2 Hours"
+msgstr "De 1 a 2 horas"
+
+#: pytrainer/lib/listview.py:38
+msgid ">2 Hours"
+msgstr "> 2 horas"
+
+#: pytrainer/lib/gpx.py:129
 msgid "No Name"
 msgstr "Sin nombre"
 
-#: pytrainer/lib/gpx.py:129
+#: pytrainer/lib/gpx.py:137
 msgid "No Data"
 msgstr "Sin datos"
 
-#: pytrainer/lib/activity.py:199
+#: pytrainer/lib/activity.py:200
 msgid "feet"
 msgstr "pies"
 
-#: pytrainer/lib/activity.py:312
+#: pytrainer/lib/activity.py:322
 msgid "Pace by Lap"
 msgstr "Ritmo por vuelta"
 
-#: pytrainer/lib/activity.py:318
-#: pytrainer/lib/activity.py:329
-#: pytrainer/lib/activity.py:401
-#: pytrainer/lib/activity.py:411
-#: pytrainer/lib/activity.py:420
-#: pytrainer/lib/activity.py:429
-#: pytrainer/lib/activity.py:438
-#: pytrainer/lib/activity.py:448
-#: pytrainer/lib/activity.py:457
-#: pytrainer/lib/activity.py:519
+#: pytrainer/lib/activity.py:328 pytrainer/lib/activity.py:339
+#: pytrainer/lib/activity.py:411 pytrainer/lib/activity.py:421
+#: pytrainer/lib/activity.py:430 pytrainer/lib/activity.py:439
+#: pytrainer/lib/activity.py:448 pytrainer/lib/activity.py:458
+#: pytrainer/lib/activity.py:467 pytrainer/lib/activity.py:529
 msgid "Time (seconds)"
 msgstr "Tiempo (segundos)"
 
-#: pytrainer/lib/activity.py:323
+#: pytrainer/lib/activity.py:333
 msgid "Speed by Lap"
 msgstr "Velocidad por vuelta"
 
-#: pytrainer/lib/activity.py:395
-#: pytrainer/lib/activity.py:397
+#: pytrainer/lib/activity.py:405 pytrainer/lib/activity.py:407
 msgid "Elevation"
 msgstr "Altura"
 
-#: pytrainer/lib/activity.py:406
-#: pytrainer/lib/activity.py:408
+#: pytrainer/lib/activity.py:416 pytrainer/lib/activity.py:418
 msgid "Corrected Elevation"
 msgstr "Altura corregida"
 
-#: pytrainer/lib/activity.py:443
+#: pytrainer/lib/activity.py:453
 #, python-format
 msgid "Heart Rate (% of max)"
 msgstr "Frecuencia cardíaca (% del máx.)"
 
-#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455
 msgid "%"
 msgstr "%"
 
-#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:464
 msgid "rpm"
 msgstr "rpm"
 
-#: pytrainer/lib/activity.py:513
+#: pytrainer/lib/activity.py:523
 msgid "Heart Rate zone"
 msgstr "Zona frecuencia cardiaca"
 
-#: pytrainer/monthgraph.py:70
-#: pytrainer/monthgraph.py:72
-#: pytrainer/monthgraph.py:74
-#: pytrainer/monthgraph.py:76
-#: pytrainer/monthgraph.py:78
+#: pytrainer/monthgraph.py:26 pytrainer/monthgraph.py:27
+#: pytrainer/monthgraph.py:28 pytrainer/monthgraph.py:29
+#: pytrainer/monthgraph.py:30
 msgid "day"
 msgstr "día"
 
-#: pytrainer/monthgraph.py:70
-#: pytrainer/weekgraph.py:115
+#: pytrainer/monthgraph.py:26 pytrainer/weekgraph.py:28
 msgid "Daily Distance"
 msgstr "Distancia"
 
-#: pytrainer/monthgraph.py:72
-#: pytrainer/yeargraph.py:72
-#: pytrainer/weekgraph.py:117
+#: pytrainer/monthgraph.py:27 pytrainer/totalgraph.py:25
+#: pytrainer/yeargraph.py:27 pytrainer/weekgraph.py:29
 msgid "Time (hours)"
 msgstr "Tiempo en horas"
 
-#: pytrainer/monthgraph.py:72
-#: pytrainer/weekgraph.py:117
+#: pytrainer/monthgraph.py:27 pytrainer/weekgraph.py:29
 msgid "Daily Time"
 msgstr "Tiempo diario"
 
-#: pytrainer/monthgraph.py:74
-#: pytrainer/yeargraph.py:74
-#: pytrainer/weekgraph.py:119
+#: pytrainer/monthgraph.py:28 pytrainer/totalgraph.py:26
+#: pytrainer/yeargraph.py:28 pytrainer/weekgraph.py:30
 msgid "Average Heart Rate (bpm)"
 msgstr "Pulsaciones medias (ppm)"
 
-#: pytrainer/monthgraph.py:74
-#: pytrainer/weekgraph.py:119
+#: pytrainer/monthgraph.py:28 pytrainer/weekgraph.py:30
 msgid "Daily Average Heart Rate"
 msgstr "Pulsaciones diarias"
 
-#: pytrainer/monthgraph.py:76
-#: pytrainer/weekgraph.py:121
+#: pytrainer/monthgraph.py:29 pytrainer/weekgraph.py:31
 msgid "Daily Average Speed"
 msgstr "medias diarias"
 
-#: pytrainer/monthgraph.py:78
-#: pytrainer/weekgraph.py:123
+#: pytrainer/monthgraph.py:30 pytrainer/weekgraph.py:32
 msgid "Daily Calories"
 msgstr "Calorías diarias"
 
+#: pytrainer/totalgraph.py:24 pytrainer/totalgraph.py:25
+#: pytrainer/totalgraph.py:26 pytrainer/totalgraph.py:27
+#: pytrainer/totalgraph.py:28
+msgid "year"
+msgstr "año"
+
+#: pytrainer/totalgraph.py:24
+msgid "Annual Distance"
+msgstr "Distancia anual"
+
+#: pytrainer/totalgraph.py:25
+msgid "Annual Time"
+msgstr "Tiempo anual"
+
+#: pytrainer/totalgraph.py:26
+msgid "Annual Average Heart Rate"
+msgstr "Pulsaciones medias en el año"
+
+#: pytrainer/totalgraph.py:27
+msgid "Annual Average Speed"
+msgstr "Velocidad media anual"
+
+#: pytrainer/totalgraph.py:28
+msgid "Annual Calories"
+msgstr "Calorías (kcal) en el año"
+
 #: pytrainer/athlete.py:52
 msgid "lb"
 msgstr "lb"
@@ -1944,41 +2099,47 @@ msgstr "lb"
 msgid "kg"
 msgstr "kg"
 
-#: pytrainer/record.py:513
+#: pytrainer/record.py:56
+msgid "Modify details before importing"
+msgstr "Modificar detalles antes de importar"
+
+#: pytrainer/record.py:466
 msgid "pyTrainer can't import data from your gpx file"
 msgstr "pyTrainer no puede importar datos de tu fichero gpx"
 
-#: pytrainer/yeargraph.py:70
-#: pytrainer/yeargraph.py:72
-#: pytrainer/yeargraph.py:74
-#: pytrainer/yeargraph.py:76
-#: pytrainer/yeargraph.py:78
+#: pytrainer/yeargraph.py:26 pytrainer/yeargraph.py:27
+#: pytrainer/yeargraph.py:28 pytrainer/yeargraph.py:29
+#: pytrainer/yeargraph.py:30
 msgid "month"
 msgstr "mes"
 
-#: pytrainer/yeargraph.py:70
+#: pytrainer/yeargraph.py:26
 msgid "Monthly Distance"
 msgstr "Distancia"
 
-#: pytrainer/yeargraph.py:72
+#: pytrainer/yeargraph.py:27
 msgid "Monthly Time"
 msgstr "Tiempo mensual"
 
-#: pytrainer/yeargraph.py:74
+#: pytrainer/yeargraph.py:28
 msgid "Monthly Average Heart Rate"
 msgstr "Pulsaciones medias mensuales"
 
-#: pytrainer/yeargraph.py:76
+#: pytrainer/yeargraph.py:29
 msgid "Monthly Average Speed"
 msgstr "Medias mensuales"
 
-#: pytrainer/yeargraph.py:78
+#: pytrainer/yeargraph.py:30
 msgid "Monthly Calories"
 msgstr "Calorías mensuales"
 
 #: pytrainer/waypoint.py:87
-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 actividades de varios días. Probablemente necesites editarlo"
+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 actividades de varios días. Probablemente "
+"necesites editarlo"
 
 #: pytrainer/daygraph.py:54
 msgid "Velocity (Km/h)"
@@ -1988,7 +2149,7 @@ msgstr "Velocidad (km/h)"
 msgid "Velocity"
 msgstr "Velocidad"
 
-#: pytrainer/main.py:449
+#: pytrainer/main.py:467
 msgid "Delete this waypoint?"
 msgstr "¿Borrar este waypoint?"
 
@@ -2024,23 +2185,15 @@ msgstr "Gant"
 msgid "Garmin tools dump file"
 msgstr "Fichero de volcado de datos de Garmintools"
 
-#: import/file_garmintcxv2.py:43
+#: import/file_garmintcxv2.py:44
 msgid "Garmin training center database file version 2"
 msgstr "Versión 2 del fichero Garmin training center database"
 
-#: extensions/fixelevation/fixelevation.py:94
+#: extensions/fixelevation/fixelevation.py:129
 msgid "Elevation Correction Complete"
 msgstr "Corrección de altura completada"
 
-#: extensions/openstreetmap/openstreetmap.py:30
-msgid "Must have username and password configured"
-msgstr "Es obligatorio indicar nombre de usuario y contraseña"
-
-#: extensions/openstreetmap/openstreetmap.py:32
-msgid "Openstreetmap Extension Error"
-msgstr "Error de la extensión OpenStreetMap"
-
-#: extensions/openstreetmap/openstreetmap.py:79
+#: extensions/openstreetmap/openstreetmap.py:82
 msgid ""
 "Posting GPX trace to Openstreetmap\n"
 "\n"
@@ -2050,18 +2203,34 @@ msgstr ""
 "\n"
 "Por favor espere, puede durar varios minutos"
 
-#: extensions/openstreetmap/openstreetmap.py:81
+#: extensions/openstreetmap/openstreetmap.py:84
 msgid "Openstreetmap Extension Processing"
 msgstr "Procesando extensión OpenStreetMap"
 
-#: extensions/openstreetmap/openstreetmap.py:99
+#: extensions/openstreetmap/openstreetmap.py:102
 msgid "Openstreetmap Extension Upload Complete"
 msgstr "Envío completo de la extensión OpenStreetMap"
 
+#: extensions/openstreetmap/openstreetmap.py:107
+msgid "Error while uploading file to OSM: "
+msgstr "Error mientras se subía el fichero a OSM:"
+
 #: extensions/openstreetmap/openstreetmap.py:109
+msgid "Openstreetmap Extension Error"
+msgstr "Error de la extensión OpenStreetMap"
+
+#: extensions/openstreetmap/openstreetmap.py:117
 msgid "Please add any additional information for this upload"
 msgstr "Por favor indique información adicional para este envío"
 
+#: extensions/openstreetmap/openstreetmap.py:204
+msgid "Error"
+msgstr "Error"
+
+#: extensions/openstreetmap/openstreetmap.py:247
+msgid "Error while saving extension configuration"
+msgstr "Error mientras se guardaba la configuración de la extensión"
+
 #: extensions/wordpress/wordpress.py:46
 msgid "Posting to Wordpress blog"
 msgstr "Subir a blog de Wordpress"
@@ -2073,80 +2242,3 @@ msgstr "Procesando extensión Wordpress"
 #: extensions/wordpress/wordpress.py:144
 msgid "Wordpress Extension Upload Complete"
 msgstr "Envío completo a Wordpress"
-
-#~ 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 "Googlemaps v3"
-#~ msgstr "Googlemaps v3"
-
-#~ msgid "<small>Is the Googlemaps API version 3 in use?</small>"
-#~ msgstr "<small>¿Se usa la versión 3 de la API de Googlemaps?</small>"
-
-#~ msgid "Unified Import"
-#~ msgstr "Importar"
-
-#~ msgid "<small>Is the Unified Importer active?</small>"
-#~ msgstr "<small>¿Está habilitado el importador unificado?</small>"
-
-#~ msgid "Equipment handling"
-#~ msgstr "Gestión de equipamiento"
-
-#~ msgid "<small>Want to track equipment?</small>"
-#~ msgstr "<small>¿Control de equipamiento?</small>"
-
-#~ msgid ""
-#~ "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to "
-#~ "switch it off</small>"
-#~ msgstr ""
-#~ "<small>* Se usa por defecto la versión 3 de la API de Googlemaps, utilice "
-#~ "--gmaps2 para desactivarla</small>"
-
-#~ msgid "Category:"
-#~ msgstr "Categoría:"
-
-#~ msgid ""
-#~ "Running shoes\n"
-#~ "GPS watch\n"
-#~ "T-shirts\n"
-#~ "Tyres\n"
-#~ "Socks"
-#~ msgstr ""
-#~ "Zapatillas de correr\n"
-#~ "Reloj GPS\n"
-#~ "Camiseta\n"
-#~ "Rueda\n"
-#~ "Calcetines"
-
-#~ msgid "New equipment"
-#~ msgstr "Nuevo equipamiento"
-
-#~ msgid "Kilometer"
-#~ msgstr "Kilómetros"
-
-#~ msgid "Elevation v Distance"
-#~ msgstr "Altura vs Distancia"
-
-#~ msgid "Elevation v Time"
-#~ msgstr "Altura vs Tiempo"
-
-#~ msgid "Speed v Distance"
-#~ msgstr "Velocidad vs Distancia"
-
-#~ msgid "Pace v Distance"
-#~ msgstr "Ritmo vs Distancia"
-
-#~ msgid "Heart Rate v Distance"
-#~ msgstr "Pulsaciones vs Distancia"
-
-#~ msgid "Cadence v Distance"
-#~ msgstr "Cadencia vs Distancia"
diff --git a/locale/fr/LC_MESSAGES/pytrainer_fr.po b/locale/fr/LC_MESSAGES/pytrainer_fr.po
index 4994f9c..cf365ff 100644
--- a/locale/fr/LC_MESSAGES/pytrainer_fr.po
+++ b/locale/fr/LC_MESSAGES/pytrainer_fr.po
@@ -1,19 +1,19 @@
 # translation of pytrainer_fr.po to
-# French translations for vud package.
-# Copyright (C) 2006 THE vud'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the vud package.
+# French translations for pytrainer package.
+# Copyright (C) 2006 THE pytrainer'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the pytrainer package.
 #
 # Fiz Vazquez <vud1 at sindominio.net>, 2006.
 # dj <dj at djremixtheblog.be>, 2006.
 msgid ""
 msgstr ""
-"Project-Id-Version: pytrainer_fr\n"
+"Project-Id-Version: pytrainer_fr 1.9.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-25 22:45+0100\n"
+"POT-Creation-Date: 2011-10-12 22:01+0200\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Pierre Gaigé <pgaige at free.fr>\n"
 "Language-Team:  <fr at li.org>\n"
-"Language: \n"
+"Language: French\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -32,6 +32,7 @@ msgstr "<b>Liste d'équipements</b>"
 
 #: glade/equipment.glade:149
 #: glade/equipment.glade:406
+#: pytrainer/gui/equipment.py:98
 msgid "Description"
 msgstr "Description"
 
@@ -47,12 +48,13 @@ msgstr "Utilisation précédente"
 
 #: glade/equipment.glade:243
 #: glade/equipment.glade:499
+#: pytrainer/gui/equipment.py:102
 msgid "Active"
 msgstr "Actif"
 
 #: glade/equipment.glade:277
 #: glade/equipment.glade:533
-#: pytrainer/gui/windowimportdata.py:352
+#: pytrainer/gui/windowimportdata.py:353
 msgid "Notes"
 msgstr "Notes"
 
@@ -83,12 +85,12 @@ msgstr "<b>Détail des Extensions</b>"
 
 #: glade/extensions.glade:67
 msgid "name-entry"
-msgstr ""
+msgstr "name-entry"
 
 #: glade/extensions.glade:82
 #: glade/plugins.glade:144
-#: glade/profile.glade:727
-#: glade/pytrainer.glade:5161
+#: glade/profile.glade:728
+#: glade/pytrainer.glade:5703
 msgid "Name:"
 msgstr "Nom:"
 
@@ -99,19 +101,18 @@ msgstr "Statut:"
 
 #: glade/extensions.glade:110
 #: glade/plugins.glade:86
-#: glade/pytrainer.glade:5690
+#: glade/pytrainer.glade:6548
 msgid "Description:"
 msgstr "Description:"
 
 #: glade/extensions.glade:124
 #: glade/plugins.glade:100
 msgid "status-entry"
-msgstr ""
+msgstr "status-entry"
 
 #: glade/extensions.glade:139
-#, fuzzy
 msgid "description-entry"
-msgstr "Description:"
+msgstr "description-entry"
 
 #: glade/importdata.glade:7
 #: glade/importdata.glade:325
@@ -123,6 +124,8 @@ msgid ""
 "Test 1\n"
 "Test 2"
 msgstr ""
+"Test 1\n"
+"Test 2"
 
 #: glade/importdata.glade:46
 msgid "<b>Select your GPS device</b>"
@@ -242,9 +245,10 @@ msgid "<b>File delimiter</b>"
 msgstr "<b>Délimiteur de champs</b>"
 
 #: glade/importdata.glade:864
-#: pytrainer/gui/windowmain.py:109
-#: pytrainer/gui/windowmain.py:124
-#: pytrainer/gui/windowmain.py:1147
+#: pytrainer/gui/windowmain.py:116
+#: pytrainer/gui/windowmain.py:131
+#: pytrainer/gui/windowmain.py:184
+#: pytrainer/gui/windowmain.py:1494
 #: pytrainer/gui/dialogselecttrack.py:40
 msgid "Date"
 msgstr "Date"
@@ -268,7 +272,8 @@ msgid "Exclude"
 msgstr "Exclure"
 
 #: glade/importdata.glade:892
-#: pytrainer/monthgraph.py:70
+#: pytrainer/totalgraph.py:24
+#: pytrainer/monthgraph.py:26
 #: pytrainer/heartrategraph.py:36
 #: pytrainer/recordgraph.py:134
 #: pytrainer/recordgraph.py:136
@@ -277,8 +282,8 @@ msgstr "Exclure"
 #: pytrainer/recordgraph.py:142
 #: pytrainer/recordgraph.py:144
 #: pytrainer/recordgraph.py:146
-#: pytrainer/weekgraph.py:115
-#: pytrainer/yeargraph.py:70
+#: pytrainer/weekgraph.py:28
+#: pytrainer/yeargraph.py:26
 #: pytrainer/daygraph.py:52
 #: pytrainer/daygraph.py:54
 #: pytrainer/daygraph.py:56
@@ -298,8 +303,8 @@ msgid "<b>File Column</b>"
 msgstr "<b>Colonne du fichier</b>"
 
 #: glade/importdata.glade:972
-#: pytrainer/gui/windowmain.py:108
-#: pytrainer/gui/windowmain.py:1146
+#: pytrainer/gui/windowmain.py:115
+#: pytrainer/gui/windowmain.py:1493
 msgid "Title"
 msgstr "Titre"
 
@@ -320,19 +325,21 @@ msgid "Max Speed (km/h)"
 msgstr "Vitesse Max (km/h)"
 
 #: glade/importdata.glade:1037
-#: pytrainer/monthgraph.py:76
-#: pytrainer/weekgraph.py:121
-#: pytrainer/yeargraph.py:76
+#: pytrainer/totalgraph.py:27
+#: pytrainer/monthgraph.py:29
+#: pytrainer/weekgraph.py:31
+#: pytrainer/yeargraph.py:29
 msgid "Average Speed (km/h)"
 msgstr "Vitesse moyenne (km/h)"
 
 #: glade/importdata.glade:1050
 #: glade/pytrainer.glade:277
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:111
-#: pytrainer/gui/windowmain.py:1149
-#: pytrainer/gui/windowimportdata.py:352
-#: pytrainer/gui/windowprofile.py:59
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:118
+#: pytrainer/gui/windowmain.py:140
+#: pytrainer/gui/windowmain.py:1496
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowprofile.py:65
 #: pytrainer/gui/windowrecord.py:210
 msgid "Sport"
 msgstr "Sport"
@@ -356,6 +363,7 @@ msgstr "Allure Max (min/km)"
 
 #: glade/importdata.glade:1115
 #: glade/newrecord.glade:1094
+#: pytrainer/gui/windowmain.py:167
 msgid "Comments"
 msgstr "Commentaires"
 
@@ -395,7 +403,7 @@ msgid "<b>Import from CSV</b>"
 msgstr "<b>Importer à partir d'un fichier CSV</b>"
 
 #: glade/newrecord.glade:7
-#: pytrainer/gui/windowmain.py:1769
+#: pytrainer/gui/windowmain.py:2160
 msgid "New Entry"
 msgstr "Nouvelle entrée"
 
@@ -428,7 +436,7 @@ msgstr "Distance (km):"
 #: glade/newrecord.glade:558
 #: glade/newrecord.glade:697
 #: glade/newrecord.glade:958
-#: glade/profile.glade:1462
+#: glade/profile.glade:1548
 msgid "Calculate"
 msgstr "Calculer"
 
@@ -451,10 +459,10 @@ msgstr "Début:"
 
 #: glade/newrecord.glade:461
 msgid "12:00:00"
-msgstr ""
+msgstr "12:00:00"
 
 #: glade/newrecord.glade:486
-#: glade/profile.glade:1500
+#: glade/profile.glade:1586
 msgid "<b>General</b>"
 msgstr "<b>Général:</b>"
 
@@ -480,7 +488,7 @@ msgstr "Max (min/km)"
 
 #: glade/newrecord.glade:671
 msgid "Pace (min/km):"
-msgstr "Allure (min/km)"
+msgstr "Allure (min/km):"
 
 #: glade/newrecord.glade:718
 msgid "<b>Pace</b>"
@@ -507,11 +515,13 @@ msgid "Heart rate:"
 msgstr "Fréquence Cardiaque:"
 
 #: glade/newrecord.glade:902
-#: pytrainer/monthgraph.py:78
-#: pytrainer/weekgraph.py:123
-#: pytrainer/gui/windowmain.py:115
-#: pytrainer/gui/windowmain.py:1153
-#: pytrainer/yeargraph.py:78
+#: pytrainer/totalgraph.py:28
+#: pytrainer/monthgraph.py:30
+#: pytrainer/weekgraph.py:32
+#: pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:165
+#: pytrainer/gui/windowmain.py:1500
+#: pytrainer/yeargraph.py:30
 msgid "Calories"
 msgstr "Calories"
 
@@ -540,7 +550,7 @@ msgid "<b>Associated Equipment</b>"
 msgstr "<b>Équipement associé</b>"
 
 #: glade/newrecord.glade:1203
-#: glade/profile.glade:1360
+#: glade/profile.glade:1446
 msgid "Equipment"
 msgstr "Équipement"
 
@@ -549,13 +559,12 @@ msgid "<b>Plugin Details</b>"
 msgstr "<b>Détail du plugin</b>"
 
 #: glade/plugins.glade:68
-#, fuzzy
 msgid "description-entry "
-msgstr "Description:"
+msgstr "description-entry"
 
 #: glade/plugins.glade:129
 msgid "nameEntry"
-msgstr ""
+msgstr "nameEntry"
 
 #: glade/profile.glade:7
 msgid "Preferences"
@@ -574,12 +583,12 @@ msgid "<b>System of Measurement</b>"
 msgstr "<b>Système de Mesure</b>"
 
 #: glade/profile.glade:103
-#: glade/pytrainer.glade:2023
+#: glade/pytrainer.glade:2111
 msgid "Google"
-msgstr ""
+msgstr "Google"
 
 #: glade/profile.glade:118
-#: glade/pytrainer.glade:2006
+#: glade/pytrainer.glade:2094
 msgid "Open Street Map"
 msgstr "Open Street Map"
 
@@ -624,12 +633,12 @@ msgid "Gender:"
 msgstr "Sexe:"
 
 #: glade/profile.glade:407
-#: glade/pytrainer.glade:5186
+#: glade/pytrainer.glade:5728
 msgid "Height:"
 msgstr "Taille:"
 
 #: glade/profile.glade:447
-#: glade/pytrainer.glade:5173
+#: glade/pytrainer.glade:5715
 msgid "Date of birth:"
 msgstr "Date de Naissance:"
 
@@ -638,49 +647,49 @@ msgid "Weight:"
 msgstr "Poids:"
 
 #: glade/profile.glade:542
-#: glade/pytrainer.glade:5248
+#: glade/pytrainer.glade:5790
 msgid "<b>Athlete Details</b>"
 msgstr "<b>Détail de l'Athlète</b>"
 
 #: glade/profile.glade:557
-#: glade/pytrainer.glade:5351
+#: glade/pytrainer.glade:5893
 msgid "Athlete"
 msgstr "Athlète"
 
-#: glade/profile.glade:671
+#: glade/profile.glade:672
 msgid "<b>Sport List</b>"
 msgstr "<b>Liste des Sports</b>"
 
-#: glade/profile.glade:683
+#: glade/profile.glade:684
 msgid "llist"
-msgstr ""
+msgstr "llist"
 
-#: glade/profile.glade:738
+#: glade/profile.glade:739
 msgid "M.E.T.:"
 msgstr "M.E.T.:"
 
-#: glade/profile.glade:765
+#: glade/profile.glade:766
 msgid "Extra Weight:"
 msgstr "Poids Additionnel:"
 
-#: glade/profile.glade:801
-#: glade/profile.glade:1181
+#: glade/profile.glade:802
+#: glade/profile.glade:1218
 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:821
+#: glade/profile.glade:822
 msgid "Maximum Pace:"
 msgstr "Allure Max:"
 
-#: glade/profile.glade:913
+#: glade/profile.glade:950
 msgid "<b>Add New Sport</b>"
 msgstr "<b>Ajouter un Sport</b>"
 
-#: glade/profile.glade:928
+#: glade/profile.glade:965
 msgid "new"
 msgstr "nouveau"
 
-#: glade/profile.glade:959
+#: glade/profile.glade:996
 msgid ""
 "Deleting a sport removes associated records.\n"
 "Continue?"
@@ -688,96 +697,103 @@ msgstr ""
 "Détruire un sport supprime les enregistrements associés.\n"
 "Continuer?"
 
-#: glade/profile.glade:1041
+#: glade/profile.glade:1078
 msgid "<b>Delete Sport</b>"
 msgstr "<b>Supprimer un Sport</b>"
 
-#: glade/profile.glade:1073
+#: glade/profile.glade:1110
 msgid "delete"
 msgstr "supprimer"
 
-#: glade/profile.glade:1106
+#: glade/profile.glade:1143
 msgid "Name"
 msgstr "Nom"
 
-#: glade/profile.glade:1129
+#: glade/profile.glade:1166
 msgid "M.E.T."
 msgstr "M.E.T."
 
-#: glade/profile.glade:1156
-#: pytrainer/gui/windowprofile.py:59
+#: glade/profile.glade:1193
+#: pytrainer/gui/windowprofile.py:65
 msgid "Extra Weight"
 msgstr "Poids Additionnel"
 
-#: glade/profile.glade:1201
-msgid "Maxiumum Pace"
-msgstr "Allure Max"
+#: glade/profile.glade:1238
+#: pytrainer/gui/windowprofile.py:65
+msgid "Maximum Pace"
+msgstr "Allure Maximale"
+
+#: glade/profile.glade:1265
+#: pytrainer/gui/windowmain.py:188
+#: pytrainer/gui/windowprofile.py:65
+msgid "Color"
+msgstr "Couleur"
 
-#: glade/profile.glade:1289
+#: glade/profile.glade:1375
 msgid "<b>Edit Sport</b>"
 msgstr "<b>Éditer un sport</b>"
 
-#: glade/profile.glade:1300
+#: glade/profile.glade:1386
 msgid "<b>lalaal</b>"
 msgstr "<b>Base de données</b>"
 
-#: glade/profile.glade:1322
+#: glade/profile.glade:1408
 msgid "edit"
 msgstr "édition"
 
-#: glade/profile.glade:1338
+#: glade/profile.glade:1424
 msgid "Sports"
 msgstr "Sports"
 
-#: glade/profile.glade:1393
+#: glade/profile.glade:1479
 msgid "Maximum heart rate:"
 msgstr "Fréquence Cardiaque Maximale:"
 
-#: glade/profile.glade:1404
+#: glade/profile.glade:1490
 msgid "Resting heart rate:"
 msgstr "Fréquence Cardiaque au Repos:"
 
-#: glade/profile.glade:1449
+#: glade/profile.glade:1535
 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:1536
+#: glade/profile.glade:1622
 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:1549
+#: glade/profile.glade:1635
 msgid "Percentages based method"
 msgstr "Méthode basée sur des pourcentages"
 
-#: glade/profile.glade:1565
-#: pytrainer/gui/windowmain.py:614
+#: glade/profile.glade:1651
+#: pytrainer/gui/windowmain.py:790
 msgid "Karvonen method"
 msgstr "Méthode de Karvonen"
 
-#: glade/profile.glade:1586
+#: glade/profile.glade:1672
 msgid "Select how to calculate your heart rate zones."
 msgstr "Sélectionnez la méthode appropriée pour définir les zones cardiaque."
 
-#: glade/profile.glade:1625
+#: glade/profile.glade:1711
 msgid "<b>Heart Rate Zones</b>"
 msgstr "<b>Zones Cardiaque:</b>"
 
-#: glade/profile.glade:1647
+#: glade/profile.glade:1733
 #: pytrainer/heartrategraph.py:36
 #: pytrainer/recordgraph.py:140
 #: pytrainer/daygraph.py:56
-#: pytrainer/lib/activity.py:433
-#: pytrainer/lib/activity.py:435
+#: pytrainer/lib/activity.py:443
 #: pytrainer/lib/activity.py:445
-#: pytrainer/lib/activity.py:515
+#: pytrainer/lib/activity.py:455
+#: pytrainer/lib/activity.py:525
 msgid "Heart Rate"
 msgstr "Fréquence Cardiaque"
 
-#: glade/profile.glade:1673
+#: glade/profile.glade:1759
 msgid "Log Level"
 msgstr "Niveau de Log"
 
-#: glade/profile.glade:1681
+#: glade/profile.glade:1767
 msgid ""
 "Error\n"
 "Warning\n"
@@ -789,39 +805,39 @@ msgstr ""
 "Info\n"
 "Debug"
 
-#: glade/profile.glade:1699
+#: glade/profile.glade:1785
 msgid "<small>What level of detail is written to the log?</small>"
 msgstr "<small>Niveau de détail du fichier log?</small>"
 
-#: glade/profile.glade:1713
+#: glade/profile.glade:1799
 msgid "Validate"
 msgstr "Valider"
 
-#: glade/profile.glade:1743
+#: glade/profile.glade:1829
 msgid "<small>Do the plugins attempt to validate the input file before processing?</small>"
 msgstr "<small>Le plugin doit-il essayer de valider le fichier d'entrée avant d'effectuer le traitement?</small>"
 
-#: glade/profile.glade:1759
+#: glade/profile.glade:1845
 msgid "Check"
 msgstr "Vérifier"
 
-#: glade/profile.glade:1788
+#: glade/profile.glade:1874
 msgid "<small>Was a configuration and database check requested?</small>"
 msgstr "<small>La vérification de la configuration et de la base de données est-elle activée?</small>"
 
-#: glade/profile.glade:1804
+#: glade/profile.glade:1890
 msgid "New Graph"
 msgstr "Nouveau Graphe"
 
-#: glade/profile.glade:1833
+#: glade/profile.glade:1919
 msgid "<small>Want to use experimental new approach to graphing?</small>"
 msgstr "<small>Voulez vous expérimenter un nouveau mode pour les graphes?</small>"
 
-#: glade/profile.glade:1876
+#: glade/profile.glade:1962
 msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>"
 msgstr "<small>Cet écran montre l'état des options configurables de la ligne de commande de pytrainer. Ces options peuvent être changées ici pour la session en cours, elles ne seront toutefois pas conservées au prochain démarrage.</small>"
 
-#: glade/profile.glade:1897
+#: glade/profile.glade:1983
 msgid "Startup Parameters"
 msgstr "Paramètres de démarrage"
 
@@ -830,9 +846,8 @@ msgid "_File"
 msgstr "_Fichier"
 
 #: glade/pytrainer.glade:39
-#, fuzzy
 msgid "_Import"
-msgstr "Importer"
+msgstr "_Import"
 
 #: glade/pytrainer.glade:60
 msgid "_Export as Text Separated by Commas"
@@ -871,7 +886,7 @@ msgid "_Help"
 msgstr "_Aide"
 
 #: glade/pytrainer.glade:290
-#: glade/pytrainer.glade:5467
+#: glade/pytrainer.glade:6324
 msgid "All Sports"
 msgstr "Tous les Sports"
 
@@ -880,26 +895,26 @@ msgid "<b>Sport:</b>"
 msgstr "<b>Sport:</b>"
 
 #: glade/pytrainer.glade:408
-#: glade/pytrainer.glade:2726
-#: glade/pytrainer.glade:3337
-#: glade/pytrainer.glade:3960
-#: glade/pytrainer.glade:4659
+#: glade/pytrainer.glade:3144
+#: glade/pytrainer.glade:3786
+#: glade/pytrainer.glade:4440
+#: glade/pytrainer.glade:5170
 msgid "<b>Duration:</b>"
 msgstr "<b>Durée:</b>"
 
 #: glade/pytrainer.glade:423
-#: glade/pytrainer.glade:2816
-#: glade/pytrainer.glade:3416
-#: glade/pytrainer.glade:4039
-#: glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:3234
+#: glade/pytrainer.glade:3865
+#: glade/pytrainer.glade:4519
+#: glade/pytrainer.glade:5272
 msgid "<b>Speed:</b>"
 msgstr "<b>Vitesse:</b>"
 
 #: glade/pytrainer.glade:437
-#: glade/pytrainer.glade:2984
-#: glade/pytrainer.glade:3611
-#: glade/pytrainer.glade:4234
-#: glade/pytrainer.glade:4856
+#: glade/pytrainer.glade:3402
+#: glade/pytrainer.glade:4060
+#: glade/pytrainer.glade:4714
+#: glade/pytrainer.glade:5367
 msgid "<b>Pace:</b>"
 msgstr "<b>Allure:</b>"
 
@@ -920,10 +935,10 @@ msgid "<b>Date:</b>"
 msgstr "<b>Date:</b>"
 
 #: glade/pytrainer.glade:628
-#: glade/pytrainer.glade:2712
-#: glade/pytrainer.glade:3323
-#: glade/pytrainer.glade:3946
-#: glade/pytrainer.glade:4645
+#: glade/pytrainer.glade:3130
+#: glade/pytrainer.glade:3772
+#: glade/pytrainer.glade:4426
+#: glade/pytrainer.glade:5156
 msgid "<b>Distance:</b>"
 msgstr "<b>Distance:</b>"
 
@@ -932,10 +947,10 @@ msgid "<b>Max Speed</b>"
 msgstr "<b>Vitesse Max:</b>"
 
 #: glade/pytrainer.glade:661
-#: glade/pytrainer.glade:3014
-#: glade/pytrainer.glade:3625
-#: glade/pytrainer.glade:4248
-#: glade/pytrainer.glade:4871
+#: glade/pytrainer.glade:3432
+#: glade/pytrainer.glade:4074
+#: glade/pytrainer.glade:4728
+#: glade/pytrainer.glade:5382
 msgid "<b>Max Pace:</b>"
 msgstr "<b>Allure Max:</b>"
 
@@ -944,55 +959,67 @@ msgid "<b>Descent:</b>"
 msgstr "<b>Dénivelé Négatif:</b>"
 
 #: glade/pytrainer.glade:769
-#: glade/pytrainer.glade:2924
-#: glade/pytrainer.glade:3491
-#: glade/pytrainer.glade:4114
-#: glade/pytrainer.glade:4571
+#: glade/pytrainer.glade:3342
+#: glade/pytrainer.glade:3940
+#: glade/pytrainer.glade:4594
+#: glade/pytrainer.glade:5082
 msgid "Cal"
 msgstr "Cal"
 
-#: glade/pytrainer.glade:808
-#: glade/pytrainer.glade:2686
-#: glade/pytrainer.glade:3297
-#: glade/pytrainer.glade:3920
-#: glade/pytrainer.glade:4748
-#: pytrainer/gui/windowmain.py:102
+#: glade/pytrainer.glade:809
+#: glade/pytrainer.glade:3104
+#: glade/pytrainer.glade:3746
+#: glade/pytrainer.glade:4400
+#: glade/pytrainer.glade:5259
+#: pytrainer/gui/windowmain.py:109
 msgid "Km"
 msgstr "km"
 
-#: glade/pytrainer.glade:823
-#: glade/pytrainer.glade:2846
-#: glade/pytrainer.glade:2879
-#: glade/pytrainer.glade:3446
-#: glade/pytrainer.glade:3539
-#: glade/pytrainer.glade:4069
-#: glade/pytrainer.glade:4162
-#: glade/pytrainer.glade:4791
-#: glade/pytrainer.glade:4807
-#: pytrainer/gui/windowmain.py:631
-#: pytrainer/gui/windowmain.py:632
-#: pytrainer/gui/windowmain.py:754
-#: pytrainer/gui/windowmain.py:755
-#: pytrainer/gui/windowmain.py:832
-#: pytrainer/gui/windowmain.py:833
-#: pytrainer/lib/activity.py:202
+#: glade/pytrainer.glade:824
+#: glade/pytrainer.glade:3264
+#: glade/pytrainer.glade:3297
+#: glade/pytrainer.glade:3895
+#: glade/pytrainer.glade:3988
+#: glade/pytrainer.glade:4549
+#: glade/pytrainer.glade:4642
+#: glade/pytrainer.glade:5302
+#: glade/pytrainer.glade:5318
+#: pytrainer/gui/windowmain.py:916
+#: pytrainer/gui/windowmain.py:917
+#: pytrainer/gui/windowmain.py:1045
+#: pytrainer/gui/windowmain.py:1046
+#: pytrainer/gui/windowmain.py:1127
+#: pytrainer/gui/windowmain.py:1128
+#: pytrainer/lib/activity.py:203
 msgid "km/h"
 msgstr "km/h"
 
-#: glade/pytrainer.glade:838
+#: glade/pytrainer.glade:839
 msgid "<b>Equipment:</b>"
 msgstr "<b>Équipement:</b>"
 
-#: glade/pytrainer.glade:1014
+#: glade/pytrainer.glade:935
+msgid "<b>Active / Rest:</b>"
+msgstr "<b>Actif / Repos:</b>"
+
+#: glade/pytrainer.glade:962
+msgid "h:m:s"
+msgstr "h:m:s"
+
+#: glade/pytrainer.glade:1007
+msgid "<b>Laps</b>"
+msgstr "<b>Tours</b>"
+
+#: glade/pytrainer.glade:1078
 msgid " <b>Title:</b>"
 msgstr " <b>Titre:</b>"
 
-#: glade/pytrainer.glade:1064
-#: pytrainer/gui/windowmain.py:1375
+#: glade/pytrainer.glade:1128
+#: pytrainer/gui/windowmain.py:1722
 msgid "Show graph display options"
 msgstr "Montrer les réglages du graphe"
 
-#: glade/pytrainer.glade:1082
+#: glade/pytrainer.glade:1146
 msgid ""
 "Profile\n"
 "Speed\n"
@@ -1010,14 +1037,15 @@ msgstr ""
 "Pourcentage\n"
 "Zone"
 
-#: glade/pytrainer.glade:1099
-#: glade/pytrainer.glade:3831
-#: glade/pytrainer.glade:4454
-#: glade/pytrainer.glade:5076
+#: glade/pytrainer.glade:1163
+#: glade/pytrainer.glade:4311
+#: glade/pytrainer.glade:4965
+#: glade/pytrainer.glade:5618
+#: glade/pytrainer.glade:5984
 msgid "Versus"
 msgstr "Versus"
 
-#: glade/pytrainer.glade:1110
+#: glade/pytrainer.glade:1174
 msgid ""
 "None\n"
 "Profile\n"
@@ -1033,199 +1061,272 @@ msgstr ""
 "Fréquence Cardiaque\n"
 "Rythme\n"
 
-#: glade/pytrainer.glade:1257
+#: glade/pytrainer.glade:1320
 msgid "<small>Graph Display Options</small>"
 msgstr "<small>Options d'affichage des graphiques</small>"
 
-#: glade/pytrainer.glade:1282
-#: glade/pytrainer.glade:1497
-#: glade/pytrainer.glade:1717
+#: glade/pytrainer.glade:1345
+#: glade/pytrainer.glade:1560
+#: glade/pytrainer.glade:1780
 msgid "<small>Limits</small>"
 msgstr "<small>Limites</small>"
 
-#: glade/pytrainer.glade:1294
-#: glade/pytrainer.glade:1509
-#: glade/pytrainer.glade:1763
+#: glade/pytrainer.glade:1357
+#: glade/pytrainer.glade:1572
+#: glade/pytrainer.glade:1826
 msgid "<small>Min</small>"
 msgstr "<small>Min</small>"
 
-#: glade/pytrainer.glade:1306
-#: glade/pytrainer.glade:1521
-#: glade/pytrainer.glade:1775
+#: glade/pytrainer.glade:1369
+#: glade/pytrainer.glade:1584
+#: glade/pytrainer.glade:1838
 msgid "<small>Max</small>"
 msgstr "<small>Max</small>"
 
-#: glade/pytrainer.glade:1355
-#: glade/pytrainer.glade:1577
+#: glade/pytrainer.glade:1418
+#: glade/pytrainer.glade:1640
 msgid "<small>Color</small>"
 msgstr "<small>Couleur</small>"
 
-#: glade/pytrainer.glade:1386
-#: glade/pytrainer.glade:1590
+#: glade/pytrainer.glade:1449
+#: glade/pytrainer.glade:1653
 msgid "<small>Weight</small>"
 msgstr "<small>Poids</small>"
 
-#: glade/pytrainer.glade:1416
+#: glade/pytrainer.glade:1479
 msgid "Y1"
-msgstr ""
+msgstr "Y1"
 
-#: glade/pytrainer.glade:1427
-#: glade/pytrainer.glade:1638
+#: glade/pytrainer.glade:1490
+#: glade/pytrainer.glade:1701
 msgid "<small>Smoothing</small>"
 msgstr "<small>Lissage</small>"
 
-#: glade/pytrainer.glade:1567
+#: glade/pytrainer.glade:1630
 msgid "Y2"
-msgstr ""
+msgstr "Y2"
 
-#: glade/pytrainer.glade:1707
+#: glade/pytrainer.glade:1770
 msgid "X"
-msgstr ""
+msgstr "X"
 
-#: glade/pytrainer.glade:1788
+#: glade/pytrainer.glade:1851
 msgid "<small>Distance</small>"
 msgstr "<small>Distance</small>"
 
-#: glade/pytrainer.glade:1817
+#: glade/pytrainer.glade:1880
 msgid "<small>Time</small>"
 msgstr "<small>Temps</small>"
 
-#: glade/pytrainer.glade:1878
+#: glade/pytrainer.glade:1941
 msgid "Show Laps"
 msgstr "Montrer les tours"
 
-#: glade/pytrainer.glade:1917
+#: glade/pytrainer.glade:1980
 msgid "Reset Graph"
 msgstr "Réinitialiser le Graphe"
 
-#: glade/pytrainer.glade:1979
+#: glade/pytrainer.glade:2042
 msgid "Redraw Map"
 msgstr "Redessiner la carte"
 
-#: glade/pytrainer.glade:1995
+#: glade/pytrainer.glade:2058
+msgid "<small>Show:</small>"
+msgstr "<small>Afficher:</small>"
+
+#: glade/pytrainer.glade:2069
+msgid ""
+"None\n"
+"Speed\n"
+"Heart rate\n"
+"Cadence"
+msgstr ""
+"Rien\n"
+"Vitesse\n"
+"Fréquence Cardiaque\n"
+"Allure"
+
+#: glade/pytrainer.glade:2084
 msgid "<small>Display map using:</small>"
 msgstr "<small>Afficher la carte avec:</small>"
 
-#: glade/pytrainer.glade:2097
+#: glade/pytrainer.glade:2185
 msgid "<b>Beats:</b>"
 msgstr "<b>FC Moy:</b>"
 
-#: glade/pytrainer.glade:2109
-#: glade/pytrainer.glade:2894
-#: glade/pytrainer.glade:3461
-#: glade/pytrainer.glade:4084
-#: glade/pytrainer.glade:4541
+#: glade/pytrainer.glade:2197
+#: glade/pytrainer.glade:3312
+#: glade/pytrainer.glade:3910
+#: glade/pytrainer.glade:4564
+#: glade/pytrainer.glade:5052
 msgid "<b>Calories: </b>"
 msgstr "<b>Calories:</b>"
 
-#: glade/pytrainer.glade:2123
-#: glade/pytrainer.glade:3046
-#: glade/pytrainer.glade:3689
-#: glade/pytrainer.glade:4312
-#: glade/pytrainer.glade:4919
+#: glade/pytrainer.glade:2211
+#: glade/pytrainer.glade:3464
+#: glade/pytrainer.glade:4138
+#: glade/pytrainer.glade:4792
+#: glade/pytrainer.glade:5430
 msgid "<b>Max Beats:</b>"
 msgstr "<b>FC Max:</b>"
 
-#: glade/pytrainer.glade:2137
+#: glade/pytrainer.glade:2225
 msgid "<b>HR Zones Method:</b>"
 msgstr "<b>Calcul des zones de FC :</b>"
 
-#: glade/pytrainer.glade:2152
+#: glade/pytrainer.glade:2240
 msgid "<b>HR Zone5:</b>"
 msgstr "<b>Zone FC5:</b>"
 
-#: glade/pytrainer.glade:2167
-#: glade/pytrainer.glade:2366
+#: glade/pytrainer.glade:2255
+#: glade/pytrainer.glade:2454
 msgid " bpm"
 msgstr " bpm"
 
-#: glade/pytrainer.glade:2183
+#: glade/pytrainer.glade:2271
 msgid " Cal"
 msgstr " Cal"
 
-#: glade/pytrainer.glade:2241
+#: glade/pytrainer.glade:2329
 msgid "<b>HR Zone4:</b>"
 msgstr "<b>Zone FC4:</b>"
 
-#: glade/pytrainer.glade:2257
+#: glade/pytrainer.glade:2345
 msgid "<b>HR Zone3:</b>"
 msgstr "<b>Zone FC3:</b>"
 
-#: glade/pytrainer.glade:2273
+#: glade/pytrainer.glade:2361
 msgid "<b>HR Zone2:</b>"
 msgstr "<b>Zone FC2:</b>"
 
-#: glade/pytrainer.glade:2289
+#: glade/pytrainer.glade:2377
 msgid "<b>HR Zone1:</b>"
 msgstr "<b>Zone FC1:</b>"
 
-#: glade/pytrainer.glade:2391
-#: glade/pytrainer.glade:2403
-#: glade/pytrainer.glade:2418
-#: glade/pytrainer.glade:2433
-#: glade/pytrainer.glade:2448
-#: glade/pytrainer.glade:2969
-#: glade/pytrainer.glade:3063
-#: glade/pytrainer.glade:3596
-#: glade/pytrainer.glade:3674
-#: glade/pytrainer.glade:4219
-#: glade/pytrainer.glade:4297
-#: glade/pytrainer.glade:4616
-#: glade/pytrainer.glade:4823
-#: pytrainer/lib/activity.py:435
-#: pytrainer/lib/activity.py:515
+#: glade/pytrainer.glade:2479
+#: glade/pytrainer.glade:2491
+#: glade/pytrainer.glade:2506
+#: glade/pytrainer.glade:2521
+#: glade/pytrainer.glade:2536
+#: glade/pytrainer.glade:3387
+#: glade/pytrainer.glade:3481
+#: glade/pytrainer.glade:4045
+#: glade/pytrainer.glade:4123
+#: glade/pytrainer.glade:4699
+#: glade/pytrainer.glade:4777
+#: glade/pytrainer.glade:5127
+#: glade/pytrainer.glade:5334
+#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:525
 msgid "bpm"
 msgstr "bpm"
 
-#: glade/pytrainer.glade:2493
+#: glade/pytrainer.glade:2581
 msgid " <b>Heart Rate:</b>"
 msgstr " <b>Fréquence Cardiaque:</b>"
 
-#: glade/pytrainer.glade:2653
+#: glade/pytrainer.glade:2769
+msgid "<b>Projected times</b>"
+msgstr "<b>Temps estimé</b>"
+
+#: glade/pytrainer.glade:2799
+msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>"
+msgstr "<i>Classement de l'activité comparativement à une activité de même nature pour une distance de ± x%:</i>"
+
+#: glade/pytrainer.glade:2832
+msgid "<b>Range:</b>"
+msgstr "<b>Intervalle:</b>"
+
+#: glade/pytrainer.glade:2845
+msgid "<b>Rank:</b>"
+msgstr "<b>Classement:</b>"
+
+#: glade/pytrainer.glade:2858
+msgid "<b>Speed: </b>"
+msgstr "<b>Vitesse:</b>"
+
+#: glade/pytrainer.glade:2871
+msgid "<b>Avg speed:</b>"
+msgstr "<b>Vitesse moy.:</b>"
+
+#: glade/pytrainer.glade:2884
+msgid "<b>Standard deviation:</b>"
+msgstr "<b>Écart type:</b>"
+
+#: glade/pytrainer.glade:2898
+msgid "<b>Deviation:</b>"
+msgstr "<b>Dispersion:</b>"
+
+#: glade/pytrainer.glade:3017
+msgid "<b>Ranking</b>"
+msgstr "<b>Classement:</b>"
+
+#: glade/pytrainer.glade:3043
+msgid "<b>Analytics:</b>"
+msgstr "<b>Analyse:</b>"
+
+#: glade/pytrainer.glade:3071
 msgid "Record"
 msgstr "Enregistrement"
 
-#: glade/pytrainer.glade:2862
-#: glade/pytrainer.glade:3507
-#: glade/pytrainer.glade:4130
-#: glade/pytrainer.glade:4839
+#: glade/pytrainer.glade:3280
+#: glade/pytrainer.glade:3956
+#: glade/pytrainer.glade:4610
+#: glade/pytrainer.glade:5350
 msgid "<b>Max Speed:</b>"
 msgstr "<b>Vit. Max:</b>"
 
-#: glade/pytrainer.glade:2939
-#: glade/pytrainer.glade:3566
-#: glade/pytrainer.glade:4189
-#: glade/pytrainer.glade:4586
+#: glade/pytrainer.glade:3357
+#: glade/pytrainer.glade:4015
+#: glade/pytrainer.glade:4669
+#: glade/pytrainer.glade:5097
 msgid "<b>Beats avg:</b>"
 msgstr "<b>FC Moy:</b>"
 
-#: glade/pytrainer.glade:2999
-#: glade/pytrainer.glade:3031
-#: glade/pytrainer.glade:3642
-#: glade/pytrainer.glade:3658
-#: glade/pytrainer.glade:4265
-#: glade/pytrainer.glade:4281
-#: glade/pytrainer.glade:4888
-#: glade/pytrainer.glade:4904
-#: pytrainer/gui/windowmain.py:633
-#: pytrainer/gui/windowmain.py:634
-#: pytrainer/gui/windowmain.py:756
-#: pytrainer/gui/windowmain.py:757
-#: pytrainer/gui/windowmain.py:834
-#: pytrainer/gui/windowmain.py:835
-#: pytrainer/lib/activity.py:203
+#: glade/pytrainer.glade:3417
+#: glade/pytrainer.glade:3449
+#: glade/pytrainer.glade:4091
+#: glade/pytrainer.glade:4107
+#: glade/pytrainer.glade:4745
+#: glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:5399
+#: glade/pytrainer.glade:5415
+#: pytrainer/gui/windowmain.py:918
+#: pytrainer/gui/windowmain.py:919
+#: pytrainer/gui/windowmain.py:1047
+#: pytrainer/gui/windowmain.py:1048
+#: pytrainer/gui/windowmain.py:1129
+#: pytrainer/gui/windowmain.py:1130
+#: pytrainer/lib/activity.py:204
 msgid "min/km"
 msgstr "min/km"
 
-#: glade/pytrainer.glade:3153
+#: glade/pytrainer.glade:3556
+#: glade/pytrainer.glade:4199
+#: glade/pytrainer.glade:4853
+#: glade/pytrainer.glade:5506
+msgid "<b>Total Asc/Desc:</b>"
+msgstr "<b>Dénivelé Total Pos/Neg:</b>"
+
+#: glade/pytrainer.glade:3583
+#: glade/pytrainer.glade:4226
+#: glade/pytrainer.glade:4880
+#: glade/pytrainer.glade:5533
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
+#: pytrainer/lib/activity.py:205
+msgid "m"
+msgstr "m"
+
+#: glade/pytrainer.glade:3602
 msgid " <b>Date:</b>"
 msgstr " <b>Date:</b>"
 
-#: glade/pytrainer.glade:3196
+#: glade/pytrainer.glade:3645
 msgid "Value"
 msgstr "Valeur"
 
-#: glade/pytrainer.glade:3207
+#: glade/pytrainer.glade:3656
 msgid ""
 "Stage Profile\n"
 "Stage Velocity\n"
@@ -1235,17 +1336,18 @@ msgstr ""
 "Vitesse de la sortie\n"
 "Profil de la sortie/Vitesse"
 
-#: glade/pytrainer.glade:3263
+#: glade/pytrainer.glade:3712
 msgid "Day"
 msgstr "Jour"
 
-#: glade/pytrainer.glade:3765
+#: glade/pytrainer.glade:4245
 msgid " <b>Week:</b>"
 msgstr "<b>Semaine:</b>"
 
-#: glade/pytrainer.glade:3816
-#: glade/pytrainer.glade:4439
-#: glade/pytrainer.glade:5061
+#: glade/pytrainer.glade:4296
+#: glade/pytrainer.glade:4950
+#: glade/pytrainer.glade:5603
+#: glade/pytrainer.glade:5969
 msgid ""
 "Distance\n"
 "Time\n"
@@ -1259,9 +1361,10 @@ msgstr ""
 "Vitesse moyenne\n"
 "Calories"
 
-#: glade/pytrainer.glade:3842
-#: glade/pytrainer.glade:4465
-#: glade/pytrainer.glade:5087
+#: glade/pytrainer.glade:4322
+#: glade/pytrainer.glade:4976
+#: glade/pytrainer.glade:5629
+#: glade/pytrainer.glade:5995
 msgid ""
 "None\n"
 "Distance\n"
@@ -1277,51 +1380,82 @@ msgstr ""
 "Vitesse moyenne\n"
 "Calories"
 
-#: glade/pytrainer.glade:3886
+#: glade/pytrainer.glade:4366
 msgid "Week"
 msgstr "Semaine"
 
-#: glade/pytrainer.glade:4388
+#: glade/pytrainer.glade:4899
 msgid " <b>Month:</b>"
 msgstr " <b>Mois:</b>"
 
-#: glade/pytrainer.glade:4508
+#: glade/pytrainer.glade:5019
 msgid "Month"
 msgstr "Mois"
 
-#: glade/pytrainer.glade:5010
+#: glade/pytrainer.glade:5552
 msgid " <b>Year:</b>"
 msgstr " <b>Année:</b>"
 
-#: glade/pytrainer.glade:5130
+#: glade/pytrainer.glade:5672
 msgid "Year"
 msgstr "Année"
 
-#: glade/pytrainer.glade:5284
+#: glade/pytrainer.glade:5826
 msgid "<b>Graph</b>"
 msgstr "<b>Graphe:</b>"
 
-#: glade/pytrainer.glade:5325
+#: glade/pytrainer.glade:5867
 msgid "<b>History</b>"
 msgstr "<b>Historique</b>"
 
-#: glade/pytrainer.glade:5389
+#: glade/pytrainer.glade:5937
+msgid "<b>Sports</b>"
+msgstr "<b>Sports</b>"
+
+#: glade/pytrainer.glade:6018
+msgid "Total distance:"
+msgstr "Distance totale:"
+
+#: glade/pytrainer.glade:6032
+msgid "Total duration:"
+msgstr "Durée totale:"
+
+#: glade/pytrainer.glade:6081
+msgid "Start date:"
+msgstr "Date de début:"
+
+#: glade/pytrainer.glade:6096
+msgid "End date:"
+msgstr "Date de fin:"
+
+#: glade/pytrainer.glade:6182
+msgid "<b>All</b>"
+msgstr "<b>Tout</b>"
+
+#: glade/pytrainer.glade:6208
+msgid "Totals"
+msgstr "Totaux"
+
+#: glade/pytrainer.glade:6246
 msgid "<b>Title:</b>"
 msgstr "<b>Titre:</b>"
 
-#: glade/pytrainer.glade:5412
+#: glade/pytrainer.glade:6269
 msgid "Search"
 msgstr "Rechercher"
 
-#: glade/pytrainer.glade:5436
+#: glade/pytrainer.glade:6293
+#: pytrainer/lib/listview.py:3
+#: pytrainer/lib/listview.py:10
 msgid "All Distances"
 msgstr "Toutes les distances"
 
-#: glade/pytrainer.glade:5445
+#: glade/pytrainer.glade:6302
+#: pytrainer/lib/listview.py:35
 msgid "All Durations"
 msgstr "Toutes les durées"
 
-#: glade/pytrainer.glade:5455
+#: glade/pytrainer.glade:6312
 msgid ""
 "All time\n"
 "Last 4 weeks\n"
@@ -1331,17 +1465,17 @@ msgstr ""
 "Toutes les dates\n"
 "Les 4 dernières semaines\n"
 "Les 6 derniers mois\n"
-"Les 12 derniers moiss"
+"Les 12 derniers mois"
 
-#: glade/pytrainer.glade:5492
+#: glade/pytrainer.glade:6349
 msgid "Columns"
 msgstr "Colonnes"
 
-#: glade/pytrainer.glade:5619
+#: glade/pytrainer.glade:6477
 msgid "Type:"
 msgstr "Type:"
 
-#: glade/pytrainer.glade:5632
+#: glade/pytrainer.glade:6490
 msgid ""
 "Font\n"
 "Restaurant\n"
@@ -1353,31 +1487,31 @@ msgstr ""
 "Vue Panoramique\n"
 "Sommet"
 
-#: glade/pytrainer.glade:5648
+#: glade/pytrainer.glade:6506
 msgid "Latitude: "
 msgstr "Latitude:"
 
-#: glade/pytrainer.glade:5662
+#: glade/pytrainer.glade:6520
 msgid " Name:"
 msgstr "Nom:"
 
-#: glade/pytrainer.glade:5674
+#: glade/pytrainer.glade:6532
 msgid "Longitude:"
 msgstr " Longitude:"
 
-#: glade/pytrainer.glade:5766
+#: glade/pytrainer.glade:6624
 msgid "<b> Waypoint: </b>"
 msgstr "<b> Point de localisation:</b>"
 
-#: glade/pytrainer.glade:5950
+#: glade/pytrainer.glade:6808
 msgid "Edit Record"
 msgstr "Éditer un enregistrement"
 
-#: glade/pytrainer.glade:5964
+#: glade/pytrainer.glade:6822
 msgid "Show graph in classic view"
 msgstr "Montrer le graphe dans la vue classique"
 
-#: glade/pytrainer.glade:5978
+#: glade/pytrainer.glade:6836
 msgid "Merge tracks"
 msgstr "Fusionner les traces"
 
@@ -1422,19 +1556,11 @@ msgstr "Gant"
 msgid "Garmin tools dump file"
 msgstr "Fichier de dump Garmin tools"
 
-#: import/file_garmintcxv2.py:43
+#: import/file_garmintcxv2.py:44
 msgid "Garmin training center database file version 2"
 msgstr "Fichier de base de données Garmin training center version 2"
 
-#: extensions/openstreetmap/openstreetmap.py:30
-msgid "Must have username and password configured"
-msgstr "Un nom d'utilisateur et un mot de passe doivent être configurés"
-
-#: extensions/openstreetmap/openstreetmap.py:32
-msgid "Openstreetmap Extension Error"
-msgstr "Erreur d'extension Openstreetmap"
-
-#: extensions/openstreetmap/openstreetmap.py:79
+#: extensions/openstreetmap/openstreetmap.py:82
 msgid ""
 "Posting GPX trace to Openstreetmap\n"
 "\n"
@@ -1444,19 +1570,35 @@ msgstr ""
 "\n"
 "Merci d'attendre la fin du processus qui peut prendre quelques minutes"
 
-#: extensions/openstreetmap/openstreetmap.py:81
+#: extensions/openstreetmap/openstreetmap.py:84
 msgid "Openstreetmap Extension Processing"
 msgstr "Traitement de l'extension Openstreetmap"
 
-#: extensions/openstreetmap/openstreetmap.py:99
+#: extensions/openstreetmap/openstreetmap.py:102
 msgid "Openstreetmap Extension Upload Complete"
 msgstr "Chargement sur Openstreetmap effectué"
 
+#: extensions/openstreetmap/openstreetmap.py:107
+msgid "Error while uploading file to OSM: "
+msgstr "Erreur lors du chargement du fichier ver OSM"
+
 #: extensions/openstreetmap/openstreetmap.py:109
+msgid "Openstreetmap Extension Error"
+msgstr "Erreur d'extension Openstreetmap"
+
+#: extensions/openstreetmap/openstreetmap.py:117
 msgid "Please add any additional information for this upload"
 msgstr "Merci de Compléter les informations pour ce chargement"
 
-#: extensions/fixelevation/fixelevation.py:94
+#: extensions/openstreetmap/openstreetmap.py:204
+msgid "Error"
+msgstr "Erreur"
+
+#: extensions/openstreetmap/openstreetmap.py:247
+msgid "Error while saving extension configuration"
+msgstr "Erreur lors de la sauvegarde de la configuration de l'extension"
+
+#: extensions/fixelevation/fixelevation.py:129
 msgid "Elevation Correction Complete"
 msgstr "Correction d'élévation terminée"
 
@@ -1472,57 +1614,91 @@ msgstr "Traitement de l'extension Wordpress"
 msgid "Wordpress Extension Upload Complete"
 msgstr "Chargement sur Wordpress effectué"
 
-#: pytrainer/record.py:63
-#: pytrainer/gui/windowmain.py:1765
+#: pytrainer/record.py:56
+msgid "Modify details before importing"
+msgstr "Modifier les détails avant l'importation"
+
+#: pytrainer/record.py:67
+#: pytrainer/gui/windowmain.py:2156
 msgid "Edit Entry"
 msgstr "Entrée Rapide"
 
-#: pytrainer/record.py:513
+#: pytrainer/record.py:466
 msgid "pyTrainer can't import data from your gpx file"
 msgstr "pyTrainer ne peut pas importer de données depuis le fichier GPX"
 
-#: pytrainer/monthgraph.py:70
-#: pytrainer/monthgraph.py:72
-#: pytrainer/monthgraph.py:74
-#: pytrainer/monthgraph.py:76
-#: pytrainer/monthgraph.py:78
+#: pytrainer/totalgraph.py:24
+#: pytrainer/totalgraph.py:25
+#: pytrainer/totalgraph.py:26
+#: pytrainer/totalgraph.py:27
+#: pytrainer/totalgraph.py:28
+msgid "year"
+msgstr "année"
+
+#: pytrainer/totalgraph.py:24
+msgid "Annual Distance"
+msgstr "Distance annuelle"
+
+#: pytrainer/totalgraph.py:25
+#: pytrainer/monthgraph.py:27
+#: pytrainer/weekgraph.py:29
+#: pytrainer/yeargraph.py:27
+msgid "Time (hours)"
+msgstr "Durée (Heures)"
+
+#: pytrainer/totalgraph.py:25
+msgid "Annual Time"
+msgstr "Durée annuelle"
+
+#: pytrainer/totalgraph.py:26
+#: pytrainer/monthgraph.py:28
+#: pytrainer/weekgraph.py:30
+#: pytrainer/yeargraph.py:28
+msgid "Average Heart Rate (bpm)"
+msgstr "FC moyenne (bpm)"
+
+#: pytrainer/totalgraph.py:26
+msgid "Annual Average Heart Rate"
+msgstr "FC moyenne annuelle"
+
+#: pytrainer/totalgraph.py:27
+msgid "Annual Average Speed"
+msgstr "Vitesse moyenne annuelle"
+
+#: pytrainer/totalgraph.py:28
+msgid "Annual Calories"
+msgstr "Calories annuelles"
+
+#: pytrainer/monthgraph.py:26
+#: pytrainer/monthgraph.py:27
+#: pytrainer/monthgraph.py:28
+#: pytrainer/monthgraph.py:29
+#: pytrainer/monthgraph.py:30
 msgid "day"
 msgstr "jour"
 
-#: pytrainer/monthgraph.py:70
-#: pytrainer/weekgraph.py:115
+#: pytrainer/monthgraph.py:26
+#: pytrainer/weekgraph.py:28
 msgid "Daily Distance"
 msgstr "Distance Journalière"
 
-#: pytrainer/monthgraph.py:72
-#: pytrainer/weekgraph.py:117
-#: pytrainer/yeargraph.py:72
-msgid "Time (hours)"
-msgstr "Durée (Heures)"
-
-#: pytrainer/monthgraph.py:72
-#: pytrainer/weekgraph.py:117
+#: pytrainer/monthgraph.py:27
+#: pytrainer/weekgraph.py:29
 msgid "Daily Time"
 msgstr "Durée Journalière"
 
-#: pytrainer/monthgraph.py:74
-#: pytrainer/weekgraph.py:119
-#: pytrainer/yeargraph.py:74
-msgid "Average Heart Rate (bpm)"
-msgstr "FC moyenne (bpm):"
-
-#: pytrainer/monthgraph.py:74
-#: pytrainer/weekgraph.py:119
+#: pytrainer/monthgraph.py:28
+#: pytrainer/weekgraph.py:30
 msgid "Daily Average Heart Rate"
 msgstr "FC moyenne Journalière"
 
-#: pytrainer/monthgraph.py:76
-#: pytrainer/weekgraph.py:121
+#: pytrainer/monthgraph.py:29
+#: pytrainer/weekgraph.py:31
 msgid "Daily Average Speed"
 msgstr "Vitesse moyenne Journalière"
 
-#: pytrainer/monthgraph.py:78
-#: pytrainer/weekgraph.py:123
+#: pytrainer/monthgraph.py:30
+#: pytrainer/weekgraph.py:32
 msgid "Daily Calories"
 msgstr "Calories Journalière"
 
@@ -1547,16 +1723,17 @@ msgid "Speed (Km/h)"
 msgstr "Vitesse (km/h)"
 
 #: pytrainer/recordgraph.py:136
-#: pytrainer/lib/activity.py:325
-#: pytrainer/lib/activity.py:415
-#: pytrainer/lib/activity.py:417
+#: pytrainer/gui/windowmain.py:187
+#: pytrainer/lib/activity.py:335
+#: pytrainer/lib/activity.py:425
+#: pytrainer/lib/activity.py:427
 msgid "Speed"
 msgstr "Vitesse"
 
 #: pytrainer/recordgraph.py:138
-#: pytrainer/lib/activity.py:314
-#: pytrainer/lib/activity.py:424
-#: pytrainer/lib/activity.py:426
+#: pytrainer/lib/activity.py:324
+#: pytrainer/lib/activity.py:434
+#: pytrainer/lib/activity.py:436
 msgid "Pace"
 msgstr "Allure"
 
@@ -1565,8 +1742,8 @@ msgid "Cadence (rpm)"
 msgstr "Rythme (tpm) "
 
 #: pytrainer/recordgraph.py:142
-#: pytrainer/lib/activity.py:452
-#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:462
+#: pytrainer/lib/activity.py:464
 msgid "Cadence"
 msgstr "Rythme"
 
@@ -1575,7 +1752,7 @@ msgid "Beats (%)"
 msgstr "Pulsations (%)"
 
 #: pytrainer/recordgraph.py:144
-#: pytrainer/gui/windowmain.py:1151
+#: pytrainer/gui/windowmain.py:1498
 msgid "Beats"
 msgstr "Pulsations"
 
@@ -1587,44 +1764,50 @@ msgstr "Zone"
 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/extensions/googlemaps.py:69
-#: pytrainer/extensions/osm.py:48
-#: pytrainer/gui/windowmain.py:1679
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+#: pytrainer/gui/windowmain.py:2066
 #: pytrainer/gui/drawArea.py:165
 msgid "h"
 msgstr "h"
 
-#: pytrainer/extensions/googlemaps.py:69
-#: pytrainer/extensions/osm.py:48
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
 #: pytrainer/gui/drawArea.py:166
 msgid "min"
 msgstr "min"
 
-#: pytrainer/extensions/googlemaps.py:71
-#: pytrainer/extensions/osm.py:50
-#: pytrainer/gui/windowmain.py:112
-#: pytrainer/gui/windowmain.py:394
-#: pytrainer/gui/windowmain.py:1150
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:104
+#: pytrainer/gui/windowmain.py:119
+#: pytrainer/gui/windowmain.py:158
+#: pytrainer/gui/windowmain.py:176
+#: pytrainer/gui/windowmain.py:186
+#: pytrainer/gui/windowmain.py:570
+#: pytrainer/gui/windowmain.py:1497
 msgid "Time"
 msgstr "Temps"
 
-#: pytrainer/extensions/googlemaps.py:71
-#: pytrainer/extensions/osm.py:50
-#: pytrainer/gui/windowmain.py:110
-#: pytrainer/gui/windowmain.py:393
-#: pytrainer/gui/windowmain.py:1148
-#: pytrainer/gui/windowimportdata.py:352
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:105
+#: pytrainer/gui/windowmain.py:117
+#: pytrainer/gui/windowmain.py:157
+#: pytrainer/gui/windowmain.py:175
+#: pytrainer/gui/windowmain.py:185
+#: pytrainer/gui/windowmain.py:569
+#: pytrainer/gui/windowmain.py:1495
+#: pytrainer/gui/windowimportdata.py:353
 #: pytrainer/gui/windowrecord.py:210
-#: pytrainer/lib/activity.py:313
-#: pytrainer/lib/activity.py:324
-#: pytrainer/lib/activity.py:396
-#: pytrainer/lib/activity.py:407
-#: pytrainer/lib/activity.py:416
-#: pytrainer/lib/activity.py:425
-#: pytrainer/lib/activity.py:434
+#: pytrainer/lib/activity.py:323
+#: pytrainer/lib/activity.py:334
+#: pytrainer/lib/activity.py:406
+#: pytrainer/lib/activity.py:417
+#: pytrainer/lib/activity.py:426
+#: pytrainer/lib/activity.py:435
 #: pytrainer/lib/activity.py:444
-#: pytrainer/lib/activity.py:453
-#: pytrainer/lib/activity.py:514
+#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:463
+#: pytrainer/lib/activity.py:524
 msgid "Distance"
 msgstr "Distance"
 
@@ -1632,316 +1815,454 @@ msgstr "Distance"
 msgid "Athlete Data"
 msgstr "Données de l'athlète"
 
-#: pytrainer/gui/windowmain.py:100
+#: pytrainer/gui/windowmain.py:107
 msgid "Miles"
 msgstr "Miles"
 
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:107
-#: pytrainer/gui/windowmain.py:120
-#: pytrainer/gui/windowmain.py:123
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:130
+#: pytrainer/gui/windowmain.py:139
+#: pytrainer/gui/windowmain.py:173
+#: pytrainer/gui/windowmain.py:182
 msgid "id"
 msgstr "id"
 
-#: pytrainer/gui/windowmain.py:103
+#: pytrainer/gui/windowmain.py:110
 msgid "Start"
 msgstr "Début"
 
-#: pytrainer/gui/windowmain.py:113
+#: pytrainer/gui/windowmain.py:120
 msgid "⌀ HR"
 msgstr "FC"
 
-#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:121
 msgid "⌀ Speed"
 msgstr "Vitesse"
 
-#: pytrainer/gui/windowmain.py:120
+#: pytrainer/gui/windowmain.py:127
 msgid "Waypoint"
 msgstr "Point de Localisation"
 
-#: pytrainer/gui/windowmain.py:125
+#: pytrainer/gui/windowmain.py:132
 msgid "Weight"
 msgstr "Poids"
 
-#: pytrainer/gui/windowmain.py:126
+#: pytrainer/gui/windowmain.py:133
 msgid "Body Fat %"
 msgstr "% de Masse Grasse"
 
-#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:134
 msgid "Resting HR"
 msgstr "Fréquence de repos"
 
-#: pytrainer/gui/windowmain.py:128
+#: pytrainer/gui/windowmain.py:135
+#: pytrainer/gui/windowmain.py:147
+#: pytrainer/gui/windowmain.py:164
 msgid "Max HR"
 msgstr "FC Max"
 
-#: pytrainer/gui/windowmain.py:395
+#: pytrainer/gui/windowmain.py:141
+msgid "Records"
+msgstr "Enregistrements"
+
+#: pytrainer/gui/windowmain.py:142
+msgid "Total duration"
+msgstr "Durée totale"
+
+#: pytrainer/gui/windowmain.py:143
+msgid "Total distance"
+msgstr "Distance totale"
+
+#: pytrainer/gui/windowmain.py:144
+#: pytrainer/gui/windowmain.py:159
+msgid "Avg speed"
+msgstr "Vitesse moy"
+
+#: pytrainer/gui/windowmain.py:145
+#: pytrainer/gui/windowmain.py:160
+msgid "Max speed"
+msgstr "Vitesse max"
+
+#: pytrainer/gui/windowmain.py:146
+#: pytrainer/gui/windowmain.py:163
+msgid "Avg HR"
+msgstr "FC moy"
+
+#: pytrainer/gui/windowmain.py:148
+msgid "Max duration"
+msgstr "Durée max"
+
+#: pytrainer/gui/windowmain.py:149
+msgid "Max distance"
+msgstr "Distance max"
+
+#: pytrainer/gui/windowmain.py:155
+msgid "Lap"
+msgstr "Tour"
+
+#: pytrainer/gui/windowmain.py:156
+msgid "Trigger"
+msgstr "Échantillonage"
+
+#: pytrainer/gui/windowmain.py:161
+msgid "Avg pace"
+msgstr "Allure moy"
+
+#: pytrainer/gui/windowmain.py:162
+msgid "Max pace"
+msgstr "Allure max"
+
+#: pytrainer/gui/windowmain.py:166
+msgid "Intensity"
+msgstr "Intensité"
+
+#: pytrainer/gui/windowmain.py:174
+msgid "Race"
+msgstr "Course"
+
+#: pytrainer/gui/windowmain.py:183
+msgid "Rank"
+msgstr "Place"
+
+#: pytrainer/gui/windowmain.py:319
+msgid "d"
+msgstr "d"
+
+#: pytrainer/gui/windowmain.py:559
+msgid "Show on X Axis"
+msgstr "Montrer sur l'axe X"
+
+#: pytrainer/gui/windowmain.py:560
+msgid "Show on Y1 Axis"
+msgstr "Montrer sur l'axe Y1"
+
+#: pytrainer/gui/windowmain.py:561
+msgid "Show on Y2 Axis"
+msgstr "Montrer sur l'axe Y2"
+
+#: pytrainer/gui/windowmain.py:562
+msgid "Axis Limits"
+msgstr "Limites des axes"
+
+#: pytrainer/gui/windowmain.py:571
 msgid "Laps"
 msgstr "Tours"
 
-#: pytrainer/gui/windowmain.py:396
+#: pytrainer/gui/windowmain.py:572
 msgid "Left Axis Grid"
 msgstr "Grille d'axe Gauche"
 
-#: pytrainer/gui/windowmain.py:397
+#: pytrainer/gui/windowmain.py:573
 msgid "Right Axis Grid"
 msgstr "Grille d'axe Droite"
 
-#: pytrainer/gui/windowmain.py:398
+#: pytrainer/gui/windowmain.py:574
 msgid "X Axis Grid"
 msgstr "Grille d'axe X"
 
-#: pytrainer/gui/windowmain.py:459
+#: pytrainer/gui/windowmain.py:635
 msgid "Reset Limits"
 msgstr "Réinitialiser les limites"
 
-#: pytrainer/gui/windowmain.py:461
+#: pytrainer/gui/windowmain.py:637
 msgid "Set Limits"
 msgstr "Fixer les limites"
 
-#: pytrainer/gui/windowmain.py:616
+#: pytrainer/gui/windowmain.py:792
 msgid "Percentages method"
 msgstr "Méthode basée sur des pourcentages"
 
-#: pytrainer/gui/windowmain.py:624
-#: pytrainer/gui/windowmain.py:747
-#: pytrainer/gui/windowmain.py:825
-#: pytrainer/lib/activity.py:196
+#: pytrainer/gui/windowmain.py:805
+msgid "800 m"
+msgstr "800 m"
+
+#: pytrainer/gui/windowmain.py:806
+msgid "1500 m"
+msgstr "1500 m"
+
+#: pytrainer/gui/windowmain.py:807
+msgid "5K"
+msgstr "5K"
+
+#: pytrainer/gui/windowmain.py:808
+msgid "7K"
+msgstr "7K"
+
+#: pytrainer/gui/windowmain.py:809
+msgid "10K"
+msgstr "10K"
+
+#: pytrainer/gui/windowmain.py:810
+msgid "Half marathon"
+msgstr "Semi Marathon"
+
+#: pytrainer/gui/windowmain.py:811
+msgid "Marathon"
+msgstr "Marathon"
+
+#: pytrainer/gui/windowmain.py:812
+msgid "100K"
+msgstr "100K"
+
+#: pytrainer/gui/windowmain.py:909
+#: pytrainer/gui/windowmain.py:1038
+#: pytrainer/gui/windowmain.py:1120
+#: pytrainer/lib/activity.py:197
 msgid "miles"
 msgstr "miles"
 
-#: pytrainer/gui/windowmain.py:625
-#: pytrainer/gui/windowmain.py:626
-#: pytrainer/gui/windowmain.py:748
-#: pytrainer/gui/windowmain.py:749
-#: pytrainer/gui/windowmain.py:826
-#: pytrainer/gui/windowmain.py:827
-#: pytrainer/lib/activity.py:197
+#: pytrainer/gui/windowmain.py:910
+#: pytrainer/gui/windowmain.py:911
+#: pytrainer/gui/windowmain.py:1039
+#: pytrainer/gui/windowmain.py:1040
+#: pytrainer/gui/windowmain.py:1121
+#: pytrainer/gui/windowmain.py:1122
+#: pytrainer/lib/activity.py:198
 msgid "miles/h"
 msgstr "miles/h"
 
-#: pytrainer/gui/windowmain.py:627
-#: pytrainer/gui/windowmain.py:628
-#: pytrainer/gui/windowmain.py:750
-#: pytrainer/gui/windowmain.py:751
-#: pytrainer/gui/windowmain.py:828
-#: pytrainer/gui/windowmain.py:829
-#: pytrainer/lib/activity.py:198
+#: pytrainer/gui/windowmain.py:912
+#: pytrainer/gui/windowmain.py:913
+#: pytrainer/gui/windowmain.py:1041
+#: pytrainer/gui/windowmain.py:1042
+#: pytrainer/gui/windowmain.py:1123
+#: pytrainer/gui/windowmain.py:1124
+#: pytrainer/lib/activity.py:199
 msgid "min/mile"
 msgstr "min/mile"
 
-#: pytrainer/gui/windowmain.py:630
-#: pytrainer/gui/windowmain.py:753
-#: pytrainer/gui/windowmain.py:831
-#: pytrainer/lib/activity.py:201
+#: pytrainer/gui/windowmain.py:915
+#: pytrainer/gui/windowmain.py:1044
+#: pytrainer/gui/windowmain.py:1126
+#: pytrainer/lib/activity.py:202
 msgid "km"
 msgstr "km"
 
-#: pytrainer/gui/windowmain.py:1152
+#: pytrainer/gui/windowmain.py:1499
 msgid "Average"
 msgstr "Moyenne"
 
-#: pytrainer/gui/windowmain.py:1371
+#: pytrainer/gui/windowmain.py:1718
 msgid "Hide graph display options"
 msgstr "Cacher les réglages du graphe "
 
-#: pytrainer/gui/windowmain.py:1669
+#: pytrainer/gui/windowmain.py:2056
 msgid "lap"
 msgstr "tour "
 
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
-#: pytrainer/lib/activity.py:204
-msgid "m"
-msgstr "m"
-
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
 msgid "s"
 msgstr "s"
 
-#: pytrainer/gui/windowmain.py:1776
+#: pytrainer/gui/windowmain.py:2167
 msgid "Delete Entry"
 msgstr "Détruire l'entrée"
 
-#: pytrainer/gui/windowmain.py:1800
+#: pytrainer/gui/windowmain.py:2191
 msgid "Create Athlete Entry"
 msgstr "Créer une entrée Athlète"
 
-#: pytrainer/gui/windowmain.py:1804
+#: pytrainer/gui/windowmain.py:2195
 msgid "Edit Athlete Entry"
 msgstr "Éditer les données de l'athlète"
 
-#: pytrainer/gui/windowmain.py:1885
-#: pytrainer/main.py:433
+#: pytrainer/gui/windowmain.py:2208
+msgid "<b>Date</b>"
+msgstr "<b>Date</b>"
+
+#: pytrainer/gui/windowmain.py:2224
+msgid "<b>Weight</b>"
+msgstr "<b>Poids</b>"
+
+#: pytrainer/gui/windowmain.py:2232
+msgid "<b>Body Fat</b>"
+msgstr "<b>Masse grasse</b>"
+
+#: pytrainer/gui/windowmain.py:2240
+msgid "<b>Resting Heart Rate</b>"
+msgstr "<b>Fréquence cardiaque de repos</b>"
+
+#: pytrainer/gui/windowmain.py:2248
+msgid "<b>Max Heart Rate</b>"
+msgstr "<b>Fréquence cardiaque max</b>"
+
+#: pytrainer/gui/windowmain.py:2276
+#: pytrainer/main.py:451
 msgid "Delete this database entry?"
 msgstr "Supprimer cette entrée de la Base de Données?"
 
-#: pytrainer/gui/windowmain.py:1887
+#: pytrainer/gui/windowmain.py:2278
 msgid "Are you sure?"
 msgstr "Êtes vous sûr?"
 
 #: pytrainer/gui/windowextensions.py:70
-#: pytrainer/gui/windowimportdata.py:560
+#: pytrainer/gui/windowimportdata.py:558
 #: pytrainer/gui/windowplugins.py:71
 #: pytrainer/gui/windowplugins.py:95
 msgid "Disable"
 msgstr "Désactivé"
 
 #: pytrainer/gui/windowextensions.py:72
-#: pytrainer/gui/windowimportdata.py:561
+#: pytrainer/gui/windowimportdata.py:559
 #: pytrainer/gui/windowplugins.py:69
 #: pytrainer/gui/windowplugins.py:96
 msgid "Enable"
 msgstr "Activé"
 
 #: pytrainer/gui/windowextensions.py:81
-#: pytrainer/gui/windowimportdata.py:545
+#: pytrainer/gui/windowimportdata.py:543
 #: pytrainer/gui/windowplugins.py:80
 #, python-format
 msgid "%s settings"
-msgstr ""
+msgstr "%s réglages"
 
 #: pytrainer/gui/windowextensions.py:112
 #: pytrainer/gui/windowextensions.py:125
 msgid "OK"
 msgstr "OK"
 
-#: pytrainer/gui/windowimportdata.py:116
+#: pytrainer/gui/windowimportdata.py:117
 msgid "No file selected"
 msgstr "Pas de fichier sélectionné"
 
-#: pytrainer/gui/windowimportdata.py:161
+#: pytrainer/gui/windowimportdata.py:162
 msgid "Configure"
 msgstr "Configurer"
 
-#: pytrainer/gui/windowimportdata.py:162
+#: pytrainer/gui/windowimportdata.py:163
 msgid "Run"
-msgstr ""
+msgstr "Course à pied"
 
-#: pytrainer/gui/windowimportdata.py:170
+#: pytrainer/gui/windowimportdata.py:171
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: pytrainer/gui/windowimportdata.py:172
+#: pytrainer/gui/windowimportdata.py:173
 msgid "Enabled"
 msgstr "Activé"
 
-#: pytrainer/gui/windowimportdata.py:252
+#: pytrainer/gui/windowimportdata.py:253
 msgid "GPS device found"
 msgstr "Périphérique GPS trouvé"
 
-#: pytrainer/gui/windowimportdata.py:255
+#: pytrainer/gui/windowimportdata.py:256
 msgid "GPS device <b>not</b> found"
 msgstr "Périphérique GPS <b>non</b> trouvé"
 
-#: pytrainer/gui/windowimportdata.py:262
+#: pytrainer/gui/windowimportdata.py:263
 msgid "This tool was not found on the system"
 msgstr "Cet outil n'est pas installé sur votre système"
 
-#: pytrainer/gui/windowimportdata.py:264
+#: pytrainer/gui/windowimportdata.py:265
 msgid " Homepage"
 msgstr "Page d'accueil"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "File"
 msgstr "Fichier"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "Type"
 msgstr "Type"
 
-#: pytrainer/gui/windowimportdata.py:317
+#: pytrainer/gui/windowimportdata.py:318
 msgid "Activities"
 msgstr "Activités"
 
-#: pytrainer/gui/windowimportdata.py:352
+#: pytrainer/gui/windowimportdata.py:353
 #: pytrainer/gui/windowrecord.py:210
 msgid "Start Time"
 msgstr "Heure de début"
 
-#: pytrainer/gui/windowimportdata.py:352
+#: pytrainer/gui/windowimportdata.py:353
 #: pytrainer/gui/windowrecord.py:210
 msgid "Duration"
 msgstr "Durée"
 
-#: pytrainer/gui/windowimportdata.py:501
+#: pytrainer/gui/windowimportdata.py:499
 msgid "Imported into database"
 msgstr "Importé dans la base"
 
-#: pytrainer/gui/windowimportdata.py:568
+#: pytrainer/gui/windowimportdata.py:566
 #: pytrainer/gui/windowplugins.py:103
 msgid "Ok"
 msgstr "Ok"
 
-#: pytrainer/gui/windowimportdata.py:628
+#: pytrainer/gui/windowimportdata.py:626
 msgid "Saving options"
 msgstr "Sauvegarde des options"
 
-#: pytrainer/gui/windowimportdata.py:630
+#: pytrainer/gui/windowimportdata.py:628
 msgid "Options saved"
 msgstr "Options sauvegardées"
 
-#: pytrainer/gui/windowimportdata.py:655
+#: pytrainer/gui/windowimportdata.py:653
 msgid "Importing one activity"
 msgstr "Importation d'une activité"
 
-#: pytrainer/gui/windowimportdata.py:656
+#: pytrainer/gui/windowimportdata.py:654
 msgid "Imported one activity"
 msgstr "Une activité importée"
 
-#: pytrainer/gui/windowimportdata.py:658
+#: pytrainer/gui/windowimportdata.py:656
 #, python-format
 msgid "Importing %d activities"
 msgstr "Importation de %d activités"
 
-#: pytrainer/gui/windowimportdata.py:659
+#: pytrainer/gui/windowimportdata.py:657
 #, python-format
 msgid "Imported %d activities"
 msgstr "%d activités importées"
 
-#: pytrainer/gui/windowimportdata.py:678
+#: pytrainer/gui/windowimportdata.py:676
 msgid "Choose a file (or files) to import activities from"
 msgstr "Choisir un fichier pour importer vos activités"
 
-#: pytrainer/gui/windowimportdata.py:693
-#: pytrainer/gui/windowimportdata.py:694
+#: pytrainer/gui/windowimportdata.py:691
+#: pytrainer/gui/windowimportdata.py:692
 #, python-format
 msgid "Found file of type: %s"
 msgstr "Fichier trouvé de type: %s"
 
-#: pytrainer/gui/windowimportdata.py:718
+#: pytrainer/gui/windowimportdata.py:716
 msgid "Found in database"
 msgstr "Présent dans la base"
 
-#: pytrainer/gui/windowimportdata.py:733
-#: pytrainer/gui/windowimportdata.py:734
+#: pytrainer/gui/windowimportdata.py:731
+#: pytrainer/gui/windowimportdata.py:732
 #, python-format
 msgid "File %s is of unknown or unsupported file type"
 msgstr "Le fichier %s est inconnu ou d'un type non supporté"
 
-#: pytrainer/gui/windowimportdata.py:807
+#: pytrainer/gui/windowimportdata.py:805
 #, python-format
 msgid "Column %d"
 msgstr "Colonne %d"
 
-#: pytrainer/gui/windowprofile.py:41
+#: pytrainer/gui/windowprofile.py:47
 msgid "Male"
 msgstr "Homme"
 
-#: pytrainer/gui/windowprofile.py:42
+#: pytrainer/gui/windowprofile.py:48
 msgid "Female"
 msgstr "Femme"
 
-#: pytrainer/gui/windowprofile.py:59
+#: pytrainer/gui/windowprofile.py:65
 msgid "MET"
 msgstr "MET"
 
-#: pytrainer/gui/windowprofile.py:59
-msgid "Maximum Pace"
-msgstr "Allure Maximale"
+#: pytrainer/gui/windowprofile.py:314
+msgid "Sport Creation Error"
+msgstr "Erreur lors de création du sport"
 
-#: pytrainer/gui/drawArea.py:399
+#: pytrainer/gui/equipment.py:101
+msgid "Usage"
+msgstr "Utilisation"
+
+#: pytrainer/gui/drawArea.py:410
 msgid "rest"
 msgstr "repos"
 
@@ -1953,55 +2274,55 @@ msgstr "Fichier GPX"
 msgid "Track Name"
 msgstr "Nom du Circuit"
 
-#: pytrainer/profile.py:109
+#: pytrainer/profile.py:114
 msgid "Moderate activity"
 msgstr "Activité modérée"
 
-#: pytrainer/profile.py:110
+#: pytrainer/profile.py:115
 msgid "Weight Control"
 msgstr "Perte de poids"
 
-#: pytrainer/profile.py:111
+#: pytrainer/profile.py:116
 msgid "Aerobic"
 msgstr "Aérobie"
 
-#: pytrainer/profile.py:112
+#: pytrainer/profile.py:117
 msgid "Anaerobic"
 msgstr "Anaérobie"
 
-#: pytrainer/profile.py:113
+#: pytrainer/profile.py:118
 msgid "VO2 MAX"
 msgstr "VO2 Max"
 
-#: pytrainer/main.py:449
+#: pytrainer/main.py:467
 msgid "Delete this waypoint?"
 msgstr "Détruire ce Point de Localisation"
 
-#: pytrainer/yeargraph.py:70
-#: pytrainer/yeargraph.py:72
-#: pytrainer/yeargraph.py:74
-#: pytrainer/yeargraph.py:76
-#: pytrainer/yeargraph.py:78
+#: pytrainer/yeargraph.py:26
+#: pytrainer/yeargraph.py:27
+#: pytrainer/yeargraph.py:28
+#: pytrainer/yeargraph.py:29
+#: pytrainer/yeargraph.py:30
 msgid "month"
 msgstr "mois"
 
-#: pytrainer/yeargraph.py:70
+#: pytrainer/yeargraph.py:26
 msgid "Monthly Distance"
 msgstr "Distance Mensuelle"
 
-#: pytrainer/yeargraph.py:72
+#: pytrainer/yeargraph.py:27
 msgid "Monthly Time"
 msgstr "Durée Mensuelle"
 
-#: pytrainer/yeargraph.py:74
+#: pytrainer/yeargraph.py:28
 msgid "Monthly Average Heart Rate"
 msgstr "FC moyenne Mensuelle"
 
-#: pytrainer/yeargraph.py:76
+#: pytrainer/yeargraph.py:29
 msgid "Monthly Average Speed"
 msgstr "Vitesse moyenne Mensuelle"
 
-#: pytrainer/yeargraph.py:78
+#: pytrainer/yeargraph.py:30
 msgid "Monthly Calories"
 msgstr "Calories Mensuelle"
 
@@ -2021,437 +2342,91 @@ msgstr "lb"
 msgid "kg"
 msgstr "kg"
 
-#: pytrainer/lib/activity.py:199
+#: pytrainer/lib/listview.py:32
+msgid "All Time"
+msgstr "Toutes les dates"
+
+#: pytrainer/lib/listview.py:32
+msgid "Last 4 Weeks"
+msgstr "Les 4 dernières semaines"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 6 Months"
+msgstr "Les 6 derniers mois"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 12 Months"
+msgstr "Les 12 derniers mois"
+
+#: pytrainer/lib/listview.py:36
+msgid "<1 Hour"
+msgstr "<1 heure"
+
+#: pytrainer/lib/listview.py:37
+msgid "1-2 Hours"
+msgstr "1-2 heures"
+
+#: pytrainer/lib/listview.py:38
+msgid ">2 Hours"
+msgstr ">2 heures"
+
+#: pytrainer/lib/activity.py:200
 msgid "feet"
 msgstr "pieds"
 
-#: pytrainer/lib/activity.py:312
+#: pytrainer/lib/activity.py:322
 msgid "Pace by Lap"
 msgstr "Allure au tour"
 
-#: pytrainer/lib/activity.py:318
-#: pytrainer/lib/activity.py:329
-#: pytrainer/lib/activity.py:401
+#: pytrainer/lib/activity.py:328
+#: pytrainer/lib/activity.py:339
 #: pytrainer/lib/activity.py:411
-#: pytrainer/lib/activity.py:420
-#: pytrainer/lib/activity.py:429
-#: pytrainer/lib/activity.py:438
+#: pytrainer/lib/activity.py:421
+#: pytrainer/lib/activity.py:430
+#: pytrainer/lib/activity.py:439
 #: pytrainer/lib/activity.py:448
-#: pytrainer/lib/activity.py:457
-#: pytrainer/lib/activity.py:519
+#: pytrainer/lib/activity.py:458
+#: pytrainer/lib/activity.py:467
+#: pytrainer/lib/activity.py:529
 msgid "Time (seconds)"
 msgstr "Durée (s)"
 
-#: pytrainer/lib/activity.py:323
+#: pytrainer/lib/activity.py:333
 msgid "Speed by Lap"
 msgstr "Vitesse au tour"
 
-#: pytrainer/lib/activity.py:395
-#: pytrainer/lib/activity.py:397
+#: pytrainer/lib/activity.py:405
+#: pytrainer/lib/activity.py:407
 msgid "Elevation"
 msgstr "Altitude"
 
-#: pytrainer/lib/activity.py:406
-#: pytrainer/lib/activity.py:408
+#: pytrainer/lib/activity.py:416
+#: pytrainer/lib/activity.py:418
 msgid "Corrected Elevation"
 msgstr "Altitude corrigée"
 
-#: pytrainer/lib/activity.py:443
+#: pytrainer/lib/activity.py:453
 #, python-format
 msgid "Heart Rate (% of max)"
 msgstr "Fréquence Cardiaque (% du max)"
 
-#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455
 msgid "%"
 msgstr "%"
 
-#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:464
 msgid "rpm"
 msgstr "tpm"
 
-#: pytrainer/lib/activity.py:513
+#: pytrainer/lib/activity.py:523
 msgid "Heart Rate zone"
 msgstr "Zone de Fréquence Cardiaque"
 
-#: pytrainer/lib/gpx.py:122
+#: pytrainer/lib/gpx.py:129
 msgid "No Name"
 msgstr "Sans Nom"
 
-#: pytrainer/lib/gpx.py:129
+#: pytrainer/lib/gpx.py:137
 msgid "No Data"
 msgstr "Pas de Valeurs"
 
-#~ msgid "Use this port for internal connections: "
-#~ msgstr "Utiliser ce port pour les connexions internes:"
-
-#~ 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>"
-
-#~ msgid "<b>Port  Connnection</b>"
-#~ msgstr "<b>Port de Connexion:</b>"
-
-#~ msgid "label-2147483648"
-#~ msgstr "label-2147483648"
-
-#~ msgid "<small>Is the Googlemaps API version 3 in use?</small>"
-#~ msgstr "<small>Googlemaps utilise t-il l'API version 3?</small>"
-
-#~ msgid "Unified Import"
-#~ msgstr "Import unifié"
-
-#~ msgid "<small>Is the Unified Importer active?</small>"
-#~ msgstr "<small>L'import unifié est-il activé?</small>"
-
-#~ msgid ""
-#~ "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to "
-#~ "switch it off</small>"
-#~ msgstr ""
-#~ "<small>* Notez que l'API version 3 de Googlemaps est activée par défaut, "
-#~ "utilisez --gmaps2 pour la déactiver</small>"
-
-#~ msgid "window1"
-#~ msgstr "fenêtre1"
-
-#, fuzzy
-#~ msgid "label-2147483647"
-#~ msgstr "label-2147483648"
-
-#~ msgid "label154"
-#~ msgstr "label154"
-
-#~ msgid "label155"
-#~ msgstr "label155"
-
-#~ msgid "label162"
-#~ msgstr "label162"
-
-#~ msgid "label163"
-#~ msgstr "label163"
-
-#~ msgid "Kilometer"
-#~ msgstr "Kilomètres"
-
-#~ msgid "Refresh Graph Display"
-#~ msgstr "Rafraîchir l'affichage du graphique"
-
-#~ msgid "<b>Velocity</b>"
-#~ msgstr "<b>Vitesse</b>"
-
-#~ msgid "Velocity (km/h)"
-#~ msgstr "Vitesse (km/h)"
-
-#~ msgid "Clear"
-#~ msgstr "Effacer"
-
-#~ msgid "Unknown file type"
-#~ msgstr "Fichier de type inconnu"
-
-#~ msgid "Import Success"
-#~ msgstr "Importation réussie"
-
-#, fuzzy
-#~ msgid "  "
-#~ msgstr " "
-
-#, fuzzy
-#~ msgid "<b>frame1</b>"
-#~ msgstr " <b>Nom:</b>"
-
-#~ msgid "Kilometers"
-#~ msgstr "Kilomètres"
-
-#~ msgid "Daily kilometers"
-#~ msgstr "Kilométrage journalier"
-
-#~ msgid "Beats per Minute"
-#~ msgstr "Pulsations par Minute"
-
-#~ msgid "Daily Beats"
-#~ msgstr "FC moy. journalière"
-
-#~ msgid "Weekly kilometers"
-#~ msgstr "Kilométrage hebdomadaire"
-
-#~ msgid "Weekly Time"
-#~ msgstr "Durée hebdomadaire"
-
-#~ msgid "weekly Beats"
-#~ msgstr "FC moy. hebdomadaire"
-
-#~ msgid "Weekly Speed Averages"
-#~ msgstr "Vitesse moy. hebdomadaire"
-
-#~ msgid "Weekly Calories"
-#~ msgstr "Calories hebdomadaire"
-
-#~ msgid "kilometers"
-#~ msgstr "Kilomètres"
-
-#~ msgid "monthly kilometers"
-#~ msgstr "Kilométrage mensuel"
-
-#~ msgid "time in hours"
-#~ msgstr "Temps en heures"
-
-#~ msgid "beats per minute"
-#~ msgstr "pulsations par minute"
-
-#~ msgid "monthly beats"
-#~ msgstr "FC moy. mensuelle"
-
-#~ msgid "average (hm/h)"
-#~ msgstr "Vitesse moy. (km/h)"
-
-#~ msgid "calories"
-#~ msgstr "calories"
-
-#~ msgid "January"
-#~ msgstr "Janvier"
-
-#~ msgid "Febrary"
-#~ msgstr "Février"
-
-#~ msgid "March"
-#~ msgstr "Mars"
-
-#~ msgid "April"
-#~ msgstr "Avril"
-
-#~ msgid "May"
-#~ msgstr "Mai"
-
-#~ msgid "June"
-#~ msgstr "Juin"
-
-#~ msgid "July"
-#~ msgstr "Juillet"
-
-#~ msgid "August"
-#~ msgstr "Août"
-
-#~ msgid "September"
-#~ msgstr "Septembre"
-
-#~ msgid "October"
-#~ msgstr "Octobre"
-
-#~ msgid "November"
-#~ msgstr "Novembre"
-
-#~ msgid "December"
-#~ msgstr "Décembre"
-
-#~ msgid ""
-#~ "Distance\n"
-#~ "Time\n"
-#~ msgstr ""
-#~ "Distance\n"
-#~ "Temps\n"
-
-#~ msgid ""
-#~ "<small><b>Note:</b> You can get your M.E.T. sport Coefficient here: "
-#~ "http://pytrainer.e-oss.net/met.pdf</small>"
-#~ msgstr ""
-#~ "<small><b>Note:</b> Vous pouvez consulter l'indice M.E.T. de votre sport "
-#~ "à l'adresse suivante: http://pytrainer.e-oss.net/met.pdf</small>"
-
-#~ msgid "pytrainer"
-#~ msgstr "pytrainer"
-
-#~ msgid "(c) Fiz Vazquez <vud1 at sindominio.net>"
-#~ msgstr "(c) Fiz Vazquez <vud1 at sindominio.net>"
-
-#~ msgid "Track sporting activities and performance"
-#~ msgstr "Un outil de suivi des activités sportives et des performances"
-
-#~ msgid ""
-#~ "(C) Fiz Vazquez\n"
-#~ "\n"
-#~ "  This program is free software; you can redistribute \n"
-#~ "  it and/or modify it under the terms of the GNU \n"
-#~ "  General Public License as published by the Free \n"
-#~ "  Software Foundation; either version 2 of the License, \n"
-#~ "  or (at your option) any later version.\n"
-#~ "\n"
-#~ "  This program is distributed in the hope that it will be \n"
-#~ "  useful, but WITHOUT ANY WARRANTY; without even the\n"
-#~ "  implied warranty of MERCHANTABILITY or FITNESS FOR \n"
-#~ "  A PARTICULAR PURPOSE.  See the GNU General Public \n"
-#~ "  License <http://www.opensource.org/gpl-license.html>\n"
-#~ "  for more details.\n"
-#~ "\n"
-#~ "  You can found the license on Debian systems in the file\n"
-#~ "  /usr/share/common-licenses/GPL\n"
-#~ msgstr ""
-#~ "(C) Fiz Vazquez\n"
-#~ "\n"
-#~ "  This program is free software; you can redistribute \n"
-#~ "  it and/or modify it under the terms of the GNU \n"
-#~ "  General Public License as published by the Free \n"
-#~ "  Software Foundation; either version 2 of the License, \n"
-#~ "  or (at your option) any later version.\n"
-#~ "\n"
-#~ "  This program is distributed in the hope that it will be \n"
-#~ "  useful, but WITHOUT ANY WARRANTY; without even the\n"
-#~ "  implied warranty of MERCHANTABILITY or FITNESS FOR \n"
-#~ "  A PARTICULAR PURPOSE.  See the GNU General Public \n"
-#~ "  License <http://www.opensource.org/gpl-license.html>\n"
-#~ "  for more details.\n"
-#~ "\n"
-#~ "  You can found the license on Debian systems in the file\n"
-#~ "  /usr/share/common-licenses/GPL\n"
-
-#~ msgid "pytrainer.e-oss.net"
-#~ msgstr "pytrainer.e-oss.net"
-
-#~ msgid ""
-#~ "Basque: Jabier Santamaria <mendikote at gmail.com>\n"
-#~ "Catalan: Eloi Crespillo Itchart <eloi at ikuszen.com>\n"
-#~ "Czech: Lobus Pokorny <sp.pok at seznam.cz>\n"
-#~ "French: Dj <dj at djremixtheblog.be>\n"
-#~ "French: Pierre Gaigé <pgaige at free.fr>\n"
-#~ "Norwegian: Havard Davidsen <havard.davidsen at gmail.com>\n"
-#~ "Polish: Seweryn Kokot <skokot at po.opole.pl>\n"
-#~ "german: Aleks <aleks at schnecklecker.de>\n"
-#~ "Spanish: Fiz vazquez <vud1 at sindominio.net>"
-#~ msgstr ""
-#~ "Basque: Jabier Santamaria <mendikote at gmail.com>\n"
-#~ "Catalan: Eloi Crespillo Itchart <eloi at ikuszen.com>\n"
-#~ "Czech: Lobus Pokorny <sp.pok at seznam.cz>\n"
-#~ "French: Dj <dj at djremixtheblog.be>\n"
-#~ "French: Pierre Gaigé <pgaige at free.fr>\n"
-#~ "Norwegian: Havard Davidsen <havard.davidsen at gmail.com>\n"
-#~ "Polish: Seweryn Kokot <skokot at po.opole.pl>\n"
-#~ "german: Aleks <aleks at schnecklecker.de>\n"
-#~ "Spanish: Fiz vazquez <vud1 at sindominio.net>"
-
-#~ msgid "No Active Plugins"
-#~ msgstr "Aucun plugins actif"
-
-#~ msgid "No Active Extensions"
-#~ msgstr "Aucune extension active"
-
-#~ msgid " Km"
-#~ msgstr " Km"
-
-#~ msgid "<b>Velocity:</b>"
-#~ msgstr "<b>Vitesse:</b>"
-
-#~ msgid " km/h"
-#~ msgstr " km/h"
-
-#~ msgid " <b>Accumulated Altitude Change:</b> "
-#~ msgstr " <b>Dénivelé Cumulé:</b> "
-
-#~ msgid "<b>Average:</b>"
-#~ msgstr "<b>Moyenne:</b>"
-
-#~ msgid "velocity"
-#~ msgstr "vitesse"
-
-#~ msgid "Calculate Distance"
-#~ msgstr "Calculer la Distance"
-
-#~ msgid "Calculate Time"
-#~ msgstr "Calculer la Durée"
-
-#~ msgid "Calculate Velocity"
-#~ msgstr "Calculer la Vitesse"
-
-#~ msgid "Calculate Pace"
-#~ msgstr "Calculer le Rythme"
-
-#~ msgid "Calculate Calories"
-#~ msgstr "Calculer les Calories"
-
-#~ msgid "Calculate Average"
-#~ msgstr "Calcule la Moyenne"
-
-#~ msgid ""
-#~ "You are going to remove a sport. When you delete a \n"
-#~ "sport you delete the records asociated. Are you sure \n"
-#~ "that you want do it?"
-#~ msgstr ""
-#~ "Vous êtes en train de supprimer un sport. Quand vous supprimez un sport "
-#~ "vous supprimez les résultats associés. Êtes vous sûr de vouloir le faire?"
-
-#~ msgid ""
-#~ "You are going to remove one database entry. Are you sure yo want do it?"
-#~ msgstr ""
-#~ "Vous êtes en train de supprimer une entrée de la base de données. Êtes "
-#~ "vous sûr de vouloir le faire?"
-
-#~ msgid "You are going to remove one waypoint. Are you sure yo want do it?"
-#~ msgstr ""
-#~ "Vous êtes en train de supprimer un point de localisation. Êtes vous sûr "
-#~ "de vouloir le faire?"
-
-#~ 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."
-#~ msgstr ""
-#~ "Ce fichier GPX semble contenir plusieurs circuits. Pressez Annuler pour "
-#~ "sélectionner un circuit. Pressez Ok pour tous les charger sous un seul et "
-#~ "même circuit."
-
-#~ msgid "<b>Positive:</b>"
-#~ msgstr "<b>Positif:</b>"
-
-#~ msgid "<b>Negative:</b>"
-#~ msgstr "<b>Négatif:</b>"
-
-#~ msgid "Km/day"
-#~ msgstr "Km/jour"
-
-#~ msgid "bpm/day"
-#~ msgstr "bpm/jour"
-
-#~ msgid "km/h/day"
-#~ msgstr "km/h/jour"
-
-#~ msgid "cal/day"
-#~ msgstr "cal/jour"
-
-#~ msgid "time/day"
-#~ msgstr "temps/jour"
-
-#~ msgid " <b>Description:</b>"
-#~ msgstr " <b>Description:</b>"
-
-#~ msgid "Profile"
-#~ msgstr "Profil"
-
-#~ msgid "Age"
-#~ msgstr "Age"
-
-#~ msgid "Database"
-#~ msgstr "Base de données"
-
-#~ msgid "The free sport trainning center"
-#~ msgstr "Un outil libre de planification d'entrainements"
-
-#~ msgid "window2"
-#~ msgstr "fenêtre2"
-
-#~ msgid "The training tool for the gnu people"
-#~ msgstr "L'outil d'entrainement pour les gens libres"
-
-#, fuzzy
-#~ msgid "Export "
-#~ msgstr "Export"
-
-#~ msgid "dialog1"
-#~ msgstr "dialogue1"
-
-#~ msgid "Kj"
-#~ msgstr "Kj"
-
-#~ msgid "Kj/day"
-#~ msgstr "Kj/jour"
-
-#~ msgid "Press Here to create the database"
-#~ msgstr "Appuyez ici pour créer votre base de données"
diff --git a/locale/gl/LC_MESSAGES/Makefile b/locale/gl/LC_MESSAGES/Makefile
new file mode 100644
index 0000000..f20fa06
--- /dev/null
+++ b/locale/gl/LC_MESSAGES/Makefile
@@ -0,0 +1,8 @@
+default:
+	msgfmt pytrainer_gl.po -o ./pytrainer.mo
+
+merge:
+	msgmerge pytrainer_gl.po pytrainer_gl.po_new > pytrainer_gl.po.tmp
+	mv pytrainer_gl.po.tmp pytrainer_gl.po
+	rm pytrainer_gl.po_new
+	
diff --git a/locale/gl/LC_MESSAGES/pytrainer_gl.po b/locale/gl/LC_MESSAGES/pytrainer_gl.po
new file mode 100644
index 0000000..4f8d5ae
--- /dev/null
+++ b/locale/gl/LC_MESSAGES/pytrainer_gl.po
@@ -0,0 +1,2592 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Pytrainer 1.9.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-10-12 10:22+0200\n"
+"PO-Revision-Date: 2011-10-12 17:44+0100\n"
+"Last-Translator: Kaptan <khanyux at gmail.com>\n"
+"Language-Team: http://trasno.net/ <proxecto at trasno.net>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Galician\n"
+"X-Poedit-Country: SPAIN\n"
+
+#: glade/calendar.glade:7
+msgid "Calendar"
+msgstr "Calendario"
+
+#: glade/equipment.glade:109
+msgid "<b>Equipment List</b>"
+msgstr "<b>Lista de equipamento</b>"
+
+#: glade/equipment.glade:149
+#: glade/equipment.glade:406
+#: pytrainer/gui/equipment.py:98
+msgid "Description"
+msgstr "Descrición"
+
+#: glade/equipment.glade:174
+#: glade/equipment.glade:431
+msgid "Life Expectancy"
+msgstr "Vida útil esperada"
+
+#: glade/equipment.glade:211
+#: glade/equipment.glade:467
+msgid "Prior Usage"
+msgstr "Uso Anterior"
+
+#: glade/equipment.glade:243
+#: glade/equipment.glade:499
+#: pytrainer/gui/equipment.py:102
+msgid "Active"
+msgstr "Activo"
+
+#: glade/equipment.glade:277
+#: glade/equipment.glade:533
+#: pytrainer/gui/windowimportdata.py:353
+msgid "Notes"
+msgstr "Notas"
+
+#: glade/equipment.glade:366
+msgid "<b>Add New Equipment</b>"
+msgstr "<b>Engadir Novo Equipamento</b>"
+
+#: glade/equipment.glade:622
+msgid "<b>Edit Equipment</b>"
+msgstr "<b>Editar Equipamento</b>"
+
+#: glade/equipment.glade:651
+msgid "Really delete the equipment item?"
+msgstr "Realmente desexa borrar o equipamento?"
+
+#: glade/equipment.glade:704
+msgid "<b>Delete Equipment</b>"
+msgstr "<b>Borrar Equipamento</b>"
+
+#: glade/extensions.glade:9
+#: glade/pytrainer.glade:163
+msgid "Extensions"
+msgstr "Extensións"
+
+#: glade/extensions.glade:54
+msgid "<b>Extension Details</b>"
+msgstr "<b>Detalles das extensións</b>"
+
+#: glade/extensions.glade:67
+msgid "name-entry"
+msgstr "nome-entrada"
+
+#: glade/extensions.glade:82
+#: glade/plugins.glade:144
+#: glade/profile.glade:728
+#: glade/pytrainer.glade:5703
+msgid "Name:"
+msgstr "Nome:"
+
+#: glade/extensions.glade:96
+#: glade/plugins.glade:115
+msgid "Status:"
+msgstr "Estado:"
+
+#: glade/extensions.glade:110
+#: glade/plugins.glade:86
+#: glade/pytrainer.glade:6548
+msgid "Description:"
+msgstr "Descrición:"
+
+#: glade/extensions.glade:124
+#: glade/plugins.glade:100
+msgid "status-entry"
+msgstr "estado-entrada"
+
+#: glade/extensions.glade:139
+msgid "description-entry"
+msgstr "descrición-entrada"
+
+#: glade/importdata.glade:7
+#: glade/importdata.glade:325
+msgid "Import"
+msgstr "Importar"
+
+#: glade/importdata.glade:36
+msgid ""
+"Test 1\n"
+"Test 2"
+msgstr ""
+"Proba 1\n"
+"Proba 2"
+
+#: glade/importdata.glade:46
+msgid "<b>Select your GPS device</b>"
+msgstr "<b>Seleccione o seu dispositivo GPS</b>"
+
+#: glade/importdata.glade:64
+msgid "Import from GPS Device is not yet implemented"
+msgstr "Importar dende dispositivo GPS aínda non está dispoñible"
+
+#: glade/importdata.glade:92
+msgid "<b>Tools</b>"
+msgstr "<b>Ferramentas</b>"
+
+#: glade/importdata.glade:111
+msgid "Rescan"
+msgstr "Examinar de novo"
+
+#: glade/importdata.glade:115
+msgid "Rescan system for available tools"
+msgstr "Examinando de novo ferramentas dispoñibles no sistema"
+
+#: glade/importdata.glade:168
+msgid "<b>Import from GPS Device</b>"
+msgstr "<b>Importar dende un dispositivo GPS</b>"
+
+#: glade/importdata.glade:221
+msgid "Remove selected files and the associated activities"
+msgstr "Borrar ficheiros seleccionados e as actividades asociadas"
+
+#: glade/importdata.glade:239
+msgid "Add files to import activities from"
+msgstr "Engadir ficheiros dende os que importar actividades"
+
+#: glade/importdata.glade:264
+msgid "<b>Add file(s) to import activities from</b>"
+msgstr "<b>Engadir ficheiro(s) dende o(os) que importar actividades </b>"
+
+#: glade/importdata.glade:307
+msgid "<b>Select activities to import</b>"
+msgstr "<b>Seleccionar actividades para importar</b>"
+
+#: glade/importdata.glade:330
+msgid "Import selected activities"
+msgstr "Importar actividades seleccionadas"
+
+#: glade/importdata.glade:347
+msgid "Close Import dialog"
+msgstr "Pechar diálogo de Importación"
+
+#: glade/importdata.glade:387
+msgid "<b>Import from File</b>"
+msgstr "<b>Importar dendde Ficheiro</b>"
+
+#: glade/importdata.glade:464
+msgid "<b>Plugins</b>"
+msgstr "<b>Engadidos</b>"
+
+#: glade/importdata.glade:491
+msgid "Import from GPS Device"
+msgstr "Importar dende dispositivo GPS"
+
+#: glade/importdata.glade:510
+msgid "Import from File"
+msgstr "Importar dende Ficheiro"
+
+#: glade/importdata.glade:525
+msgid "Launch 'File Select' on start"
+msgstr "Lanzar 'Ficheiro Seleccionado' ó inicio"
+
+#: glade/importdata.glade:530
+msgid "Automatically start the file selection dialog"
+msgstr "Lanzar diálogo de selección de ficheiros  automaticamente"
+
+#: glade/importdata.glade:546
+#: glade/plugins.glade:9
+msgid "Plugins"
+msgstr "Engadidos"
+
+#: glade/importdata.glade:572
+msgid "<b>Default to Tab</b>"
+msgstr "<b>Lingüeta por defecto</b>"
+
+#: glade/importdata.glade:595
+msgid "Reset"
+msgstr "Restablecer"
+
+#: glade/importdata.glade:611
+msgid "Save"
+msgstr "Gardar"
+
+#: glade/importdata.glade:670
+msgid "<b>Options</b>"
+msgstr "<b>Opcións</b>"
+
+#: glade/importdata.glade:702
+msgid "<b>Select file to import from</b>"
+msgstr "<b>Seleccionar ficheiro para importar dende</b>"
+
+#: glade/importdata.glade:731
+msgid "Tab"
+msgstr "Lingüeta"
+
+#: glade/importdata.glade:746
+msgid "Comma"
+msgstr "Coma"
+
+#: glade/importdata.glade:763
+msgid "Other"
+msgstr "Outro"
+
+#: glade/importdata.glade:799
+msgid "Read File"
+msgstr "Ler Ficheiro"
+
+#: glade/importdata.glade:820
+msgid "<b>File delimiter</b>"
+msgstr "<b>Delimitador no ficheiro</b>"
+
+#: glade/importdata.glade:864
+#: pytrainer/gui/windowmain.py:116
+#: pytrainer/gui/windowmain.py:131
+#: pytrainer/gui/windowmain.py:184
+#: pytrainer/gui/windowmain.py:1494
+#: pytrainer/gui/dialogselecttrack.py:40
+msgid "Date"
+msgstr "Data"
+
+#: glade/importdata.glade:877
+#: glade/importdata.glade:918
+#: glade/importdata.glade:933
+#: glade/importdata.glade:1128
+#: glade/importdata.glade:1143
+#: glade/importdata.glade:1158
+#: glade/importdata.glade:1173
+#: glade/importdata.glade:1188
+#: glade/importdata.glade:1203
+#: glade/importdata.glade:1218
+#: glade/importdata.glade:1233
+#: glade/importdata.glade:1248
+#: glade/importdata.glade:1263
+#: glade/importdata.glade:1278
+#: glade/importdata.glade:1293
+msgid "Exclude"
+msgstr "Descartar"
+
+#: glade/importdata.glade:892
+#: pytrainer/recordgraph.py:134
+#: pytrainer/recordgraph.py:136
+#: pytrainer/recordgraph.py:138
+#: pytrainer/recordgraph.py:140
+#: pytrainer/recordgraph.py:142
+#: pytrainer/recordgraph.py:144
+#: pytrainer/recordgraph.py:146
+#: pytrainer/monthgraph.py:26
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/totalgraph.py:24
+#: pytrainer/yeargraph.py:26
+#: pytrainer/daygraph.py:52
+#: pytrainer/daygraph.py:54
+#: pytrainer/daygraph.py:56
+#: pytrainer/weekgraph.py:28
+msgid "Distance (km)"
+msgstr "Distancia (km)"
+
+#: glade/importdata.glade:905
+msgid "Duration (sec)"
+msgstr "Duración (seg)"
+
+#: glade/importdata.glade:947
+msgid "<b>PyTrainer Field</b>"
+msgstr "<b>Campo en PyTrainer</b>"
+
+#: glade/importdata.glade:958
+msgid "<b>File Column</b>"
+msgstr "<b>Columna no Ficheiro</b>"
+
+#: glade/importdata.glade:972
+#: pytrainer/gui/windowmain.py:115
+#: pytrainer/gui/windowmain.py:1493
+msgid "Title"
+msgstr "Título"
+
+#: glade/importdata.glade:985
+msgid "Descent (m)"
+msgstr "Descendido (m)"
+
+#: glade/importdata.glade:998
+msgid "Accent (m)"
+msgstr "Ascendido (m)"
+
+#: glade/importdata.glade:1011
+msgid "Calories (kcal)"
+msgstr "Calorías (kcal)"
+
+#: glade/importdata.glade:1024
+msgid "Max Speed (km/h)"
+msgstr "Velocidade Máx (km/h)"
+
+#: glade/importdata.glade:1037
+#: pytrainer/monthgraph.py:29
+#: pytrainer/totalgraph.py:27
+#: pytrainer/yeargraph.py:29
+#: pytrainer/weekgraph.py:31
+msgid "Average Speed (km/h)"
+msgstr "Velocidade Media (km/h)"
+
+#: glade/importdata.glade:1050
+#: glade/pytrainer.glade:277
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:118
+#: pytrainer/gui/windowmain.py:140
+#: pytrainer/gui/windowmain.py:1496
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/gui/windowprofile.py:65
+msgid "Sport"
+msgstr "Deporte"
+
+#: glade/importdata.glade:1063
+msgid "Average Heartrate (bpm)"
+msgstr "Pulsacións medias (ppm)"
+
+#: glade/importdata.glade:1076
+msgid "Max Heartrate (bpm)"
+msgstr "Pulsacións Máximas (ppm)"
+
+#: glade/importdata.glade:1089
+#: pytrainer/recordgraph.py:138
+msgid "Pace (min/km)"
+msgstr "Ritmo (min/km)"
+
+#: glade/importdata.glade:1102
+msgid "Max Pace (min/km)"
+msgstr "Ritmo  Máx (min/km)"
+
+#: glade/importdata.glade:1115
+#: glade/newrecord.glade:1094
+#: pytrainer/gui/windowmain.py:167
+msgid "Comments"
+msgstr "Comentarios"
+
+#: glade/importdata.glade:1309
+msgid "Force sport to:"
+msgstr "Forzar deporte a:"
+
+#: glade/importdata.glade:1323
+#: glade/newrecord.glade:404
+msgid " "
+msgstr " "
+
+#: glade/importdata.glade:1394
+msgid "<b>Map Columns</b>"
+msgstr "<b>Mapear Columnas</b>"
+
+#: glade/importdata.glade:1414
+msgid ""
+"<small>This is an experiemental import for delimited files\n"
+"1) Select a file\n"
+"2) Click 'Read File' to analyse the file\n"
+"3) Map columns in the file to pytrainer data elements (Date is required)\n"
+"4) Click 'Import Data'</small>"
+msgstr ""
+"<small>Esta é un forma experimental de importar ficheiros delimitados\n"
+"1) Seleccione un ficheiro\n"
+"2) Prema 'Ler Ficheiro' para analizalo\n"
+"3) Asigne as columnas do ficheiro a elementos de datos de Pytrainer (a data é obligatoria)\n"
+"4) Prema 'Importar Datos'</small>"
+
+#: glade/importdata.glade:1427
+msgid "Import Data"
+msgstr "Importar Datos"
+
+#: glade/importdata.glade:1467
+msgid "<b>Import from CSV</b>"
+msgstr "<b>Importar dende un ficheiro CSV</b>"
+
+#: glade/newrecord.glade:7
+#: pytrainer/gui/windowmain.py:2160
+msgid "New Entry"
+msgstr "Nova Entrada"
+
+#: glade/newrecord.glade:61
+msgid "Title:"
+msgstr "Título:"
+
+#: glade/newrecord.glade:85
+msgid "GPX File:"
+msgstr "Ficheiro GPX:"
+
+#: glade/newrecord.glade:129
+msgid "Calculate Values"
+msgstr "Calcular Valores:"
+
+#: glade/newrecord.glade:149
+msgid "Sport:"
+msgstr "Deporte:"
+
+#: glade/newrecord.glade:184
+msgid "<b>Main</b>"
+msgstr "<b>Principal</b>"
+
+#: glade/newrecord.glade:221
+msgid "Distance (Km):"
+msgstr "Distancia (km):"
+
+#: glade/newrecord.glade:230
+#: glade/newrecord.glade:355
+#: glade/newrecord.glade:558
+#: glade/newrecord.glade:697
+#: glade/newrecord.glade:958
+#: glade/profile.glade:1548
+msgid "Calculate"
+msgstr "Calcular"
+
+#: glade/newrecord.glade:248
+msgid "Duration:"
+msgstr "Duración:"
+
+#: glade/newrecord.glade:279
+#: glade/newrecord.glade:306
+msgid ":"
+msgstr ":"
+
+#: glade/newrecord.glade:376
+msgid "Date:"
+msgstr "Data:"
+
+#: glade/newrecord.glade:445
+msgid "Start Time:"
+msgstr "Hora de Comezo:"
+
+#: glade/newrecord.glade:461
+msgid "12:00:00"
+msgstr "12:00:00"
+
+#: glade/newrecord.glade:486
+#: glade/profile.glade:1586
+msgid "<b>General</b>"
+msgstr "<b>Xeral</b>"
+
+#: glade/newrecord.glade:522
+msgid "Max (km/h):"
+msgstr "Máx (km/h):"
+
+#: glade/newrecord.glade:547
+msgid "Average (km/h)"
+msgstr "Media (km/h)"
+
+#: glade/newrecord.glade:593
+msgid "<b>Speed</b>"
+msgstr "<b>Velocidade</b>"
+
+#: glade/newrecord.glade:612
+msgid "Quick Entry"
+msgstr "Entrada Rápida"
+
+#: glade/newrecord.glade:644
+msgid "Max (min/km):"
+msgstr "Máx (min/km):"
+
+#: glade/newrecord.glade:671
+msgid "Pace (min/km):"
+msgstr "Ritmo (min/km):"
+
+#: glade/newrecord.glade:718
+msgid "<b>Pace</b>"
+msgstr "<b>Ritmo</b>"
+
+#: glade/newrecord.glade:754
+msgid "Ascent:"
+msgstr "Ascendido:"
+
+#: glade/newrecord.glade:780
+msgid "Descent:"
+msgstr "Descendido:"
+
+#: glade/newrecord.glade:813
+msgid "<b>Accumulated Altitude Change</b>"
+msgstr "<b>Desnivel Acumulado</b>"
+
+#: glade/newrecord.glade:850
+msgid "Max (bpm):"
+msgstr "Máx (ppm):"
+
+#: glade/newrecord.glade:862
+msgid "Heart rate:"
+msgstr "Pulsacións:"
+
+#: glade/newrecord.glade:902
+#: pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:165
+#: pytrainer/gui/windowmain.py:1500
+#: pytrainer/monthgraph.py:30
+#: pytrainer/totalgraph.py:28
+#: pytrainer/yeargraph.py:30
+#: pytrainer/weekgraph.py:32
+msgid "Calories"
+msgstr "Calorías"
+
+#: glade/newrecord.glade:931
+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 o cálculo de calorías é necesario introducir o valor de MET do deporte (en Preferencias->Deportes) </small>"
+
+#: glade/newrecord.glade:1005
+msgid "<b>Heart Rate</b>"
+msgstr "<b>Pulsacións</b>"
+
+#: glade/newrecord.glade:1027
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: glade/newrecord.glade:1079
+msgid "<b>Comments</b>"
+msgstr "<b>Comentarios</b>"
+
+#: glade/newrecord.glade:1134
+msgid "<i>There are no active equipment items.</i>"
+msgstr "<i>Non hai elementos de equipamento activos.</i>"
+
+#: glade/newrecord.glade:1188
+msgid "<b>Associated Equipment</b>"
+msgstr "<b>Equipamento Asociado</b>"
+
+#: glade/newrecord.glade:1203
+#: glade/profile.glade:1446
+msgid "Equipment"
+msgstr "Equipamento"
+
+#: glade/plugins.glade:53
+msgid "<b>Plugin Details</b>"
+msgstr "<b>Detalles do Engadido</b>"
+
+#: glade/plugins.glade:68
+msgid "description-entry "
+msgstr "descrición-entrada"
+
+#: glade/plugins.glade:129
+msgid "nameEntry"
+msgstr "nomeEntrada"
+
+#: glade/profile.glade:7
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: glade/profile.glade:37
+msgid "Metric system"
+msgstr "Sistema métrico"
+
+#: glade/profile.glade:53
+msgid "U.S. customary units"
+msgstr "Sistema americano"
+
+#: glade/profile.glade:74
+msgid "<b>System of Measurement</b>"
+msgstr "<b>Sistema de Medida</b>"
+
+#: glade/profile.glade:103
+#: glade/pytrainer.glade:2111
+msgid "Google"
+msgstr "Google"
+
+#: glade/profile.glade:118
+#: glade/pytrainer.glade:2094
+msgid "Open Street Map"
+msgstr "Open Street Map"
+
+#: glade/profile.glade:140
+msgid "<b>Default Map Viewer</b>"
+msgstr "<b>Visor de Mapas por Defecto</b>"
+
+#: glade/profile.glade:176
+msgid "Database type:"
+msgstr "Tipo de base de datos:"
+
+#: glade/profile.glade:187
+msgid "Database host:"
+msgstr "Servidor da base de datos:"
+
+#: glade/profile.glade:213
+msgid "Database name:"
+msgstr "Nome da base de datos:"
+
+#: glade/profile.glade:252
+msgid "Database user:"
+msgstr "Usuario da base de datos:"
+
+#: glade/profile.glade:267
+msgid "Database pass:"
+msgstr "Contrasinal da base de datos:"
+
+#: glade/profile.glade:318
+msgid "<b>Database</b>"
+msgstr "<b>Base de datos</b>"
+
+#: glade/profile.glade:340
+msgid "General"
+msgstr "Xeral"
+
+#: glade/profile.glade:369
+msgid "User name:"
+msgstr "Nome do usuario:"
+
+#: glade/profile.glade:380
+msgid "Gender:"
+msgstr "Xénero:"
+
+#: glade/profile.glade:407
+#: glade/pytrainer.glade:5728
+msgid "Height:"
+msgstr "Altura:"
+
+#: glade/profile.glade:447
+#: glade/pytrainer.glade:5715
+msgid "Date of birth:"
+msgstr "Data de nacemento:"
+
+#: glade/profile.glade:520
+msgid "Weight:"
+msgstr "Peso:"
+
+#: glade/profile.glade:542
+#: glade/pytrainer.glade:5790
+msgid "<b>Athlete Details</b>"
+msgstr "<b>Datos do Atleta</b>"
+
+#: glade/profile.glade:557
+#: glade/pytrainer.glade:5893
+msgid "Athlete"
+msgstr "Atleta"
+
+#: glade/profile.glade:672
+msgid "<b>Sport List</b>"
+msgstr "<b>Lista de Deportes</b>"
+
+#: glade/profile.glade:684
+msgid "llist"
+msgstr "Lista"
+
+#: glade/profile.glade:739
+msgid "M.E.T.:"
+msgstr "M.E.T.:"
+
+#: glade/profile.glade:766
+msgid "Extra Weight:"
+msgstr "Peso Extra:"
+
+#: glade/profile.glade:802
+#: glade/profile.glade:1218
+msgid "More information on determining yor M.E.T sport coefficient on Wikipedia"
+msgstr "Máis información sobre como determinar o seu coeficiente M.E.T. na Wikipedia"
+
+#: glade/profile.glade:822
+msgid "Maximum Pace:"
+msgstr "Ritmo Máximo:"
+
+#: glade/profile.glade:950
+msgid "<b>Add New Sport</b>"
+msgstr "<b>Engadir Novo Deporte</b>"
+
+#: glade/profile.glade:965
+msgid "new"
+msgstr "novo"
+
+#: glade/profile.glade:996
+msgid ""
+"Deleting a sport removes associated records.\n"
+"Continue?"
+msgstr ""
+"Borrando un deporte tamén elimina as súas entradas asociadas.\n"
+"Desexa continuar?"
+
+#: glade/profile.glade:1078
+msgid "<b>Delete Sport</b>"
+msgstr "<b>Borrar Deporte</b>"
+
+#: glade/profile.glade:1110
+msgid "delete"
+msgstr "borrar"
+
+#: glade/profile.glade:1143
+msgid "Name"
+msgstr "Nome"
+
+#: glade/profile.glade:1166
+msgid "M.E.T."
+msgstr "M.E.T."
+
+#: glade/profile.glade:1193
+#: pytrainer/gui/windowprofile.py:65
+msgid "Extra Weight"
+msgstr "Peso Extra"
+
+#: glade/profile.glade:1238
+#: pytrainer/gui/windowprofile.py:65
+msgid "Maximum Pace"
+msgstr "Ritmo Máximo"
+
+#: glade/profile.glade:1265
+#: pytrainer/gui/windowmain.py:188
+#: pytrainer/gui/windowprofile.py:65
+msgid "Color"
+msgstr "Cor"
+
+#: glade/profile.glade:1375
+msgid "<b>Edit Sport</b>"
+msgstr "<b>Editar Deporte</b>"
+
+#: glade/profile.glade:1386
+msgid "<b>lalaal</b>"
+msgstr "<b>lalaal</b>"
+
+#: glade/profile.glade:1408
+msgid "edit"
+msgstr "editar"
+
+#: glade/profile.glade:1424
+msgid "Sports"
+msgstr "Deportes"
+
+#: glade/profile.glade:1479
+msgid "Maximum heart rate:"
+msgstr "Pulsacións Máximas:"
+
+#: glade/profile.glade:1490
+msgid "Resting heart rate:"
+msgstr "Pulsacións en repouso:"
+
+#: glade/profile.glade:1535
+msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>"
+msgstr "<small><b>Nota:</b> O número máximo de pulsacións calcúlase coa seguinte fórmula: 220 menos a súa idade. </small>"
+
+#: glade/profile.glade:1622
+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> Para empregar o método Karvonen debe cubrir o campo de Pulsacións en repouso.</small>"
+
+#: glade/profile.glade:1635
+msgid "Percentages based method"
+msgstr "Método baseado en porcentaxes"
+
+#: glade/profile.glade:1651
+#: pytrainer/gui/windowmain.py:790
+msgid "Karvonen method"
+msgstr "Método Karvonen"
+
+#: glade/profile.glade:1672
+msgid "Select how to calculate your heart rate zones."
+msgstr "Seleccione como calcular as zonas de frecuencia cardíaca."
+
+#: glade/profile.glade:1711
+msgid "<b>Heart Rate Zones</b>"
+msgstr "<b>Zonas de Frecuencia Cardíaca</b>"
+
+#: glade/profile.glade:1733
+#: pytrainer/recordgraph.py:140
+#: pytrainer/lib/activity.py:443
+#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455
+#: pytrainer/lib/activity.py:525
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/daygraph.py:56
+msgid "Heart Rate"
+msgstr "Pulsacións"
+
+#: glade/profile.glade:1759
+msgid "Log Level"
+msgstr "Nivel Log"
+
+#: glade/profile.glade:1767
+msgid ""
+"Error\n"
+"Warning\n"
+"Info\n"
+"Debug"
+msgstr ""
+"Error\n"
+"Aviso\n"
+"Información\n"
+"Depuración"
+
+#: glade/profile.glade:1785
+msgid "<small>What level of detail is written to the log?</small>"
+msgstr "<small>Que nivel de detalle está escrito no ficheiro log?</small>"
+
+#: glade/profile.glade:1799
+msgid "Validate"
+msgstr "Validar"
+
+#: glade/profile.glade:1829
+msgid "<small>Do the plugins attempt to validate the input file before processing?</small>"
+msgstr "<small>Intentar validar os engadidos antes de procesar o ficheiro de entrada?</small>"
+
+#: glade/profile.glade:1845
+msgid "Check"
+msgstr "Comprobar"
+
+#: glade/profile.glade:1874
+msgid "<small>Was a configuration and database check requested?</small>"
+msgstr "<small>Houbo unha petición para comprobar a configuración e a base de datos?</small>"
+
+#: glade/profile.glade:1890
+msgid "New Graph"
+msgstr "Novo Gráfico"
+
+#: glade/profile.glade:1919
+msgid "<small>Want to use experimental new approach to graphing?</small>"
+msgstr "<small>Desexa empregar os novos gráficos experimentais?</small>"
+
+#: glade/profile.glade:1962
+msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>"
+msgstr "<small>Esta pantalla amosa o estado das opcións configurables mediante a liña de comandos para PyTrainer. Os cambios que se fagan unicamente terán efecto na presente execución de PyTrainer e non serán recordados no futuro </small>"
+
+#: glade/profile.glade:1983
+msgid "Startup Parameters"
+msgstr "Configuración de Inicio"
+
+#: glade/pytrainer.glade:24
+msgid "_File"
+msgstr "_Ficheiro"
+
+#: glade/pytrainer.glade:39
+msgid "_Import"
+msgstr "_Importar"
+
+#: glade/pytrainer.glade:60
+msgid "_Export as Text Separated by Commas"
+msgstr "_Exportar como Texto Separado por Comas"
+
+#: glade/pytrainer.glade:94
+msgid "_Edit"
+msgstr "_Editar"
+
+#: glade/pytrainer.glade:114
+msgid "_View"
+msgstr "_Vista"
+
+#: glade/pytrainer.glade:121
+msgid " _Classic View"
+msgstr " Vista _Clásica"
+
+#: glade/pytrainer.glade:131
+msgid " _List View"
+msgstr " Vista de _Listado de rexistros"
+
+#: glade/pytrainer.glade:141
+msgid " _Waypoints Editor"
+msgstr "Editor de _Waypoints"
+
+#: glade/pytrainer.glade:155
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: glade/pytrainer.glade:172
+msgid "GPS Device Plugins"
+msgstr "Engadidos do dispositivo GPS"
+
+#: glade/pytrainer.glade:185
+msgid "_Help"
+msgstr "_Axuda"
+
+#: glade/pytrainer.glade:290
+#: glade/pytrainer.glade:6324
+msgid "All Sports"
+msgstr "Todos Deportes"
+
+#: glade/pytrainer.glade:396
+msgid "<b>Sport:</b>"
+msgstr "<b>Deporte:</b>"
+
+#: glade/pytrainer.glade:408
+#: glade/pytrainer.glade:3144
+#: glade/pytrainer.glade:3786
+#: glade/pytrainer.glade:4440
+#: glade/pytrainer.glade:5170
+msgid "<b>Duration:</b>"
+msgstr "<b>Duración:</b>"
+
+#: glade/pytrainer.glade:423
+#: glade/pytrainer.glade:3234
+#: glade/pytrainer.glade:3865
+#: glade/pytrainer.glade:4519
+#: glade/pytrainer.glade:5272
+msgid "<b>Speed:</b>"
+msgstr "<b>Velocidade:</b>"
+
+#: glade/pytrainer.glade:437
+#: glade/pytrainer.glade:3402
+#: glade/pytrainer.glade:4060
+#: glade/pytrainer.glade:4714
+#: glade/pytrainer.glade:5367
+msgid "<b>Pace:</b>"
+msgstr "<b>Ritmo:</b>"
+
+#: glade/pytrainer.glade:451
+msgid "<b>Ascent:</b>"
+msgstr "<b>Ascendido:</b>"
+
+#: glade/pytrainer.glade:465
+msgid "<b>Calories:</b>"
+msgstr "<b>Calorías:</b>"
+
+#: glade/pytrainer.glade:479
+msgid "<b>Comments:</b>"
+msgstr "<b>Comentarios:</b>"
+
+#: glade/pytrainer.glade:614
+msgid "<b>Date:</b>"
+msgstr "<b>Data:</b>"
+
+#: glade/pytrainer.glade:628
+#: glade/pytrainer.glade:3130
+#: glade/pytrainer.glade:3772
+#: glade/pytrainer.glade:4426
+#: glade/pytrainer.glade:5156
+msgid "<b>Distance:</b>"
+msgstr "<b>Distancia:</b>"
+
+#: glade/pytrainer.glade:645
+msgid "<b>Max Speed</b>"
+msgstr "<b>Velocidade Máx</b>"
+
+#: glade/pytrainer.glade:661
+#: glade/pytrainer.glade:3432
+#: glade/pytrainer.glade:4074
+#: glade/pytrainer.glade:4728
+#: glade/pytrainer.glade:5382
+msgid "<b>Max Pace:</b>"
+msgstr "<b>Ritmo Máx:</b>"
+
+#: glade/pytrainer.glade:677
+msgid "<b>Descent:</b>"
+msgstr "<b>Descendido:</b>"
+
+#: glade/pytrainer.glade:769
+#: glade/pytrainer.glade:3342
+#: glade/pytrainer.glade:3940
+#: glade/pytrainer.glade:4594
+#: glade/pytrainer.glade:5082
+msgid "Cal"
+msgstr "Cal"
+
+#: glade/pytrainer.glade:809
+#: glade/pytrainer.glade:3104
+#: glade/pytrainer.glade:3746
+#: glade/pytrainer.glade:4400
+#: glade/pytrainer.glade:5259
+#: pytrainer/gui/windowmain.py:109
+msgid "Km"
+msgstr "Km"
+
+#: glade/pytrainer.glade:824
+#: glade/pytrainer.glade:3264
+#: glade/pytrainer.glade:3297
+#: glade/pytrainer.glade:3895
+#: glade/pytrainer.glade:3988
+#: glade/pytrainer.glade:4549
+#: glade/pytrainer.glade:4642
+#: glade/pytrainer.glade:5302
+#: glade/pytrainer.glade:5318
+#: pytrainer/gui/windowmain.py:916
+#: pytrainer/gui/windowmain.py:917
+#: pytrainer/gui/windowmain.py:1045
+#: pytrainer/gui/windowmain.py:1046
+#: pytrainer/gui/windowmain.py:1127
+#: pytrainer/gui/windowmain.py:1128
+#: pytrainer/lib/activity.py:203
+msgid "km/h"
+msgstr "km/h"
+
+#: glade/pytrainer.glade:839
+msgid "<b>Equipment:</b>"
+msgstr "<b>Equipamento:</b>"
+
+#: glade/pytrainer.glade:935
+msgid "<b>Active / Rest:</b>"
+msgstr "<b>Activo / Repouso:</b>"
+
+#: glade/pytrainer.glade:962
+msgid "h:m:s"
+msgstr "h:m:s"
+
+#: glade/pytrainer.glade:1007
+msgid "<b>Laps</b>"
+msgstr "<b>Voltas</b>"
+
+#: glade/pytrainer.glade:1078
+msgid " <b>Title:</b>"
+msgstr " <b>Título:</b>"
+
+#: glade/pytrainer.glade:1128
+#: pytrainer/gui/windowmain.py:1722
+msgid "Show graph display options"
+msgstr "Amosa-las opcións do gráfico"
+
+#: glade/pytrainer.glade:1146
+msgid ""
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+"Percentage\n"
+"Zone"
+msgstr ""
+"Perfil\n"
+"Velocidade\n"
+"Ritmo\n"
+"Pulsacións\n"
+"Cadencia\n"
+"Porcentaxe\n"
+"Zona"
+
+#: glade/pytrainer.glade:1163
+#: glade/pytrainer.glade:4311
+#: glade/pytrainer.glade:4965
+#: glade/pytrainer.glade:5618
+#: glade/pytrainer.glade:5984
+msgid "Versus"
+msgstr "Contra"
+
+#: glade/pytrainer.glade:1174
+msgid ""
+"None\n"
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+msgstr ""
+"Nada\n"
+"Perfil\n"
+"Velocidade\n"
+"Ritmo\n"
+"Pulsacións\n"
+"Cadencia\n"
+
+#: glade/pytrainer.glade:1320
+msgid "<small>Graph Display Options</small>"
+msgstr "<small>Opcións de visualización gráfica</small>"
+
+#: glade/pytrainer.glade:1345
+#: glade/pytrainer.glade:1560
+#: glade/pytrainer.glade:1780
+msgid "<small>Limits</small>"
+msgstr "<small>Límites</small>"
+
+#: glade/pytrainer.glade:1357
+#: glade/pytrainer.glade:1572
+#: glade/pytrainer.glade:1826
+msgid "<small>Min</small>"
+msgstr "<small>Mín</small>"
+
+#: glade/pytrainer.glade:1369
+#: glade/pytrainer.glade:1584
+#: glade/pytrainer.glade:1838
+msgid "<small>Max</small>"
+msgstr "<small>Máx</small>"
+
+#: glade/pytrainer.glade:1418
+#: glade/pytrainer.glade:1640
+msgid "<small>Color</small>"
+msgstr "<small>Cor</small>"
+
+#: glade/pytrainer.glade:1449
+#: glade/pytrainer.glade:1653
+msgid "<small>Weight</small>"
+msgstr "<small>Peso</small>"
+
+#: glade/pytrainer.glade:1479
+msgid "Y1"
+msgstr "Y1"
+
+#: glade/pytrainer.glade:1490
+#: glade/pytrainer.glade:1701
+msgid "<small>Smoothing</small>"
+msgstr "<small>Suavizado</small>"
+
+#: glade/pytrainer.glade:1630
+msgid "Y2"
+msgstr "Y2"
+
+#: glade/pytrainer.glade:1770
+msgid "X"
+msgstr "X"
+
+#: glade/pytrainer.glade:1851
+msgid "<small>Distance</small>"
+msgstr "<small>Distancia</small>"
+
+#: glade/pytrainer.glade:1880
+msgid "<small>Time</small>"
+msgstr "<small>Tempo</small>"
+
+#: glade/pytrainer.glade:1941
+msgid "Show Laps"
+msgstr "Amosar Voltas"
+
+#: glade/pytrainer.glade:1980
+msgid "Reset Graph"
+msgstr "Restablecer o Gráfico"
+
+#: glade/pytrainer.glade:2042
+msgid "Redraw Map"
+msgstr "Restablecer Mapa"
+
+#: glade/pytrainer.glade:2058
+msgid "<small>Show:</small>"
+msgstr "<small>Amosar:</small>"
+
+#: glade/pytrainer.glade:2069
+msgid ""
+"None\n"
+"Speed\n"
+"Heart rate\n"
+"Cadence"
+msgstr ""
+"Nada\n"
+"Velocidade\n"
+"Pulsacións\n"
+"Cadencia"
+
+#: glade/pytrainer.glade:2084
+msgid "<small>Display map using:</small>"
+msgstr "<small>Opcións de visualización de mapas:</small>"
+
+#: glade/pytrainer.glade:2185
+msgid "<b>Beats:</b>"
+msgstr "<b>Pulsacións:</b>"
+
+#: glade/pytrainer.glade:2197
+#: glade/pytrainer.glade:3312
+#: glade/pytrainer.glade:3910
+#: glade/pytrainer.glade:4564
+#: glade/pytrainer.glade:5052
+msgid "<b>Calories: </b>"
+msgstr "<b>Calorías: </b>"
+
+#: glade/pytrainer.glade:2211
+#: glade/pytrainer.glade:3464
+#: glade/pytrainer.glade:4138
+#: glade/pytrainer.glade:4792
+#: glade/pytrainer.glade:5430
+msgid "<b>Max Beats:</b>"
+msgstr "<b>Pulsacións Máx:</b>"
+
+#: glade/pytrainer.glade:2225
+msgid "<b>HR Zones Method:</b>"
+msgstr "<b>Método Zonas FC:</b>"
+
+#: glade/pytrainer.glade:2240
+msgid "<b>HR Zone5:</b>"
+msgstr "<b>Máximo esforzo:</b>"
+
+#: glade/pytrainer.glade:2255
+#: glade/pytrainer.glade:2454
+msgid " bpm"
+msgstr " ppm"
+
+#: glade/pytrainer.glade:2271
+msgid " Cal"
+msgstr " Cal"
+
+#: glade/pytrainer.glade:2329
+msgid "<b>HR Zone4:</b>"
+msgstr "<b>Anaeróbica:</b>"
+
+#: glade/pytrainer.glade:2345
+msgid "<b>HR Zone3:</b>"
+msgstr "<b>Aeróbica:</b>"
+
+#: glade/pytrainer.glade:2361
+msgid "<b>HR Zone2:</b>"
+msgstr "<b>Queimagraxas:</b>"
+
+#: glade/pytrainer.glade:2377
+msgid "<b>HR Zone1:</b>"
+msgstr "<b>Recuperación:</b>"
+
+#: glade/pytrainer.glade:2479
+#: glade/pytrainer.glade:2491
+#: glade/pytrainer.glade:2506
+#: glade/pytrainer.glade:2521
+#: glade/pytrainer.glade:2536
+#: glade/pytrainer.glade:3387
+#: glade/pytrainer.glade:3481
+#: glade/pytrainer.glade:4045
+#: glade/pytrainer.glade:4123
+#: glade/pytrainer.glade:4699
+#: glade/pytrainer.glade:4777
+#: glade/pytrainer.glade:5127
+#: glade/pytrainer.glade:5334
+#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:525
+msgid "bpm"
+msgstr "bpm"
+
+#: glade/pytrainer.glade:2581
+msgid " <b>Heart Rate:</b>"
+msgstr " <b>Pulsacións:</b>"
+
+#: glade/pytrainer.glade:2769
+msgid "<b>Projected times</b>"
+msgstr "<b>Tempos estimados</b>"
+
+#: glade/pytrainer.glade:2799
+msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>"
+msgstr "<i>Historial en distancias de deportes similares ± x%:</i>"
+
+#: glade/pytrainer.glade:2832
+msgid "<b>Range:</b>"
+msgstr "<b>Alcance:</b>"
+
+#: glade/pytrainer.glade:2845
+msgid "<b>Rank:</b>"
+msgstr "<b>Posición:</b>"
+
+#: glade/pytrainer.glade:2858
+msgid "<b>Speed: </b>"
+msgstr "<b>Velocidade: </b>"
+
+#: glade/pytrainer.glade:2871
+msgid "<b>Avg speed:</b>"
+msgstr "<b>Velocidade:</b>"
+
+#: glade/pytrainer.glade:2884
+msgid "<b>Standard deviation:</b>"
+msgstr "<b>Desviación estándar:</b>"
+
+#: glade/pytrainer.glade:2898
+msgid "<b>Deviation:</b>"
+msgstr "<b>Desviación:</b>"
+
+#: glade/pytrainer.glade:3017
+msgid "<b>Ranking</b>"
+msgstr "<b>Clasificación</b>"
+
+#: glade/pytrainer.glade:3043
+msgid "<b>Analytics:</b>"
+msgstr "<b>Estatísticas:</b>"
+
+#: glade/pytrainer.glade:3071
+msgid "Record"
+msgstr "Rexistro"
+
+#: glade/pytrainer.glade:3280
+#: glade/pytrainer.glade:3956
+#: glade/pytrainer.glade:4610
+#: glade/pytrainer.glade:5350
+msgid "<b>Max Speed:</b>"
+msgstr "<b>Velocidade Máxima:</b>"
+
+#: glade/pytrainer.glade:3357
+#: glade/pytrainer.glade:4015
+#: glade/pytrainer.glade:4669
+#: glade/pytrainer.glade:5097
+msgid "<b>Beats avg:</b>"
+msgstr "<b>Pulsacións media:</b>"
+
+#: glade/pytrainer.glade:3417
+#: glade/pytrainer.glade:3449
+#: glade/pytrainer.glade:4091
+#: glade/pytrainer.glade:4107
+#: glade/pytrainer.glade:4745
+#: glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:5399
+#: glade/pytrainer.glade:5415
+#: pytrainer/gui/windowmain.py:918
+#: pytrainer/gui/windowmain.py:919
+#: pytrainer/gui/windowmain.py:1047
+#: pytrainer/gui/windowmain.py:1048
+#: pytrainer/gui/windowmain.py:1129
+#: pytrainer/gui/windowmain.py:1130
+#: pytrainer/lib/activity.py:204
+msgid "min/km"
+msgstr "min/km"
+
+#: glade/pytrainer.glade:3556
+#: glade/pytrainer.glade:4199
+#: glade/pytrainer.glade:4853
+#: glade/pytrainer.glade:5506
+msgid "<b>Total Asc/Desc:</b>"
+msgstr "<b>Total Asc/Desc:</b>"
+
+#: glade/pytrainer.glade:3583
+#: glade/pytrainer.glade:4226
+#: glade/pytrainer.glade:4880
+#: glade/pytrainer.glade:5533
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
+#: pytrainer/lib/activity.py:205
+msgid "m"
+msgstr "m"
+
+#: glade/pytrainer.glade:3602
+msgid " <b>Date:</b>"
+msgstr " <b>Data:</b>"
+
+#: glade/pytrainer.glade:3645
+msgid "Value"
+msgstr "Valor"
+
+#: glade/pytrainer.glade:3656
+msgid ""
+"Stage Profile\n"
+"Stage Velocity\n"
+"Stage Profile/velocity"
+msgstr ""
+"Perfil de Etapa\n"
+"Velocidade de Etapa\n"
+"Perfil/Velocidade de Etapa"
+
+#: glade/pytrainer.glade:3712
+msgid "Day"
+msgstr "Día"
+
+#: glade/pytrainer.glade:4245
+msgid " <b>Week:</b>"
+msgstr " <b>Semana:</b>"
+
+#: glade/pytrainer.glade:4296
+#: glade/pytrainer.glade:4950
+#: glade/pytrainer.glade:5603
+#: glade/pytrainer.glade:5969
+msgid ""
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Distancia\n"
+"Tempo\n"
+"Pulsacións medias\n"
+"Velocidade Media\n"
+"Calorias"
+
+#: glade/pytrainer.glade:4322
+#: glade/pytrainer.glade:4976
+#: glade/pytrainer.glade:5629
+#: glade/pytrainer.glade:5995
+msgid ""
+"None\n"
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Nada\n"
+"Distancia\n"
+"Tempo\n"
+"Pulsacións Medias\n"
+"Velocidade Media\n"
+"Calorías"
+
+#: glade/pytrainer.glade:4366
+msgid "Week"
+msgstr "Semana"
+
+#: glade/pytrainer.glade:4899
+msgid " <b>Month:</b>"
+msgstr " <b>Mes:</b>"
+
+#: glade/pytrainer.glade:5019
+msgid "Month"
+msgstr "Mes"
+
+#: glade/pytrainer.glade:5552
+msgid " <b>Year:</b>"
+msgstr " <b>Ano:</b>"
+
+#: glade/pytrainer.glade:5672
+msgid "Year"
+msgstr "Ano"
+
+#: glade/pytrainer.glade:5826
+msgid "<b>Graph</b>"
+msgstr "<b>Gráfico</b>"
+
+#: glade/pytrainer.glade:5867
+msgid "<b>History</b>"
+msgstr "<b>Historial</b>"
+
+#: glade/pytrainer.glade:5937
+msgid "<b>Sports</b>"
+msgstr "<b>Deporte</b>"
+
+#: glade/pytrainer.glade:6018
+msgid "Total distance:"
+msgstr "Distancia total:"
+
+#: glade/pytrainer.glade:6032
+msgid "Total duration:"
+msgstr "Duración total:"
+
+#: glade/pytrainer.glade:6081
+msgid "Start date:"
+msgstr "Hora de Comezo:"
+
+#: glade/pytrainer.glade:6096
+msgid "End date:"
+msgstr "Data fin:"
+
+#: glade/pytrainer.glade:6182
+msgid "<b>All</b>"
+msgstr "<b>Todos</b>"
+
+#: glade/pytrainer.glade:6208
+msgid "Totals"
+msgstr "Totais"
+
+#: glade/pytrainer.glade:6246
+msgid "<b>Title:</b>"
+msgstr "<b>Título:</b>"
+
+#: glade/pytrainer.glade:6269
+msgid "Search"
+msgstr "Buscar"
+
+#: glade/pytrainer.glade:6293
+#: pytrainer/lib/listview.py:3
+#: pytrainer/lib/listview.py:10
+msgid "All Distances"
+msgstr "Todas as Distancias"
+
+#: glade/pytrainer.glade:6302
+#: pytrainer/lib/listview.py:35
+msgid "All Durations"
+msgstr "Todas as Duracións"
+
+#: glade/pytrainer.glade:6312
+msgid ""
+"All time\n"
+"Last 4 weeks\n"
+"Last 6 months\n"
+"Last 12 months"
+msgstr ""
+"Todo o Tempo\n"
+"Últimas 4 semanas\n"
+"Últimos 6 meses\n"
+"Últimos 12 meses"
+
+#: glade/pytrainer.glade:6349
+msgid "Columns"
+msgstr "Columnas"
+
+#: glade/pytrainer.glade:6477
+msgid "Type:"
+msgstr "Tipo:"
+
+#: glade/pytrainer.glade:6490
+msgid ""
+"Font\n"
+"Restaurant\n"
+"Scenic Area\n"
+"Summit"
+msgstr ""
+"Fonte\n"
+"Restaurante\n"
+"Mirador\n"
+"Cima"
+
+#: glade/pytrainer.glade:6506
+msgid "Latitude: "
+msgstr "Latitude: "
+
+#: glade/pytrainer.glade:6520
+msgid " Name:"
+msgstr " Nome:"
+
+#: glade/pytrainer.glade:6532
+msgid "Longitude:"
+msgstr "Lonxitude:"
+
+#: glade/pytrainer.glade:6624
+msgid "<b> Waypoint: </b>"
+msgstr "<b> Waypoint: </b>"
+
+#: glade/pytrainer.glade:6808
+msgid "Edit Record"
+msgstr "Editar Entrada"
+
+#: glade/pytrainer.glade:6822
+msgid "Show graph in classic view"
+msgstr "Amosa-lo gráfico en vista clásica"
+
+#: glade/pytrainer.glade:6836
+msgid "Merge tracks"
+msgstr "Unir entrenamentos"
+
+#: glade/selecttrackdialog.glade:7
+msgid "Select track record"
+msgstr "Seleccionar un dos entrenamentos"
+
+#: glade/warning.glade:7
+#: glade/warning.glade:38
+msgid "Warning"
+msgstr "Aviso"
+
+#: pytrainer/gui/windowmain.py:107
+msgid "Miles"
+msgstr "Millas"
+
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:130
+#: pytrainer/gui/windowmain.py:139
+#: pytrainer/gui/windowmain.py:173
+#: pytrainer/gui/windowmain.py:182
+msgid "id"
+msgstr "id"
+
+#: pytrainer/gui/windowmain.py:110
+msgid "Start"
+msgstr "Comezo"
+
+#: pytrainer/gui/windowmain.py:117
+#: pytrainer/gui/windowmain.py:157
+#: pytrainer/gui/windowmain.py:175
+#: pytrainer/gui/windowmain.py:185
+#: pytrainer/gui/windowmain.py:569
+#: pytrainer/gui/windowmain.py:1495
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/lib/activity.py:323
+#: pytrainer/lib/activity.py:334
+#: pytrainer/lib/activity.py:406
+#: pytrainer/lib/activity.py:417
+#: pytrainer/lib/activity.py:426
+#: pytrainer/lib/activity.py:435
+#: pytrainer/lib/activity.py:444
+#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:463
+#: pytrainer/lib/activity.py:524
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:105
+msgid "Distance"
+msgstr "Distancia"
+
+#: pytrainer/gui/windowmain.py:119
+#: pytrainer/gui/windowmain.py:158
+#: pytrainer/gui/windowmain.py:176
+#: pytrainer/gui/windowmain.py:186
+#: pytrainer/gui/windowmain.py:570
+#: pytrainer/gui/windowmain.py:1497
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:104
+msgid "Time"
+msgstr "Tempo"
+
+#: pytrainer/gui/windowmain.py:120
+msgid "⌀ HR"
+msgstr "⌀ FC"
+
+#: pytrainer/gui/windowmain.py:121
+msgid "⌀ Speed"
+msgstr "⌀ Velocidade"
+
+#: pytrainer/gui/windowmain.py:127
+msgid "Waypoint"
+msgstr "Waypoint"
+
+#: pytrainer/gui/windowmain.py:132
+msgid "Weight"
+msgstr "Peso"
+
+#: pytrainer/gui/windowmain.py:133
+msgid "Body Fat %"
+msgstr "Graxa Corporal %"
+
+#: pytrainer/gui/windowmain.py:134
+msgid "Resting HR"
+msgstr "FC en repouso"
+
+#: pytrainer/gui/windowmain.py:135
+#: pytrainer/gui/windowmain.py:147
+#: pytrainer/gui/windowmain.py:164
+msgid "Max HR"
+msgstr "Máx FC"
+
+#: pytrainer/gui/windowmain.py:141
+msgid "Records"
+msgstr "Rexistro"
+
+#: pytrainer/gui/windowmain.py:142
+msgid "Total duration"
+msgstr "Todas as Duracións"
+
+#: pytrainer/gui/windowmain.py:143
+msgid "Total distance"
+msgstr "Distancia total"
+
+#: pytrainer/gui/windowmain.py:144
+#: pytrainer/gui/windowmain.py:159
+msgid "Avg speed"
+msgstr "Velocidade media"
+
+#: pytrainer/gui/windowmain.py:145
+#: pytrainer/gui/windowmain.py:160
+msgid "Max speed"
+msgstr "Velocidade Máx"
+
+#: pytrainer/gui/windowmain.py:146
+#: pytrainer/gui/windowmain.py:163
+msgid "Avg HR"
+msgstr "FC media"
+
+#: pytrainer/gui/windowmain.py:148
+msgid "Max duration"
+msgstr "Duración Máx"
+
+#: pytrainer/gui/windowmain.py:149
+msgid "Max distance"
+msgstr "Distancia Máx"
+
+#: pytrainer/gui/windowmain.py:155
+msgid "Lap"
+msgstr "Volta"
+
+#: pytrainer/gui/windowmain.py:156
+msgid "Trigger"
+msgstr "Activador"
+
+#: pytrainer/gui/windowmain.py:161
+msgid "Avg pace"
+msgstr "Ritmo medio"
+
+#: pytrainer/gui/windowmain.py:162
+msgid "Max pace"
+msgstr "Ritmo máx"
+
+#: pytrainer/gui/windowmain.py:166
+msgid "Intensity"
+msgstr "Intensidade"
+
+#: pytrainer/gui/windowmain.py:174
+msgid "Race"
+msgstr "Carreira"
+
+#: pytrainer/gui/windowmain.py:183
+msgid "Rank"
+msgstr "Posición"
+
+#: pytrainer/gui/windowmain.py:187
+#: pytrainer/recordgraph.py:136
+#: pytrainer/lib/activity.py:335
+#: pytrainer/lib/activity.py:425
+#: pytrainer/lib/activity.py:427
+msgid "Speed"
+msgstr "Velocidade"
+
+#: pytrainer/gui/windowmain.py:319
+msgid "d"
+msgstr "d"
+
+#: pytrainer/gui/windowmain.py:559
+msgid "Show on X Axis"
+msgstr "Amosar no Eixe X"
+
+#: pytrainer/gui/windowmain.py:560
+msgid "Show on Y1 Axis"
+msgstr "Amosar no Eixe Y1"
+
+#: pytrainer/gui/windowmain.py:561
+msgid "Show on Y2 Axis"
+msgstr "Amosar no Eixe Y2"
+
+#: pytrainer/gui/windowmain.py:562
+msgid "Axis Limits"
+msgstr "Límites dos Eixes"
+
+#: pytrainer/gui/windowmain.py:571
+msgid "Laps"
+msgstr "Voltas"
+
+#: pytrainer/gui/windowmain.py:572
+msgid "Left Axis Grid"
+msgstr "Cuadrícula do Eixe Esquerdo"
+
+#: pytrainer/gui/windowmain.py:573
+msgid "Right Axis Grid"
+msgstr "Cuadrícula do Eixe Dereito"
+
+#: pytrainer/gui/windowmain.py:574
+msgid "X Axis Grid"
+msgstr "Cuadrícula do Eixe X"
+
+#: pytrainer/gui/windowmain.py:635
+msgid "Reset Limits"
+msgstr "Restablecer Límites"
+
+#: pytrainer/gui/windowmain.py:637
+msgid "Set Limits"
+msgstr "Establecer Límites"
+
+#: pytrainer/gui/windowmain.py:792
+msgid "Percentages method"
+msgstr "Baseado en porcentaxes"
+
+#: pytrainer/gui/windowmain.py:805
+msgid "800 m"
+msgstr "800 m"
+
+#: pytrainer/gui/windowmain.py:806
+msgid "1500 m"
+msgstr "1500 m"
+
+#: pytrainer/gui/windowmain.py:807
+msgid "5K"
+msgstr "5K"
+
+#: pytrainer/gui/windowmain.py:808
+msgid "7K"
+msgstr "7K"
+
+#: pytrainer/gui/windowmain.py:809
+msgid "10K"
+msgstr "10K"
+
+#: pytrainer/gui/windowmain.py:810
+msgid "Half marathon"
+msgstr "Media maratón"
+
+#: pytrainer/gui/windowmain.py:811
+msgid "Marathon"
+msgstr "Maratón"
+
+#: pytrainer/gui/windowmain.py:812
+msgid "100K"
+msgstr "100K"
+
+#: pytrainer/gui/windowmain.py:909
+#: pytrainer/gui/windowmain.py:1038
+#: pytrainer/gui/windowmain.py:1120
+#: pytrainer/lib/activity.py:197
+msgid "miles"
+msgstr "millas"
+
+#: pytrainer/gui/windowmain.py:910
+#: pytrainer/gui/windowmain.py:911
+#: pytrainer/gui/windowmain.py:1039
+#: pytrainer/gui/windowmain.py:1040
+#: pytrainer/gui/windowmain.py:1121
+#: pytrainer/gui/windowmain.py:1122
+#: pytrainer/lib/activity.py:198
+msgid "miles/h"
+msgstr "millas/h"
+
+#: pytrainer/gui/windowmain.py:912
+#: pytrainer/gui/windowmain.py:913
+#: pytrainer/gui/windowmain.py:1041
+#: pytrainer/gui/windowmain.py:1042
+#: pytrainer/gui/windowmain.py:1123
+#: pytrainer/gui/windowmain.py:1124
+#: pytrainer/lib/activity.py:199
+msgid "min/mile"
+msgstr "min/milla"
+
+#: pytrainer/gui/windowmain.py:915
+#: pytrainer/gui/windowmain.py:1044
+#: pytrainer/gui/windowmain.py:1126
+#: pytrainer/lib/activity.py:202
+msgid "km"
+msgstr "km"
+
+#: pytrainer/gui/windowmain.py:1498
+#: pytrainer/recordgraph.py:144
+msgid "Beats"
+msgstr "Pulsacións"
+
+#: pytrainer/gui/windowmain.py:1499
+msgid "Average"
+msgstr "Media"
+
+#: pytrainer/gui/windowmain.py:1718
+msgid "Hide graph display options"
+msgstr "Ocultar opcións de visualización gráfica"
+
+#: pytrainer/gui/windowmain.py:2056
+msgid "lap"
+msgstr "Volta"
+
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/drawArea.py:165
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+msgid "h"
+msgstr "h"
+
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
+msgid "s"
+msgstr "s"
+
+#: pytrainer/gui/windowmain.py:2156
+#: pytrainer/record.py:67
+msgid "Edit Entry"
+msgstr "Editar Entrada"
+
+#: pytrainer/gui/windowmain.py:2167
+msgid "Delete Entry"
+msgstr "Borrar Entrada"
+
+#: pytrainer/gui/windowmain.py:2191
+msgid "Create Athlete Entry"
+msgstr "Crear Entrada de Atleta"
+
+#: pytrainer/gui/windowmain.py:2195
+msgid "Edit Athlete Entry"
+msgstr "Editar Entrada do Atleta"
+
+#: pytrainer/gui/windowmain.py:2208
+msgid "<b>Date</b>"
+msgstr "<b>Data</b>"
+
+#: pytrainer/gui/windowmain.py:2224
+msgid "<b>Weight</b>"
+msgstr " <b>Peso</b>"
+
+#: pytrainer/gui/windowmain.py:2232
+msgid "<b>Body Fat</b>"
+msgstr "<b>Graxa Corporal</b>"
+
+#: pytrainer/gui/windowmain.py:2240
+msgid "<b>Resting Heart Rate</b>"
+msgstr "<b>Pulsacións en Repouso</b>"
+
+#: pytrainer/gui/windowmain.py:2248
+msgid "<b>Max Heart Rate</b>"
+msgstr "<b>Pulsacións Máximas</b>"
+
+#: pytrainer/gui/windowmain.py:2276
+#: pytrainer/main.py:451
+msgid "Delete this database entry?"
+msgstr "Borrar esta entrada da base de datos?"
+
+#: pytrainer/gui/windowmain.py:2278
+msgid "Are you sure?"
+msgstr "Está seguro?"
+
+#: pytrainer/gui/windowimportdata.py:117
+msgid "No file selected"
+msgstr "Ningún ficheiro seleccionado"
+
+#: pytrainer/gui/windowimportdata.py:162
+msgid "Configure"
+msgstr "Configurar"
+
+#: pytrainer/gui/windowimportdata.py:163
+msgid "Run"
+msgstr "Executar"
+
+#: pytrainer/gui/windowimportdata.py:171
+msgid "Disabled"
+msgstr "Desactivado"
+
+#: pytrainer/gui/windowimportdata.py:173
+msgid "Enabled"
+msgstr "Activo"
+
+#: pytrainer/gui/windowimportdata.py:253
+msgid "GPS device found"
+msgstr "Encontrado dispositivo GPS"
+
+#: pytrainer/gui/windowimportdata.py:256
+msgid "GPS device <b>not</b> found"
+msgstr "Dispositivo GPS <b>non</b> encontrado"
+
+#: pytrainer/gui/windowimportdata.py:263
+msgid "This tool was not found on the system"
+msgstr "Non se encontrou esta ferramenta no sistema"
+
+#: pytrainer/gui/windowimportdata.py:265
+msgid " Homepage"
+msgstr " Páxina de inicio"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "File"
+msgstr "Ficheiro"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Type"
+msgstr "Tipo"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Activities"
+msgstr "Actividades"
+
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+msgid "Start Time"
+msgstr "Hora de Comezo:"
+
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+msgid "Duration"
+msgstr "Duración"
+
+#: pytrainer/gui/windowimportdata.py:499
+msgid "Imported into database"
+msgstr "Importado á base de datos"
+
+#: pytrainer/gui/windowimportdata.py:543
+#: pytrainer/gui/windowextensions.py:81
+#: pytrainer/gui/windowplugins.py:80
+#, python-format
+msgid "%s settings"
+msgstr "%s opcións"
+
+#: pytrainer/gui/windowimportdata.py:558
+#: pytrainer/gui/windowextensions.py:70
+#: pytrainer/gui/windowplugins.py:71
+#: pytrainer/gui/windowplugins.py:95
+msgid "Disable"
+msgstr "Deshabilitado"
+
+#: pytrainer/gui/windowimportdata.py:559
+#: pytrainer/gui/windowextensions.py:72
+#: pytrainer/gui/windowplugins.py:69
+#: pytrainer/gui/windowplugins.py:96
+msgid "Enable"
+msgstr "Habilitado"
+
+#: pytrainer/gui/windowimportdata.py:566
+#: pytrainer/gui/windowplugins.py:103
+msgid "Ok"
+msgstr "Aceptar"
+
+#: pytrainer/gui/windowimportdata.py:626
+msgid "Saving options"
+msgstr "Gardar configuración"
+
+#: pytrainer/gui/windowimportdata.py:628
+msgid "Options saved"
+msgstr "Configuración gardada"
+
+#: pytrainer/gui/windowimportdata.py:653
+msgid "Importing one activity"
+msgstr "Importando unha actividade"
+
+#: pytrainer/gui/windowimportdata.py:654
+msgid "Imported one activity"
+msgstr "Unha actividade importada"
+
+#: pytrainer/gui/windowimportdata.py:656
+#, python-format
+msgid "Importing %d activities"
+msgstr "Importando %d actividades"
+
+#: pytrainer/gui/windowimportdata.py:657
+#, python-format
+msgid "Imported %d activities"
+msgstr "%d actividades importadas"
+
+#: pytrainer/gui/windowimportdata.py:676
+msgid "Choose a file (or files) to import activities from"
+msgstr "Seleccione ficheiro/s dende o/os que importar actividades"
+
+#: pytrainer/gui/windowimportdata.py:691
+#: pytrainer/gui/windowimportdata.py:692
+#, python-format
+msgid "Found file of type: %s"
+msgstr "Tipo de ficheiro encontrado: %s"
+
+#: pytrainer/gui/windowimportdata.py:716
+msgid "Found in database"
+msgstr "Encontrado na base de datos"
+
+#: pytrainer/gui/windowimportdata.py:731
+#: pytrainer/gui/windowimportdata.py:732
+#, python-format
+msgid "File %s is of unknown or unsupported file type"
+msgstr "Ficheiro %s descoñecido ou non soportado"
+
+#: pytrainer/gui/windowimportdata.py:805
+#, python-format
+msgid "Column %d"
+msgstr "Columna %d"
+
+#: pytrainer/gui/drawArea.py:166
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+msgid "min"
+msgstr "min"
+
+#: pytrainer/gui/drawArea.py:410
+msgid "rest"
+msgstr "descanso"
+
+#: pytrainer/gui/windowrecord.py:210
+msgid "GPX File"
+msgstr "Ficheiro GPX"
+
+#: pytrainer/gui/windowprofile.py:47
+msgid "Male"
+msgstr "Home"
+
+#: pytrainer/gui/windowprofile.py:48
+msgid "Female"
+msgstr "Muller"
+
+#: pytrainer/gui/windowprofile.py:65
+msgid "MET"
+msgstr "MET"
+
+#: pytrainer/gui/windowprofile.py:314
+msgid "Sport Creation Error"
+msgstr "Erro Creando o Deporte"
+
+#: pytrainer/gui/equipment.py:101
+msgid "Usage"
+msgstr "Uso"
+
+#: pytrainer/gui/dialogselecttrack.py:40
+msgid "Track Name"
+msgstr "Nome da Ruta"
+
+#: pytrainer/gui/drawGraph.py:170
+msgid "Athlete Data"
+msgstr "Datos do Atleta"
+
+#: pytrainer/gui/windowextensions.py:112
+#: pytrainer/gui/windowextensions.py:125
+msgid "OK"
+msgstr "Aceptar"
+
+#: pytrainer/recordgraph.py:134
+#: pytrainer/daygraph.py:52
+msgid "Height (m)"
+msgstr "Altura (m)"
+
+#: pytrainer/recordgraph.py:134
+#: pytrainer/daygraph.py:52
+msgid "Stage Profile"
+msgstr "Perfil Etapa"
+
+#: pytrainer/recordgraph.py:136
+msgid "Speed (Km/h)"
+msgstr "Velocidade (km/h)"
+
+#: pytrainer/recordgraph.py:138
+#: pytrainer/lib/activity.py:324
+#: pytrainer/lib/activity.py:434
+#: pytrainer/lib/activity.py:436
+msgid "Pace"
+msgstr "Ritmo"
+
+#: pytrainer/recordgraph.py:140
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/daygraph.py:56
+msgid "Beats (bpm)"
+msgstr "Pulsacións (ppm)"
+
+#: pytrainer/recordgraph.py:142
+msgid "Cadence (rpm)"
+msgstr "Cadencia (rpm)"
+
+#: pytrainer/recordgraph.py:142
+#: pytrainer/lib/activity.py:462
+#: pytrainer/lib/activity.py:464
+msgid "Cadence"
+msgstr "Cadencia"
+
+#: pytrainer/recordgraph.py:144
+msgid "Beats (%)"
+msgstr "Pulsacións (%)"
+
+#: pytrainer/recordgraph.py:146
+msgid "Zone"
+msgstr "Zona"
+
+#: pytrainer/profile.py:114
+msgid "Moderate activity"
+msgstr "Actividad moderada"
+
+#: pytrainer/profile.py:115
+msgid "Weight Control"
+msgstr "Control do peso"
+
+#: pytrainer/profile.py:116
+msgid "Aerobic"
+msgstr "Aeróbico"
+
+#: pytrainer/profile.py:117
+msgid "Anaerobic"
+msgstr "Anaeróbico"
+
+#: pytrainer/profile.py:118
+msgid "VO2 MAX"
+msgstr "VO2 MAX"
+
+#: pytrainer/lib/listview.py:32
+msgid "All Time"
+msgstr "Todo o Tempo"
+
+#: pytrainer/lib/listview.py:32
+msgid "Last 4 Weeks"
+msgstr "Últimas 4 Semanas"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 6 Months"
+msgstr "Últimos 6 Meses"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 12 Months"
+msgstr "Últimos 12 Meses"
+
+#: pytrainer/lib/listview.py:36
+msgid "<1 Hour"
+msgstr "<1 Hora"
+
+#: pytrainer/lib/listview.py:37
+msgid "1-2 Hours"
+msgstr "1-2 Horas"
+
+#: pytrainer/lib/listview.py:38
+msgid ">2 Hours"
+msgstr ">2 Horas"
+
+#: pytrainer/lib/gpx.py:129
+msgid "No Name"
+msgstr "Sen Nome"
+
+#: pytrainer/lib/gpx.py:137
+msgid "No Data"
+msgstr "Sen Datos"
+
+#: pytrainer/lib/activity.py:200
+msgid "feet"
+msgstr "pés"
+
+#: pytrainer/lib/activity.py:322
+msgid "Pace by Lap"
+msgstr "Ritmo por Volta"
+
+#: pytrainer/lib/activity.py:328
+#: pytrainer/lib/activity.py:339
+#: pytrainer/lib/activity.py:411
+#: pytrainer/lib/activity.py:421
+#: pytrainer/lib/activity.py:430
+#: pytrainer/lib/activity.py:439
+#: pytrainer/lib/activity.py:448
+#: pytrainer/lib/activity.py:458
+#: pytrainer/lib/activity.py:467
+#: pytrainer/lib/activity.py:529
+msgid "Time (seconds)"
+msgstr "Tempo (segundos)"
+
+#: pytrainer/lib/activity.py:333
+msgid "Speed by Lap"
+msgstr "Velocidade por Volta"
+
+#: pytrainer/lib/activity.py:405
+#: pytrainer/lib/activity.py:407
+msgid "Elevation"
+msgstr "Altura"
+
+#: pytrainer/lib/activity.py:416
+#: pytrainer/lib/activity.py:418
+msgid "Corrected Elevation"
+msgstr "Altura Correxida"
+
+#: pytrainer/lib/activity.py:453
+#, python-format
+msgid "Heart Rate (% of max)"
+msgstr "Frecuencia cardíaca (% do máx)"
+
+#: pytrainer/lib/activity.py:455
+msgid "%"
+msgstr "%"
+
+#: pytrainer/lib/activity.py:464
+msgid "rpm"
+msgstr "rpm"
+
+#: pytrainer/lib/activity.py:523
+msgid "Heart Rate zone"
+msgstr "Zoa Frecuencia Cardíaca"
+
+#: pytrainer/monthgraph.py:26
+#: pytrainer/monthgraph.py:27
+#: pytrainer/monthgraph.py:28
+#: pytrainer/monthgraph.py:29
+#: pytrainer/monthgraph.py:30
+msgid "day"
+msgstr "día"
+
+#: pytrainer/monthgraph.py:26
+#: pytrainer/weekgraph.py:28
+msgid "Daily Distance"
+msgstr "Distancia Diaria"
+
+#: pytrainer/monthgraph.py:27
+#: pytrainer/totalgraph.py:25
+#: pytrainer/yeargraph.py:27
+#: pytrainer/weekgraph.py:29
+msgid "Time (hours)"
+msgstr "Tempo (horas)"
+
+#: pytrainer/monthgraph.py:27
+#: pytrainer/weekgraph.py:29
+msgid "Daily Time"
+msgstr "Tempo Diario"
+
+#: pytrainer/monthgraph.py:28
+#: pytrainer/totalgraph.py:26
+#: pytrainer/yeargraph.py:28
+#: pytrainer/weekgraph.py:30
+msgid "Average Heart Rate (bpm)"
+msgstr "Pulsacións medias (ppm)"
+
+#: pytrainer/monthgraph.py:28
+#: pytrainer/weekgraph.py:30
+msgid "Daily Average Heart Rate"
+msgstr "Pulsacións Medias Diarias"
+
+#: pytrainer/monthgraph.py:29
+#: pytrainer/weekgraph.py:31
+msgid "Daily Average Speed"
+msgstr "Velocidades Medias Diarias"
+
+#: pytrainer/monthgraph.py:30
+#: pytrainer/weekgraph.py:32
+msgid "Daily Calories"
+msgstr "Calorías Diarias"
+
+#: pytrainer/totalgraph.py:24
+#: pytrainer/totalgraph.py:25
+#: pytrainer/totalgraph.py:26
+#: pytrainer/totalgraph.py:27
+#: pytrainer/totalgraph.py:28
+msgid "year"
+msgstr "ano"
+
+#: pytrainer/totalgraph.py:24
+msgid "Annual Distance"
+msgstr "Distancia Anual"
+
+#: pytrainer/totalgraph.py:25
+msgid "Annual Time"
+msgstr "Tempo Anual"
+
+#: pytrainer/totalgraph.py:26
+msgid "Annual Average Heart Rate"
+msgstr "Pulsacións Medias Anuais"
+
+#: pytrainer/totalgraph.py:27
+msgid "Annual Average Speed"
+msgstr "Velocidade Media Anual"
+
+#: pytrainer/totalgraph.py:28
+msgid "Annual Calories"
+msgstr "Calorías Anuais"
+
+#: pytrainer/athlete.py:52
+msgid "lb"
+msgstr "lb"
+
+#: pytrainer/athlete.py:54
+msgid "kg"
+msgstr "kg"
+
+#: pytrainer/record.py:56
+msgid "Modify details before importing"
+msgstr "Modificar detalles antes de importar"
+
+#: pytrainer/record.py:466
+msgid "pyTrainer can't import data from your gpx file"
+msgstr "pyTrainer non pode importar datos dende o seu ficheiro gpx"
+
+#: pytrainer/yeargraph.py:26
+#: pytrainer/yeargraph.py:27
+#: pytrainer/yeargraph.py:28
+#: pytrainer/yeargraph.py:29
+#: pytrainer/yeargraph.py:30
+msgid "month"
+msgstr "mes"
+
+#: pytrainer/yeargraph.py:26
+msgid "Monthly Distance"
+msgstr "Distancia Mensual"
+
+#: pytrainer/yeargraph.py:27
+msgid "Monthly Time"
+msgstr "Tempo Mensual"
+
+#: pytrainer/yeargraph.py:28
+msgid "Monthly Average Heart Rate"
+msgstr "Pulsacións Medias Mensuais"
+
+#: pytrainer/yeargraph.py:29
+msgid "Monthly Average Speed"
+msgstr "Velocidades Medias Mensuais"
+
+#: pytrainer/yeargraph.py:30
+msgid "Monthly Calories"
+msgstr "Calorías Mensuais"
+
+#: pytrainer/waypoint.py:87
+msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file"
+msgstr "Parece que o ficheiro gpx contén actividades de varios días. Quizais debería editar o seu ficheiro gpx"
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity (Km/h)"
+msgstr "Velocidade (Km/h)"
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity"
+msgstr "Velocidade"
+
+#: pytrainer/main.py:467
+msgid "Delete this waypoint?"
+msgstr "Borrar este waypoint?"
+
+#: import/file_gpxplus.py:41
+msgid "GPS eXchange file"
+msgstr "Ficheiro de intercambio GPS"
+
+#: import/file_kml20.py:47
+msgid "Geodistance kml version 2.0 file"
+msgstr "Ficheiro kml versión 2.0"
+
+#: import/file_garmintcxv1.py:45
+msgid "Garmin training center database file version 1"
+msgstr "Versión 1 do ficheiro Garmin training center database"
+
+#: import/file_gpxplusNokia.py:41
+msgid "Nokia Export - GPS eXchange file"
+msgstr "Exportar a Nokia - Ficheiro de intercambio GPS"
+
+#: import/tool_gpsbabel.py:37
+msgid "GPSBabel"
+msgstr "GPSBabel"
+
+#: import/tool_garmintools.py:37
+msgid "Garmintools"
+msgstr "FerramentasGarmin"
+
+#: import/tool_gant.py:37
+msgid "Gant"
+msgstr "Gant"
+
+#: import/file_garmintools.py:44
+msgid "Garmin tools dump file"
+msgstr "Ficheiro de volcado de datos de Garmintools"
+
+#: import/file_garmintcxv2.py:44
+msgid "Garmin training center database file version 2"
+msgstr "Versión 2 do ficheiro Garmin training center database"
+
+#: extensions/fixelevation/fixelevation.py:129
+msgid "Elevation Correction Complete"
+msgstr "Corrección de Altura Completada"
+
+#: extensions/openstreetmap/openstreetmap.py:82
+msgid ""
+"Posting GPX trace to Openstreetmap\n"
+"\n"
+"Please wait this could take several minutes"
+msgstr ""
+"Enviando traza GPX a OpenStreetMap\n"
+"\n"
+"Por favor espere, pode durar varios minutos"
+
+#: extensions/openstreetmap/openstreetmap.py:84
+msgid "Openstreetmap Extension Processing"
+msgstr "Procesando Extensión OpenStreetMap"
+
+#: extensions/openstreetmap/openstreetmap.py:102
+msgid "Openstreetmap Extension Upload Complete"
+msgstr "Envío Completo da Extensión OpenStreetMap"
+
+#: extensions/openstreetmap/openstreetmap.py:107
+msgid "Error while uploading file to OSM: "
+msgstr "Ocorreu un erro mentres se subia o ficheiro a OSM: "
+
+#: extensions/openstreetmap/openstreetmap.py:109
+msgid "Openstreetmap Extension Error"
+msgstr "Erro da Extensión OpenStreetMap"
+
+#: extensions/openstreetmap/openstreetmap.py:117
+msgid "Please add any additional information for this upload"
+msgstr "Por favor engada información adicional para este envío"
+
+#: extensions/openstreetmap/openstreetmap.py:204
+msgid "Error"
+msgstr "Erro"
+
+#: extensions/openstreetmap/openstreetmap.py:247
+msgid "Error while saving extension configuration"
+msgstr "Ocorreu un erro mentres se gardaba a configuración da extensión"
+
+#: extensions/wordpress/wordpress.py:46
+msgid "Posting to Wordpress blog"
+msgstr "Subir a un blogue de Wordpress"
+
+#: extensions/wordpress/wordpress.py:48
+msgid "Wordpress Extension Processing"
+msgstr "Procesando Extensión Wordpress"
+
+#: extensions/wordpress/wordpress.py:144
+msgid "Wordpress Extension Upload Complete"
+msgstr "E"
+
+#~ msgid "Must have username and password configured"
+#~ msgstr "É obrigatorio ter o nome de usuario e contrasinal configurados"
+
+#~ msgid "Maxiumum Pace"
+#~ msgstr "Ritmo Máximo"
+
+#, fuzzy
+#~ msgid "<b>Port  Connnection</b>"
+#~ msgstr "<b>Duración:</b>"
+
+#, fuzzy
+#~ msgid "Unified Import"
+#~ msgstr "Importar"
+
+#, fuzzy
+#~ msgid "Velocity (km/h)"
+#~ msgstr "Velocidade (Km/h)"
+
+#, fuzzy
+#~ msgid "Unknown file type"
+#~ msgstr "Tipo de ficheiro encontrado: %s"
+
+#, fuzzy
+#~ msgid "Import Success"
+#~ msgstr "Importar"
+
+#, fuzzy
+#~ msgid "  "
+#~ msgstr " "
+
+#, fuzzy
+#~ msgid "<b>frame1</b>"
+#~ msgstr "<b>Ritmo</b>"
+
+#, fuzzy
+#~ msgid "Daily kilometers"
+#~ msgstr "Tempo Diario"
+
+#~ msgid "Beats per Minute"
+#~ msgstr "Pulsations par Minute"
+
+#, fuzzy
+#~ msgid "Daily Beats"
+#~ msgstr "Tempo Diario"
+
+#, fuzzy
+#~ msgid "Weekly Time"
+#~ msgstr "Tempo Diario"
+
+#, fuzzy
+#~ msgid "Weekly Calories"
+#~ msgstr "Calorías Diarias"
+
+#~ msgid "kilometers"
+#~ msgstr "Kilomètres"
+
+#, fuzzy
+#~ msgid "monthly kilometers"
+#~ msgstr "Tempo Mensual"
+
+#, fuzzy
+#~ msgid "time in hours"
+#~ msgstr "Tempo (horas)"
+
+#~ msgid "beats per minute"
+#~ msgstr "pulsations par minute"
+
+#, fuzzy
+#~ msgid "monthly beats"
+#~ msgstr "Tempo Mensual"
+
+#, fuzzy
+#~ msgid "average (hm/h)"
+#~ msgstr "Media (km/h)"
+
+#, fuzzy
+#~ msgid "calories"
+#~ msgstr "Calorías"
+
+#, fuzzy
+#~ msgid ""
+#~ "Distance\n"
+#~ "Time\n"
+#~ msgstr "Distancia"
+
+#, fuzzy
+#~ msgid "No Active Plugins"
+#~ msgstr "Engadidos do dispositivo GPS"
+
+#, fuzzy
+#~ msgid "No Active Extensions"
+#~ msgstr "Extensións"
+
+#, fuzzy
+#~ msgid " Km"
+#~ msgstr "Km"
+
+#, fuzzy
+#~ msgid "<b>Velocity:</b>"
+#~ msgstr "<b>Descendido:</b>"
+
+#, fuzzy
+#~ msgid " km/h"
+#~ msgstr "km/h"
+
+#, fuzzy
+#~ msgid " <b>Accumulated Altitude Change:</b> "
+#~ msgstr "<b>Desnivel Acumulado</b>"
+
+#, fuzzy
+#~ msgid "<b>Average:</b>"
+#~ msgstr "<b>Ritmo:</b>"
+
+#, fuzzy
+#~ msgid "velocity"
+#~ msgstr "Velocidade"
+
+#, fuzzy
+#~ msgid "Calculate Distance"
+#~ msgstr "Todas as Distancias"
+
+#, fuzzy
+#~ msgid "Calculate Time"
+#~ msgstr "Calcular"
+
+#, fuzzy
+#~ msgid "Calculate Velocity"
+#~ msgstr "Calcular Valores:"
+
+#, fuzzy
+#~ msgid "Calculate Pace"
+#~ msgstr "Calcular Valores:"
+
+#, fuzzy
+#~ msgid "Calculate Calories"
+#~ msgstr "Calcular Valores:"
+
+#, fuzzy
+#~ msgid "Calculate Average"
+#~ msgstr "Calcular Valores:"
+
+#, fuzzy
+#~ msgid "<b>Positive:</b>"
+#~ msgstr "<b>Título:</b>"
+
+#, fuzzy
+#~ msgid "<b>Negative:</b>"
+#~ msgstr "<b>Data:</b>"
+
+#, fuzzy
+#~ msgid "km/h/day"
+#~ msgstr "km/h"
+
+#, fuzzy
+#~ msgid " <b>Description:</b>"
+#~ msgstr "<b>Duración:</b>"
+
+#, fuzzy
+#~ msgid "Profile"
+#~ msgstr "Perfil Etapa"
+
+#, fuzzy
+#~ msgid "Database"
+#~ msgstr "Tipo de base de datos:"
diff --git a/locale/pt/LC_MESSAGES/Makefile b/locale/pt/LC_MESSAGES/Makefile
new file mode 100644
index 0000000..fc516a2
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/Makefile
@@ -0,0 +1,8 @@
+default:
+	msgfmt pytrainer_pt.po -o ./pytrainer.mo
+
+merge:
+	msgmerge pytrainer_pt.po pytrainer_pt.po_new > pytrainer_pt.po.tmp
+	mv pytrainer_pt.po.tmp pytrainer_pt.po
+	rm pytrainer_pt.po_new
+	
diff --git a/locale/pt/LC_MESSAGES/pytrainer_pt.po b/locale/pt/LC_MESSAGES/pytrainer_pt.po
new file mode 100644
index 0000000..38df2c0
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/pytrainer_pt.po
@@ -0,0 +1,2427 @@
+# Portuguese translation for pytrainer's messages
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the pytrainer package.
+# Pedro Ribeiro <p.m42.ribeiro at gmail.com>, 2011
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pytrainer 1.9.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-10-20 19:14+0200\n"
+"PO-Revision-Date: 2011-10-20 19:14+0100\n"
+"Last-Translator: Pedro Ribeiro <p.m42.ribeiro at gmail.com>\n"
+"Language-Team: Portuguese <traduz at debianpt.org>\n"
+"Language: Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glade/calendar.glade:7
+msgid "Calendar"
+msgstr "Calendário"
+
+#: glade/equipment.glade:109
+msgid "<b>Equipment List</b>"
+msgstr "<b>Lista de Equipamento</b>"
+
+#: glade/equipment.glade:149
+#: glade/equipment.glade:406
+#: pytrainer/gui/equipment.py:98
+msgid "Description"
+msgstr "Descrição"
+
+#: glade/equipment.glade:174
+#: glade/equipment.glade:431
+msgid "Life Expectancy"
+msgstr "Esperança de Vida"
+
+#: glade/equipment.glade:211
+#: glade/equipment.glade:467
+msgid "Prior Usage"
+msgstr "Utilização Anterior"
+
+#: glade/equipment.glade:243
+#: glade/equipment.glade:499
+#: pytrainer/gui/equipment.py:102
+msgid "Active"
+msgstr "Activo"
+
+#: glade/equipment.glade:277
+#: glade/equipment.glade:533
+#: pytrainer/gui/windowimportdata.py:353
+msgid "Notes"
+msgstr "Notas"
+
+#: glade/equipment.glade:366
+msgid "<b>Add New Equipment</b>"
+msgstr "<b>Acrescentar Novo Equipamento</b>"
+
+#: glade/equipment.glade:622
+msgid "<b>Edit Equipment</b>"
+msgstr "<b>Editar Equipamento</b>"
+
+#: glade/equipment.glade:651
+msgid "Really delete the equipment item?"
+msgstr "De certeza que quer apagar o equipamento?"
+
+#: glade/equipment.glade:704
+msgid "<b>Delete Equipment</b>"
+msgstr "<b>Apagar Equipamento</b>"
+
+#: glade/extensions.glade:9
+#: glade/pytrainer.glade:163
+msgid "Extensions"
+msgstr "Extensões"
+
+#: glade/extensions.glade:54
+msgid "<b>Extension Details</b>"
+msgstr "<b>Detalhes da Extensão</b>"
+
+#: glade/extensions.glade:67
+msgid "name-entry"
+msgstr "nome"
+
+#: glade/extensions.glade:82
+#: glade/plugins.glade:144
+#: glade/profile.glade:728
+#: glade/pytrainer.glade:5703
+msgid "Name:"
+msgstr "Nome:"
+
+#: glade/extensions.glade:96
+#: glade/plugins.glade:115
+msgid "Status:"
+msgstr "Estado:"
+
+#: glade/extensions.glade:110
+#: glade/plugins.glade:86
+#: glade/pytrainer.glade:6548
+msgid "Description:"
+msgstr "Descrição:"
+
+#: glade/extensions.glade:124
+#: glade/plugins.glade:100
+msgid "status-entry"
+msgstr "estado"
+
+#: glade/extensions.glade:139
+msgid "description-entry"
+msgstr "descrição"
+
+#: glade/importdata.glade:7
+#: glade/importdata.glade:325
+msgid "Import"
+msgstr "Importar"
+
+#: glade/importdata.glade:36
+msgid ""
+"Test 1\n"
+"Test 2"
+msgstr ""
+"Teste 1\n"
+"Teste 2"
+
+#: glade/importdata.glade:46
+msgid "<b>Select your GPS device</b>"
+msgstr "<b>Seleccione o seu dispositivo GPS</b>"
+
+#: glade/importdata.glade:64
+msgid "Import from GPS Device is not yet implemented"
+msgstr "Importação a partir do Dispositivo GPS ainda não está implementada"
+
+#: glade/importdata.glade:92
+msgid "<b>Tools</b>"
+msgstr "<b>Ferramentas</b>"
+
+#: glade/importdata.glade:111
+msgid "Rescan"
+msgstr "Rescan"
+
+#: glade/importdata.glade:115
+msgid "Rescan system for available tools"
+msgstr "Fazer o rescan do sistema à procura de ferramentas"
+
+#: glade/importdata.glade:168
+msgid "<b>Import from GPS Device</b>"
+msgstr "<b>Importar do Dispositivo GPS</b>"
+
+#: glade/importdata.glade:221
+msgid "Remove selected files and the associated activities"
+msgstr "Remover ficheiros seleccionados e actividades associadas"
+
+#: glade/importdata.glade:239
+msgid "Add files to import activities from"
+msgstr "Acrescentar ficheiros a partir dos quais importar actividades"
+
+#: glade/importdata.glade:264
+msgid "<b>Add file(s) to import activities from</b>"
+msgstr "<b>Acrescentar ficheiro(s) a partir do(s) qual(is) importar actividades"
+
+#: glade/importdata.glade:307
+msgid "<b>Select activities to import</b>"
+msgstr "<b>Seleccionar actividades a importar</b>"
+
+#: glade/importdata.glade:330
+msgid "Import selected activities"
+msgstr "Importar actividades seleccionadas"
+
+#: glade/importdata.glade:347
+msgid "Close Import dialog"
+msgstr "Fechar diálogo de importação"
+
+#: glade/importdata.glade:387
+msgid "<b>Import from File</b>"
+msgstr "<b>Importar a partir de Ficheiro</b>"
+
+#: glade/importdata.glade:464
+msgid "<b>Plugins</b>"
+msgstr "<b>Plugins</b>"
+
+#: glade/importdata.glade:491
+msgid "Import from GPS Device"
+msgstr "Importar a partir do Dispositivo GPS"
+
+#: glade/importdata.glade:510
+msgid "Import from File"
+msgstr "Importar a partir de Ficheiro"
+
+#: glade/importdata.glade:525
+msgid "Launch 'File Select' on start"
+msgstr "Executar o 'Escolher Ficheiro' ao iniciar"
+
+#: glade/importdata.glade:530
+msgid "Automatically start the file selection dialog"
+msgstr "Executar automaticamente o diálogo de selecção de ficheiro"
+
+#: glade/importdata.glade:546
+#: glade/plugins.glade:9
+msgid "Plugins"
+msgstr "Plugins"
+
+#: glade/importdata.glade:572
+msgid "<b>Default to Tab</b>"
+msgstr "<b>Separador predefinido</b>"
+
+#: glade/importdata.glade:595
+msgid "Reset"
+msgstr "Reset"
+
+#: glade/importdata.glade:611
+msgid "Save"
+msgstr "Guardar"
+
+#: glade/importdata.glade:670
+msgid "<b>Options</b>"
+msgstr "<b>Opções</b>"
+
+#: glade/importdata.glade:702
+msgid "<b>Select file to import from</b>"
+msgstr "<b>Escolher ficheiro a partir do qual importar</b>"
+
+#: glade/importdata.glade:731
+msgid "Tab"
+msgstr "Tab"
+
+#: glade/importdata.glade:746
+msgid "Comma"
+msgstr "Vírgula"
+
+#: glade/importdata.glade:763
+msgid "Other"
+msgstr "Outro"
+
+#: glade/importdata.glade:799
+msgid "Read File"
+msgstr "Ler Ficheiro"
+
+#: glade/importdata.glade:820
+msgid "<b>File delimiter</b>"
+msgstr "<b>Delimitador de campos no ficheiro</b>"
+
+#: glade/importdata.glade:864
+#: pytrainer/gui/windowmain.py:116
+#: pytrainer/gui/windowmain.py:131
+#: pytrainer/gui/windowmain.py:184
+#: pytrainer/gui/windowmain.py:1494
+#: pytrainer/gui/dialogselecttrack.py:40
+msgid "Date"
+msgstr "Data"
+
+#: glade/importdata.glade:877
+#: glade/importdata.glade:918
+#: glade/importdata.glade:933
+#: glade/importdata.glade:1128
+#: glade/importdata.glade:1143
+#: glade/importdata.glade:1158
+#: glade/importdata.glade:1173
+#: glade/importdata.glade:1188
+#: glade/importdata.glade:1203
+#: glade/importdata.glade:1218
+#: glade/importdata.glade:1233
+#: glade/importdata.glade:1248
+#: glade/importdata.glade:1263
+#: glade/importdata.glade:1278
+#: glade/importdata.glade:1293
+msgid "Exclude"
+msgstr "Excluir"
+
+#: glade/importdata.glade:892
+#: pytrainer/recordgraph.py:134
+#: pytrainer/recordgraph.py:136
+#: pytrainer/recordgraph.py:138
+#: pytrainer/recordgraph.py:140
+#: pytrainer/recordgraph.py:142
+#: pytrainer/recordgraph.py:144
+#: pytrainer/recordgraph.py:146
+#: pytrainer/monthgraph.py:26
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/totalgraph.py:24
+#: pytrainer/yeargraph.py:26
+#: pytrainer/daygraph.py:52
+#: pytrainer/daygraph.py:54
+#: pytrainer/daygraph.py:56
+#: pytrainer/weekgraph.py:28
+msgid "Distance (km)"
+msgstr "Distância (km)"
+
+#: glade/importdata.glade:905
+msgid "Duration (sec)"
+msgstr "Duração (s)"
+
+#: glade/importdata.glade:947
+msgid "<b>PyTrainer Field</b>"
+msgstr "<b>Campo do PyTrainer</b>"
+
+#: glade/importdata.glade:958
+msgid "<b>File Column</b>"
+msgstr "<b>Coluna no Ficheiro</b>"
+
+#: glade/importdata.glade:972
+#: pytrainer/gui/windowmain.py:115
+#: pytrainer/gui/windowmain.py:1493
+msgid "Title"
+msgstr "Título"
+
+#: glade/importdata.glade:985
+msgid "Descent (m)"
+msgstr "Descida (m)"
+
+#: glade/importdata.glade:998
+msgid "Accent (m)"
+msgstr "Subida (m)"
+
+#: glade/importdata.glade:1011
+msgid "Calories (kcal)"
+msgstr "Calorias (kcal)"
+
+#: glade/importdata.glade:1024
+msgid "Max Speed (km/h)"
+msgstr "Vel Máxima (km/h)"
+
+#: glade/importdata.glade:1037
+#: pytrainer/monthgraph.py:29
+#: pytrainer/totalgraph.py:27
+#: pytrainer/yeargraph.py:29
+#: pytrainer/weekgraph.py:31
+msgid "Average Speed (km/h)"
+msgstr "Vel Média (km/h)"
+
+#: glade/importdata.glade:1050
+#: glade/pytrainer.glade:277
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:118
+#: pytrainer/gui/windowmain.py:140
+#: pytrainer/gui/windowmain.py:1496
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/gui/windowprofile.py:65
+msgid "Sport"
+msgstr "Desporto"
+
+#: glade/importdata.glade:1063
+msgid "Average Heartrate (bpm)"
+msgstr "Ritmo cardíaco médio (ppm)"
+
+#: glade/importdata.glade:1076
+msgid "Max Heartrate (bpm)"
+msgstr "Ritmo cardíaco máx (ppm)"
+
+#: glade/importdata.glade:1089
+#: pytrainer/recordgraph.py:138
+msgid "Pace (min/km)"
+msgstr "Ritmo (min/km)"
+
+#: glade/importdata.glade:1102
+msgid "Max Pace (min/km)"
+msgstr "Ritmo Máximo (min/km)"
+
+#: glade/importdata.glade:1115
+#: glade/newrecord.glade:1094
+#: pytrainer/gui/windowmain.py:167
+msgid "Comments"
+msgstr "Comentários"
+
+#: glade/importdata.glade:1309
+msgid "Force sport to:"
+msgstr "Forçar desporto a:"
+
+#: glade/importdata.glade:1323
+#: glade/newrecord.glade:404
+msgid " "
+msgstr " "
+
+#: glade/importdata.glade:1394
+msgid "<b>Map Columns</b>"
+msgstr "<b>Mapa de Colunas</b>"
+
+#: glade/importdata.glade:1414
+msgid ""
+"<small>This is an experiemental import for delimited files\n"
+"1) Select a file\n"
+"2) Click 'Read File' to analyse the file\n"
+"3) Map columns in the file to pytrainer data elements (Date is required)\n"
+"4) Click 'Import Data'</small>"
+msgstr ""
+"<small>Esta é uma importação experimental para ficheiros delimitados\n"
+"1) Escolher um ficheiro\n"
+"2) Clicar em 'Ler Ficheiro' para analisar o ficheiro\n"
+"3) Mapear colunas do ficheiro para elementos de dados do pytrainer (são\n"
+"   necessários dados)\n"
+"4) Clicar em 'Importar Dados'</small>"
+
+#: glade/importdata.glade:1427
+msgid "Import Data"
+msgstr "Importar Dados"
+
+#: glade/importdata.glade:1467
+msgid "<b>Import from CSV</b>"
+msgstr "<b>Importar a partir do CSV</b>"
+
+#: glade/newrecord.glade:7
+#: pytrainer/gui/windowmain.py:2160
+msgid "New Entry"
+msgstr "Nova Entrada"
+
+#: glade/newrecord.glade:61
+msgid "Title:"
+msgstr "Título:"
+
+#: glade/newrecord.glade:85
+msgid "GPX File:"
+msgstr "Ficheiro GPX:"
+
+#: glade/newrecord.glade:129
+msgid "Calculate Values"
+msgstr "Calcular Valores"
+
+#: glade/newrecord.glade:149
+msgid "Sport:"
+msgstr "Desporto:"
+
+#: glade/newrecord.glade:184
+msgid "<b>Main</b>"
+msgstr "<b>Principal</b>"
+
+#: glade/newrecord.glade:221
+msgid "Distance (Km):"
+msgstr "Distância (Km):"
+
+#: glade/newrecord.glade:230
+#: glade/newrecord.glade:355
+#: glade/newrecord.glade:558
+#: glade/newrecord.glade:697
+#: glade/newrecord.glade:958
+#: glade/profile.glade:1548
+msgid "Calculate"
+msgstr "Calcular"
+
+#: glade/newrecord.glade:248
+msgid "Duration:"
+msgstr "Duração:"
+
+#: glade/newrecord.glade:279
+#: glade/newrecord.glade:306
+msgid ":"
+msgstr ":"
+
+#: glade/newrecord.glade:376
+msgid "Date:"
+msgstr "Data:"
+
+#: glade/newrecord.glade:445
+msgid "Start Time:"
+msgstr "Hora de Início:"
+
+#: glade/newrecord.glade:461
+msgid "12:00:00"
+msgstr "12:00:00"
+
+#: glade/newrecord.glade:486
+#: glade/profile.glade:1586
+msgid "<b>General</b>"
+msgstr "<b>Geral</b>"
+
+#: glade/newrecord.glade:522
+msgid "Max (km/h):"
+msgstr "Máx. (km/h):"
+
+#: glade/newrecord.glade:547
+msgid "Average (km/h)"
+msgstr "Média (km/h)"
+
+#: glade/newrecord.glade:593
+msgid "<b>Speed</b>"
+msgstr "<b>Velocidade</b>"
+
+#: glade/newrecord.glade:612
+msgid "Quick Entry"
+msgstr "Entrada Rápida"
+
+#: glade/newrecord.glade:644
+msgid "Max (min/km):"
+msgstr "Máx. (min/km):"
+
+#: glade/newrecord.glade:671
+msgid "Pace (min/km):"
+msgstr "Ritmo (min/km):"
+
+#: glade/newrecord.glade:718
+msgid "<b>Pace</b>"
+msgstr "<b>Ritmo</b>"
+
+#: glade/newrecord.glade:754
+msgid "Ascent:"
+msgstr "Subida:"
+
+#: glade/newrecord.glade:780
+msgid "Descent:"
+msgstr "Descida:"
+
+#: glade/newrecord.glade:813
+msgid "<b>Accumulated Altitude Change</b>"
+msgstr "<b>Mudança de Altitude Acumulada</b>"
+
+#: glade/newrecord.glade:850
+msgid "Max (bpm):"
+msgstr "Máx (ppm):"
+
+#: glade/newrecord.glade:862
+msgid "Heart rate:"
+msgstr "Ritmo Cardíaco:"
+
+#: glade/newrecord.glade:902
+#: pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:165
+#: pytrainer/gui/windowmain.py:1500
+#: pytrainer/monthgraph.py:30
+#: pytrainer/totalgraph.py:28
+#: pytrainer/yeargraph.py:30
+#: pytrainer/weekgraph.py:32
+msgid "Calories"
+msgstr "Calorias"
+
+#: glade/newrecord.glade:931
+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 cálculo das calorias deve ser introduzido o MET do desporto (em Preferências->Desporto) </small>"
+
+#: glade/newrecord.glade:1005
+msgid "<b>Heart Rate</b>"
+msgstr "<b>Ritmo Cardíaco</b>"
+
+#: glade/newrecord.glade:1027
+msgid "Advanced"
+msgstr "Avançado"
+
+#: glade/newrecord.glade:1079
+msgid "<b>Comments</b>"
+msgstr "<b>Comentários</b>"
+
+#: glade/newrecord.glade:1134
+msgid "<i>There are no active equipment items.</i>"
+msgstr "<i>Não há items de equipamento activos.</i>"
+
+#: glade/newrecord.glade:1188
+msgid "<b>Associated Equipment</b>"
+msgstr "<b>Equipamento Associado</b>"
+
+#: glade/newrecord.glade:1203
+#: glade/profile.glade:1446
+msgid "Equipment"
+msgstr "Equipamento"
+
+#: glade/plugins.glade:53
+msgid "<b>Plugin Details</b>"
+msgstr "<b>Detalhes do Plugin</b>"
+
+#: glade/plugins.glade:68
+msgid "description-entry "
+msgstr "descrição"
+
+#: glade/plugins.glade:129
+msgid "nameEntry"
+msgstr "nome"
+
+#: glade/profile.glade:7
+msgid "Preferences"
+msgstr "Preferências"
+
+#: glade/profile.glade:37
+msgid "Metric system"
+msgstr "Sistema métrico"
+
+#: glade/profile.glade:53
+msgid "U.S. customary units"
+msgstr "Unidades habituais nos E.U.A."
+
+#: glade/profile.glade:74
+msgid "<b>System of Measurement</b>"
+msgstr "<b>Sistema de Medidas</b>"
+
+#: glade/profile.glade:103
+#: glade/pytrainer.glade:2111
+msgid "Google"
+msgstr "Google"
+
+#: glade/profile.glade:118
+#: glade/pytrainer.glade:2094
+msgid "Open Street Map"
+msgstr "Open Street Map"
+
+#: glade/profile.glade:140
+msgid "<b>Default Map Viewer</b>"
+msgstr "<b>Visualizador de Mapas Predefinido</b>"
+
+#: glade/profile.glade:176
+msgid "Database type:"
+msgstr "Tipo de Base de Dados:"
+
+#: glade/profile.glade:187
+msgid "Database host:"
+msgstr "Servidor de Base de Dados:"
+
+#: glade/profile.glade:213
+msgid "Database name:"
+msgstr "Nome da Base de Dados:"
+
+#: glade/profile.glade:252
+msgid "Database user:"
+msgstr "Utilizador da Base de Dados:"
+
+#: glade/profile.glade:267
+msgid "Database pass:"
+msgstr "Password para a Base de Dados:"
+
+#: glade/profile.glade:318
+msgid "<b>Database</b>"
+msgstr "<b>Base de Dados</b>"
+
+#: glade/profile.glade:340
+msgid "General"
+msgstr "Geral"
+
+#: glade/profile.glade:369
+msgid "User name:"
+msgstr "Nome de Utilizador:"
+
+#: glade/profile.glade:380
+msgid "Gender:"
+msgstr "Sexo:"
+
+#: glade/profile.glade:407
+#: glade/pytrainer.glade:5728
+msgid "Height:"
+msgstr "Altura"
+
+#: glade/profile.glade:447
+#: glade/pytrainer.glade:5715
+msgid "Date of birth:"
+msgstr "Data de Nascimento:"
+
+#: glade/profile.glade:520
+msgid "Weight:"
+msgstr "Peso:"
+
+#: glade/profile.glade:542
+#: glade/pytrainer.glade:5790
+msgid "<b>Athlete Details</b>"
+msgstr "<b>Detalhes do Atleta</b>"
+
+#: glade/profile.glade:557
+#: glade/pytrainer.glade:5893
+msgid "Athlete"
+msgstr "Atleta"
+
+#: glade/profile.glade:672
+msgid "<b>Sport List</b>"
+msgstr "<b>Lista de Desportos</b>"
+
+#: glade/profile.glade:684
+msgid "llist"
+msgstr "llista"
+
+#: glade/profile.glade:739
+msgid "M.E.T.:"
+msgstr "M.E.T.:"
+
+#: glade/profile.glade:766
+msgid "Extra Weight:"
+msgstr "Peso Extra:"
+
+#: glade/profile.glade:802
+#: glade/profile.glade:1218
+msgid "More information on determining yor M.E.T sport coefficient on Wikipedia"
+msgstr "Mais informações para determinar o seu coeficiente desportivo M.E.T. na Wikipédia"
+
+#: glade/profile.glade:822
+msgid "Maximum Pace:"
+msgstr "Ritmo Máximo:"
+
+#: glade/profile.glade:950
+msgid "<b>Add New Sport</b>"
+msgstr "<b>Acrescentar Novo Desporto</b>"
+
+#: glade/profile.glade:965
+msgid "new"
+msgstr "novo"
+
+#: glade/profile.glade:996
+msgid ""
+"Deleting a sport removes associated records.\n"
+"Continue?"
+msgstr ""
+"Apagar um desporto remove registos associados.\n"
+"Continuar?"
+
+#: glade/profile.glade:1078
+msgid "<b>Delete Sport</b>"
+msgstr "<b>Apagar Desporto</b>"
+
+#: glade/profile.glade:1110
+msgid "delete"
+msgstr "apagar"
+
+#: glade/profile.glade:1143
+msgid "Name"
+msgstr "Nome"
+
+#: glade/profile.glade:1166
+msgid "M.E.T."
+msgstr "M.E.T."
+
+#: glade/profile.glade:1193
+#: pytrainer/gui/windowprofile.py:65
+msgid "Extra Weight"
+msgstr "Peso Extra"
+
+#: glade/profile.glade:1238
+#: pytrainer/gui/windowprofile.py:65
+msgid "Maximum Pace"
+msgstr "Ritmo Máximo"
+
+#: glade/profile.glade:1265
+#: pytrainer/gui/windowmain.py:188
+#: pytrainer/gui/windowprofile.py:65
+msgid "Color"
+msgstr "Cor"
+
+#: glade/profile.glade:1375
+msgid "<b>Edit Sport</b>"
+msgstr "<b>Editar Desporto</b>"
+
+#: glade/profile.glade:1386
+msgid "<b>lalaal</b>"
+msgstr "<b>lalaal</b>"
+
+#: glade/profile.glade:1408
+msgid "edit"
+msgstr "editar"
+
+#: glade/profile.glade:1424
+msgid "Sports"
+msgstr "Desportos"
+
+#: glade/profile.glade:1479
+msgid "Maximum heart rate:"
+msgstr "Ritmo cardíaco máximo:"
+
+#: glade/profile.glade:1490
+msgid "Resting heart rate:"
+msgstr "Ritmo cardíaco em repouso:"
+
+#: glade/profile.glade:1535
+msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>"
+msgstr "<small><b>Nota:</b> O ritmo cardíaco máximo é calculado pela subtracção de 220 à sua idade. </small>"
+
+#: glade/profile.glade:1622
+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> para poder usar o método de Karvonen tem de preencher o campo 'Ritmo cardíaco em repouso'.</small>"
+
+#: glade/profile.glade:1635
+msgid "Percentages based method"
+msgstr "Método baseado em percentagens"
+
+#: glade/profile.glade:1651
+#: pytrainer/gui/windowmain.py:790
+msgid "Karvonen method"
+msgstr "Método de Karvonen"
+
+#: glade/profile.glade:1672
+msgid "Select how to calculate your heart rate zones."
+msgstr "Seleccione o método de cálculo do seu ritmo cardíaco"
+
+#: glade/profile.glade:1711
+msgid "<b>Heart Rate Zones</b>"
+msgstr "<b>Zonas de Ritmo Cardíaco</b>"
+
+#: glade/profile.glade:1733
+#: pytrainer/recordgraph.py:140
+#: pytrainer/lib/activity.py:443
+#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:455
+#: pytrainer/lib/activity.py:525
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/daygraph.py:56
+msgid "Heart Rate"
+msgstr "Ritmo Cardíaco"
+
+#: glade/profile.glade:1759
+msgid "Log Level"
+msgstr "Nível de Registo"
+
+#: glade/profile.glade:1767
+msgid ""
+"Error\n"
+"Warning\n"
+"Info\n"
+"Debug"
+msgstr ""
+"Erro\n"
+"Aviso\n"
+"Informativo\n"
+"Debug"
+
+#: glade/profile.glade:1785
+msgid "<small>What level of detail is written to the log?</small>"
+msgstr "<small>Que nível de informação quer escrever no registo?</small>"
+
+#: glade/profile.glade:1799
+msgid "Validate"
+msgstr "Validar"
+
+#: glade/profile.glade:1829
+msgid "<small>Do the plugins attempt to validate the input file before processing?</small>"
+msgstr "<small>Os plugins tentam validar os ficheiros de input antes do processamento?</small>"
+
+#: glade/profile.glade:1845
+msgid "Check"
+msgstr "Verificar"
+
+#: glade/profile.glade:1874
+msgid "<small>Was a configuration and database check requested?</small>"
+msgstr "<small>Foi pedida uma verificação da configuração e base de dados?</small>"
+
+#: glade/profile.glade:1890
+msgid "New Graph"
+msgstr "Novo Gráfico"
+
+#: glade/profile.glade:1919
+msgid "<small>Want to use experimental new approach to graphing?</small>"
+msgstr "<small>Quer usar a nova abordagem experimental para os gráficos?</small>"
+
+#: glade/profile.glade:1962
+msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>"
+msgstr "<small>Este écran mostra o estado das opções configuráveis pela linha de comando para o pytrainer. Estas opções podem ser alteradas aqui, de modo a afectarem a execução actual do pytrainer. No entanto, estas alterações não serão guardadas para a próxima execução do programa</small>"
+
+#: glade/profile.glade:1983
+msgid "Startup Parameters"
+msgstr "Parâmetros de Arranque"
+
+#: glade/pytrainer.glade:24
+msgid "_File"
+msgstr "_Ficheiro"
+
+#: glade/pytrainer.glade:39
+msgid "_Import"
+msgstr "_Importar"
+
+#: glade/pytrainer.glade:60
+msgid "_Export as Text Separated by Commas"
+msgstr "_Exportar como Texto Separado por Vírgulas (CSV)"
+
+#: glade/pytrainer.glade:94
+msgid "_Edit"
+msgstr "_Editar"
+
+#: glade/pytrainer.glade:114
+msgid "_View"
+msgstr "_Ver"
+
+#: glade/pytrainer.glade:121
+msgid " _Classic View"
+msgstr "Vista _Clássica"
+
+#: glade/pytrainer.glade:131
+msgid " _List View"
+msgstr "Vista em _Lista"
+
+#: glade/pytrainer.glade:141
+msgid " _Waypoints Editor"
+msgstr "Editor de _Pontos de Interesse"
+
+#: glade/pytrainer.glade:155
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: glade/pytrainer.glade:172
+msgid "GPS Device Plugins"
+msgstr "Plugins para Dispositivos GPS"
+
+#: glade/pytrainer.glade:185
+msgid "_Help"
+msgstr "_Ajuda"
+
+#: glade/pytrainer.glade:290
+#: glade/pytrainer.glade:6324
+msgid "All Sports"
+msgstr "Todos os Desportos"
+
+#: glade/pytrainer.glade:396
+msgid "<b>Sport:</b>"
+msgstr "<b>Desporto:</b>"
+
+#: glade/pytrainer.glade:408
+#: glade/pytrainer.glade:3144
+#: glade/pytrainer.glade:3786
+#: glade/pytrainer.glade:4440
+#: glade/pytrainer.glade:5170
+msgid "<b>Duration:</b>"
+msgstr "<b>Duração:</b>"
+
+#: glade/pytrainer.glade:423
+#: glade/pytrainer.glade:3234
+#: glade/pytrainer.glade:3865
+#: glade/pytrainer.glade:4519
+#: glade/pytrainer.glade:5272
+msgid "<b>Speed:</b>"
+msgstr "<b>Velocidade:</b>"
+
+#: glade/pytrainer.glade:437
+#: glade/pytrainer.glade:3402
+#: glade/pytrainer.glade:4060
+#: glade/pytrainer.glade:4714
+#: glade/pytrainer.glade:5367
+msgid "<b>Pace:</b>"
+msgstr "<b>Ritmo:</b>"
+
+#: glade/pytrainer.glade:451
+msgid "<b>Ascent:</b>"
+msgstr "<b>Subida:</b>"
+
+#: glade/pytrainer.glade:465
+msgid "<b>Calories:</b>"
+msgstr "<b>Calorias:</b>"
+
+#: glade/pytrainer.glade:479
+msgid "<b>Comments:</b>"
+msgstr "<b>Comentários:</b>"
+
+#: glade/pytrainer.glade:614
+msgid "<b>Date:</b>"
+msgstr "<b>Data:</b>"
+
+#: glade/pytrainer.glade:628
+#: glade/pytrainer.glade:3130
+#: glade/pytrainer.glade:3772
+#: glade/pytrainer.glade:4426
+#: glade/pytrainer.glade:5156
+msgid "<b>Distance:</b>"
+msgstr "<b>Distância:</b>"
+
+#: glade/pytrainer.glade:645
+msgid "<b>Max Speed</b>"
+msgstr "<b>Vel. Máxima</b>"
+
+#: glade/pytrainer.glade:661
+#: glade/pytrainer.glade:3432
+#: glade/pytrainer.glade:4074
+#: glade/pytrainer.glade:4728
+#: glade/pytrainer.glade:5382
+msgid "<b>Max Pace:</b>"
+msgstr "<b>Ritmo Máx:</b>"
+
+#: glade/pytrainer.glade:677
+msgid "<b>Descent:</b>"
+msgstr "<b>Descida:</b>"
+
+#: glade/pytrainer.glade:769
+#: glade/pytrainer.glade:3342
+#: glade/pytrainer.glade:3940
+#: glade/pytrainer.glade:4594
+#: glade/pytrainer.glade:5082
+msgid "Cal"
+msgstr "Cal"
+
+#: glade/pytrainer.glade:809
+#: glade/pytrainer.glade:3104
+#: glade/pytrainer.glade:3746
+#: glade/pytrainer.glade:4400
+#: glade/pytrainer.glade:5259
+#: pytrainer/gui/windowmain.py:109
+msgid "Km"
+msgstr "Km"
+
+#: glade/pytrainer.glade:824
+#: glade/pytrainer.glade:3264
+#: glade/pytrainer.glade:3297
+#: glade/pytrainer.glade:3895
+#: glade/pytrainer.glade:3988
+#: glade/pytrainer.glade:4549
+#: glade/pytrainer.glade:4642
+#: glade/pytrainer.glade:5302
+#: glade/pytrainer.glade:5318
+#: pytrainer/gui/windowmain.py:916
+#: pytrainer/gui/windowmain.py:917
+#: pytrainer/gui/windowmain.py:1045
+#: pytrainer/gui/windowmain.py:1046
+#: pytrainer/gui/windowmain.py:1127
+#: pytrainer/gui/windowmain.py:1128
+#: pytrainer/lib/activity.py:203
+msgid "km/h"
+msgstr "km/h"
+
+#: glade/pytrainer.glade:839
+msgid "<b>Equipment:</b>"
+msgstr "<b>Equipamento:</b>"
+
+#: glade/pytrainer.glade:935
+msgid "<b>Active / Rest:</b>"
+msgstr "<b>Activo / Em Repouso:</b>"
+
+#: glade/pytrainer.glade:962
+msgid "h:m:s"
+msgstr "h:m:s"
+
+#: glade/pytrainer.glade:1007
+msgid "<b>Laps</b>"
+msgstr "<b>Voltas</b>"
+
+#: glade/pytrainer.glade:1078
+msgid " <b>Title:</b>"
+msgstr "<b>Título:</b>"
+
+#: glade/pytrainer.glade:1128
+#: pytrainer/gui/windowmain.py:1722
+msgid "Show graph display options"
+msgstr "Mostrar opções de gráficos"
+
+#: glade/pytrainer.glade:1146
+msgid ""
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+"Percentage\n"
+"Zone"
+msgstr ""
+"Perfil\n"
+"Velocidade\n"
+"Ritmo\n"
+"Ritmo Cardíaco\n"
+"Cadência\n"
+"Percentagem\n"
+"Zona"
+
+#: glade/pytrainer.glade:1163
+#: glade/pytrainer.glade:4311
+#: glade/pytrainer.glade:4965
+#: glade/pytrainer.glade:5618
+#: glade/pytrainer.glade:5984
+msgid "Versus"
+msgstr "vs."
+
+#: glade/pytrainer.glade:1174
+msgid ""
+"None\n"
+"Profile\n"
+"Speed\n"
+"Pace\n"
+"Heart Rate\n"
+"Cadence\n"
+msgstr ""
+"Nenhum\n"
+"Perfil\n"
+"Velocidade\n"
+"Ritmo\n"
+"Ritmo Cardíaco\n"
+"Cadência\n"
+
+#: glade/pytrainer.glade:1320
+msgid "<small>Graph Display Options</small>"
+msgstr "<small>Opções de Visualização de Gráficos</small>"
+
+#: glade/pytrainer.glade:1345
+#: glade/pytrainer.glade:1560
+#: glade/pytrainer.glade:1780
+msgid "<small>Limits</small>"
+msgstr "<small>Limites</small>"
+
+#: glade/pytrainer.glade:1357
+#: glade/pytrainer.glade:1572
+#: glade/pytrainer.glade:1826
+msgid "<small>Min</small>"
+msgstr "<small>Mín.</small>"
+
+#: glade/pytrainer.glade:1369
+#: glade/pytrainer.glade:1584
+#: glade/pytrainer.glade:1838
+msgid "<small>Max</small>"
+msgstr "<small>Máx.</small>"
+
+#: glade/pytrainer.glade:1418
+#: glade/pytrainer.glade:1640
+msgid "<small>Color</small>"
+msgstr "<small>Cor</small>"
+
+#: glade/pytrainer.glade:1449
+#: glade/pytrainer.glade:1653
+msgid "<small>Weight</small>"
+msgstr "<small>Peso</small>"
+
+#: glade/pytrainer.glade:1479
+msgid "Y1"
+msgstr "Y1"
+
+#: glade/pytrainer.glade:1490
+#: glade/pytrainer.glade:1701
+msgid "<small>Smoothing</small>"
+msgstr "<small>Suavização</small>"
+
+#: glade/pytrainer.glade:1630
+msgid "Y2"
+msgstr "Y2"
+
+#: glade/pytrainer.glade:1770
+msgid "X"
+msgstr "X"
+
+#: glade/pytrainer.glade:1851
+msgid "<small>Distance</small>"
+msgstr "<small>Distância</small>"
+
+#: glade/pytrainer.glade:1880
+msgid "<small>Time</small>"
+msgstr "<small>Tempo</small>"
+
+#: glade/pytrainer.glade:1941
+msgid "Show Laps"
+msgstr "Mostrar Voltas"
+
+#: glade/pytrainer.glade:1980
+msgid "Reset Graph"
+msgstr "Reset do Gráfico"
+
+#: glade/pytrainer.glade:2042
+msgid "Redraw Map"
+msgstr "Redesenhar Mapa"
+
+#: glade/pytrainer.glade:2058
+msgid "<small>Show:</small>"
+msgstr "<small>Mostrar:</small>"
+
+#: glade/pytrainer.glade:2069
+msgid ""
+"None\n"
+"Speed\n"
+"Heart rate\n"
+"Cadence"
+msgstr ""
+"Nenhum\n"
+"Velocidade\n"
+"Ritmo Cardíaco\n"
+"Cadência"
+
+#: glade/pytrainer.glade:2084
+msgid "<small>Display map using:</small>"
+msgstr "<small>Mostrar mapa usando:</small>"
+
+#: glade/pytrainer.glade:2185
+msgid "<b>Beats:</b>"
+msgstr "<b>Pulsações:</b>"
+
+#: glade/pytrainer.glade:2197
+#: glade/pytrainer.glade:3312
+#: glade/pytrainer.glade:3910
+#: glade/pytrainer.glade:4564
+#: glade/pytrainer.glade:5052
+msgid "<b>Calories: </b>"
+msgstr "<b>Calorias: </b>"
+
+#: glade/pytrainer.glade:2211
+#: glade/pytrainer.glade:3464
+#: glade/pytrainer.glade:4138
+#: glade/pytrainer.glade:4792
+#: glade/pytrainer.glade:5430
+msgid "<b>Max Beats:</b>"
+msgstr "<b>Máx. de Pulsações:</b>"
+
+#: glade/pytrainer.glade:2225
+msgid "<b>HR Zones Method:</b>"
+msgstr "<b>Método das Zonas HR:</b>"
+
+#: glade/pytrainer.glade:2240
+msgid "<b>HR Zone5:</b>"
+msgstr "<b>Zona5 HR:</b>"
+
+#: glade/pytrainer.glade:2255
+#: glade/pytrainer.glade:2454
+msgid " bpm"
+msgstr " ppm"
+
+#: glade/pytrainer.glade:2271
+msgid " Cal"
+msgstr " Cal"
+
+#: glade/pytrainer.glade:2329
+msgid "<b>HR Zone4:</b>"
+msgstr "<b>Zona4 HR:</b>"
+
+#: glade/pytrainer.glade:2345
+msgid "<b>HR Zone3:</b>"
+msgstr "<b>Zona3 HR:</b>"
+
+#: glade/pytrainer.glade:2361
+msgid "<b>HR Zone2:</b>"
+msgstr "<b>Zona2 HR:</b>"
+
+#: glade/pytrainer.glade:2377
+msgid "<b>HR Zone1:</b>"
+msgstr "<b>Zona1 HR:</b>"
+
+#: glade/pytrainer.glade:2479
+#: glade/pytrainer.glade:2491
+#: glade/pytrainer.glade:2506
+#: glade/pytrainer.glade:2521
+#: glade/pytrainer.glade:2536
+#: glade/pytrainer.glade:3387
+#: glade/pytrainer.glade:3481
+#: glade/pytrainer.glade:4045
+#: glade/pytrainer.glade:4123
+#: glade/pytrainer.glade:4699
+#: glade/pytrainer.glade:4777
+#: glade/pytrainer.glade:5127
+#: glade/pytrainer.glade:5334
+#: pytrainer/lib/activity.py:445
+#: pytrainer/lib/activity.py:525
+msgid "bpm"
+msgstr "ppm"
+
+#: glade/pytrainer.glade:2581
+msgid " <b>Heart Rate:</b>"
+msgstr " <b>Ritmo Cardíaco:</b>"
+
+#: glade/pytrainer.glade:2769
+msgid "<b>Projected times</b>"
+msgstr "<b>Tempos projectados</b>"
+
+#: glade/pytrainer.glade:2799
+msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>"
+msgstr "<i>Classificação relativa para actividades do mesmo desporto para distâncias ± x%:</i>"
+
+#: glade/pytrainer.glade:2832
+msgid "<b>Range:</b>"
+msgstr "<b>Alcance:</b>"
+
+#: glade/pytrainer.glade:2845
+msgid "<b>Rank:</b>"
+msgstr "<b>Classificação:</b>"
+
+#: glade/pytrainer.glade:2858
+msgid "<b>Speed: </b>"
+msgstr "<b>Velocidade: </b>"
+
+#: glade/pytrainer.glade:2871
+msgid "<b>Avg speed:</b>"
+msgstr "<b>Vel. média:</b>"
+
+#: glade/pytrainer.glade:2884
+msgid "<b>Standard deviation:</b>"
+msgstr "<b>Desvio padrão:</b>"
+
+#: glade/pytrainer.glade:2898
+msgid "<b>Deviation:</b>"
+msgstr "<b>Desvio:</b>"
+
+#: glade/pytrainer.glade:3017
+msgid "<b>Ranking</b>"
+msgstr "<b>Classificação</b>"
+
+#: glade/pytrainer.glade:3043
+msgid "<b>Analytics:</b>"
+msgstr "<b>Analítica:</b>"
+
+#: glade/pytrainer.glade:3071
+msgid "Record"
+msgstr "Registo"
+
+#: glade/pytrainer.glade:3280
+#: glade/pytrainer.glade:3956
+#: glade/pytrainer.glade:4610
+#: glade/pytrainer.glade:5350
+msgid "<b>Max Speed:</b>"
+msgstr "<b>Vel. Máxima:</b>"
+
+#: glade/pytrainer.glade:3357
+#: glade/pytrainer.glade:4015
+#: glade/pytrainer.glade:4669
+#: glade/pytrainer.glade:5097
+msgid "<b>Beats avg:</b>"
+msgstr "<b>Média pulsação:</b>"
+
+#: glade/pytrainer.glade:3417
+#: glade/pytrainer.glade:3449
+#: glade/pytrainer.glade:4091
+#: glade/pytrainer.glade:4107
+#: glade/pytrainer.glade:4745
+#: glade/pytrainer.glade:4761
+#: glade/pytrainer.glade:5399
+#: glade/pytrainer.glade:5415
+#: pytrainer/gui/windowmain.py:918
+#: pytrainer/gui/windowmain.py:919
+#: pytrainer/gui/windowmain.py:1047
+#: pytrainer/gui/windowmain.py:1048
+#: pytrainer/gui/windowmain.py:1129
+#: pytrainer/gui/windowmain.py:1130
+#: pytrainer/lib/activity.py:204
+msgid "min/km"
+msgstr "min/km"
+
+#: glade/pytrainer.glade:3556
+#: glade/pytrainer.glade:4199
+#: glade/pytrainer.glade:4853
+#: glade/pytrainer.glade:5506
+msgid "<b>Total Asc/Desc:</b>"
+msgstr "<b>Total Sub/Desc:</b>"
+
+#: glade/pytrainer.glade:3583
+#: glade/pytrainer.glade:4226
+#: glade/pytrainer.glade:4880
+#: glade/pytrainer.glade:5533
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
+#: pytrainer/lib/activity.py:205
+msgid "m"
+msgstr "m"
+
+#: glade/pytrainer.glade:3602
+msgid " <b>Date:</b>"
+msgstr " <b>Data:</b>"
+
+#: glade/pytrainer.glade:3645
+msgid "Value"
+msgstr "Valor"
+
+#: glade/pytrainer.glade:3656
+msgid ""
+"Stage Profile\n"
+"Stage Velocity\n"
+"Stage Profile/velocity"
+msgstr ""
+"Definir Perfil\n"
+"Definir Velocidade\n"
+"Definir Perfil/velocidade"
+
+#: glade/pytrainer.glade:3712
+msgid "Day"
+msgstr "Dia"
+
+#: glade/pytrainer.glade:4245
+msgid " <b>Week:</b>"
+msgstr " <b>Semana:</b>"
+
+#: glade/pytrainer.glade:4296
+#: glade/pytrainer.glade:4950
+#: glade/pytrainer.glade:5603
+#: glade/pytrainer.glade:5969
+msgid ""
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Distância\n"
+"Tempo\n"
+"Ritmo Cardíaco Médio\n"
+"Velocidade Média\n"
+"Calorias"
+
+#: glade/pytrainer.glade:4322
+#: glade/pytrainer.glade:4976
+#: glade/pytrainer.glade:5629
+#: glade/pytrainer.glade:5995
+msgid ""
+"None\n"
+"Distance\n"
+"Time\n"
+"Average Heart Rate\n"
+"Average Speed\n"
+"Calories"
+msgstr ""
+"Nenhum\n"
+"Distância\n"
+"Tempo\n"
+"Ritmo Cardíaco Médio\n"
+"Velocidade Média\n"
+"Calorias"
+
+#: glade/pytrainer.glade:4366
+msgid "Week"
+msgstr "Semana"
+
+#: glade/pytrainer.glade:4899
+msgid " <b>Month:</b>"
+msgstr " <b>Mês:</b>"
+
+#: glade/pytrainer.glade:5019
+msgid "Month"
+msgstr "Mês"
+
+#: glade/pytrainer.glade:5552
+msgid " <b>Year:</b>"
+msgstr " <b>Ano:</b>"
+
+#: glade/pytrainer.glade:5672
+msgid "Year"
+msgstr "Ano"
+
+#: glade/pytrainer.glade:5826
+msgid "<b>Graph</b>"
+msgstr "<b>Gráfico</b>"
+
+#: glade/pytrainer.glade:5867
+msgid "<b>History</b>"
+msgstr "<b>Histórico</b>"
+
+#: glade/pytrainer.glade:5937
+msgid "<b>Sports</b>"
+msgstr "<b>Desportos</b>"
+
+#: glade/pytrainer.glade:6018
+msgid "Total distance:"
+msgstr "Distância total:"
+
+#: glade/pytrainer.glade:6032
+msgid "Total duration:"
+msgstr "Duração total:"
+
+#: glade/pytrainer.glade:6081
+msgid "Start date:"
+msgstr "Data de início:"
+
+#: glade/pytrainer.glade:6096
+msgid "End date:"
+msgstr "Data de fim:"
+
+#: glade/pytrainer.glade:6182
+msgid "<b>All</b>"
+msgstr "<b>Todos</b>"
+
+#: glade/pytrainer.glade:6208
+msgid "Totals"
+msgstr "Totais"
+
+#: glade/pytrainer.glade:6246
+msgid "<b>Title:</b>"
+msgstr "<b>Título:</b>"
+
+#: glade/pytrainer.glade:6269
+msgid "Search"
+msgstr "Pesquisar"
+
+#: glade/pytrainer.glade:6293
+#: pytrainer/lib/listview.py:3
+#: pytrainer/lib/listview.py:10
+msgid "All Distances"
+msgstr "Todas as Distâncias"
+
+#: glade/pytrainer.glade:6302
+#: pytrainer/lib/listview.py:35
+msgid "All Durations"
+msgstr "Todas as durações"
+
+#: glade/pytrainer.glade:6312
+msgid ""
+"All time\n"
+"Last 4 weeks\n"
+"Last 6 months\n"
+"Last 12 months"
+msgstr ""
+"Todos os registos\n"
+"Últimas 4 semanas\n"
+"Últimos 6 meses\n"
+"Últimos 12 meses"
+
+#: glade/pytrainer.glade:6349
+msgid "Columns"
+msgstr "Colunas"
+
+#: glade/pytrainer.glade:6477
+msgid "Type:"
+msgstr "Tipo:"
+
+#: glade/pytrainer.glade:6490
+msgid ""
+"Font\n"
+"Restaurant\n"
+"Scenic Area\n"
+"Summit"
+msgstr ""
+"Fonte\n"
+"Restaurante\n"
+"Paisagem\n"
+"Monte"
+
+#: glade/pytrainer.glade:6506
+msgid "Latitude: "
+msgstr "Latitude: "
+
+#: glade/pytrainer.glade:6520
+msgid " Name:"
+msgstr " Nome:"
+
+#: glade/pytrainer.glade:6532
+msgid "Longitude:"
+msgstr "Longitude:"
+
+#: glade/pytrainer.glade:6624
+msgid "<b> Waypoint: </b>"
+msgstr "<b> Ponto de Interesse: </b>"
+
+#: glade/pytrainer.glade:6808
+msgid "Edit Record"
+msgstr "Editar Registo"
+
+#: glade/pytrainer.glade:6822
+msgid "Show graph in classic view"
+msgstr "Mostrar gráfico na vista clássica"
+
+#: glade/pytrainer.glade:6836
+msgid "Merge tracks"
+msgstr "Juntar percursos"
+
+#: glade/selecttrackdialog.glade:7
+msgid "Select track record"
+msgstr "Escolher registo de percurso"
+
+#: glade/warning.glade:7
+#: glade/warning.glade:38
+msgid "Warning"
+msgstr "Aviso"
+
+#: pytrainer/gui/windowmain.py:107
+msgid "Miles"
+msgstr "Milhas"
+
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:130
+#: pytrainer/gui/windowmain.py:139
+#: pytrainer/gui/windowmain.py:173
+#: pytrainer/gui/windowmain.py:182
+msgid "id"
+msgstr "id"
+
+#: pytrainer/gui/windowmain.py:110
+msgid "Start"
+msgstr "Início"
+
+#: pytrainer/gui/windowmain.py:117
+#: pytrainer/gui/windowmain.py:157
+#: pytrainer/gui/windowmain.py:175
+#: pytrainer/gui/windowmain.py:185
+#: pytrainer/gui/windowmain.py:569
+#: pytrainer/gui/windowmain.py:1495
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+#: pytrainer/lib/activity.py:323
+#: pytrainer/lib/activity.py:334
+#: pytrainer/lib/activity.py:406
+#: pytrainer/lib/activity.py:417
+#: pytrainer/lib/activity.py:426
+#: pytrainer/lib/activity.py:435
+#: pytrainer/lib/activity.py:444
+#: pytrainer/lib/activity.py:454
+#: pytrainer/lib/activity.py:463
+#: pytrainer/lib/activity.py:524
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:105
+msgid "Distance"
+msgstr "Distância"
+
+#: pytrainer/gui/windowmain.py:119
+#: pytrainer/gui/windowmain.py:158
+#: pytrainer/gui/windowmain.py:176
+#: pytrainer/gui/windowmain.py:186
+#: pytrainer/gui/windowmain.py:570
+#: pytrainer/gui/windowmain.py:1497
+#: pytrainer/extensions/googlemaps.py:129
+#: pytrainer/extensions/osm.py:104
+msgid "Time"
+msgstr "Tempo"
+
+#: pytrainer/gui/windowmain.py:120
+msgid "⌀ HR"
+msgstr "⌀ Bat. Card."
+
+#: pytrainer/gui/windowmain.py:121
+msgid "⌀ Speed"
+msgstr "⌀ Vel."
+
+#: pytrainer/gui/windowmain.py:127
+msgid "Waypoint"
+msgstr "Ponto de interesse"
+
+#: pytrainer/gui/windowmain.py:132
+msgid "Weight"
+msgstr "Peso"
+
+#: pytrainer/gui/windowmain.py:133
+msgid "Body Fat %"
+msgstr "% Gordura Corporal"
+
+#: pytrainer/gui/windowmain.py:134
+msgid "Resting HR"
+msgstr "Bat. Card. em Repouso"
+
+#: pytrainer/gui/windowmain.py:135
+#: pytrainer/gui/windowmain.py:147
+#: pytrainer/gui/windowmain.py:164
+msgid "Max HR"
+msgstr "Máx Bat. Card."
+
+#: pytrainer/gui/windowmain.py:141
+msgid "Records"
+msgstr "Registos"
+
+#: pytrainer/gui/windowmain.py:142
+msgid "Total duration"
+msgstr "Duração total"
+
+#: pytrainer/gui/windowmain.py:143
+msgid "Total distance"
+msgstr "Distância total"
+
+#: pytrainer/gui/windowmain.py:144
+#: pytrainer/gui/windowmain.py:159
+msgid "Avg speed"
+msgstr "Vel. Média"
+
+#: pytrainer/gui/windowmain.py:145
+#: pytrainer/gui/windowmain.py:160
+msgid "Max speed"
+msgstr "Vel. Máx."
+
+#: pytrainer/gui/windowmain.py:146
+#: pytrainer/gui/windowmain.py:163
+msgid "Avg HR"
+msgstr "Ritmo Card. Médio"
+
+#: pytrainer/gui/windowmain.py:148
+msgid "Max duration"
+msgstr "Duração Máx."
+
+#: pytrainer/gui/windowmain.py:149
+msgid "Max distance"
+msgstr "Distância Máx."
+
+#: pytrainer/gui/windowmain.py:155
+msgid "Lap"
+msgstr "Volta"
+
+#: pytrainer/gui/windowmain.py:156
+msgid "Trigger"
+msgstr "Gatilho"
+
+#: pytrainer/gui/windowmain.py:161
+msgid "Avg pace"
+msgstr "Ritmo Méd."
+
+#: pytrainer/gui/windowmain.py:162
+msgid "Max pace"
+msgstr "Ritmo Máx."
+
+#: pytrainer/gui/windowmain.py:166
+msgid "Intensity"
+msgstr "Intensidade"
+
+#: pytrainer/gui/windowmain.py:174
+msgid "Race"
+msgstr "Corrida"
+
+#: pytrainer/gui/windowmain.py:183
+msgid "Rank"
+msgstr "Posição"
+
+#: pytrainer/gui/windowmain.py:187
+#: pytrainer/recordgraph.py:136
+#: pytrainer/lib/activity.py:335
+#: pytrainer/lib/activity.py:425
+#: pytrainer/lib/activity.py:427
+msgid "Speed"
+msgstr "Velocidade"
+
+#: pytrainer/gui/windowmain.py:319
+msgid "d"
+msgstr "d"
+
+#: pytrainer/gui/windowmain.py:559
+msgid "Show on X Axis"
+msgstr "Mostrar no eixo X"
+
+#: pytrainer/gui/windowmain.py:560
+msgid "Show on Y1 Axis"
+msgstr "Mostrar no eixo Y1"
+
+#: pytrainer/gui/windowmain.py:561
+msgid "Show on Y2 Axis"
+msgstr "Mostrar no eixo Y2"
+
+#: pytrainer/gui/windowmain.py:562
+msgid "Axis Limits"
+msgstr "Limites do Eixo"
+
+#: pytrainer/gui/windowmain.py:571
+msgid "Laps"
+msgstr "Voltas"
+
+#: pytrainer/gui/windowmain.py:572
+msgid "Left Axis Grid"
+msgstr "Grelha do Eixo Esquerdo"
+
+#: pytrainer/gui/windowmain.py:573
+msgid "Right Axis Grid"
+msgstr "Grelha do Eixo Direito"
+
+#: pytrainer/gui/windowmain.py:574
+msgid "X Axis Grid"
+msgstr "Grelha do Eixo X"
+
+#: pytrainer/gui/windowmain.py:635
+msgid "Reset Limits"
+msgstr "Repor Limites"
+
+#: pytrainer/gui/windowmain.py:637
+msgid "Set Limits"
+msgstr "Definir Limites"
+
+#: pytrainer/gui/windowmain.py:792
+msgid "Percentages method"
+msgstr "Método das percentagens"
+
+#: pytrainer/gui/windowmain.py:805
+msgid "800 m"
+msgstr "800 m"
+
+#: pytrainer/gui/windowmain.py:806
+msgid "1500 m"
+msgstr "1500 m"
+
+#: pytrainer/gui/windowmain.py:807
+msgid "5K"
+msgstr "5K"
+
+#: pytrainer/gui/windowmain.py:808
+msgid "7K"
+msgstr "7K"
+
+#: pytrainer/gui/windowmain.py:809
+msgid "10K"
+msgstr "10K"
+
+#: pytrainer/gui/windowmain.py:810
+msgid "Half marathon"
+msgstr "Meia maratona"
+
+#: pytrainer/gui/windowmain.py:811
+msgid "Marathon"
+msgstr "Maratona"
+
+#: pytrainer/gui/windowmain.py:812
+msgid "100K"
+msgstr "100K"
+
+#: pytrainer/gui/windowmain.py:909
+#: pytrainer/gui/windowmain.py:1038
+#: pytrainer/gui/windowmain.py:1120
+#: pytrainer/lib/activity.py:197
+msgid "miles"
+msgstr "milhas"
+
+#: pytrainer/gui/windowmain.py:910
+#: pytrainer/gui/windowmain.py:911
+#: pytrainer/gui/windowmain.py:1039
+#: pytrainer/gui/windowmain.py:1040
+#: pytrainer/gui/windowmain.py:1121
+#: pytrainer/gui/windowmain.py:1122
+#: pytrainer/lib/activity.py:198
+msgid "miles/h"
+msgstr "milhas/h"
+
+#: pytrainer/gui/windowmain.py:912
+#: pytrainer/gui/windowmain.py:913
+#: pytrainer/gui/windowmain.py:1041
+#: pytrainer/gui/windowmain.py:1042
+#: pytrainer/gui/windowmain.py:1123
+#: pytrainer/gui/windowmain.py:1124
+#: pytrainer/lib/activity.py:199
+msgid "min/mile"
+msgstr "min/milha"
+
+#: pytrainer/gui/windowmain.py:915
+#: pytrainer/gui/windowmain.py:1044
+#: pytrainer/gui/windowmain.py:1126
+#: pytrainer/lib/activity.py:202
+msgid "km"
+msgstr "km"
+
+#: pytrainer/gui/windowmain.py:1498
+#: pytrainer/recordgraph.py:144
+msgid "Beats"
+msgstr "Pulsações"
+
+#: pytrainer/gui/windowmain.py:1499
+msgid "Average"
+msgstr "Média"
+
+#: pytrainer/gui/windowmain.py:1718
+msgid "Hide graph display options"
+msgstr "Esconder opções de visualização de gráficos"
+
+#: pytrainer/gui/windowmain.py:2056
+msgid "lap"
+msgstr "volta"
+
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/drawArea.py:165
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+msgid "h"
+msgstr "h"
+
+#: pytrainer/gui/windowmain.py:2066
+#: pytrainer/gui/windowmain.py:2068
+msgid "s"
+msgstr "s"
+
+#: pytrainer/gui/windowmain.py:2156
+#: pytrainer/record.py:67
+msgid "Edit Entry"
+msgstr "Editar Registo"
+
+#: pytrainer/gui/windowmain.py:2167
+msgid "Delete Entry"
+msgstr "Apagar Registo"
+
+#: pytrainer/gui/windowmain.py:2191
+msgid "Create Athlete Entry"
+msgstr "Criar Registo de Atleta"
+
+#: pytrainer/gui/windowmain.py:2195
+msgid "Edit Athlete Entry"
+msgstr "Editar Registo de Atleta"
+
+#: pytrainer/gui/windowmain.py:2208
+msgid "<b>Date</b>"
+msgstr "<b>Data</b>"
+
+#: pytrainer/gui/windowmain.py:2224
+msgid "<b>Weight</b>"
+msgstr "<b>Peso</b>"
+
+#: pytrainer/gui/windowmain.py:2232
+msgid "<b>Body Fat</b>"
+msgstr "<b>Gordura Corporal</b>"
+
+#: pytrainer/gui/windowmain.py:2240
+msgid "<b>Resting Heart Rate</b>"
+msgstr "<b>Ritmo Cardíaco em Repouso</b>"
+
+#: pytrainer/gui/windowmain.py:2248
+msgid "<b>Max Heart Rate</b>"
+msgstr "<b>Ritmo Cardíaco Máximo</b>"
+
+#: pytrainer/gui/windowmain.py:2276
+#: pytrainer/main.py:451
+msgid "Delete this database entry?"
+msgstr "Apagar este registo?"
+
+#: pytrainer/gui/windowmain.py:2278
+msgid "Are you sure?"
+msgstr "De certeza?"
+
+#: pytrainer/gui/windowimportdata.py:117
+msgid "No file selected"
+msgstr "Nenhum ficheiro seleccionado"
+
+#: pytrainer/gui/windowimportdata.py:162
+msgid "Configure"
+msgstr "Configurar"
+
+#: pytrainer/gui/windowimportdata.py:163
+msgid "Run"
+msgstr "Executar"
+
+#: pytrainer/gui/windowimportdata.py:171
+msgid "Disabled"
+msgstr "Desactivado"
+
+#: pytrainer/gui/windowimportdata.py:173
+msgid "Enabled"
+msgstr "Activado"
+
+#: pytrainer/gui/windowimportdata.py:253
+msgid "GPS device found"
+msgstr "Encontrado dispositivo GPS"
+
+#: pytrainer/gui/windowimportdata.py:256
+msgid "GPS device <b>not</b> found"
+msgstr "<b>Não foi</b> encontrado dispositivo GPS"
+
+#: pytrainer/gui/windowimportdata.py:263
+msgid "This tool was not found on the system"
+msgstr "Esta ferramenta não foi encontrada no sistema"
+
+#: pytrainer/gui/windowimportdata.py:265
+msgid " Homepage"
+msgstr " Homepage"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "File"
+msgstr "Ficheiro"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Type"
+msgstr "Tipo"
+
+#: pytrainer/gui/windowimportdata.py:318
+msgid "Activities"
+msgstr "Actividades"
+
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+msgid "Start Time"
+msgstr "Hora de Início"
+
+#: pytrainer/gui/windowimportdata.py:353
+#: pytrainer/gui/windowrecord.py:210
+msgid "Duration"
+msgstr "Duração"
+
+#: pytrainer/gui/windowimportdata.py:499
+msgid "Imported into database"
+msgstr "Importado para a base de dados"
+
+#: pytrainer/gui/windowimportdata.py:543
+#: pytrainer/gui/windowextensions.py:81
+#: pytrainer/gui/windowplugins.py:80
+#, python-format
+msgid "%s settings"
+msgstr "configurações %s"
+
+#: pytrainer/gui/windowimportdata.py:558
+#: pytrainer/gui/windowextensions.py:70
+#: pytrainer/gui/windowplugins.py:71
+#: pytrainer/gui/windowplugins.py:95
+msgid "Disable"
+msgstr "Desligar"
+
+#: pytrainer/gui/windowimportdata.py:559
+#: pytrainer/gui/windowextensions.py:72
+#: pytrainer/gui/windowplugins.py:69
+#: pytrainer/gui/windowplugins.py:96
+msgid "Enable"
+msgstr "Ligar"
+
+#: pytrainer/gui/windowimportdata.py:566
+#: pytrainer/gui/windowplugins.py:103
+msgid "Ok"
+msgstr "Ok"
+
+#: pytrainer/gui/windowimportdata.py:626
+msgid "Saving options"
+msgstr "Opções de gravação"
+
+#: pytrainer/gui/windowimportdata.py:628
+msgid "Options saved"
+msgstr "Opções guardadas"
+
+#: pytrainer/gui/windowimportdata.py:653
+msgid "Importing one activity"
+msgstr "A importar uma actividade"
+
+#: pytrainer/gui/windowimportdata.py:654
+msgid "Imported one activity"
+msgstr "Uma actividade importada"
+
+#: pytrainer/gui/windowimportdata.py:656
+#, python-format
+msgid "Importing %d activities"
+msgstr "A importar %d actividades"
+
+#: pytrainer/gui/windowimportdata.py:657
+#, python-format
+msgid "Imported %d activities"
+msgstr "%d actividades importadas"
+
+#: pytrainer/gui/windowimportdata.py:676
+msgid "Choose a file (or files) to import activities from"
+msgstr "Escolha um ficheiro (ou ficheiros) para fonte de actividades"
+
+#: pytrainer/gui/windowimportdata.py:691
+#: pytrainer/gui/windowimportdata.py:692
+#, python-format
+msgid "Found file of type: %s"
+msgstr "Encontrado ficheiro do tipo: %s"
+
+#: pytrainer/gui/windowimportdata.py:716
+msgid "Found in database"
+msgstr "Encontrado na base de dados"
+
+#: pytrainer/gui/windowimportdata.py:731
+#: pytrainer/gui/windowimportdata.py:732
+#, python-format
+msgid "File %s is of unknown or unsupported file type"
+msgstr "O ficheiro %s é de um tipo desconhecido ou não suportado"
+
+#: pytrainer/gui/windowimportdata.py:805
+#, python-format
+msgid "Column %d"
+msgstr "Coluna %d"
+
+#: pytrainer/gui/drawArea.py:166
+#: pytrainer/extensions/googlemaps.py:127
+#: pytrainer/extensions/osm.py:102
+msgid "min"
+msgstr "min"
+
+#: pytrainer/gui/drawArea.py:410
+msgid "rest"
+msgstr "repouso"
+
+#: pytrainer/gui/windowrecord.py:210
+msgid "GPX File"
+msgstr "Ficheiro GPX"
+
+#: pytrainer/gui/windowprofile.py:47
+msgid "Male"
+msgstr "Masculino"
+
+#: pytrainer/gui/windowprofile.py:48
+msgid "Female"
+msgstr "Feminino"
+
+#: pytrainer/gui/windowprofile.py:65
+msgid "MET"
+msgstr "MET"
+
+#: pytrainer/gui/windowprofile.py:314
+msgid "Sport Creation Error"
+msgstr "Erro ao Criar Desporto"
+
+#: pytrainer/gui/equipment.py:101
+msgid "Usage"
+msgstr "Utilização"
+
+#: pytrainer/gui/dialogselecttrack.py:40
+msgid "Track Name"
+msgstr "Nome da Pista"
+
+#: pytrainer/gui/drawGraph.py:170
+msgid "Athlete Data"
+msgstr "Dados de Atleta"
+
+#: pytrainer/gui/windowextensions.py:112
+#: pytrainer/gui/windowextensions.py:125
+msgid "OK"
+msgstr "OK"
+
+#: pytrainer/recordgraph.py:134
+#: pytrainer/daygraph.py:52
+msgid "Height (m)"
+msgstr "Altura (m)"
+
+#: pytrainer/recordgraph.py:134
+#: pytrainer/daygraph.py:52
+msgid "Stage Profile"
+msgstr "Definir Perfil"
+
+#: pytrainer/recordgraph.py:136
+msgid "Speed (Km/h)"
+msgstr "Velocidade (Km/h)"
+
+#: pytrainer/recordgraph.py:138
+#: pytrainer/lib/activity.py:324
+#: pytrainer/lib/activity.py:434
+#: pytrainer/lib/activity.py:436
+msgid "Pace"
+msgstr "Ritmo"
+
+#: pytrainer/recordgraph.py:140
+#: pytrainer/heartrategraph.py:36
+#: pytrainer/daygraph.py:56
+msgid "Beats (bpm)"
+msgstr "Pulsações (ppm)"
+
+#: pytrainer/recordgraph.py:142
+msgid "Cadence (rpm)"
+msgstr "Cadência (rpm)"
+
+#: pytrainer/recordgraph.py:142
+#: pytrainer/lib/activity.py:462
+#: pytrainer/lib/activity.py:464
+msgid "Cadence"
+msgstr "Cadência"
+
+#: pytrainer/recordgraph.py:144
+msgid "Beats (%)"
+msgstr "Batidas (%)"
+
+#: pytrainer/recordgraph.py:146
+msgid "Zone"
+msgstr "Zona"
+
+#: pytrainer/profile.py:114
+msgid "Moderate activity"
+msgstr "Actividade moderada"
+
+#: pytrainer/profile.py:115
+msgid "Weight Control"
+msgstr "Controlo de Peso"
+
+#: pytrainer/profile.py:116
+msgid "Aerobic"
+msgstr "Aeróbica"
+
+#: pytrainer/profile.py:117
+msgid "Anaerobic"
+msgstr "Anaeróbica"
+
+#: pytrainer/profile.py:118
+msgid "VO2 MAX"
+msgstr "Máx VO2"
+
+#: pytrainer/lib/listview.py:32
+msgid "All Time"
+msgstr "Desde sempre"
+
+#: pytrainer/lib/listview.py:32
+msgid "Last 4 Weeks"
+msgstr "Últimas 4 Semanas"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 6 Months"
+msgstr "Últimos 6 Meses"
+
+#: pytrainer/lib/listview.py:33
+msgid "Last 12 Months"
+msgstr "Últimos 12 Meses"
+
+#: pytrainer/lib/listview.py:36
+msgid "<1 Hour"
+msgstr "<1 Hora"
+
+#: pytrainer/lib/listview.py:37
+msgid "1-2 Hours"
+msgstr "1-2 Horas"
+
+#: pytrainer/lib/listview.py:38
+msgid ">2 Hours"
+msgstr ">2 Horas"
+
+#: pytrainer/lib/gpx.py:129
+msgid "No Name"
+msgstr "Sem Nome"
+
+#: pytrainer/lib/gpx.py:137
+msgid "No Data"
+msgstr "Sem Dados"
+
+#: pytrainer/lib/activity.py:200
+msgid "feet"
+msgstr "pés"
+
+#: pytrainer/lib/activity.py:322
+msgid "Pace by Lap"
+msgstr "Ritmo por Volta"
+
+#: pytrainer/lib/activity.py:328
+#: pytrainer/lib/activity.py:339
+#: pytrainer/lib/activity.py:411
+#: pytrainer/lib/activity.py:421
+#: pytrainer/lib/activity.py:430
+#: pytrainer/lib/activity.py:439
+#: pytrainer/lib/activity.py:448
+#: pytrainer/lib/activity.py:458
+#: pytrainer/lib/activity.py:467
+#: pytrainer/lib/activity.py:529
+msgid "Time (seconds)"
+msgstr "Tempo (segundos)"
+
+#: pytrainer/lib/activity.py:333
+msgid "Speed by Lap"
+msgstr "Velocidade por Volta"
+
+#: pytrainer/lib/activity.py:405
+#: pytrainer/lib/activity.py:407
+msgid "Elevation"
+msgstr "Elevação"
+
+#: pytrainer/lib/activity.py:416
+#: pytrainer/lib/activity.py:418
+msgid "Corrected Elevation"
+msgstr "Elevação Corrigida"
+
+#: pytrainer/lib/activity.py:453
+#, python-format
+msgid "Heart Rate (% of max)"
+msgstr "Ritmo Cardíaco (% do máx.)"
+
+#: pytrainer/lib/activity.py:455
+msgid "%"
+msgstr "%"
+
+#: pytrainer/lib/activity.py:464
+msgid "rpm"
+msgstr "rpm"
+
+#: pytrainer/lib/activity.py:523
+msgid "Heart Rate zone"
+msgstr "Zona do Ritmo Cardíaco"
+
+#: pytrainer/monthgraph.py:26
+#: pytrainer/monthgraph.py:27
+#: pytrainer/monthgraph.py:28
+#: pytrainer/monthgraph.py:29
+#: pytrainer/monthgraph.py:30
+msgid "day"
+msgstr "dia"
+
+#: pytrainer/monthgraph.py:26
+#: pytrainer/weekgraph.py:28
+msgid "Daily Distance"
+msgstr "Distância Diária"
+
+#: pytrainer/monthgraph.py:27
+#: pytrainer/totalgraph.py:25
+#: pytrainer/yeargraph.py:27
+#: pytrainer/weekgraph.py:29
+msgid "Time (hours)"
+msgstr "Tempo (horas)"
+
+#: pytrainer/monthgraph.py:27
+#: pytrainer/weekgraph.py:29
+msgid "Daily Time"
+msgstr "Tempo Diário"
+
+#: pytrainer/monthgraph.py:28
+#: pytrainer/totalgraph.py:26
+#: pytrainer/yeargraph.py:28
+#: pytrainer/weekgraph.py:30
+msgid "Average Heart Rate (bpm)"
+msgstr "Ritmo Cardíaco Médio (ppm)"
+
+#: pytrainer/monthgraph.py:28
+#: pytrainer/weekgraph.py:30
+msgid "Daily Average Heart Rate"
+msgstr "Ritmo Cardíaco Médio Diário"
+
+#: pytrainer/monthgraph.py:29
+#: pytrainer/weekgraph.py:31
+msgid "Daily Average Speed"
+msgstr "Velocidade Média Diária"
+
+#: pytrainer/monthgraph.py:30
+#: pytrainer/weekgraph.py:32
+msgid "Daily Calories"
+msgstr "Calorias Diárias"
+
+#: pytrainer/totalgraph.py:24
+#: pytrainer/totalgraph.py:25
+#: pytrainer/totalgraph.py:26
+#: pytrainer/totalgraph.py:27
+#: pytrainer/totalgraph.py:28
+msgid "year"
+msgstr "ano"
+
+#: pytrainer/totalgraph.py:24
+msgid "Annual Distance"
+msgstr "Distância Anual"
+
+#: pytrainer/totalgraph.py:25
+msgid "Annual Time"
+msgstr "Tempo anual"
+
+#: pytrainer/totalgraph.py:26
+msgid "Annual Average Heart Rate"
+msgstr "Ritmo Cardíaco Médio Anual"
+
+#: pytrainer/totalgraph.py:27
+msgid "Annual Average Speed"
+msgstr "Velocidade Média Anual"
+
+#: pytrainer/totalgraph.py:28
+msgid "Annual Calories"
+msgstr "Calorias Anuais"
+
+#: pytrainer/athlete.py:52
+msgid "lb"
+msgstr "lb"
+
+#: pytrainer/athlete.py:54
+msgid "kg"
+msgstr "kg"
+
+#: pytrainer/record.py:56
+msgid "Modify details before importing"
+msgstr "Modificar detalhes antes de importar"
+
+#: pytrainer/record.py:466
+msgid "pyTrainer can't import data from your gpx file"
+msgstr "O pyTrainer não pode importar dados do seu ficheiro gpx"
+
+#: pytrainer/yeargraph.py:26
+#: pytrainer/yeargraph.py:27
+#: pytrainer/yeargraph.py:28
+#: pytrainer/yeargraph.py:29
+#: pytrainer/yeargraph.py:30
+msgid "month"
+msgstr "mês"
+
+#: pytrainer/yeargraph.py:26
+msgid "Monthly Distance"
+msgstr "Distância Mensal"
+
+#: pytrainer/yeargraph.py:27
+msgid "Monthly Time"
+msgstr "Tempo Mensal"
+
+#: pytrainer/yeargraph.py:28
+msgid "Monthly Average Heart Rate"
+msgstr "Ritmo Cardíaco Médio Mensal"
+
+#: pytrainer/yeargraph.py:29
+msgid "Monthly Average Speed"
+msgstr "Velocidade Média Mensal"
+
+#: pytrainer/yeargraph.py:30
+msgid "Monthly Calories"
+msgstr "Calorias Médias"
+
+#: pytrainer/waypoint.py:87
+msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file"
+msgstr "O ficheiro gpx contém aparentemente registos de vários dias. Talvez seja necessário editar o ficheiro gpx"
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity (Km/h)"
+msgstr "Velocidade (Km/h)"
+
+#: pytrainer/daygraph.py:54
+msgid "Velocity"
+msgstr "Velocidade"
+
+#: pytrainer/main.py:467
+msgid "Delete this waypoint?"
+msgstr "Apagar este ponto?"
+
+#: import/file_gpxplus.py:41
+msgid "GPS eXchange file"
+msgstr "Ficheiro GPS eXchange"
+
+#: import/file_kml20.py:47
+msgid "Geodistance kml version 2.0 file"
+msgstr "Ficheiro Geodistance kml versão 2.0"
+
+#: import/file_garmintcxv1.py:45
+msgid "Garmin training center database file version 1"
+msgstr "Ficheiro de base de dados do centro de treino Garmin, versão 1"
+
+#: import/file_gpxplusNokia.py:41
+msgid "Nokia Export - GPS eXchange file"
+msgstr "Nokia Export - ficheiro GPS eXchange"
+
+#: import/tool_gpsbabel.py:37
+msgid "GPSBabel"
+msgstr "GPSBabel"
+
+#: import/tool_garmintools.py:37
+msgid "Garmintools"
+msgstr "Garmintools"
+
+#: import/tool_gant.py:37
+msgid "Gant"
+msgstr "Gant"
+
+#: import/file_garmintools.py:44
+msgid "Garmin tools dump file"
+msgstr "Ficheiro dump de Garmin tools"
+
+#: import/file_garmintcxv2.py:44
+msgid "Garmin training center database file version 2"
+msgstr "Ficheiro de base de dados do centro de treino Garmin, versão 2"
+
+#: extensions/fixelevation/fixelevation.py:129
+msgid "Elevation Correction Complete"
+msgstr "Correcção de Elevações Completa"
+
+#: extensions/openstreetmap/openstreetmap.py:82
+msgid ""
+"Posting GPX trace to Openstreetmap\n"
+"\n"
+"Please wait this could take several minutes"
+msgstr ""
+"A enviar percurso GPX para o Openstreetmap\n"
+"\n"
+"Por favor aguarde, isto pode demorar alguns minutos"
+
+#: extensions/openstreetmap/openstreetmap.py:84
+msgid "Openstreetmap Extension Processing"
+msgstr "A processar Extensão Openstreetmap"
+
+#: extensions/openstreetmap/openstreetmap.py:102
+msgid "Openstreetmap Extension Upload Complete"
+msgstr "Envio da Extensão Openstreetmap completo"
+
+#: extensions/openstreetmap/openstreetmap.py:107
+msgid "Error while uploading file to OSM: "
+msgstr "Erro ao enviar ficheiro para o OSM: "
+
+#: extensions/openstreetmap/openstreetmap.py:109
+msgid "Openstreetmap Extension Error"
+msgstr "Erro na Extensão Openstreetmap"
+
+#: extensions/openstreetmap/openstreetmap.py:117
+msgid "Please add any additional information for this upload"
+msgstr "Por favor, acrescente informações adicionais para este envio"
+
+#: extensions/openstreetmap/openstreetmap.py:204
+msgid "Error"
+msgstr "Erro"
+
+#: extensions/openstreetmap/openstreetmap.py:247
+msgid "Error while saving extension configuration"
+msgstr "Erro ao guardar configuração da extensão"
+
+#: extensions/wordpress/wordpress.py:46
+msgid "Posting to Wordpress blog"
+msgstr "A enviar para blog Wordpress"
+
+#: extensions/wordpress/wordpress.py:48
+msgid "Wordpress Extension Processing"
+msgstr "A processar Extensão Wordpress"
+
+#: extensions/wordpress/wordpress.py:144
+msgid "Wordpress Extension Upload Complete"
+msgstr "Envio da Extensão Wordpress Completo"
+
diff --git a/locale/sv/LC_MESSAGES/Makefile b/locale/sv/LC_MESSAGES/Makefile
new file mode 100644
index 0000000..7bb0e02
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/Makefile
@@ -0,0 +1,7 @@
+default:
+	msgfmt pytrainer_sv.po -o ./pytrainer.mo
+
+merge:
+	msgmerge pytrainer_sv.po pytrainer_sv.po_new > pytrainer_sv.po.tmp
+	mv pytrainer_sv.po.tmp pytrainer_sv.po
+	rm pytrainer_sv.po_new
diff --git a/locale/es/LC_MESSAGES/pytrainer_es.po b/locale/sv/LC_MESSAGES/pytrainer_sv.po
similarity index 67%
copy from locale/es/LC_MESSAGES/pytrainer_es.po
copy to locale/sv/LC_MESSAGES/pytrainer_sv.po
index d9156ee..4b6fd1b 100644
--- a/locale/es/LC_MESSAGES/pytrainer_es.po
+++ b/locale/sv/LC_MESSAGES/pytrainer_sv.po
@@ -1,249 +1,252 @@
-# Spanish translations for pytrainer package.
-# Copyright (C) 2006 pytrainer COPYRIGHT HOLDER
+# Swedish translations for pytrainer package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the pytrainer package.
-# Fiz Vazquez <vud1 at sindominio.net>, 2006.
+# David García Granda <dgranda at gmail.com>, 2010.
+# Per Medin <per.medin at gmail.com>, 2011.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: pytrainer 1.7.2\n"
+"Project-Id-Version: pytrainer 1.8.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-24 13:39+0100\n"
-"PO-Revision-Date: 2010-11-24 13:43+0100\n"
-"Last-Translator: David Garcia Granda <dgranda at gmail.com>\n"
-"Language-Team: Spanish <es at li.org>\n"
-"Language: es\n"
+"POT-Creation-Date: 2010-12-31 16:41+0100\n"
+"PO-Revision-Date: 2011-01-09 20:27+0100\n"
+"Last-Translator: Per Medin <per.medin at gmail.com>\n"
+"Language-Team: Swedish\n"
+"Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: Sweden\n"
 
 #: glade/calendar.glade:7
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Kalender"
 
 #: glade/equipment.glade:109
 msgid "<b>Equipment List</b>"
-msgstr "<b>Lista de material</b>"
+msgstr "<b>Utrustningslista</b>"
 
 #: glade/equipment.glade:149
 #: glade/equipment.glade:406
 msgid "Description"
-msgstr "Descripción"
+msgstr "Beskrivning"
 
 #: glade/equipment.glade:174
 #: glade/equipment.glade:431
 msgid "Life Expectancy"
-msgstr "Vida útil esperada"
+msgstr ""
 
 #: glade/equipment.glade:211
 #: glade/equipment.glade:467
 msgid "Prior Usage"
-msgstr "Uso anterior"
+msgstr ""
 
 #: glade/equipment.glade:243
 #: glade/equipment.glade:499
 msgid "Active"
-msgstr "Habilitado"
+msgstr "Aktiv"
 
 #: glade/equipment.glade:277
 #: glade/equipment.glade:533
 #: pytrainer/gui/windowimportdata.py:352
 msgid "Notes"
-msgstr "Notas"
+msgstr "Anteckningar"
 
 #: glade/equipment.glade:366
 msgid "<b>Add New Equipment</b>"
-msgstr "<b>Añadir nuevo material</b>"
+msgstr "<b>Lägg till utrustning</b>"
 
 #: glade/equipment.glade:622
 msgid "<b>Edit Equipment</b>"
-msgstr "<b>Editar material</b>"
+msgstr "<b>Redigera utrustning</b>"
 
 #: glade/equipment.glade:651
 msgid "Really delete the equipment item?"
-msgstr "¿Confirma que desea borrar el material?"
+msgstr "Radera utrustningen?"
 
 #: glade/equipment.glade:704
 msgid "<b>Delete Equipment</b>"
-msgstr "<b>Borrar material</b>"
+msgstr "<b>Radera utrustning</b>"
 
 #: glade/extensions.glade:9
 #: glade/pytrainer.glade:163
 msgid "Extensions"
-msgstr "Extensiones"
+msgstr "Tillägg"
 
 #: glade/extensions.glade:54
 msgid "<b>Extension Details</b>"
-msgstr "<b>Detalles de la extensión</b>"
+msgstr "<b>Tilläggs Detaljer</b>"
 
 #: glade/extensions.glade:67
 msgid "name-entry"
-msgstr "Nombre"
+msgstr "namn-inmatning"
 
 #: glade/extensions.glade:82
 #: glade/plugins.glade:144
 #: glade/profile.glade:727
 #: glade/pytrainer.glade:5161
 msgid "Name:"
-msgstr "Nombre:"
+msgstr "Namn:"
 
 #: glade/extensions.glade:96
 #: glade/plugins.glade:115
 msgid "Status:"
-msgstr "Estado:"
+msgstr "Status:"
 
 #: glade/extensions.glade:110
 #: glade/plugins.glade:86
 #: glade/pytrainer.glade:5690
 msgid "Description:"
-msgstr "<b>Descripción:</b>"
+msgstr "Beskrivning"
 
 #: glade/extensions.glade:124
 #: glade/plugins.glade:100
 msgid "status-entry"
-msgstr "Estado"
+msgstr "status-inmatning"
 
 #: glade/extensions.glade:139
 msgid "description-entry"
-msgstr "Descripción"
+msgstr "detalj-imatning"
 
 #: glade/importdata.glade:7
 #: glade/importdata.glade:325
 msgid "Import"
-msgstr "Importar"
+msgstr "Importera"
 
 #: glade/importdata.glade:36
 msgid ""
 "Test 1\n"
 "Test 2"
 msgstr ""
-"Prueba 1\n"
-"Prueba 2"
+"Test 1\n"
+"Test 2"
 
 #: glade/importdata.glade:46
 msgid "<b>Select your GPS device</b>"
-msgstr "<b>Seleccione su dispositivo GPS</b>"
+msgstr "<b>Välj GPS utrustning</b>"
 
 #: glade/importdata.glade:64
 msgid "Import from GPS Device is not yet implemented"
-msgstr "Importar desde dispositivo GPS todavía no disponible"
+msgstr "Import från GPS är ännu inte implementerad"
 
 #: glade/importdata.glade:92
 msgid "<b>Tools</b>"
-msgstr "<b>Herramientas</b>"
+msgstr "<b>Verktyg</b>"
 
 #: glade/importdata.glade:111
 msgid "Rescan"
-msgstr "Examinar de nuevo"
+msgstr "Sök igen"
 
 #: glade/importdata.glade:115
 msgid "Rescan system for available tools"
-msgstr "Buscando de nuevo herramientas disponibles en el sistema"
+msgstr "Sök igenom systemet efter tillgängliga verktyg"
 
 #: glade/importdata.glade:168
 msgid "<b>Import from GPS Device</b>"
-msgstr "<b>Importar desde dispositivo GPS</b>"
+msgstr "<b>Importera från GPS</b>"
 
 #: glade/importdata.glade:221
 msgid "Remove selected files and the associated activities"
-msgstr "Borrar ficheros seleccionados y actividades asociadas"
+msgstr "Radera markerade filer och tillhörande aktiviteter"
 
 #: glade/importdata.glade:239
 msgid "Add files to import activities from"
-msgstr "Añadir ficheros desde los importar actividades"
+msgstr "Lägg till filer att importera aktiviter från"
 
 #: glade/importdata.glade:264
 msgid "<b>Add file(s) to import activities from</b>"
-msgstr "<b>Añadir fichero(s) desde el/los que importar actividades</b>"
+msgstr "<b>Lägg till fil(er) att importera aktiviteter från</b>"
 
 #: glade/importdata.glade:307
 msgid "<b>Select activities to import</b>"
-msgstr "<b>Seleccionar actividades para importar</b>"
+msgstr "<b>Välj aktiviteter att importera</b>"
 
 #: glade/importdata.glade:330
 msgid "Import selected activities"
-msgstr "Importadas %d actividades"
+msgstr "Importera valda aktiviteter"
 
 #: glade/importdata.glade:347
 msgid "Close Import dialog"
-msgstr "Cerrar proceso de importación"
+msgstr "Stäng import dialog"
 
 #: glade/importdata.glade:387
 msgid "<b>Import from File</b>"
-msgstr "<b>Importar desde fichero</b>"
+msgstr "<b>Importera från Fil</b>"
 
 #: glade/importdata.glade:464
 msgid "<b>Plugins</b>"
-msgstr "<b>Plugins</b>"
+msgstr "<b>Tillägg</b>"
 
 #: glade/importdata.glade:491
 msgid "Import from GPS Device"
-msgstr "Importar desde dispositivo GPS"
+msgstr "Importera från GPS"
 
 #: glade/importdata.glade:510
 msgid "Import from File"
-msgstr "Importar desde fichero"
+msgstr "Importera från Fil"
 
 #: glade/importdata.glade:525
 msgid "Launch 'File Select' on start"
-msgstr "Arrancar 'Selección de fichero' en el comienzo"
+msgstr "Aktivera 'Välj Fil' vid start"
 
 #: glade/importdata.glade:530
 msgid "Automatically start the file selection dialog"
-msgstr "Lanzar proceso de selección de fichero automáticamente"
+msgstr "Starta automatiskt väl fil dialogen"
 
 #: glade/importdata.glade:546
 #: glade/plugins.glade:9
 msgid "Plugins"
-msgstr "Plugins"
+msgstr "Tillägg"
 
 #: glade/importdata.glade:572
 msgid "<b>Default to Tab</b>"
-msgstr "<b>Pestaña por defecto</b>"
+msgstr "<b>Standardinställning</b>"
 
 #: glade/importdata.glade:595
 msgid "Reset"
-msgstr "Resetear"
+msgstr "Återställ"
 
 #: glade/importdata.glade:611
 msgid "Save"
-msgstr "Guardar"
+msgstr "Spara"
 
 #: glade/importdata.glade:670
 msgid "<b>Options</b>"
-msgstr "<b>Opciones</b>"
+msgstr "<b>Alternativ</b>"
 
 #: glade/importdata.glade:702
 msgid "<b>Select file to import from</b>"
-msgstr "<b>Seleccionar fichero para importar</b>"
+msgstr "<b>Välj fil att importera från</b>"
 
 #: glade/importdata.glade:731
 msgid "Tab"
-msgstr "Pestaña"
+msgstr "Tabb"
 
 #: glade/importdata.glade:746
 msgid "Comma"
-msgstr "Comma"
+msgstr "Komma"
 
 #: glade/importdata.glade:763
 msgid "Other"
-msgstr "Otro"
+msgstr "Annat"
 
 #: glade/importdata.glade:799
 msgid "Read File"
-msgstr "Leer archivo"
+msgstr "Läs Fil"
 
 #: glade/importdata.glade:820
 msgid "<b>File delimiter</b>"
-msgstr "<b>Delimitador en el archivo</b>"
+msgstr "<b>Filavgränsare</b>"
 
 #: glade/importdata.glade:864
-#: pytrainer/gui/windowmain.py:109
-#: pytrainer/gui/windowmain.py:124
-#: pytrainer/gui/windowmain.py:1147
+#: pytrainer/gui/windowmain.py:111
+#: pytrainer/gui/windowmain.py:126
+#: pytrainer/gui/windowmain.py:1143
 #: pytrainer/gui/dialogselecttrack.py:40
 msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
 
 #: glade/importdata.glade:877
 #: glade/importdata.glade:918
@@ -261,7 +264,7 @@ msgstr "Fecha"
 #: glade/importdata.glade:1278
 #: glade/importdata.glade:1293
 msgid "Exclude"
-msgstr "Descartar"
+msgstr "Undanta"
 
 #: glade/importdata.glade:892
 #: pytrainer/recordgraph.py:134
@@ -279,94 +282,94 @@ msgstr "Descartar"
 #: pytrainer/daygraph.py:56
 #: pytrainer/weekgraph.py:115
 msgid "Distance (km)"
-msgstr "Distancia (km)"
+msgstr "Distans (km)"
 
 #: glade/importdata.glade:905
 msgid "Duration (sec)"
-msgstr "Duración (s)"
+msgstr "Varaktighet (s)"
 
 #: glade/importdata.glade:947
 msgid "<b>PyTrainer Field</b>"
-msgstr "<b>Campo en PyTrainer</b>"
+msgstr "<b>PyTrainer Fält</b>"
 
 #: glade/importdata.glade:958
 msgid "<b>File Column</b>"
-msgstr "<b>Columna en el archivo</b>"
+msgstr "<b>Filkolumn</b>"
 
 #: glade/importdata.glade:972
-#: pytrainer/gui/windowmain.py:108
-#: pytrainer/gui/windowmain.py:1146
+#: pytrainer/gui/windowmain.py:110
+#: pytrainer/gui/windowmain.py:1142
 msgid "Title"
-msgstr "Título"
+msgstr "Titel"
 
 #: glade/importdata.glade:985
 msgid "Descent (m)"
-msgstr "Descenso (m)"
+msgstr "Sluttning (m)"
 
 #: glade/importdata.glade:998
 msgid "Accent (m)"
-msgstr "Ascenso (m)"
+msgstr "Stigning (m)"
 
 #: glade/importdata.glade:1011
 msgid "Calories (kcal)"
-msgstr "Calorías (kcal)"
+msgstr "Kalorier (kcal)"
 
 #: glade/importdata.glade:1024
 msgid "Max Speed (km/h)"
-msgstr "Velocidad Máx. (km/h)"
+msgstr "Maxhastighet (km/h)"
 
 #: glade/importdata.glade:1037
 #: pytrainer/monthgraph.py:76
 #: pytrainer/yeargraph.py:76
 #: pytrainer/weekgraph.py:121
 msgid "Average Speed (km/h)"
-msgstr "Velocidad media (km/h)"
+msgstr "Medelhastighet (km/h)"
 
 #: glade/importdata.glade:1050
 #: glade/pytrainer.glade:277
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:111
-#: pytrainer/gui/windowmain.py:1149
+#: pytrainer/gui/windowmain.py:105
+#: pytrainer/gui/windowmain.py:113
+#: pytrainer/gui/windowmain.py:1145
 #: pytrainer/gui/windowimportdata.py:352
 #: pytrainer/gui/windowrecord.py:210
 #: pytrainer/gui/windowprofile.py:59
 msgid "Sport"
-msgstr "Deporte"
+msgstr "Träningsform"
 
 #: glade/importdata.glade:1063
 msgid "Average Heartrate (bpm)"
-msgstr "Pulsaciones medias (ppm)"
+msgstr "Snittpuls (slag/min)"
 
 #: glade/importdata.glade:1076
 msgid "Max Heartrate (bpm)"
-msgstr "Pulsaciones máximas (ppm)"
+msgstr "Maxpuls (slag/min)"
 
 #: glade/importdata.glade:1089
 #: pytrainer/recordgraph.py:138
 msgid "Pace (min/km)"
-msgstr "Ritmo (min/km)"
+msgstr "Tempo (min/km)"
 
 #: glade/importdata.glade:1102
 msgid "Max Pace (min/km)"
-msgstr "Ritmo máximo(min/km)"
+msgstr "Maxtempo (min/km)"
 
 #: glade/importdata.glade:1115
 #: glade/newrecord.glade:1094
 msgid "Comments"
-msgstr "Comentarios"
+msgstr "Kommentarer"
 
 #: glade/importdata.glade:1309
 msgid "Force sport to:"
-msgstr "Forzar deporte a:"
+msgstr "Tvinga aktivitet till:"
 
 #: glade/importdata.glade:1323
 #: glade/newrecord.glade:404
 msgid " "
-msgstr " "
+msgstr ""
 
 #: glade/importdata.glade:1394
 msgid "<b>Map Columns</b>"
-msgstr "<b>Mapear columnas</b>"
+msgstr ""
 
 #: glade/importdata.glade:1414
 msgid ""
@@ -376,48 +379,43 @@ msgid ""
 "3) Map columns in the file to pytrainer data elements (Date is required)\n"
 "4) Click 'Import Data'</small>"
 msgstr ""
-"<small>Se trata de importar ficheros delimitados de manera experimental\n"
-"1) Seleccione un fichero\n"
-"2) Pulse 'Leer fichero\" para analizarlo\n"
-"3) Asigne las columnas del fichero a elementos de datos de Pytrainer (la fecha obligatoria)\n"
-"4) Pulse 'Importar datos'</small>"
 
 #: glade/importdata.glade:1427
 msgid "Import Data"
-msgstr "Importar datos"
+msgstr "Importera Data"
 
 #: glade/importdata.glade:1467
 msgid "<b>Import from CSV</b>"
-msgstr "<b>Importar desde fichero CSV</b>"
+msgstr "<b>Importera från CSV fil</b>"
 
 #: glade/newrecord.glade:7
-#: pytrainer/gui/windowmain.py:1769
+#: pytrainer/gui/windowmain.py:1793
 msgid "New Entry"
-msgstr "Nueva entrada"
+msgstr "Ny Inmatning"
 
 #: glade/newrecord.glade:61
 msgid "Title:"
-msgstr "Título:"
+msgstr "Titel:"
 
 #: glade/newrecord.glade:85
 msgid "GPX File:"
-msgstr "Archivo GPX:"
+msgstr "GPX fil:"
 
 #: glade/newrecord.glade:129
 msgid "Calculate Values"
-msgstr "Calcular valores"
+msgstr "Beräkna värden"
 
 #: glade/newrecord.glade:149
 msgid "Sport:"
-msgstr "Deporte:"
+msgstr "Träningsform:"
 
 #: glade/newrecord.glade:184
 msgid "<b>Main</b>"
-msgstr "<b>Principal</b>"
+msgstr "<b>Huvud</b>"
 
 #: glade/newrecord.glade:221
 msgid "Distance (Km):"
-msgstr "Distancia (km):"
+msgstr "Sträcka (km):"
 
 #: glade/newrecord.glade:230
 #: glade/newrecord.glade:355
@@ -426,11 +424,11 @@ msgstr "Distancia (km):"
 #: glade/newrecord.glade:958
 #: glade/profile.glade:1462
 msgid "Calculate"
-msgstr "Calcular"
+msgstr "Beräkna"
 
 #: glade/newrecord.glade:248
 msgid "Duration:"
-msgstr "Duración:"
+msgstr "Tid:"
 
 #: glade/newrecord.glade:279
 #: glade/newrecord.glade:306
@@ -439,11 +437,11 @@ msgstr ":"
 
 #: glade/newrecord.glade:376
 msgid "Date:"
-msgstr "Fecha:"
+msgstr "Datum:"
 
 #: glade/newrecord.glade:445
 msgid "Start Time:"
-msgstr "Hora de comienzo:"
+msgstr "Starttid:"
 
 #: glade/newrecord.glade:461
 msgid "12:00:00"
@@ -452,121 +450,121 @@ msgstr "12:00:00"
 #: glade/newrecord.glade:486
 #: glade/profile.glade:1500
 msgid "<b>General</b>"
-msgstr "<b>General:</b>"
+msgstr "<b>Allmän</b>"
 
 #: glade/newrecord.glade:522
 msgid "Max (km/h):"
-msgstr "Punta (km/h)"
+msgstr "Max (km/h):"
 
 #: glade/newrecord.glade:547
 msgid "Average (km/h)"
-msgstr "Media (km/h)"
+msgstr "Medel (km/h)"
 
 #: glade/newrecord.glade:593
 msgid "<b>Speed</b>"
-msgstr "<b>Velocidad</b>"
+msgstr "<b>Hastighet</b>"
 
 #: glade/newrecord.glade:612
 msgid "Quick Entry"
-msgstr "Entrada"
+msgstr "Snabbinmatning"
 
 #: glade/newrecord.glade:644
 msgid "Max (min/km):"
-msgstr "Max (min/km)"
+msgstr "Max (min/km):"
 
 #: glade/newrecord.glade:671
 msgid "Pace (min/km):"
-msgstr "Ritmo (min/km)"
+msgstr "Tempo (min/km):"
 
 #: glade/newrecord.glade:718
 msgid "<b>Pace</b>"
-msgstr "<b>Ritmo</b>"
+msgstr "<b>Tempo</b>"
 
 #: glade/newrecord.glade:754
 msgid "Ascent:"
-msgstr "Ascenso:"
+msgstr "Stigning:"
 
 #: glade/newrecord.glade:780
 msgid "Descent:"
-msgstr "Descenso:"
+msgstr "Sluttning:"
 
 #: glade/newrecord.glade:813
 msgid "<b>Accumulated Altitude Change</b>"
-msgstr "<b>Desnivel acumulado:</b>"
+msgstr "<b>Ackumulerad höjdskillnad</b>"
 
 #: glade/newrecord.glade:850
 msgid "Max (bpm):"
-msgstr "Pulsaciones máximas"
+msgstr "Max (slag/min):"
 
 #: glade/newrecord.glade:862
 msgid "Heart rate:"
-msgstr "Pulsaciones"
+msgstr "Puls:"
 
 #: glade/newrecord.glade:902
-#: pytrainer/gui/windowmain.py:115
-#: pytrainer/gui/windowmain.py:1153
+#: pytrainer/gui/windowmain.py:117
+#: pytrainer/gui/windowmain.py:1149
 #: pytrainer/monthgraph.py:78
 #: pytrainer/yeargraph.py:78
 #: pytrainer/weekgraph.py:123
 msgid "Calories"
-msgstr "Calorías"
+msgstr "Kalorier"
 
 #: glade/newrecord.glade:931
 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>"
+msgstr "<small><b>Notera:</b> För att beräkna kalorier så måste träningsform väljas (i Inställningar->Träningsform) </small>"
 
 #: glade/newrecord.glade:1005
 msgid "<b>Heart Rate</b>"
-msgstr "<b>Pulsaciones</b>"
+msgstr "<b>Hjärtfrekvens</b>"
 
 #: glade/newrecord.glade:1027
 msgid "Advanced"
-msgstr "Avanzado"
+msgstr "Avancerad"
 
 #: glade/newrecord.glade:1079
 msgid "<b>Comments</b>"
-msgstr "<b>Comentarios</b>"
+msgstr "<b>Kommentarer</b>"
 
 #: glade/newrecord.glade:1134
 msgid "<i>There are no active equipment items.</i>"
-msgstr "<i>No hay piezas de material activas</i>"
+msgstr "<i>Det finns ingen aktiv utrustning.</i>"
 
 #: glade/newrecord.glade:1188
 msgid "<b>Associated Equipment</b>"
-msgstr "<b>Material asociado</b>"
+msgstr "<b>Associerad utrustning</b>"
 
 #: glade/newrecord.glade:1203
 #: glade/profile.glade:1360
 msgid "Equipment"
-msgstr "Equipamiento"
+msgstr "Utrustning"
 
 #: glade/plugins.glade:53
 msgid "<b>Plugin Details</b>"
-msgstr "<b>Detalles del plugin</b>"
+msgstr "<b>Tilläggsdetaljer</b>"
 
 #: glade/plugins.glade:68
 msgid "description-entry "
-msgstr "Descripción"
+msgstr "beskrivningsinmatning"
 
 #: glade/plugins.glade:129
 msgid "nameEntry"
-msgstr "Nombre entrada"
+msgstr "namnInmatning"
 
 #: glade/profile.glade:7
 msgid "Preferences"
-msgstr "Preferencias"
+msgstr "Inställningar"
 
 #: glade/profile.glade:37
 msgid "Metric system"
-msgstr "Sistema métrico"
+msgstr "Metriska"
 
 #: glade/profile.glade:53
 msgid "U.S. customary units"
-msgstr "Sistema americano"
+msgstr "Amerikanska"
 
 #: glade/profile.glade:74
 msgid "<b>System of Measurement</b>"
-msgstr "<b>Sistema de medida</b>"
+msgstr "<b>Måttenheter</b>"
 
 #: glade/profile.glade:103
 #: glade/pytrainer.glade:2023
@@ -580,182 +578,182 @@ msgstr "Open Street Map"
 
 #: glade/profile.glade:140
 msgid "<b>Default Map Viewer</b>"
-msgstr "<b>Mapa por defecto</b>"
+msgstr "<b>Förvald kartvisare</b>"
 
 #: glade/profile.glade:176
 msgid "Database type:"
-msgstr "Tipo de base de datos"
+msgstr "Databas typ:"
 
 #: glade/profile.glade:187
 msgid "Database host:"
-msgstr "Servidor base de datos"
+msgstr "Databas värd:"
 
 #: glade/profile.glade:213
 msgid "Database name:"
-msgstr "Nombre base de datos"
+msgstr "Databas namn:"
 
 #: glade/profile.glade:252
 msgid "Database user:"
-msgstr "Usuario base de datos"
+msgstr "Databas användare:"
 
 #: glade/profile.glade:267
 msgid "Database pass:"
-msgstr "Contraseña base de datos"
+msgstr "Databas lösenord:"
 
 #: glade/profile.glade:318
 msgid "<b>Database</b>"
-msgstr "<b>Base de datos:</b>"
+msgstr "<b>Databas</b>"
 
 #: glade/profile.glade:340
 msgid "General"
-msgstr "General"
+msgstr ""
 
 #: glade/profile.glade:369
 msgid "User name:"
-msgstr "Nombre de usuario:"
+msgstr "Användare:"
 
 #: glade/profile.glade:380
 msgid "Gender:"
-msgstr "Género:"
+msgstr "Kön:"
 
 #: glade/profile.glade:407
 #: glade/pytrainer.glade:5186
 msgid "Height:"
-msgstr "Altura:"
+msgstr "Längd:"
 
 #: glade/profile.glade:447
 #: glade/pytrainer.glade:5173
 msgid "Date of birth:"
-msgstr "Fecha de nacimiento:"
+msgstr "Födelsedatum:"
 
 #: glade/profile.glade:520
 msgid "Weight:"
-msgstr "Peso:"
+msgstr "Vikt:"
 
 #: glade/profile.glade:542
 #: glade/pytrainer.glade:5248
 msgid "<b>Athlete Details</b>"
-msgstr "<b>Datos personales</b>"
+msgstr "<b>Användardata</b>"
 
 #: glade/profile.glade:557
 #: glade/pytrainer.glade:5351
 msgid "Athlete"
-msgstr "Atleta"
+msgstr "Användare"
 
 #: glade/profile.glade:671
 msgid "<b>Sport List</b>"
-msgstr "<b>Lista de deportes</b>"
+msgstr "<b>Aktivitetstyper</b>"
 
 #: glade/profile.glade:683
 msgid "llist"
-msgstr "lista"
+msgstr ""
 
 #: glade/profile.glade:738
 msgid "M.E.T.:"
-msgstr "M.E.T.:"
+msgstr ""
 
 #: glade/profile.glade:765
 msgid "Extra Weight:"
-msgstr "Peso extra:"
+msgstr "Extra vikt:"
 
 #: glade/profile.glade:801
 #: glade/profile.glade:1181
 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"
+msgstr ""
 
 #: glade/profile.glade:821
 msgid "Maximum Pace:"
-msgstr "Ritmo más rápido:"
+msgstr "Maxtempo:"
 
 #: glade/profile.glade:913
 msgid "<b>Add New Sport</b>"
-msgstr "<b>Añadir nuevo deporte</b>"
+msgstr "<b>Lägg till ny aktivitet</b>"
 
 #: glade/profile.glade:928
 msgid "new"
-msgstr "nuevo"
+msgstr "ny"
 
 #: glade/profile.glade:959
 msgid ""
 "Deleting a sport removes associated records.\n"
 "Continue?"
 msgstr ""
-"Si borra un deporte elimina sus registros asociados.\n"
-"¿Desea continuar?"
+"Att radera en aktivitet raderar alla poster med denna aktivitet.\n"
+"Fortsätt?"
 
 #: glade/profile.glade:1041
 msgid "<b>Delete Sport</b>"
-msgstr "<b>Borrar deporte</b>"
+msgstr "<b>Radera Aktivitet</b>"
 
 #: glade/profile.glade:1073
 msgid "delete"
-msgstr "borrar"
+msgstr "radera"
 
 #: glade/profile.glade:1106
 msgid "Name"
-msgstr "Nombre"
+msgstr "Namn"
 
 #: glade/profile.glade:1129
 msgid "M.E.T."
-msgstr "M.E.T."
+msgstr ""
 
 #: glade/profile.glade:1156
 #: pytrainer/gui/windowprofile.py:59
 msgid "Extra Weight"
-msgstr "Peso extra"
+msgstr "Extra vikt"
 
 #: glade/profile.glade:1201
 msgid "Maxiumum Pace"
-msgstr "Ritmo más rápido:"
+msgstr "Maxtempo"
 
 #: glade/profile.glade:1289
 msgid "<b>Edit Sport</b>"
-msgstr "<b>Editar deporte</b>"
+msgstr "<b>Redigera Aktivitet</b>"
 
 #: glade/profile.glade:1300
 msgid "<b>lalaal</b>"
-msgstr "<b>lalaal</b>"
+msgstr ""
 
 #: glade/profile.glade:1322
 msgid "edit"
-msgstr "editar"
+msgstr "redigera"
 
 #: glade/profile.glade:1338
 msgid "Sports"
-msgstr "Deportes"
+msgstr "Aktiviteter"
 
 #: glade/profile.glade:1393
 msgid "Maximum heart rate:"
-msgstr "Pulsaciones máximas:"
+msgstr "Maxpuls:"
 
 #: glade/profile.glade:1404
 msgid "Resting heart rate:"
-msgstr "Pulsaciones en reposo:"
+msgstr "Vilopuls:"
 
 #: glade/profile.glade:1449
 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>"
+msgstr "<small><b>Notera:</b> Maxpuls är beräknad genom att subtraera din ålder från 220. </small>"
 
 #: glade/profile.glade:1536
 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>"
+msgstr "<small><b>NOTERA:</b> för att använda Karvonen metoden måste vilopulsen anges.</small>"
 
 #: glade/profile.glade:1549
 msgid "Percentages based method"
-msgstr "Basado en porcentajes"
+msgstr "Procentbaserad metod"
 
 #: glade/profile.glade:1565
-#: pytrainer/gui/windowmain.py:614
+#: pytrainer/gui/windowmain.py:616
 msgid "Karvonen method"
-msgstr "Karvonen"
+msgstr "Karvonens metod"
 
 #: glade/profile.glade:1586
 msgid "Select how to calculate your heart rate zones."
-msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca"
+msgstr "Välj metod för att beräkna pulszoner."
 
 #: glade/profile.glade:1625
 msgid "<b>Heart Rate Zones</b>"
-msgstr "<b>Zonas de frecuencia cardiaca</b>"
+msgstr "<b>Pulszoner</b>"
 
 #: glade/profile.glade:1647
 #: pytrainer/recordgraph.py:140
@@ -766,11 +764,11 @@ msgstr "<b>Zonas de frecuencia cardiaca</b>"
 #: pytrainer/heartrategraph.py:36
 #: pytrainer/daygraph.py:56
 msgid "Heart Rate"
-msgstr "Pulsaciones"
+msgstr "Puls"
 
 #: glade/profile.glade:1673
 msgid "Log Level"
-msgstr "Nivel de log"
+msgstr "Loggnivå"
 
 #: glade/profile.glade:1681
 msgid ""
@@ -779,99 +777,95 @@ msgid ""
 "Info\n"
 "Debug"
 msgstr ""
-"Error\n"
-"Advertencia\n"
-"Información\n"
-"Depuración"
 
 #: glade/profile.glade:1699
 msgid "<small>What level of detail is written to the log?</small>"
-msgstr "<small>¿Qué nivel de detalle existe en el fichero de log?</small>"
+msgstr "<small>Vilken nivå av detaljer skrivs till loggen?</small>"
 
 #: glade/profile.glade:1713
 msgid "Validate"
-msgstr "Validar"
+msgstr "Validera"
 
 #: glade/profile.glade:1743
 msgid "<small>Do the plugins attempt to validate the input file before processing?</small>"
-msgstr "<small>¿Intentan los plugins validar el fichero de entrada antes de procesarlo?</small>"
+msgstr "<small>Försöker tillägget validera filen före bearbetning?</small>"
 
 #: glade/profile.glade:1759
 msgid "Check"
-msgstr "Comprobación"
+msgstr "Kontrollera"
 
 #: glade/profile.glade:1788
 msgid "<small>Was a configuration and database check requested?</small>"
-msgstr "<small>¿Existió una petición para comprobar la configuración y la base de datos?</small>"
+msgstr "<small>Önskades en konfigurations och databaskontroll?</small>"
 
 #: glade/profile.glade:1804
 msgid "New Graph"
-msgstr "Nuevo gráfico"
+msgstr "Ny Graf"
 
 #: glade/profile.glade:1833
 msgid "<small>Want to use experimental new approach to graphing?</small>"
-msgstr "<small>¿Desea usar los nuevos gráficos (experimental)?</small>"
+msgstr ""
 
 #: glade/profile.glade:1876
 msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>"
-msgstr "<small>Esta pantalla muestra el estado de las opciones que se pueden configurar mediante línea de comandos para PyTrainer. Los cambios que se hagan únicamente tendrán efecto en la presente ejecución de pytrainer y no serán recordados en el futuro</small>"
+msgstr ""
 
 #: glade/profile.glade:1897
 msgid "Startup Parameters"
-msgstr "Configuración inicio"
+msgstr "Startparametrar"
 
 #: glade/pytrainer.glade:24
 msgid "_File"
-msgstr "_Archivo"
+msgstr "_Arkiv"
 
 #: glade/pytrainer.glade:39
 msgid "_Import"
-msgstr "_Importar"
+msgstr "_Importera"
 
 #: glade/pytrainer.glade:60
 msgid "_Export as Text Separated by Commas"
-msgstr "_Exportar como texto separado por comas (csv)"
+msgstr "_Exportera som kommaseparerad textfil"
 
 #: glade/pytrainer.glade:94
 msgid "_Edit"
-msgstr "_Editar"
+msgstr "_Redigera"
 
 #: glade/pytrainer.glade:114
 msgid "_View"
-msgstr "_Ver"
+msgstr "_Visa"
 
 #: glade/pytrainer.glade:121
 msgid " _Classic View"
-msgstr "Vista _clásica"
+msgstr "_Klassisk vy"
 
 #: glade/pytrainer.glade:131
 msgid " _List View"
-msgstr "_Listado de registros"
+msgstr "_List vy"
 
 #: glade/pytrainer.glade:141
 msgid " _Waypoints Editor"
-msgstr "Editor de _waypoints"
+msgstr "_Koordinat vy"
 
 #: glade/pytrainer.glade:155
 msgid "Tools"
-msgstr "Herramientas"
+msgstr "Verktyg"
 
 #: glade/pytrainer.glade:172
 msgid "GPS Device Plugins"
-msgstr "Plugins de dispositivos GPS"
+msgstr "GPS Tillägg"
 
 #: glade/pytrainer.glade:185
 msgid "_Help"
-msgstr "_Ayuda"
+msgstr "_Hjälp"
 
 #: glade/pytrainer.glade:290
 #: glade/pytrainer.glade:5467
 msgid "All Sports"
-msgstr "Deportes"
+msgstr "Alla Aktiviteter"
 
 #: glade/pytrainer.glade:396
 msgid "<b>Sport:</b>"
-msgstr "<b>Deporte:</b>"
+msgstr "<b>Aktivitet:</b>"
 
 #: glade/pytrainer.glade:408
 #: glade/pytrainer.glade:2726
@@ -879,7 +873,7 @@ msgstr "<b>Deporte:</b>"
 #: glade/pytrainer.glade:3960
 #: glade/pytrainer.glade:4659
 msgid "<b>Duration:</b>"
-msgstr "<b>Duración:</b>"
+msgstr "<b>Tid:</b>"
 
 #: glade/pytrainer.glade:423
 #: glade/pytrainer.glade:2816
@@ -887,7 +881,7 @@ msgstr "<b>Duración:</b>"
 #: glade/pytrainer.glade:4039
 #: glade/pytrainer.glade:4761
 msgid "<b>Speed:</b>"
-msgstr "<b>Velocidad:</b>"
+msgstr "<b>Hastighet:</b>"
 
 #: glade/pytrainer.glade:437
 #: glade/pytrainer.glade:2984
@@ -895,23 +889,23 @@ msgstr "<b>Velocidad:</b>"
 #: glade/pytrainer.glade:4234
 #: glade/pytrainer.glade:4856
 msgid "<b>Pace:</b>"
-msgstr "<b>Ritmo:</b>"
+msgstr "<b>Tempo:</b>"
 
 #: glade/pytrainer.glade:451
 msgid "<b>Ascent:</b>"
-msgstr "<b>Ascenso:</b>"
+msgstr "<b>Stigning:</b>"
 
 #: glade/pytrainer.glade:465
 msgid "<b>Calories:</b>"
-msgstr "<b>Calorías: </b>"
+msgstr "<b>Kalorier:</b>"
 
 #: glade/pytrainer.glade:479
 msgid "<b>Comments:</b>"
-msgstr "<b>Comentarios:</b>"
+msgstr "<b>Kommentarer:</b>"
 
 #: glade/pytrainer.glade:614
 msgid "<b>Date:</b>"
-msgstr "<b>Fecha:</b>"
+msgstr "<b>Datum:</b>"
 
 #: glade/pytrainer.glade:628
 #: glade/pytrainer.glade:2712
@@ -919,11 +913,11 @@ msgstr "<b>Fecha:</b>"
 #: glade/pytrainer.glade:3946
 #: glade/pytrainer.glade:4645
 msgid "<b>Distance:</b>"
-msgstr "<b>Distancia:</b>"
+msgstr "<b>Distans:</b>"
 
 #: glade/pytrainer.glade:645
 msgid "<b>Max Speed</b>"
-msgstr "<b>Pico velocidad:</b>"
+msgstr "<b>Maxhastighet</b>"
 
 #: glade/pytrainer.glade:661
 #: glade/pytrainer.glade:3014
@@ -931,11 +925,11 @@ msgstr "<b>Pico velocidad:</b>"
 #: glade/pytrainer.glade:4248
 #: glade/pytrainer.glade:4871
 msgid "<b>Max Pace:</b>"
-msgstr "<b>Pico ritmo:</b>"
+msgstr "<b>Maxtempo:</b>"
 
 #: glade/pytrainer.glade:677
 msgid "<b>Descent:</b>"
-msgstr "<b>Descenso:</b>"
+msgstr "<b>Sluttning:</b>"
 
 #: glade/pytrainer.glade:769
 #: glade/pytrainer.glade:2924
@@ -943,16 +937,16 @@ msgstr "<b>Descenso:</b>"
 #: glade/pytrainer.glade:4114
 #: glade/pytrainer.glade:4571
 msgid "Cal"
-msgstr "Cal"
+msgstr "cal"
 
 #: glade/pytrainer.glade:808
 #: glade/pytrainer.glade:2686
 #: glade/pytrainer.glade:3297
 #: glade/pytrainer.glade:3920
 #: glade/pytrainer.glade:4748
-#: pytrainer/gui/windowmain.py:102
+#: pytrainer/gui/windowmain.py:104
 msgid "Km"
-msgstr "km"
+msgstr "Km"
 
 #: glade/pytrainer.glade:823
 #: glade/pytrainer.glade:2846
@@ -963,28 +957,28 @@ msgstr "km"
 #: glade/pytrainer.glade:4162
 #: glade/pytrainer.glade:4791
 #: glade/pytrainer.glade:4807
-#: pytrainer/gui/windowmain.py:631
-#: pytrainer/gui/windowmain.py:632
-#: pytrainer/gui/windowmain.py:754
-#: pytrainer/gui/windowmain.py:755
-#: pytrainer/gui/windowmain.py:832
-#: pytrainer/gui/windowmain.py:833
+#: pytrainer/gui/windowmain.py:633
+#: pytrainer/gui/windowmain.py:634
+#: pytrainer/gui/windowmain.py:756
+#: pytrainer/gui/windowmain.py:757
+#: pytrainer/gui/windowmain.py:834
+#: pytrainer/gui/windowmain.py:835
 #: pytrainer/lib/activity.py:202
 msgid "km/h"
 msgstr "km/h"
 
 #: glade/pytrainer.glade:838
 msgid "<b>Equipment:</b>"
-msgstr "<b>Material:</b>"
+msgstr "<b>Utrustning:</b>"
 
 #: glade/pytrainer.glade:1014
 msgid " <b>Title:</b>"
-msgstr "<b>Título:</b>"
+msgstr " <b>Runda:</b>"
 
 #: glade/pytrainer.glade:1064
-#: pytrainer/gui/windowmain.py:1375
+#: pytrainer/gui/windowmain.py:1371
 msgid "Show graph display options"
-msgstr "Mostrar opciones del gráfico"
+msgstr "Visa grafinställningar"
 
 #: glade/pytrainer.glade:1082
 msgid ""
@@ -996,20 +990,20 @@ msgid ""
 "Percentage\n"
 "Zone"
 msgstr ""
-"Perfil\n"
-"Velocidad\n"
-"Ritmo\n"
-"Pulsaciones\n"
-"Cadencia\n"
-"Porcentaje\n"
-"Zona"
+"Profil\n"
+"Hastighet\n"
+"Tempo\n"
+"Puls\n"
+"Kadens\n"
+"Procent\n"
+"Pulszone"
 
 #: glade/pytrainer.glade:1099
 #: glade/pytrainer.glade:3831
 #: glade/pytrainer.glade:4454
 #: glade/pytrainer.glade:5076
 msgid "Versus"
-msgstr "contra"
+msgstr "Mot"
 
 #: glade/pytrainer.glade:1110
 msgid ""
@@ -1020,88 +1014,89 @@ msgid ""
 "Heart Rate\n"
 "Cadence\n"
 msgstr ""
-"Nada\n"
-"Perfil\n"
-"Velocidad\n"
-"Ritmo\n"
-"Pulsaciones\n"
+"Ingen\n"
+"Profil\n"
+"Hastighet\n"
+"Tempo\n"
+"Puls\n"
+"Kadens\n"
 
 #: glade/pytrainer.glade:1257
 msgid "<small>Graph Display Options</small>"
-msgstr "<small>Opciones de visualización gráfica</small>"
+msgstr "<small>Grafinställningar</small>"
 
 #: glade/pytrainer.glade:1282
 #: glade/pytrainer.glade:1497
 #: glade/pytrainer.glade:1717
 msgid "<small>Limits</small>"
-msgstr "<small>Límites</small>"
+msgstr "<small>Gränser</small>"
 
 #: glade/pytrainer.glade:1294
 #: glade/pytrainer.glade:1509
 #: glade/pytrainer.glade:1763
 msgid "<small>Min</small>"
-msgstr "<small>Mín</small>"
+msgstr "<small>Min</small>"
 
 #: glade/pytrainer.glade:1306
 #: glade/pytrainer.glade:1521
 #: glade/pytrainer.glade:1775
 msgid "<small>Max</small>"
-msgstr "<small>Máx</small>"
+msgstr "<small>Max</small>"
 
 #: glade/pytrainer.glade:1355
 #: glade/pytrainer.glade:1577
 msgid "<small>Color</small>"
-msgstr "<small>Color</small>"
+msgstr "<small>Färg</small>"
 
 #: glade/pytrainer.glade:1386
 #: glade/pytrainer.glade:1590
 msgid "<small>Weight</small>"
-msgstr "<small>Peso</small>"
+msgstr "<small>Vikt</small>"
 
 #: glade/pytrainer.glade:1416
 msgid "Y1"
-msgstr "Y1"
+msgstr ""
 
 #: glade/pytrainer.glade:1427
 #: glade/pytrainer.glade:1638
 msgid "<small>Smoothing</small>"
-msgstr "<small>Suavizado</small>"
+msgstr "<small>Utjämna</small>"
 
 #: glade/pytrainer.glade:1567
 msgid "Y2"
-msgstr "Y2"
+msgstr ""
 
 #: glade/pytrainer.glade:1707
 msgid "X"
-msgstr "X"
+msgstr ""
 
 #: glade/pytrainer.glade:1788
 msgid "<small>Distance</small>"
-msgstr "<small>Distancia</small>"
+msgstr "<small>Distans</small>"
 
 #: glade/pytrainer.glade:1817
 msgid "<small>Time</small>"
-msgstr "<small>Tiempo</small>"
+msgstr "<small>Tid</small>"
 
 #: glade/pytrainer.glade:1878
 msgid "Show Laps"
-msgstr "Mostras vueltas"
+msgstr "Visa Varv"
 
 #: glade/pytrainer.glade:1917
 msgid "Reset Graph"
-msgstr "Resetear"
+msgstr "Återställ Graf"
 
 #: glade/pytrainer.glade:1979
 msgid "Redraw Map"
-msgstr "Restaurar"
+msgstr "Ritaom karta"
 
 #: glade/pytrainer.glade:1995
 msgid "<small>Display map using:</small>"
-msgstr "<small>Opciones de visualización de mapas:</small>"
+msgstr "<small>Visa kart m.h.a.:</small>"
 
 #: glade/pytrainer.glade:2097
 msgid "<b>Beats:</b>"
-msgstr "<b>Pulsaciones:</b>"
+msgstr "<b>Puls:</b>"
 
 #: glade/pytrainer.glade:2109
 #: glade/pytrainer.glade:2894
@@ -1109,7 +1104,7 @@ msgstr "<b>Pulsaciones:</b>"
 #: glade/pytrainer.glade:4084
 #: glade/pytrainer.glade:4541
 msgid "<b>Calories: </b>"
-msgstr "<b>Calorías: </b>"
+msgstr "<b>Kalorier: </b>"
 
 #: glade/pytrainer.glade:2123
 #: glade/pytrainer.glade:3046
@@ -1117,40 +1112,40 @@ msgstr "<b>Calorías: </b>"
 #: glade/pytrainer.glade:4312
 #: glade/pytrainer.glade:4919
 msgid "<b>Max Beats:</b>"
-msgstr "<b>Pico pulsaciones:</b>"
+msgstr "<b>Maxpuls:</b>"
 
 #: glade/pytrainer.glade:2137
 msgid "<b>HR Zones Method:</b>"
-msgstr "<b>Método de cálculo:</b>"
+msgstr "<b>Pulszonsmetod:</b>"
 
 #: glade/pytrainer.glade:2152
 msgid "<b>HR Zone5:</b>"
-msgstr "<b>Máximo esfuerzo:</b>"
+msgstr "<b>Pulszon 5:</b>"
 
 #: glade/pytrainer.glade:2167
 #: glade/pytrainer.glade:2366
 msgid " bpm"
-msgstr "ppm"
+msgstr "slag/min"
 
 #: glade/pytrainer.glade:2183
 msgid " Cal"
-msgstr "Cal"
+msgstr "cal"
 
 #: glade/pytrainer.glade:2241
 msgid "<b>HR Zone4:</b>"
-msgstr "<b>Anaeróbica:</b>"
+msgstr "<b>Pulszon 4:</b>"
 
 #: glade/pytrainer.glade:2257
 msgid "<b>HR Zone3:</b>"
-msgstr "<b>Aeróbica:</b>"
+msgstr "<b>Pulszon 3:</b>"
 
 #: glade/pytrainer.glade:2273
 msgid "<b>HR Zone2:</b>"
-msgstr "<b>Quemagrasas:</b>"
+msgstr "<b>Pulszon 2:</b>"
 
 #: glade/pytrainer.glade:2289
 msgid "<b>HR Zone1:</b>"
-msgstr "<b>Recuperación:</b>"
+msgstr "<b>Pulszon 1:</b>"
 
 #: glade/pytrainer.glade:2391
 #: glade/pytrainer.glade:2403
@@ -1168,29 +1163,29 @@ msgstr "<b>Recuperación:</b>"
 #: pytrainer/lib/activity.py:435
 #: pytrainer/lib/activity.py:515
 msgid "bpm"
-msgstr "ppm"
+msgstr "slag/min"
 
 #: glade/pytrainer.glade:2493
 msgid " <b>Heart Rate:</b>"
-msgstr "<b>Pulsaciones:</b>"
+msgstr " <b>Puls:</b>"
 
 #: glade/pytrainer.glade:2653
 msgid "Record"
-msgstr "Registro"
+msgstr "Pass"
 
 #: glade/pytrainer.glade:2862
 #: glade/pytrainer.glade:3507
 #: glade/pytrainer.glade:4130
 #: glade/pytrainer.glade:4839
 msgid "<b>Max Speed:</b>"
-msgstr "<b>Velocidad máxima:</b>"
+msgstr "<b>Maxtempo:</b>"
 
 #: glade/pytrainer.glade:2939
 #: glade/pytrainer.glade:3566
 #: glade/pytrainer.glade:4189
 #: glade/pytrainer.glade:4586
 msgid "<b>Beats avg:</b>"
-msgstr "<b>Media pulsaciones:</b>"
+msgstr "<b>Medelpuls:</b>"
 
 #: glade/pytrainer.glade:2999
 #: glade/pytrainer.glade:3031
@@ -1200,23 +1195,23 @@ msgstr "<b>Media pulsaciones:</b>"
 #: glade/pytrainer.glade:4281
 #: glade/pytrainer.glade:4888
 #: glade/pytrainer.glade:4904
-#: pytrainer/gui/windowmain.py:633
-#: pytrainer/gui/windowmain.py:634
-#: pytrainer/gui/windowmain.py:756
-#: pytrainer/gui/windowmain.py:757
-#: pytrainer/gui/windowmain.py:834
-#: pytrainer/gui/windowmain.py:835
+#: pytrainer/gui/windowmain.py:635
+#: pytrainer/gui/windowmain.py:636
+#: pytrainer/gui/windowmain.py:758
+#: pytrainer/gui/windowmain.py:759
+#: pytrainer/gui/windowmain.py:836
+#: pytrainer/gui/windowmain.py:837
 #: pytrainer/lib/activity.py:203
 msgid "min/km"
 msgstr "min/km"
 
 #: glade/pytrainer.glade:3153
 msgid " <b>Date:</b>"
-msgstr "<b>Fecha:</b>"
+msgstr " <b>Datum:</b>"
 
 #: glade/pytrainer.glade:3196
 msgid "Value"
-msgstr "Valor"
+msgstr "Värde"
 
 #: glade/pytrainer.glade:3207
 msgid ""
@@ -1224,17 +1219,17 @@ msgid ""
 "Stage Velocity\n"
 "Stage Profile/velocity"
 msgstr ""
-"Perfil de Etapa\n"
-"Velocidad de Etapa\n"
-"Perfil/Velocidad de Etapa"
+"Etappprofil\n"
+"  EtappEtapphastighet\n"
+"Etappprofil/hastighet"
 
 #: glade/pytrainer.glade:3263
 msgid "Day"
-msgstr "Día"
+msgstr "Dag"
 
 #: glade/pytrainer.glade:3765
 msgid " <b>Week:</b>"
-msgstr "<b>Semana:</b>"
+msgstr "<b>Vecka:</b>"
 
 #: glade/pytrainer.glade:3816
 #: glade/pytrainer.glade:4439
@@ -1246,11 +1241,11 @@ msgid ""
 "Average Speed\n"
 "Calories"
 msgstr ""
-"Distancia\n"
-"Tiempo\n"
-"Pulsaciones\n"
-"Velocidad media\n"
-"Calorías"
+"Distans\n"
+"Tid\n"
+"Medelpuls\n"
+"Medelhastighet\n"
+"Kalorier"
 
 #: glade/pytrainer.glade:3842
 #: glade/pytrainer.glade:4465
@@ -1263,56 +1258,56 @@ msgid ""
 "Average Speed\n"
 "Calories"
 msgstr ""
-"Nada\n"
-"Distancia\n"
-"Tiempo\n"
-"Pulsaciones\n"
-"Velocidad media\n"
-"Calorías"
+"Ingen\n"
+"Distans\n"
+"Tid\n"
+"Medelpuls\n"
+"Medelhastighet\n"
+"Kalorier"
 
 #: glade/pytrainer.glade:3886
 msgid "Week"
-msgstr "Semana"
+msgstr "Vecka"
 
 #: glade/pytrainer.glade:4388
 msgid " <b>Month:</b>"
-msgstr "<b>Mes:</b>"
+msgstr " <b>Månad:</b>"
 
 #: glade/pytrainer.glade:4508
 msgid "Month"
-msgstr "Mes"
+msgstr "Månad"
 
 #: glade/pytrainer.glade:5010
 msgid " <b>Year:</b>"
-msgstr "<b>Año:</b>"
+msgstr " <b>År:</b>"
 
 #: glade/pytrainer.glade:5130
 msgid "Year"
-msgstr "Año"
+msgstr "År"
 
 #: glade/pytrainer.glade:5284
 msgid "<b>Graph</b>"
-msgstr "<b>Gráfico</b>"
+msgstr "<b>Graf</b>"
 
 #: glade/pytrainer.glade:5325
 msgid "<b>History</b>"
-msgstr "<b>Histórico</b>"
+msgstr "<b>Historia</b>"
 
 #: glade/pytrainer.glade:5389
 msgid "<b>Title:</b>"
-msgstr "<b>Título:</b>"
+msgstr "<b>Titel:</b>"
 
 #: glade/pytrainer.glade:5412
 msgid "Search"
-msgstr "Buscar"
+msgstr "Sök"
 
 #: glade/pytrainer.glade:5436
 msgid "All Distances"
-msgstr "Distancia"
+msgstr "Alla distanser"
 
 #: glade/pytrainer.glade:5445
 msgid "All Durations"
-msgstr "Duración"
+msgstr "All varaktighet"
 
 #: glade/pytrainer.glade:5455
 msgid ""
@@ -1321,18 +1316,18 @@ msgid ""
 "Last 6 months\n"
 "Last 12 months"
 msgstr ""
-"Tiempo\n"
-"Últimas 4 semanas\n"
-"Últimos 6 meses\n"
-"Últimos 12 meses"
+"All tid\n"
+"Senaste 4 veckorna\n"
+"Senaste 6 månaderna\n"
+"Senaste 12 månaderna"
 
 #: glade/pytrainer.glade:5492
 msgid "Columns"
-msgstr "Columnas"
+msgstr "Kolumner"
 
 #: glade/pytrainer.glade:5619
 msgid "Type:"
-msgstr "Tipo:"
+msgstr "Typ:"
 
 #: glade/pytrainer.glade:5632
 msgid ""
@@ -1341,66 +1336,62 @@ msgid ""
 "Scenic Area\n"
 "Summit"
 msgstr ""
-"Fuente\n"
-"Restaurante\n"
-"Mirador\n"
-"Cumbre"
 
 #: glade/pytrainer.glade:5648
 msgid "Latitude: "
-msgstr "<b>Latitud:</b>"
+msgstr "Latitud:"
 
 #: glade/pytrainer.glade:5662
 msgid " Name:"
-msgstr "Nombre:"
+msgstr "Namn:"
 
 #: glade/pytrainer.glade:5674
 msgid "Longitude:"
-msgstr "<b>Longitud:</b>"
+msgstr "Longitud:"
 
 #: glade/pytrainer.glade:5766
 msgid "<b> Waypoint: </b>"
-msgstr "<b> Waypoint: </b>"
+msgstr "<b> Koordinat: </b>"
 
 #: glade/pytrainer.glade:5950
 msgid "Edit Record"
-msgstr "Editar entrada"
+msgstr "Ändra post"
 
 #: glade/pytrainer.glade:5964
 msgid "Show graph in classic view"
-msgstr "Mostrar gráfico en vista clásica"
+msgstr "Visa graf i klassisk vy"
 
 #: glade/pytrainer.glade:5978
 msgid "Merge tracks"
-msgstr "Combinar entrenamientos"
+msgstr ""
 
 #: glade/selecttrackdialog.glade:7
 msgid "Select track record"
-msgstr "Seleccione uno de los tracks"
+msgstr ""
 
 #: glade/warning.glade:7
 #: glade/warning.glade:38
 msgid "Warning"
-msgstr "Advertencia"
+msgstr "Varning"
 
-#: pytrainer/gui/windowmain.py:100
+#: pytrainer/gui/windowmain.py:102
 msgid "Miles"
-msgstr "Millas"
+msgstr "Miles"
 
-#: pytrainer/gui/windowmain.py:103
-#: pytrainer/gui/windowmain.py:107
-#: pytrainer/gui/windowmain.py:120
-#: pytrainer/gui/windowmain.py:123
+#: pytrainer/gui/windowmain.py:105
+#: pytrainer/gui/windowmain.py:109
+#: pytrainer/gui/windowmain.py:122
+#: pytrainer/gui/windowmain.py:125
 msgid "id"
 msgstr "id"
 
-#: pytrainer/gui/windowmain.py:103
+#: pytrainer/gui/windowmain.py:105
 msgid "Start"
-msgstr "Comienzo"
+msgstr "Start"
 
-#: pytrainer/gui/windowmain.py:110
-#: pytrainer/gui/windowmain.py:393
-#: pytrainer/gui/windowmain.py:1148
+#: pytrainer/gui/windowmain.py:112
+#: pytrainer/gui/windowmain.py:395
+#: pytrainer/gui/windowmain.py:1144
 #: pytrainer/gui/windowimportdata.py:352
 #: pytrainer/gui/windowrecord.py:210
 #: pytrainer/lib/activity.py:313
@@ -1416,88 +1407,78 @@ msgstr "Comienzo"
 #: pytrainer/extensions/googlemaps.py:71
 #: pytrainer/extensions/osm.py:50
 msgid "Distance"
-msgstr "Distancia"
+msgstr "Distans"
 
-#: pytrainer/gui/windowmain.py:112
-#: pytrainer/gui/windowmain.py:394
-#: pytrainer/gui/windowmain.py:1150
+#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:396
+#: pytrainer/gui/windowmain.py:1146
 #: pytrainer/extensions/googlemaps.py:71
 #: pytrainer/extensions/osm.py:50
 msgid "Time"
-msgstr "Tiempo"
+msgstr "Tid"
 
-#: pytrainer/gui/windowmain.py:113
+#: pytrainer/gui/windowmain.py:115
 msgid "⌀ HR"
-msgstr "⌀ FC"
+msgstr "⌀ Puls"
 
-#: pytrainer/gui/windowmain.py:114
+#: pytrainer/gui/windowmain.py:116
 msgid "⌀ Speed"
-msgstr "⌀ Velocidad"
+msgstr "⌀ Hastighet"
 
-#: pytrainer/gui/windowmain.py:120
+#: pytrainer/gui/windowmain.py:122
 msgid "Waypoint"
-msgstr "Waypoint"
+msgstr "Koordinat"
 
-#: pytrainer/gui/windowmain.py:125
+#: pytrainer/gui/windowmain.py:127
 msgid "Weight"
-msgstr "Peso"
+msgstr "Vikt"
 
-#: pytrainer/gui/windowmain.py:126
+#: pytrainer/gui/windowmain.py:128
 msgid "Body Fat %"
-msgstr "Grasa corporal %"
+msgstr "% Kroppsfett"
 
-#: pytrainer/gui/windowmain.py:127
+#: pytrainer/gui/windowmain.py:129
 msgid "Resting HR"
-msgstr "FC en reposo"
+msgstr "Vilopuls"
 
-#: pytrainer/gui/windowmain.py:128
+#: pytrainer/gui/windowmain.py:130
 msgid "Max HR"
-msgstr "FC max"
+msgstr "Maxpuls"
 
-#: pytrainer/gui/windowmain.py:395
+#: pytrainer/gui/windowmain.py:397
 msgid "Laps"
-msgstr "Vueltas"
+msgstr "Varv"
 
-#: pytrainer/gui/windowmain.py:396
+#: pytrainer/gui/windowmain.py:398
 msgid "Left Axis Grid"
-msgstr "Cuadrícula eje izquierdo"
+msgstr "Vänster axel skala"
 
-#: pytrainer/gui/windowmain.py:397
+#: pytrainer/gui/windowmain.py:399
 msgid "Right Axis Grid"
-msgstr "Cuadrícula eje derecho"
+msgstr "Höger axel skala"
 
-#: pytrainer/gui/windowmain.py:398
+#: pytrainer/gui/windowmain.py:400
 msgid "X Axis Grid"
-msgstr "Cuadrícula eje X"
+msgstr "X-axel skala"
 
-#: pytrainer/gui/windowmain.py:459
+#: pytrainer/gui/windowmain.py:461
 msgid "Reset Limits"
-msgstr "Borrar límites"
+msgstr "Återställ gränser"
 
-#: pytrainer/gui/windowmain.py:461
+#: pytrainer/gui/windowmain.py:463
 msgid "Set Limits"
-msgstr "Establecer límites"
+msgstr "Sätt gränser"
 
-#: pytrainer/gui/windowmain.py:616
+#: pytrainer/gui/windowmain.py:618
 msgid "Percentages method"
-msgstr "basado en porcentajes"
+msgstr "Procent"
 
-#: pytrainer/gui/windowmain.py:624
-#: pytrainer/gui/windowmain.py:747
-#: pytrainer/gui/windowmain.py:825
-#: pytrainer/lib/activity.py:196
-msgid "miles"
-msgstr "millas"
-
-#: pytrainer/gui/windowmain.py:625
 #: pytrainer/gui/windowmain.py:626
-#: pytrainer/gui/windowmain.py:748
 #: pytrainer/gui/windowmain.py:749
-#: pytrainer/gui/windowmain.py:826
 #: pytrainer/gui/windowmain.py:827
-#: pytrainer/lib/activity.py:197
-msgid "miles/h"
-msgstr "millas/h"
+#: pytrainer/lib/activity.py:196
+msgid "miles"
+msgstr "miles"
 
 #: pytrainer/gui/windowmain.py:627
 #: pytrainer/gui/windowmain.py:628
@@ -1505,160 +1486,170 @@ msgstr "millas/h"
 #: pytrainer/gui/windowmain.py:751
 #: pytrainer/gui/windowmain.py:828
 #: pytrainer/gui/windowmain.py:829
-#: pytrainer/lib/activity.py:198
-msgid "min/mile"
-msgstr "min/milla"
+#: pytrainer/lib/activity.py:197
+msgid "miles/h"
+msgstr "miles/h"
 
+#: pytrainer/gui/windowmain.py:629
 #: pytrainer/gui/windowmain.py:630
+#: pytrainer/gui/windowmain.py:752
 #: pytrainer/gui/windowmain.py:753
+#: pytrainer/gui/windowmain.py:830
 #: pytrainer/gui/windowmain.py:831
+#: pytrainer/lib/activity.py:198
+msgid "min/mile"
+msgstr "min/mile"
+
+#: pytrainer/gui/windowmain.py:632
+#: pytrainer/gui/windowmain.py:755
+#: pytrainer/gui/windowmain.py:833
 #: pytrainer/lib/activity.py:201
 msgid "km"
 msgstr "km"
 
-#: pytrainer/gui/windowmain.py:1151
+#: pytrainer/gui/windowmain.py:1147
 #: pytrainer/recordgraph.py:144
 msgid "Beats"
-msgstr "Pulsaciones"
+msgstr "Puls"
 
-#: pytrainer/gui/windowmain.py:1152
+#: pytrainer/gui/windowmain.py:1148
 msgid "Average"
-msgstr "Media"
+msgstr "Medel"
 
-#: pytrainer/gui/windowmain.py:1371
+#: pytrainer/gui/windowmain.py:1367
 msgid "Hide graph display options"
-msgstr "Ocultar configuración de visualización gráfica"
+msgstr "Dölj grafinställningar"
 
-#: pytrainer/gui/windowmain.py:1669
+#: pytrainer/gui/windowmain.py:1690
 msgid "lap"
-msgstr "vuelta"
+msgstr "varv"
 
-#: pytrainer/gui/windowmain.py:1679
+#: pytrainer/gui/windowmain.py:1700
 #: pytrainer/gui/drawArea.py:165
 #: pytrainer/extensions/googlemaps.py:69
 #: pytrainer/extensions/osm.py:48
 msgid "h"
 msgstr "h"
 
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
+#: pytrainer/gui/windowmain.py:1700
+#: pytrainer/gui/windowmain.py:1702
 #: pytrainer/lib/activity.py:204
 msgid "m"
 msgstr "m"
 
-#: pytrainer/gui/windowmain.py:1679
-#: pytrainer/gui/windowmain.py:1681
+#: pytrainer/gui/windowmain.py:1700
+#: pytrainer/gui/windowmain.py:1702
 msgid "s"
 msgstr "s"
 
-#: pytrainer/gui/windowmain.py:1765
+#: pytrainer/gui/windowmain.py:1789
 #: pytrainer/record.py:63
 msgid "Edit Entry"
-msgstr "Editar entrada"
+msgstr "Ändra inmatning"
 
-#: pytrainer/gui/windowmain.py:1776
+#: pytrainer/gui/windowmain.py:1800
 msgid "Delete Entry"
-msgstr "Borrar entrada"
+msgstr "Radera inmatning"
 
-#: pytrainer/gui/windowmain.py:1800
+#: pytrainer/gui/windowmain.py:1824
 msgid "Create Athlete Entry"
-msgstr "Crear entrada de atleta"
+msgstr "Skapa användar notering"
 
-#: pytrainer/gui/windowmain.py:1804
+#: pytrainer/gui/windowmain.py:1828
 msgid "Edit Athlete Entry"
-msgstr "Editar atleta"
+msgstr ""
 
-#: pytrainer/gui/windowmain.py:1885
-#: pytrainer/main.py:433
+#: pytrainer/gui/windowmain.py:1909
+#: pytrainer/main.py:447
 msgid "Delete this database entry?"
-msgstr "¿Borrar esta entrada de la base de datos?"
+msgstr "Radera denna inmatning"
 
-#: pytrainer/gui/windowmain.py:1887
+#: pytrainer/gui/windowmain.py:1911
 msgid "Are you sure?"
-msgstr "¿Está seguro?"
+msgstr "Är du säker?"
 
 #: pytrainer/gui/windowimportdata.py:116
 msgid "No file selected"
-msgstr "Ningún fichero seleccionado"
+msgstr "Ingen fil vald"
 
 #: pytrainer/gui/windowimportdata.py:161
 msgid "Configure"
-msgstr "Configurar"
+msgstr "Konfigurera"
 
 #: pytrainer/gui/windowimportdata.py:162
 msgid "Run"
-msgstr "Ejecutar"
+msgstr "Kör"
 
 #: pytrainer/gui/windowimportdata.py:170
 msgid "Disabled"
-msgstr "Desactivo"
+msgstr "Avaktiverad"
 
 #: pytrainer/gui/windowimportdata.py:172
 msgid "Enabled"
-msgstr "Activo"
+msgstr "Aktiverad"
 
 #: pytrainer/gui/windowimportdata.py:252
 msgid "GPS device found"
-msgstr "Dispositivos GPS encontrado"
+msgstr "GPS enhet hittad"
 
 #: pytrainer/gui/windowimportdata.py:255
 msgid "GPS device <b>not</b> found"
-msgstr "Dispositivo GPS <b>no</b> encontrado"
+msgstr "GPS enhet <b>ej</b> hittad"
 
 #: pytrainer/gui/windowimportdata.py:262
 msgid "This tool was not found on the system"
-msgstr "No se ha encontrado esta herramienta en el sistema"
+msgstr "Detta verktyg hittades inte på systemet"
 
 #: pytrainer/gui/windowimportdata.py:264
 msgid " Homepage"
-msgstr "Página de inicio"
+msgstr " Hemsida"
 
 #: pytrainer/gui/windowimportdata.py:317
 msgid "File"
-msgstr "Archivo"
+msgstr "Fil"
 
 #: pytrainer/gui/windowimportdata.py:317
 msgid "Type"
-msgstr "Tipo"
+msgstr "Typ"
 
 #: pytrainer/gui/windowimportdata.py:317
 msgid "Activities"
-msgstr "Actividades"
+msgstr "Aktiviteter"
 
 #: pytrainer/gui/windowimportdata.py:352
 #: pytrainer/gui/windowrecord.py:210
 msgid "Start Time"
-msgstr "Hora de comienzo"
+msgstr "Starttid"
 
 #: pytrainer/gui/windowimportdata.py:352
 #: pytrainer/gui/windowrecord.py:210
 msgid "Duration"
-msgstr "Duración"
+msgstr "Varaktighet"
 
 #: pytrainer/gui/windowimportdata.py:501
 msgid "Imported into database"
-msgstr "Importado a base de datos"
+msgstr "Importerad till databas"
 
 #: pytrainer/gui/windowimportdata.py:545
 #: pytrainer/gui/windowextensions.py:81
 #: pytrainer/gui/windowplugins.py:80
 #, python-format
 msgid "%s settings"
-msgstr "%s opciones"
+msgstr "%s inställningar"
 
 #: pytrainer/gui/windowimportdata.py:560
 #: pytrainer/gui/windowextensions.py:70
 #: pytrainer/gui/windowplugins.py:71
 #: pytrainer/gui/windowplugins.py:95
 msgid "Disable"
-msgstr "Desactivo"
+msgstr "Avaktivera"
 
 #: pytrainer/gui/windowimportdata.py:561
 #: pytrainer/gui/windowextensions.py:72
 #: pytrainer/gui/windowplugins.py:69
 #: pytrainer/gui/windowplugins.py:96
 msgid "Enable"
-msgstr "Activo"
+msgstr "Aktivera"
 
 #: pytrainer/gui/windowimportdata.py:568
 #: pytrainer/gui/windowplugins.py:103
@@ -1667,54 +1658,54 @@ msgstr "Ok"
 
 #: pytrainer/gui/windowimportdata.py:628
 msgid "Saving options"
-msgstr "Guardar configuración"
+msgstr "Sparar inställningar"
 
 #: pytrainer/gui/windowimportdata.py:630
 msgid "Options saved"
-msgstr "Configuración guardada"
+msgstr "Inställningar sparade"
 
 #: pytrainer/gui/windowimportdata.py:655
 msgid "Importing one activity"
-msgstr "Importando una actividad"
+msgstr "Importerar en aktivitet"
 
 #: pytrainer/gui/windowimportdata.py:656
 msgid "Imported one activity"
-msgstr "Una actividad importada"
+msgstr "Importerade en aktivitet"
 
 #: pytrainer/gui/windowimportdata.py:658
 #, python-format
 msgid "Importing %d activities"
-msgstr "Importando %d actividades"
+msgstr "Importerar %d aktiviteter"
 
 #: pytrainer/gui/windowimportdata.py:659
 #, python-format
 msgid "Imported %d activities"
-msgstr "Importadas %d actividades"
+msgstr "Importerade %d aktiviteter"
 
 #: pytrainer/gui/windowimportdata.py:678
 msgid "Choose a file (or files) to import activities from"
-msgstr "Seleccione fichero/s desde el/los que importar actividades"
+msgstr "Välj en eller flera filer att importera aktivitet(er) från"
 
 #: pytrainer/gui/windowimportdata.py:693
 #: pytrainer/gui/windowimportdata.py:694
 #, python-format
 msgid "Found file of type: %s"
-msgstr "Tipo de fichero encontrado: %s"
+msgstr "Hittade fil av typen: %s"
 
 #: pytrainer/gui/windowimportdata.py:718
 msgid "Found in database"
-msgstr "Encontrado en base de datos"
+msgstr "Hittades i databasen"
 
 #: pytrainer/gui/windowimportdata.py:733
 #: pytrainer/gui/windowimportdata.py:734
 #, python-format
 msgid "File %s is of unknown or unsupported file type"
-msgstr "Fichero %s seleccionado desconocido o no soportado"
+msgstr "Filen %s är av en okänd filtyp"
 
 #: pytrainer/gui/windowimportdata.py:807
 #, python-format
 msgid "Column %d"
-msgstr "Columna %d"
+msgstr "Kolumn %d"
 
 #: pytrainer/gui/drawArea.py:166
 #: pytrainer/extensions/googlemaps.py:69
@@ -1724,128 +1715,128 @@ msgstr "min"
 
 #: pytrainer/gui/drawArea.py:399
 msgid "rest"
-msgstr "descanso"
+msgstr "vila"
 
 #: pytrainer/gui/windowrecord.py:210
 msgid "GPX File"
-msgstr "Archivo GPX"
+msgstr "GPX Fil"
 
 #: pytrainer/gui/windowprofile.py:41
 msgid "Male"
-msgstr "Varón"
+msgstr "Man"
 
 #: pytrainer/gui/windowprofile.py:42
 msgid "Female"
-msgstr "Mujer"
+msgstr "Kvinna"
 
 #: pytrainer/gui/windowprofile.py:59
 msgid "MET"
-msgstr "M.E.T."
+msgstr ""
 
 #: pytrainer/gui/windowprofile.py:59
 msgid "Maximum Pace"
-msgstr "Ritmo más rápido"
+msgstr "Maxtempo"
 
 #: pytrainer/gui/dialogselecttrack.py:40
 msgid "Track Name"
-msgstr "Nombre de la ruta"
+msgstr ""
 
 #: pytrainer/gui/drawGraph.py:170
 msgid "Athlete Data"
-msgstr "Datos del atleta"
+msgstr "Användar data"
 
 #: pytrainer/gui/windowextensions.py:112
 #: pytrainer/gui/windowextensions.py:125
 msgid "OK"
-msgstr "Ok"
+msgstr "OK"
 
 #: pytrainer/recordgraph.py:134
 #: pytrainer/daygraph.py:52
 msgid "Height (m)"
-msgstr "Altura (m)"
+msgstr "Höjd (m)"
 
 #: pytrainer/recordgraph.py:134
 #: pytrainer/daygraph.py:52
 msgid "Stage Profile"
-msgstr "Perfil de Etapa"
+msgstr "Etappprofil"
 
 #: pytrainer/recordgraph.py:136
 msgid "Speed (Km/h)"
-msgstr "Velocidad (km/h)"
+msgstr "Hastighet (Km/h)"
 
 #: pytrainer/recordgraph.py:136
 #: pytrainer/lib/activity.py:325
 #: pytrainer/lib/activity.py:415
 #: pytrainer/lib/activity.py:417
 msgid "Speed"
-msgstr "Velocidad"
+msgstr "Hastighet"
 
 #: pytrainer/recordgraph.py:138
 #: pytrainer/lib/activity.py:314
 #: pytrainer/lib/activity.py:424
 #: pytrainer/lib/activity.py:426
 msgid "Pace"
-msgstr "Ritmo"
+msgstr "Tempo"
 
 #: pytrainer/recordgraph.py:140
 #: pytrainer/heartrategraph.py:36
 #: pytrainer/daygraph.py:56
 msgid "Beats (bpm)"
-msgstr "Media pulsaciones (ppm)"
+msgstr "Puls (slag/min)"
 
 #: pytrainer/recordgraph.py:142
 msgid "Cadence (rpm)"
-msgstr "Cadencia (rpm)"
+msgstr "Kadens (varv/min)"
 
 #: pytrainer/recordgraph.py:142
 #: pytrainer/lib/activity.py:452
 #: pytrainer/lib/activity.py:454
 msgid "Cadence"
-msgstr "Cadence"
+msgstr "Kadens"
 
 #: pytrainer/recordgraph.py:144
 msgid "Beats (%)"
-msgstr "Pulsaciones (%)"
+msgstr "Puls (%)"
 
 #: pytrainer/recordgraph.py:146
 msgid "Zone"
-msgstr "Zona"
+msgstr "Zon"
 
-#: pytrainer/profile.py:109
+#: pytrainer/profile.py:110
 msgid "Moderate activity"
-msgstr "Actividad moderada"
+msgstr "Mycket lätt träning"
 
-#: pytrainer/profile.py:110
+#: pytrainer/profile.py:111
 msgid "Weight Control"
-msgstr "Control de peso"
+msgstr "Lätt träning"
 
-#: pytrainer/profile.py:111
+#: pytrainer/profile.py:112
 msgid "Aerobic"
-msgstr "Aeróbico"
+msgstr "Medelintensiv träning"
 
-#: pytrainer/profile.py:112
+#: pytrainer/profile.py:113
 msgid "Anaerobic"
-msgstr "Anaeróbico"
+msgstr "Hård träning"
 
-#: pytrainer/profile.py:113
+#: pytrainer/profile.py:114
 msgid "VO2 MAX"
-msgstr "VO2 máximo"
+msgstr "Högintensiv träning"
 
 #: pytrainer/lib/gpx.py:122
 msgid "No Name"
-msgstr "Sin nombre"
+msgstr ""
 
 #: pytrainer/lib/gpx.py:129
 msgid "No Data"
-msgstr "Sin datos"
+msgstr ""
 
 #: pytrainer/lib/activity.py:199
 msgid "feet"
-msgstr "pies"
+msgstr "fot"
 
 #: pytrainer/lib/activity.py:312
 msgid "Pace by Lap"
-msgstr "Ritmo por vuelta"
+msgstr "Varvtid"
 
 #: pytrainer/lib/activity.py:318
 #: pytrainer/lib/activity.py:329
@@ -1858,26 +1849,26 @@ msgstr "Ritmo por vuelta"
 #: pytrainer/lib/activity.py:457
 #: pytrainer/lib/activity.py:519
 msgid "Time (seconds)"
-msgstr "Tiempo (segundos)"
+msgstr "Tid (sekunder)"
 
 #: pytrainer/lib/activity.py:323
 msgid "Speed by Lap"
-msgstr "Velocidad por vuelta"
+msgstr "Hastighet per varv"
 
 #: pytrainer/lib/activity.py:395
 #: pytrainer/lib/activity.py:397
 msgid "Elevation"
-msgstr "Altura"
+msgstr "Höjd över havet"
 
 #: pytrainer/lib/activity.py:406
 #: pytrainer/lib/activity.py:408
 msgid "Corrected Elevation"
-msgstr "Altura corregida"
+msgstr "Korrigerad höjd över havet"
 
 #: pytrainer/lib/activity.py:443
 #, python-format
 msgid "Heart Rate (% of max)"
-msgstr "Frecuencia cardíaca (% del máx.)"
+msgstr "Puls (% of max)"
 
 #: pytrainer/lib/activity.py:445
 msgid "%"
@@ -1885,11 +1876,11 @@ msgstr "%"
 
 #: pytrainer/lib/activity.py:454
 msgid "rpm"
-msgstr "rpm"
+msgstr "varv per minut"
 
 #: pytrainer/lib/activity.py:513
 msgid "Heart Rate zone"
-msgstr "Zona frecuencia cardiaca"
+msgstr "Pulszon"
 
 #: pytrainer/monthgraph.py:70
 #: pytrainer/monthgraph.py:72
@@ -1897,44 +1888,44 @@ msgstr "Zona frecuencia cardiaca"
 #: pytrainer/monthgraph.py:76
 #: pytrainer/monthgraph.py:78
 msgid "day"
-msgstr "día"
+msgstr "dag"
 
 #: pytrainer/monthgraph.py:70
 #: pytrainer/weekgraph.py:115
 msgid "Daily Distance"
-msgstr "Distancia"
+msgstr "Sträcka per dag"
 
 #: pytrainer/monthgraph.py:72
 #: pytrainer/yeargraph.py:72
 #: pytrainer/weekgraph.py:117
 msgid "Time (hours)"
-msgstr "Tiempo en horas"
+msgstr "Tid (tim)"
 
 #: pytrainer/monthgraph.py:72
 #: pytrainer/weekgraph.py:117
 msgid "Daily Time"
-msgstr "Tiempo diario"
+msgstr "Tid per dag"
 
 #: pytrainer/monthgraph.py:74
 #: pytrainer/yeargraph.py:74
 #: pytrainer/weekgraph.py:119
 msgid "Average Heart Rate (bpm)"
-msgstr "Pulsaciones medias (ppm)"
+msgstr "Medelpuls (slag/min)"
 
 #: pytrainer/monthgraph.py:74
 #: pytrainer/weekgraph.py:119
 msgid "Daily Average Heart Rate"
-msgstr "Pulsaciones diarias"
+msgstr "Medelpuls per dag"
 
 #: pytrainer/monthgraph.py:76
 #: pytrainer/weekgraph.py:121
 msgid "Daily Average Speed"
-msgstr "medias diarias"
+msgstr "Medelhastighet per dag"
 
 #: pytrainer/monthgraph.py:78
 #: pytrainer/weekgraph.py:123
 msgid "Daily Calories"
-msgstr "Calorías diarias"
+msgstr "Kalorier per dag"
 
 #: pytrainer/athlete.py:52
 msgid "lb"
@@ -1946,7 +1937,7 @@ msgstr "kg"
 
 #: pytrainer/record.py:513
 msgid "pyTrainer can't import data from your gpx file"
-msgstr "pyTrainer no puede importar datos de tu fichero gpx"
+msgstr "pyTrainer kan inte importera från din gpx-fil"
 
 #: pytrainer/yeargraph.py:70
 #: pytrainer/yeargraph.py:72
@@ -1954,91 +1945,91 @@ msgstr "pyTrainer no puede importar datos de tu fichero gpx"
 #: pytrainer/yeargraph.py:76
 #: pytrainer/yeargraph.py:78
 msgid "month"
-msgstr "mes"
+msgstr "månad"
 
 #: pytrainer/yeargraph.py:70
 msgid "Monthly Distance"
-msgstr "Distancia"
+msgstr "Sträcka per månad"
 
 #: pytrainer/yeargraph.py:72
 msgid "Monthly Time"
-msgstr "Tiempo mensual"
+msgstr "Tid per dag"
 
 #: pytrainer/yeargraph.py:74
 msgid "Monthly Average Heart Rate"
-msgstr "Pulsaciones medias mensuales"
+msgstr "Medelpuls per månad"
 
 #: pytrainer/yeargraph.py:76
 msgid "Monthly Average Speed"
-msgstr "Medias mensuales"
+msgstr "Medelhastighet per månad"
 
 #: pytrainer/yeargraph.py:78
 msgid "Monthly Calories"
-msgstr "Calorías mensuales"
+msgstr "Kalorier per månad"
 
 #: pytrainer/waypoint.py:87
 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 actividades de varios días. Probablemente necesites editarlo"
+msgstr "GPX-filen verkar inehålla data för flera dagar.  Du kanske vill editera din GPX-fil"
 
 #: pytrainer/daygraph.py:54
 msgid "Velocity (Km/h)"
-msgstr "Velocidad (km/h)"
+msgstr ""
 
 #: pytrainer/daygraph.py:54
 msgid "Velocity"
-msgstr "Velocidad"
+msgstr ""
 
-#: pytrainer/main.py:449
+#: pytrainer/main.py:463
 msgid "Delete this waypoint?"
-msgstr "¿Borrar este waypoint?"
+msgstr ""
 
 #: import/file_gpxplus.py:41
 msgid "GPS eXchange file"
-msgstr "Fichero de intercambio GPS"
+msgstr ""
 
 #: import/file_kml20.py:47
 msgid "Geodistance kml version 2.0 file"
-msgstr "Fichero kml v2.0"
+msgstr ""
 
 #: import/file_garmintcxv1.py:45
 msgid "Garmin training center database file version 1"
-msgstr "Versión 1 del fichero Garmin training center database"
+msgstr ""
 
 #: import/file_gpxplusNokia.py:41
 msgid "Nokia Export - GPS eXchange file"
-msgstr "Nokia Export - Fichero de intercambio GPS"
+msgstr ""
 
 #: import/tool_gpsbabel.py:37
 msgid "GPSBabel"
-msgstr "GPSBabel"
+msgstr ""
 
 #: import/tool_garmintools.py:37
 msgid "Garmintools"
-msgstr "Garmintools"
+msgstr ""
 
 #: import/tool_gant.py:37
 msgid "Gant"
-msgstr "Gant"
+msgstr ""
 
 #: import/file_garmintools.py:44
 msgid "Garmin tools dump file"
-msgstr "Fichero de volcado de datos de Garmintools"
+msgstr ""
 
 #: import/file_garmintcxv2.py:43
 msgid "Garmin training center database file version 2"
-msgstr "Versión 2 del fichero Garmin training center database"
+msgstr ""
 
 #: extensions/fixelevation/fixelevation.py:94
 msgid "Elevation Correction Complete"
-msgstr "Corrección de altura completada"
+msgstr ""
 
 #: extensions/openstreetmap/openstreetmap.py:30
 msgid "Must have username and password configured"
-msgstr "Es obligatorio indicar nombre de usuario y contraseña"
+msgstr "Användarnamn och lösenord måste vara konfigurerat"
 
 #: extensions/openstreetmap/openstreetmap.py:32
 msgid "Openstreetmap Extension Error"
-msgstr "Error de la extensión OpenStreetMap"
+msgstr ""
 
 #: extensions/openstreetmap/openstreetmap.py:79
 msgid ""
@@ -2046,107 +2037,28 @@ msgid ""
 "\n"
 "Please wait this could take several minutes"
 msgstr ""
-"Enviando traza GPX a OpenStreetMap\n"
-"\n"
-"Por favor espere, puede durar varios minutos"
 
 #: extensions/openstreetmap/openstreetmap.py:81
 msgid "Openstreetmap Extension Processing"
-msgstr "Procesando extensión OpenStreetMap"
+msgstr ""
 
 #: extensions/openstreetmap/openstreetmap.py:99
 msgid "Openstreetmap Extension Upload Complete"
-msgstr "Envío completo de la extensión OpenStreetMap"
+msgstr ""
 
 #: extensions/openstreetmap/openstreetmap.py:109
 msgid "Please add any additional information for this upload"
-msgstr "Por favor indique información adicional para este envío"
+msgstr ""
 
 #: extensions/wordpress/wordpress.py:46
 msgid "Posting to Wordpress blog"
-msgstr "Subir a blog de Wordpress"
+msgstr ""
 
 #: extensions/wordpress/wordpress.py:48
 msgid "Wordpress Extension Processing"
-msgstr "Procesando extensión Wordpress"
+msgstr ""
 
 #: extensions/wordpress/wordpress.py:144
 msgid "Wordpress Extension Upload Complete"
-msgstr "Envío completo a Wordpress"
-
-#~ 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 "Googlemaps v3"
-#~ msgstr "Googlemaps v3"
-
-#~ msgid "<small>Is the Googlemaps API version 3 in use?</small>"
-#~ msgstr "<small>¿Se usa la versión 3 de la API de Googlemaps?</small>"
-
-#~ msgid "Unified Import"
-#~ msgstr "Importar"
-
-#~ msgid "<small>Is the Unified Importer active?</small>"
-#~ msgstr "<small>¿Está habilitado el importador unificado?</small>"
-
-#~ msgid "Equipment handling"
-#~ msgstr "Gestión de equipamiento"
-
-#~ msgid "<small>Want to track equipment?</small>"
-#~ msgstr "<small>¿Control de equipamiento?</small>"
-
-#~ msgid ""
-#~ "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to "
-#~ "switch it off</small>"
-#~ msgstr ""
-#~ "<small>* Se usa por defecto la versión 3 de la API de Googlemaps, utilice "
-#~ "--gmaps2 para desactivarla</small>"
-
-#~ msgid "Category:"
-#~ msgstr "Categoría:"
-
-#~ msgid ""
-#~ "Running shoes\n"
-#~ "GPS watch\n"
-#~ "T-shirts\n"
-#~ "Tyres\n"
-#~ "Socks"
-#~ msgstr ""
-#~ "Zapatillas de correr\n"
-#~ "Reloj GPS\n"
-#~ "Camiseta\n"
-#~ "Rueda\n"
-#~ "Calcetines"
-
-#~ msgid "New equipment"
-#~ msgstr "Nuevo equipamiento"
-
-#~ msgid "Kilometer"
-#~ msgstr "Kilómetros"
-
-#~ msgid "Elevation v Distance"
-#~ msgstr "Altura vs Distancia"
-
-#~ msgid "Elevation v Time"
-#~ msgstr "Altura vs Tiempo"
-
-#~ msgid "Speed v Distance"
-#~ msgstr "Velocidad vs Distancia"
-
-#~ msgid "Pace v Distance"
-#~ msgstr "Ritmo vs Distancia"
-
-#~ msgid "Heart Rate v Distance"
-#~ msgstr "Pulsaciones vs Distancia"
+msgstr ""
 
-#~ msgid "Cadence v Distance"
-#~ msgstr "Cadencia vs Distancia"
diff --git a/man/README b/man/README
new file mode 100644
index 0000000..cfb8207
--- /dev/null
+++ b/man/README
@@ -0,0 +1,17 @@
+Some notes about manpage for pytrainer:
+
+Current source manpage is unfortunately _not_ automatically generated.
+
+To test how man page will look like, just execute: 
+	
+	$ groff -Tascii -man manpage_pytrainer.src
+
+It is not clear which one is the right path to store man pages. On Fedora 15, it is under /usr/share/man, but output from manpath command adds /usr/local/share/man that is empty.
+
+Manual installations instructions would be (pytrainer would match section 7, miscellaneous):
+
+$ cp <manpage source file> pytrainer.7
+$ gzip pytrainer.7
+$ sudo cp pytrainer.7.gz <man_path>/man7/
+
+This installation process needs to be as automated as possible to get integrated with python distutils
diff --git a/man/manpage_pytrainer.src b/man/manpage_pytrainer.src
new file mode 100644
index 0000000..0f03d28
--- /dev/null
+++ b/man/manpage_pytrainer.src
@@ -0,0 +1,52 @@
+.TH pytrainer 7 2011-08-29 "version 1.0"
+.SH NAME
+pytrainer - manual page for pytrainer 1.9.0
+
+.SH SYNOPSIS
+pytrainer [options]
+
+.SH DESCRIPTION
+pytrainer is a tool to log all sport excursions coming from GPS devices (with a focus on ForeRunnner 205, 305 and 405) or GPX (http://www.topografix.com) files. 
+.br 
+Pytrainer supports GPS track files and displays it in graphs, maps...
+
+.SH OPTIONS 
+.IP "-h, --help"
+show this help message and exit
+.IP "-d, --debug"
+enable logging at debug level
+.IP "-i, --info"
+enable logging at info level
+.IP "-w, --warn"
+enable logging at warning level
+.IP --valid
+enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation
+.IP --check
+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
+.br
+.IP --oldgraph 
+Turn off new graphing approach
+.IP --newgraph
+Deprecated option: turn on new graphing approach
+.IP --confdir=CONF_DIR  
+Specify the directory where application configuration will be stored.
+.IP --logtype=TYPE
+Specify where logging should be output to. TYPE is one of 'file' (default), or 'console'.
+
+.SH EXAMPLES
+.IP pytrainer
+starts pytrainer with log level set to ERROR
+.IP "pytrainer -d"
+starts pytrainer with log level set to DEBUG (troubleshooting)
+
+.SH AUTHORS
+This manual page was originally written by Braulio Valdivielso <brlvldvlsmrtnz at gmail.com> and polished by Christian Perrier <bubulle at debian.org>.
+.P
+For more information please check 'Credits' in 'About' menu.
+.P
+Thanks to everyone who contributes and supports pytrainer.
+
+.SH SEE ALSO
+Project web site: http://sourceforge.net/apps/trac/pytrainer/
+.br
+Distribution list: pytrainer-devel at lists.sourceforge.net
diff --git a/pytrainer.desktop b/pytrainer.desktop
index 86bcb4e..eed2dbf 100644
--- a/pytrainer.desktop
+++ b/pytrainer.desktop
@@ -1,7 +1,7 @@
 [Desktop Entry]
-Version=1.0
+Version=1.9.0
 Type=Application
-Name=pyTrainer
+Name=pytrainer
 Comment=The Free Sport Training Center
 Exec=pytrainer
 Icon=pytrainer
diff --git a/pytrainer/daygraph.py b/pytrainer/daygraph.py
index d9b9354..6d068f1 100644
--- a/pytrainer/daygraph.py
+++ b/pytrainer/daygraph.py
@@ -16,11 +16,11 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-from gui.drawArea import DrawArea
+from timegraph import TimeGraph
 
-class DayGraph:
-	def __init__(self, vbox = None, combovalue = None):
-		self.drawarea = DrawArea(vbox)
+class DayGraph(TimeGraph):
+	def __init__(self, sports, vbox = None, combovalue = None):
+		TimeGraph.__init__(self, sports, vbox=vbox)
 		self.combovalue = combovalue
 
 	def drawgraph(self,values):
@@ -67,10 +67,4 @@ class DayGraph:
 			if value_selected==2:
 				yvalue.append(value[5])
 		return xvalue,yvalue
-	
-	def getFloatValue(self, value):
-		try:
-			return float(value)
-		except:
-			return float(0)
 
diff --git a/pytrainer/environment.py b/pytrainer/environment.py
index 14a248a..1aedd1e 100644
--- a/pytrainer/environment.py
+++ b/pytrainer/environment.py
@@ -32,6 +32,7 @@ class Environment(object):
         
         """
         self.conf_dir = conf_dir if conf_dir is not None else platform.get_default_conf_dir()
+        logging.info("Initializing environment. Conf dir is: '{0}'.".format(self.conf_dir))
         self.conf_file = self.conf_dir + "/conf.xml"
         self.log_file = self.conf_dir + "/log.out"
         self.temp_dir = self.conf_dir + "/tmp"
diff --git a/pytrainer/extensions/googlemaps.py b/pytrainer/extensions/googlemaps.py
index 9e91f8d..31ef0ab 100644
--- a/pytrainer/extensions/googlemaps.py
+++ b/pytrainer/extensions/googlemaps.py
@@ -19,6 +19,8 @@
 import os
 import re
 import logging
+import colorsys
+import math
 
 import pytrainer.lib.points as Points
 from pytrainer.lib.fileUtils import fileUtils
@@ -31,13 +33,39 @@ class Googlemaps:
         self.pytrainer_main = pytrainer_main
         self.htmlfile = "%s/googlemaps.html" % (self.pytrainer_main.profile.tmpdir)
         logging.debug("<<")
+        
+    def colorLine(self, polyline, average, variance):
+        stdev = math.sqrt(variance)
+        for i in polyline:
+            speed = i[1]
+            speed = (speed - (average - 2*stdev))/(4*stdev)
+            speed = min(max(speed,0), 1)
+            rgb_tuple = colorsys.hsv_to_rgb(0.66-(speed*0.66), 1, 0.8)
+            rgb_tuple = (rgb_tuple[0] * 255,rgb_tuple[1] * 255,rgb_tuple[2] * 255)
+            i[2] = '#%02x%02x%02x' % rgb_tuple
+            
+    def colorLineAbs(self, polyline):
+        for i in polyline:
+            speed = i[1]
+            if 0 <= speed < 7.5: #walk
+                rgb_tuple = colorsys.hsv_to_rgb(0.66, 1, (speed/7.5)*0.6)
+            elif 7.5 <= speed < 15: #jog-run
+                speed = ((speed-7.5)/7.5)
+                rgb_tuple = colorsys.hsv_to_rgb(0.66-speed*0.66, 1, 0.6+speed*0.2)
+            elif 15 <= speed < 40: #cycle
+                speed = ((speed-15)/25.0)
+                rgb_tuple = colorsys.hsv_to_rgb(1-speed, 1, 0.8+speed*0.2)
+            else: # fast cycle
+                rgb_tuple = colorsys.hsv_to_rgb(0, 1, 1)
+            
+            rgb_tuple = (rgb_tuple[0] * 255,rgb_tuple[1] * 255,rgb_tuple[2] * 255)
+            i[2] = '#%02x%02x%02x' % rgb_tuple
+                
 
-    def drawMap(self,activity):
+    def drawMap(self,activity, linetype):
         '''Draw google map
             create html file using Google API version3
-            render using embedded Mozilla
-
-            info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html
+            render using embedded Webkit
         '''
         logging.debug(">>")
         points = []
@@ -50,14 +78,44 @@ class Googlemaps:
             minlat, minlon = float(list_values[0][4]),float(list_values[0][5])
             maxlat=minlat
             maxlon=minlon
+            
+            pre = 0
+            av_sum = 0
+            variance_sum = 0
+            n = 0
             for i in list_values:
+                if linetype==1:
+                    if pre:
+                        val = (i[0]-pre[0])/((i[2]-pre[2])/3600)
+                    else:
+                        val = (list_values[1][0]-list_values[0][0])/((list_values[1][2]-list_values[0][2])/3600)
+                elif linetype==2:
+                	val = i[6] if i[6] else 0
+                elif linetype==3:
+                	val =i[7] if i[7]!=None else 1
+                else:
+                    val = 1
+                    
+                variance_sum += (val)**2
+                av_sum += val
+                n += 1
+                
                 lat, lon = float(i[4]), float(i[5])
                 minlat = min(minlat, lat)
                 maxlat = max(maxlat, lat)
                 minlon = min(minlon, lon)
                 maxlon = max(maxlon, lon)
                 pointlist.append((lat,lon))
-                polyline.append("new google.maps.LatLng(%s, %s)" % (lat, lon))
+                polyline.append(["new google.maps.LatLng(%s, %s)" % (lat, lon), val, ""])
+                pre = i
+                
+            av_speed = av_sum / float(n)
+            variance = (variance_sum / float(n)) - av_speed**2
+            variance = max(variance, 16)
+
+            self.colorLine(polyline, av_speed, variance)
+            #self.colorLineAbs(polyline)
+            
             logging.debug("minlat: %s, maxlat: %s" % (minlat, maxlat))
             logging.debug("minlon: %s, maxlon: %s" % (minlon, maxlon))
             points,levels = Points.encodePoints(pointlist)
@@ -71,13 +129,13 @@ class Googlemaps:
             finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit)
             startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
             finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
-            self.createHtml_api3(polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps)
+            self.createHtml_api3(polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps, linetype)
         else:
             self.createErrorHtml()
         return self.htmlfile
         logging.debug("<<")
 
-    def createHtml_api3(self,polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps):
+    def createHtml_api3(self,polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps, linetype):
         '''
         Generate a Google maps html file using the v3 api
             documentation at http://code.google.com/apis/maps/documentation/v3
@@ -98,9 +156,9 @@ class Googlemaps:
         <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
         <script type="text/javascript">
           function initialize() {\n'''
-        content += "            var startlatlng = %s ;\n" % (polyline[0])
+        content += "            var startlatlng = %s ;\n" % (polyline[0][0])
         content += "            var centerlatlng = new google.maps.LatLng(%f, %f);\n" % ((minlat+maxlat)/2., (minlon+maxlon)/2.)
-        content += "            var endlatlng = %s;\n" % (polyline[-1])
+        content += "            var endlatlng = %s;\n" % (polyline[-1][0])
         content += "            var swlatlng = new google.maps.LatLng(%f, %f);\n" % (minlat,minlon)
         content += "            var nelatlng = new google.maps.LatLng(%f, %f);\n" % (maxlat,maxlon)
         content += "            var startcontent = \"%s\";\n" % (startinfo)
@@ -198,19 +256,43 @@ class Googlemaps:
         content += '''
 
             var boundsBox = new google.maps.LatLngBounds(swlatlng, nelatlng );\n
-            map.fitBounds(boundsBox);\n
-            var polylineCoordinates = [\n'''
+            map.fitBounds(boundsBox);\n'''
+            
+        pre = 0
         for point in polyline:
-            content += "                                       %s,\n" % (point)
-        content += '''            ];\n
-            // Add a polyline.\n
-            var polyline = new google.maps.Polyline({\n
-                    path: polylineCoordinates,\n
-                    strokeColor: \"#3333cc\",\n
-                    strokeOpacity: 0.6,\n
-                    strokeWeight: 5,\n
-                    });\n
-            polyline.setMap(map);\n
+            if pre:
+                content += '''var polylineCoordinates = [\n'''
+                content += "                                       %s,\n" % (pre[0])
+                content += "                                       %s,\n" % (point[0])
+                content += '''            ];\n
+                    // Add a polyline.\n
+                    var polyline = new google.maps.Polyline({\n
+                            path: polylineCoordinates,\n
+                            strokeColor: \"%s\",\n
+                            strokeOpacity: 0.9,\n
+                            strokeWeight: 5,\n
+                            });\n
+                polyline.setMap(map);\n''' % point[2]
+                
+                contenttemplate = [
+                	"%s",
+                	"Speed: %0.1f km/h",
+                	"HR: %d bpm",
+                	"Cadence: %d",
+                ]
+                
+                content += '''
+                    google.maps.event.addListener(polyline, 'click', function(event) {
+                        var marker = new google.maps.InfoWindow({
+                          position: event.latLng, 
+                          content: "%s"
+                        });
+                        marker.setMap(map);
+                    });
+                    ''' % contenttemplate[linetype] % point[1]
+            pre = point
+        
+        content += '''
           }
 
         </script>
diff --git a/pytrainer/extensions/mapviewer.py b/pytrainer/extensions/mapviewer.py
index 1ab214f..34b1d02 100644
--- a/pytrainer/extensions/mapviewer.py
+++ b/pytrainer/extensions/mapviewer.py
@@ -16,11 +16,10 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-import gtkmozembed
-import logging
-import os
-
 from pytrainer.lib.fileUtils import fileUtils
+import gtk
+import logging
+import webkit
 
 class MapViewer:
 	def __init__(self, data_path = None, pytrainer_main=None, box=None):
@@ -31,14 +30,15 @@ class MapViewer:
 			logging.debug("Display box (%s) is None" % ( str(box)))
 			return
 		self.box = box
-		gtkmozembed.set_profile_path("/tmp", "foobar") # http://faq.pygtk.org/index.py?req=show&file=faq19.018.htp  #TODO FIX???
-		self.moz = gtkmozembed.MozEmbed()
+		self.wkview = webkit.WebView()
 		self.pack_box()
 		logging.debug("<<")
 
 	def pack_box(self):
 		logging.debug(">>")
-		self.box.pack_start(self.moz, True, True)
+		scrolled_window = gtk.ScrolledWindow()
+		scrolled_window.add(self.wkview)
+		self.box.pack_start(scrolled_window, True, True)
 		self.box.show_all()
 		logging.debug("<<")
 
@@ -46,7 +46,7 @@ class MapViewer:
 		logging.debug(">>")
 		if htmlfile is None:
 			htmlfile = self.createErrorHtml()
-		self.moz.load_url("file://%s" % (htmlfile))
+		self.wkview.load_uri("file://%s" % (htmlfile))
 		#self.box.show_all()
 		logging.debug("<<")
 
diff --git a/pytrainer/extensions/osm.py b/pytrainer/extensions/osm.py
index 250696a..e6248bf 100644
--- a/pytrainer/extensions/osm.py
+++ b/pytrainer/extensions/osm.py
@@ -1,253 +1,478 @@
-# Open Street Map
-# TODO: store OpenLayers.js locally (1MB file)
-# TODO: Add google satelite images layers ?
+# Open Street Maps
+
+# TODO: Add Google satellite images layers ?
+# TODO: Create map class/interface that osm/googlemaps will inherit from ?
 
-import gtkmozembed
 import os
 import re
 import logging
-
+import urllib           # for downloading cached versions of openlayers.js and openstreetmaps.js
+import time             # Used for checking if local cached file is current
+    
 from pytrainer.lib.gpx import Gpx
 import pytrainer.lib.points as Points
 from pytrainer.lib.fileUtils import fileUtils
 from pytrainer.record import Record
 
 class Osm:
-	def __init__(self, data_path = None, waypoint = None, pytrainer_main=None):
-		logging.debug(">>")
-		self.data_path = data_path
-		self.waypoint = waypoint
-		self.pytrainer_main = pytrainer_main
-		self.htmlfile = "%s/osm.html" % (self.pytrainer_main.profile.tmpdir)
-		logging.debug("<<")
-
-	def drawMap(self,activity):
-		'''Draw osm map
-			create html file using Open Layers and Open Street Map
-			render using embedded Mozilla
-
-			info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html
-		'''
-		logging.debug(">>")
-		points = []
-		levels = []
-		pointlist = []
-		polyline = []
-
-		list_values = activity.tracks
-		if list_values is not None and list_values != [] and len(list_values) > 0:
-			for i in list_values:
-				lat, lon = float(i[4]), float(i[5])
-				pointlist.append((lat,lon))
-				polyline.append("[%s, %s]" % (lon, lat))
-			points,levels = Points.encodePoints(pointlist)
-			points = points.replace("\\","\\\\")
-			laps = activity.laps
-			timeHours = int(activity.time) / 3600
-			timeMin = (float(activity.time) / 3600.0 - timeHours) * 60
-			time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min"))
-			startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title)
-			finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit)
-			startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
-			finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
-
-			self.createHtml_osm(polyline, startinfo, finishinfo, laps)
-		else:
-			self.createErrorHtml()
-		return self.htmlfile
-		logging.debug("<<")
-
-	def createHtml_osm(self, polyline, startinfo, finishinfo, laps):
-		'''
-		Generate OSM map html file using MapLayers
-		'''
-		logging.debug(">>")
-		content = '''<html>
-		<head>
-			<!-- bring in the OpenLayers javascript library
-				 (here we bring it from the remote site, but you could
-				 easily serve up this javascript yourself) -->
-			<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
-			<!-- bring in the OpenStreetMap OpenLayers layers.
-				 Using this hosted file will make sure we are kept up
-				 to date with any necessary changes -->
-			<script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
-
-			<script type="text/javascript">
-				//complex object of type OpenLayers.Map
-				var map;
-
-				//icons data object
-				var icons = {
-					iconSize : new OpenLayers.Size(30,30)'''
-
-		# If have laps data insert markers here
-		try:
-			lapsContent=''
-			for lap in laps[:500]:  # OpenLayers with firefox is limited to 500 markers -> TODO: Transfer to a constant somewhere ?
-				lapNumber = int(lap['lap_number'])+1
-				elapsedTime = float(lap['elapsed_time'])
-				elapsedTimeHours = int(elapsedTime/3600)
-				elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60)
-				elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60)
-				if elapsedTimeHours > 0:
-					strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs)
-				elif elapsedTimeMins > 0:
-					strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs)
-				else:
-					strElapsedTime = "%0.0fs" % (elapsedTimeSecs)
-				#process lat and lon for this lap
-				lapLat = float(lap['end_lat'])
-				lapLon = float(lap['end_lon'])
-				#build laps content string
-				lapsContent+=',\n'
-				lapsContent+='\t\t\t\t\tlap%d: { url : "/waypoint.png", coordinates : [%f,%f], popupInfo: "%s" }' % \
-						(lapNumber, lapLon, lapLat, \
-						"<div class='info_content'>End of lap:%d<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>" % \
-							(lapNumber, strElapsedTime, float(lap['distance'])/1000, lap['calories'])
-						)
-			content+=lapsContent
-		except Exception as e:
-			# If something breaks here just skip laps data
-			logging.error('Error formating laps data: ' + str(e))
-		# Insert start/finish track markers
-		content+=''',\n		start : { url : "/start.png", coordinates : %s, popupInfo : "%s" },
-					finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" },
-					url : "file://%s/glade"''' \
-					% (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path))
-
-		content+='''};\n
-				function init() {
-
-				// for transforming WGS 1984 to Spherical Mercator Projection
-				pWGS = new OpenLayers.Projection("EPSG:4326");
-				pMP = new OpenLayers.Projection("EPSG:900913");
-
-				map = new OpenLayers.Map ("map", {
-					controls:[
-						new OpenLayers.Control.Navigation(),
-						new OpenLayers.Control.PanZoomBar(),
-						new OpenLayers.Control.LayerSwitcher(),
-						new OpenLayers.Control.Attribution()],
-					maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
-					maxResolution: 156543.0399,
-					numZoomLevels: 19,
-					units: 'm',
-					projection: pMP,
-					displayProjection: pWGS
-				} );
-
-				// Track painting style
-				var trackStyle = {
-					strokeColor: "#33DDDD",
-					strokeWidth: 3,
-					strokeDashstyle: "solid",
-					strokeOpacity: 0.6,
-					pointRadius: 6,
-				};
-
-				//Build track object
-				var track =
-					{
-					"type":"Feature",
-					"id":"OpenLayers.Feature.Vector_259",
-					"properties":{},
-					"geometry":
-					{
-						"type":"LineString",
-						"coordinates":
-							['''
-		#Insert track points here
-		content+=",".join(polyline);
-		content+=''']
-					},
-					"crs":
-						{
-						"type":"OGC",
-						"properties":
-							{
-							"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"
-							}
-						}
-					}
-
-				//Add open street maps layers
-				layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
-				map.addLayer(layerMapnik);
-				layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
-				map.addLayer(layerTilesAtHome);
-
-				//Create vector layer to add the data on to
-				var vector_layer = new OpenLayers.Layer.Vector();
-				vector_layer.setName('Track');
-
-				var geojson_format = new OpenLayers.Format.GeoJSON();
-				var feature = geojson_format.read(track,"Feature");
-
-				// transform from WGS 1984 to Spherical Mercator Projection
-				feature.geometry.transform(pWGS, pMP);
-
-				feature.geometry.calculateBounds();
-				var vector=new OpenLayers.Feature.Vector();
-				vector.geometry = feature.geometry;
-				vector.style=trackStyle;
-
-				vector_layer.addFeatures(vector);
-				map.addLayer(vector_layer);
-
-				// Insert start/finish markers
-				layerMarkers = new OpenLayers.Layer.Markers("Markers");
-				var offset = new OpenLayers.Pixel(-(icons.iconSize.w/2), -icons.iconSize.h);
-				for (var i in icons) {
-					if (icons[i].coordinates) {
-						icons[i].icon = new OpenLayers.Icon(icons.url + icons[i].url,icons.iconSize,offset);
-						icons[i].lonLat = new OpenLayers.LonLat(icons[i].coordinates[0],icons[i].coordinates[1]);
-						icons[i].lonLat.transform(pWGS,pMP);
-						icons[i].marker = new OpenLayers.Marker(icons[i].lonLat,icons[i].icon);
-						icons[i].popup = new OpenLayers.Popup.FramedCloud("Info",
-											icons[i].lonLat,
-								                      	null,
-										        icons[i].popupInfo,
-											icons[i].icon,
-										        true,
-											null
-											);
-						icons[i].onClick = function(e) { map.addPopup(this.popup); this.popup.show(); }
-						icons[i].marker.events.register("mousedown", icons[i], function(e) { this.onClick(e)} )
-						layerMarkers.addMarker(icons[i].marker);
-					}
-				}
-				map.addLayer(layerMarkers);
-
-				//zoom and center to the track layouts
-				map.zoomToExtent(feature.geometry.getBounds());
-
-       		}
-		</script>
-
-		</head>
-		<!-- body.onload is called once the page is loaded (call the 'init' function) -->
-		<body onload="init();">
-			<!-- define a DIV into which the map will appear. Make it take up the whole window -->
-			<div style="width:100%; height:100%" id="map"></div>
-		</body>
-		</html>
-		'''
-		file = fileUtils(self.htmlfile,content)
-		file.run()
-		logging.debug("<<")
-
-	def createErrorHtml(self):
-		logging.debug(">>")
-		content = '''
-	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-	<html xmlns="http://www.w3.org/1999/xhtml"  xmlns:v="urn:schemas-microsoft-com:vml">
-		<body>
-		No Gpx Data
-		</body>
-	</html>
-		'''
-		file = fileUtils(self.htmlfile,content)
-		file.run()
-		logging.debug("<<")
+    # Default URLS
+    URLS = {'OpenLayers.js' : "http://openlayers.org/api/OpenLayers.js",
+            'OpenStreetMap.js' : "http://www.openstreetmap.org/openlayers/OpenStreetMap.js"}
+    # URLS that will not be cached
+    staticURLS = {'OpenLayers' : 'http://openlayers.org/api/'}                 #openlayers default location
+
+    def __init__(self, data_path = None, waypoint = None, pytrainer_main=None):
+        logging.debug(">>")
+        self.data_path = data_path
+        self.waypoint = waypoint
+        self.pytrainer_main = pytrainer_main
+        self.tmpdir = (self.pytrainer_main.profile.tmpdir)
+        self.htmlfile = "%s/osm.html" % (self.tmpdir)
+        logging.debug("<<")
+
+    def download(self,url,localfile):
+        """Copy the contents of a file from a given URL to pytrainer's tmpdir
+        """    
+        logging.debug(">>")
+        print "Downloading %s" % (url)
+        webFile = urllib.urlopen(url)
+        # always store downloaded files in tmpdir/cache
+        localFile = open(self.tmpdir + '/cache/' + localfile, 'w')
+        localFile.write(webFile.read())
+        webFile.close()
+        localFile.close()
+        logging.debug("<<")
+        
+    def cacheUrls(self):
+        ''' Store URL copies of needed files locally, 
+            download new versions every ~14 days or if files does'nt exists
+        '''
+        #TODO: open a msg/progress bar while downloading the new files to inform the user
+        logging.debug(">>")
+        # create cache subfolder in tmpdir if not already there
+        try:
+            cachedir = self.tmpdir + '/cache';
+            if not os.path.isdir(cachedir):
+                print "Creating %s folder" % (cachedir)
+                os.mkdir(cachedir)
+                
+            for localfile in self.URLS:
+                # local cached file does not exists? download it
+                if not os.path.isfile(cachedir + '/' + localfile):
+                    self.download(self.URLS[localfile],localfile)
+                else: 
+                    creationTime = os.path.getctime(cachedir + '/' + localfile)     # read file creation time
+                    if creationTime > time.time():                                  # file is in the future?! download it again
+                        self.download(self.URLS[localfile],localfile)
+                    elif creationTime + 14*24*60*60 < time.time():                  # 14 (days) * 24 hours * 60 minutes * 60 seconds = 14 days 
+                        self.download(self.URLS[localfile],localfile)           
+                # No exception was thrown, assuming local cache file exists and current
+                self.URLS[localfile]='file://' + cachedir + '/' + localfile;
+                logging.info("Using %s file " % (self.URLS[localfile]))
+        except Exception as e:
+            loggin.error("(%s) Error while downloading %s to local cache, using default hosted file instaed." \
+                           % (str(e), self.URLS[localfile]))
+        logging.debug("<<")
+    
+    def drawMap(self, activity, linetype):
+        '''Draw OSM map
+        create HTML file using Open Layers and Open Street Map
+        render using embedded Webkit
+        '''
+        logging.debug(">>")
+        points = []
+        levels = []
+        pointlist = []
+        polyline = []
+        attrlist = []
+
+        try :
+            list_values = activity.tracks
+            if list_values is not None and list_values != [] and len(list_values) > 0:
+                for i in list_values:
+                    lat, lon = float(i[4]), float(i[5])
+                    pointlist.append((lat,lon))
+                    polyline.append("[%s, %s]" % (lon, lat))
+                    attrlist.append((i[3],i[6])) # (Speed, HR)
+                points,levels = Points.encodePoints(pointlist)
+                points = points.replace("\\","\\\\")
+                laps = activity.laps
+                timeHours = int(activity.time) / 3600
+                timeMin = (float(activity.time) / 3600.0 - timeHours) * 60
+                time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min"))
+                startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title)
+                finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), \
+                            time, _("Distance"), activity.distance, activity.distance_unit)
+                startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
+                finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html
+
+                self.createHtml_osm(polyline, startinfo, finishinfo, laps, attrlist, linetype)
+            else:
+                self.createErrorHtml()
+        except Exception as e:
+            self.createErrorHtml(e)
+        
+        return self.htmlfile
+        logging.debug("<<")
+
+    def selectArea(self,dc=None):
+    
+        # try using local cached versions of JS files for faster rendering
+        self.cacheUrls();
+
+        content = '''
+        <html xmlns="http://www.w3.org/1999/xhtml">
+        <head>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            p {
+                width: 512px;
+            }
+            #config {
+                margin-top: 1em;
+                width: 512px;
+                position: relative;
+                height: 8em;
+            }
+            #controls {
+                padding-left: 2em;
+                margin-left: 0;
+                width: 12em;
+            }
+            #controls li {
+                padding-top: 0.5em;
+                list-style: none;
+            }
+            #options {
+                font-size: 1em;
+                top: 0;
+                margin-left: 15em;
+                position: absolute;
+            }
+
+            /* avoid pink tiles */
+            .olImageLoadError {
+                background-color: transparent !important;
+            }
+        </style>
+
+        <!-- Load libraries from remote or local cache -->
+        <script src="''' + self.URLS['OpenLayers.js']    + '''"></script>
+        <script src="''' + self.URLS['OpenStreetMap.js'] + '''"></script>
+
+        <script type="text/javascript">
+            var map, polygonControl;
+            function init(){
+
+                //"fix" locations
+                OpenLayers.ImgPath="''' + self.staticURLS['OpenLayers'] + '''img/";
+                OpenLayers.scriptLocation="''' + self.staticURLS['OpenLayers'] + '''";
+                OpenLayers._getScriptLocation=function() { return "''' + self.staticURLS['OpenLayers'] + '''";};
+                            
+                // for transforming WGS 1984 to Spherical Mercator Projection
+                pWGS = new OpenLayers.Projection("EPSG:4326");
+                pMP = new OpenLayers.Projection("EPSG:900913");
+
+                map = new OpenLayers.Map ("map", {
+                    controls:[
+                        new OpenLayers.Control.Navigation(),
+                        new OpenLayers.Control.PanZoomBar(),
+                        new OpenLayers.Control.LayerSwitcher(),
+                        new OpenLayers.Control.Attribution(),
+                        new OpenLayers.Control.MousePosition()],
+                    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+                    maxResolution: 156543.0399,
+                    numZoomLevels: 19,
+                    units: 'm',
+                    projection: pMP,
+                    displayProjection: pWGS
+                } );
+
+                //Add open street maps layers
+                layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
+                map.addLayer(layerMapnik);
+                layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
+                map.addLayer(layerTilesAtHome);      
+
+                //Add polygon drawing layer
+                var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
+                map.addLayer(polygonLayer);
+                
+                polyOptions = {sides: 4, irregular: true};
+                polygonControl = new OpenLayers.Control.DrawFeature(polygonLayer,
+                                                OpenLayers.Handler.RegularPolygon,
+                                                {handlerOptions: polyOptions});
+
+                // For desrializings
+                var out_options = {
+                    'internalProjection': map.baseLayer.projection,
+                    'externalProjection': pWGS
+                };
+
+                // allow only one feature to be drawn
+                polygonLayer.events.register("beforefeatureadded", polygonLayer, function(f) { polygonLayer.removeAllFeatures(true)});
+                // Change title after draw
+                polygonLayer.events.register("featureadded", polygonLayer, function(f) { 
+                    var title=(new OpenLayers.Format.GeoJSON(out_options).write(f.feature,false));
+                    document.title=title;
+                    });
+                
+                //prepaint saved polygon
+                savedPolygon = \'''' + str(self.waypoint) + '''\';
+                if ((savedPolygon) && (savedPolygon!=='None')) {            
+                   // deserialize 
+                   var geojson_format = new OpenLayers.Format.GeoJSON(out_options);
+                   var feature = geojson_format.read(savedPolygon);
+                   // make sure it's an array
+                   if(feature.constructor != Array)
+                        feature = [feature];
+                   if (feature && feature.length>0) {
+                      var bounds = feature[0].geometry.getBounds();
+                      polygonLayer.addFeatures(feature);
+                      map.zoomToExtent(bounds);
+                   }
+                } else {
+                    map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+                }         
+
+                map.addControl(polygonControl);            
+                
+                document.getElementById('noneToggle').checked = true;
+                
+            }
+            
+            function setOptions(options) {
+                polygonControl.handler.setOptions(options);
+            }
+            
+            function setSize(fraction) {
+                var radius = fraction * map.getExtent().getHeight();
+                polygonControl.handler.setOptions({radius: radius,
+                                                   angle: 0});
+            }
+        </script>
+        </head>
+
+          <body onload="init()">
+            <input type="radio" name="type"
+                   value="none" id="noneToggle"
+                   onclick="polygonControl.deactivate()"
+                   checked="checked" />
+            <label for="noneToggle">Navigate</label>
+            <input type="radio" name="type"
+                   value="polygon" id="polygonToggle"
+                   onclick="polygonControl.activate()" />
+            <label for="polygonToggle">Draw polygon</label>
+            <div id="map" class="smallmap"></div>   
+          </body>
+        </html>'''     
+
+        file = fileUtils(self.htmlfile,content)
+        file.run()
+        return self.htmlfile
+        
+    def createHtml_osm(self, polyline, startinfo, finishinfo, laps, attrlist, linetype):
+        '''
+        Generate OSM map html file using MapLayers
+        '''
+        logging.debug(">>")
+
+        # try using local cached versions of JS files for faster rendering
+        self.cacheUrls();
+        
+        content = '''<html>
+        <head>
+            <!-- bring in the OpenLayers javascript library
+                 (here we bring it from the remote site, but you could
+                 easily serve up this javascript yourself) -->
+            <script src="''' + self.URLS['OpenLayers.js'] + '''"></script>
+            <!-- bring in the OpenStreetMap OpenLayers layers.
+                 Using this hosted file will make sure we are kept up
+                 to date with any necessary changes -->
+            <script src="''' + self.URLS['OpenStreetMap.js'] + '''"></script>
+
+            <script type="text/javascript">
+                //complex object of type OpenLayers.Map
+                var map;
+
+                //icons data object
+                var icons = {
+                    iconSize : new OpenLayers.Size(30,30)'''
+
+        # If have laps data insert markers here
+        try:
+            lapsContent=''
+            for lap in laps[:500]:  # OpenLayers with firefox is limited to 500 markers -> TODO: Transfer to a constant somewhere ?
+                lapNumber = int(lap['lap_number'])+1
+                elapsedTime = float(lap['elapsed_time'])
+                elapsedTimeHours = int(elapsedTime/3600)
+                elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60)
+                elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60)
+                if elapsedTimeHours > 0:
+                    strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs)
+                elif elapsedTimeMins > 0:
+                    strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs)
+                else:
+                    strElapsedTime = "%0.0fs" % (elapsedTimeSecs)
+                #process lat and lon for this lap
+                lapLat = float(lap['end_lat'])
+                lapLon = float(lap['end_lon'])
+                #build laps content string
+                lapsContent+=',\n'
+                lapsContent+='\t\t\t\t\tlap%d: { url : "/waypoint.png", coordinates : [%f,%f], popupInfo: "%s" }' % \
+                        (lapNumber, lapLon, lapLat, \
+                        "<div class='info_content'>End of lap:%d<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>" % \
+                            (lapNumber, strElapsedTime, float(lap['distance'])/1000, lap['calories'])
+                        )
+            content+=lapsContent
+        except Exception as e:
+            # If something breaks here just skip laps data
+            logging.error('Error formating laps data: ' + str(e))
+        # Insert start/finish track markers
+        content+=''',\n        start : { url : "/start.png", coordinates : %s, popupInfo : "%s" },
+                    finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" },
+                    url : "file://%s/glade"''' \
+                    % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path))
+
+        content+='''};\n
+                function init() {
+
+                // fool openlayers scripts so it will download images and themes from the web instead of local folder if cached
+                OpenLayers.ImgPath="''' + self.staticURLS['OpenLayers'] + '''img/";
+                OpenLayers.scriptLocation="''' + self.staticURLS['OpenLayers'] + '''";
+                OpenLayers._getScriptLocation=function() { return "''' + self.staticURLS['OpenLayers'] + '''";};
+
+                // for transforming WGS 1984 to Spherical Mercator Projection
+                pWGS = new OpenLayers.Projection("EPSG:4326");
+                pMP = new OpenLayers.Projection("EPSG:900913");
+
+                map = new OpenLayers.Map ("map", {
+                    controls:[
+                        new OpenLayers.Control.Navigation(),
+                        new OpenLayers.Control.PanZoomBar(),
+                        new OpenLayers.Control.LayerSwitcher(),
+                        new OpenLayers.Control.Attribution()],
+                    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+                    maxResolution: 156543.0399,
+                    numZoomLevels: 19,
+                    units: 'm',
+                    projection: pMP,
+                    displayProjection: pWGS
+                } );
+
+                // Track painting style
+                var trackStyle = {
+                    strokeColor: "#33DDDD",
+                    strokeWidth: 3,
+                    strokeDashstyle: "solid",
+                    strokeOpacity: 0.6,
+                    pointRadius: 6,
+                };
+
+                //Build track object
+                var track =
+                    {
+                    "type":"Feature",
+                    "id":"OpenLayers.Feature.Vector_259",
+                    "properties":{},
+                    "geometry":
+                    {
+                        "type":"LineString",
+                        "coordinates":
+                            ['''
+        #Insert track points here
+        content+=",".join(polyline);
+        content+=''']
+                    },
+                    "crs":
+                        {
+                        "type":"OGC",
+                        "properties":
+                            {
+                            "urn":"urn:ogc:def:crs:OGC:1.3:CRS84"
+                            }
+                        }
+                    }
+
+                //Add open street maps layers
+                layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
+                map.addLayer(layerMapnik);
+                layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
+                map.addLayer(layerTilesAtHome);
+
+                //Create vector layer to add the data on to
+                var vector_layer = new OpenLayers.Layer.Vector();
+                vector_layer.setName('Track');
+
+                var geojson_format = new OpenLayers.Format.GeoJSON();
+                var feature = geojson_format.read(track,"Feature");
+
+                // transform from WGS 1984 to Spherical Mercator Projection
+                feature.geometry.transform(pWGS, pMP);
+
+                feature.geometry.calculateBounds();
+                var vector=new OpenLayers.Feature.Vector();
+                vector.geometry = feature.geometry;
+                vector.style=trackStyle;
+
+                vector_layer.addFeatures(vector);
+                map.addLayer(vector_layer);
+
+                // Insert start/finish markers
+                layerMarkers = new OpenLayers.Layer.Markers("Markers");
+                var offset = new OpenLayers.Pixel(-(icons.iconSize.w/2), -icons.iconSize.h);
+                for (var i in icons) {
+                    if (icons[i].coordinates) {
+                        icons[i].icon = new OpenLayers.Icon(icons.url + icons[i].url,icons.iconSize,offset);
+                        icons[i].lonLat = new OpenLayers.LonLat(icons[i].coordinates[0],icons[i].coordinates[1]);
+                        icons[i].lonLat.transform(pWGS,pMP);
+                        icons[i].marker = new OpenLayers.Marker(icons[i].lonLat,icons[i].icon);
+                        icons[i].popup = new OpenLayers.Popup.FramedCloud("Info",
+                                            icons[i].lonLat,
+                                                          null,
+                                                icons[i].popupInfo,
+                                            icons[i].icon,
+                                                true,
+                                            null
+                                            );
+                        icons[i].onClick = function(e) { map.addPopup(this.popup); this.popup.show(); }
+                        icons[i].marker.events.register("mousedown", icons[i], function(e) { this.onClick(e)} )
+                        layerMarkers.addMarker(icons[i].marker);
+                    }
+                }
+                map.addLayer(layerMarkers);
+
+                //zoom and center to the track layouts
+                map.zoomToExtent(feature.geometry.getBounds());
+
+            }
+        </script>
+
+        </head>
+        <!-- body.onload is called once the page is loaded (call the 'init' function) -->
+        <body onload="init();">
+            <!-- define a DIV into which the map will appear. Make it take up the whole window -->
+            <div style="width:100%; height:100%" id="map"></div>
+        </body>
+        </html>
+        '''
+        file = fileUtils(self.htmlfile,content)
+        file.run()
+        logging.debug("<<")
+
+    def createErrorHtml(self,errMsg=None):
+        logging.debug(">>")
+        errMsg = errMsg or ''       # convert None to empty string
+        content = '''
+        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+        <html xmlns="http://www.w3.org/1999/xhtml"  xmlns:v="urn:schemas-microsoft-com:vml">
+            <body>
+            No GPX Data (''' + str(errMsg) + ''')
+            </body>
+        </html>
+        '''
+        file = fileUtils(self.htmlfile,content)
+        file.run()
+        logging.debug("<<")
 
diff --git a/pytrainer/extensions/waypointeditor.py b/pytrainer/extensions/waypointeditor.py
index 2dddff3..aae806a 100644
--- a/pytrainer/extensions/waypointeditor.py
+++ b/pytrainer/extensions/waypointeditor.py
@@ -16,26 +16,24 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-import gtkmozembed
-import os
-import re
-
 from pytrainer.extension import Extension
 from pytrainer.lib.fileUtils import fileUtils
-
-import string,cgi,time
-import time
-
+import gtk
 import logging
+import os
+import re
+import webkit
 
 class WaypointEditor:
 	def __init__(self, data_path = None, vbox = None, waypoint=None, parent=None):		
 		logging.debug(">>")
 		self.data_path = data_path
 		self.extension = Extension()
-		self.moz = gtkmozembed.MozEmbed()
-		self.moz.connect('title', self.handle_title_changed) 
-		vbox.pack_start(self.moz, True, True)
+		self.wkview = webkit.WebView()
+		self.wkview.connect('notify::title', self.handle_title_changed) 
+		scrolled_window = gtk.ScrolledWindow()
+		scrolled_window.add(self.wkview)
+		vbox.pack_start(scrolled_window, True, True)
 		vbox.show_all()
 		self.htmlfile = ""
 		self.waypoint=waypoint
@@ -43,7 +41,9 @@ class WaypointEditor:
 		logging.debug("<<")
 		
 	def handle_title_changed(self, *args): 
-		title = self.moz.get_title() 
+		title = self.wkview.get_title()
+		if title == None:
+			return
 		logging.debug("Received title: "+ title)
 		m = re.match("call:([a-zA-Z]*)[(](.*)[)]", title) 
 		if m: 
@@ -86,7 +86,7 @@ class WaypointEditor:
 		tmpdir = self.pytrainer_main.profile.tmpdir
 		htmlfile = tmpdir+"/waypointeditor.html"
 		logging.debug("HTML file: "+str(htmlfile))
-		self.moz.load_url("file://"+htmlfile)
+		self.wkview.load_uri("file://"+htmlfile)
 		logging.debug("<<")
 	
 	def createHtml(self,default_waypoint=None):
diff --git a/pytrainer/gui/aboutdialog.py b/pytrainer/gui/aboutdialog.py
index 66b3ada..770ec63 100644
--- a/pytrainer/gui/aboutdialog.py
+++ b/pytrainer/gui/aboutdialog.py
@@ -23,42 +23,46 @@ import gtk
 import pytrainer.lib.webUtils
 
 class About:
-	def __init__(self,data_path = None, version = None):
-		def url_hook(dialog, url):
-			pytrainer.lib.webUtils.open_url_in_browser(url)
-		# Available in PyGTK 2.6 and above
-		gtk.about_dialog_set_url_hook(url_hook)		
-		self.data_path = data_path
-		self.version = version
+    def __init__(self,data_path = None, version = None):
+        def url_hook(dialog, url):
+            pytrainer.lib.webUtils.open_url_in_browser(url)
+        # Available in PyGTK 2.6 and above
+        gtk.about_dialog_set_url_hook(url_hook)     
+        self.data_path = data_path
+        self.version = version
 
-	def run(self):
-		authors = ["Fiz Vázquez <vud1 at sindominio.net>\nDavid García Granda <dgranda at gmail.com>\nJohn Blance <john.blance at gmail.com>\nArnd Zapletal <a.zapletal at gmail.com>\nNathan Jones <nathan at ncjones.com>\n\n-Package maintainers:\n\nRedHat/Fedora: Douglas E. Warner <silfreed at silfreed.net>\nDebian: Noèl Köthe <noel at debian.org>\nUbuntu: Kevin Dwyer <kevin at pheared.net>, Alessio Treglia <quadrispro at ubuntu.com>"]
-		translator_credits = "Euskara: Jabier Santamaria <mendikote at gmail.com>\nCatalà: Eloi Crespillo Itchart <eloi at ikuszen.com>\nČesky: Lobus Pokorny <sp.pok at seznam.cz>\nFrançais: Dj <dj at djremixtheblog.be>, Pierre Gaigé <pgaige at free.fr>\nNorsk: Havard Davidsen <havard.davidsen at gmail.com>\nPolski: Seweryn Kokot <skokot at po.opole.pl>\nDeutsch: Aleks <aleks at schnecklecker.de>, Noèl Köthe <noel at debian.org>\nEspañol: Fiz Vázquez <vud1 at sindominio.net>, David García Granda <dgranda at gmail.com>"
-		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"
-		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-09 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")
-		about_dialog.set_license(license)
-		
-		about_dialog.set_authors(authors)
-		about_dialog.set_translator_credits(translator_credits)
-		about_dialog.set_logo(gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/pytrainer_mini.png"))
+    def run(self):
+        authors = ["Fiz Vázquez <vud1 at sindominio.net>\nDavid García Granda <dgranda at gmail.com>\nJohn Blance <john.blance at gmail.com>\nArnd Zapletal <a.zapletal at gmail.com>\nNathan Jones <nathan at ncjones.com>\n\n-Package maintainers:\n\nRedHat/Fedora: Douglas E. Warner <silfreed at silfreed.net>\nDebian: Noèl Köthe <noel at debian.org>, Christian Perrier <bubulle at debian.org>\nUbuntu: Kevin Dwyer <kevin at pheared.net>, Alessio Treglia <quadrispro at ubuntu.com>"]
+        translator_credits = "Euskara: Jabier Santamaria <mendikote at gmail.com>\nCatalà: Eloi Crespillo Itchart <eloi at ikuszen.com>\nČesky: Lobus Pokorny <sp.pok at seznam.cz>\nFrançais: Dj <dj at djremixtheblog.be>, Pierre Gaigé <pgaige at free.fr>, Christian Perrier <bubulle at debian.org>\nNorsk: Havard Davidsen <havard.davidsen at gmail.com>\nPolski: Seweryn Kokot <skokot at po.opole.pl>\nDeutsch: Aleks <aleks at schnecklecker.de>, Noèl Köthe <noel at debian.org>, Erik Pfannenstein <debianignatz at gmx.de>, Andreas Mair <amair.sob at googlemail.com>\nEspañol: Fiz Vázquez <vud1 at sindominio.net>, David García Granda <dgranda at gmail.com>\nSvenska: Per Medin <per.medin at gmail.com>\nGalego: Kaptan <khanyux at gmail.com>\nPortuguês: Pedro Ribeiro <p.m42.ribeiro at gmail.com>"
+        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"
+        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-09 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")
+        about_dialog.set_license(license)
+        
+        about_dialog.set_authors(authors)
+        about_dialog.set_translator_credits(translator_credits)
+        about_dialog.set_logo(gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/pytrainer_mini.png"))
 
-		# callbacks for destroying the dialog
-		def close(dialog, response, editor):
-			editor.about_dialog = None
-			dialog.destroy()
-		def delete_event(dialog, event, editor):
-			editor.about_dialog = None
-			return True
-		
-		about_dialog.connect("response", close, self)
-		about_dialog.connect("delete-event", delete_event, self)  
-		self.about_dialog = about_dialog
-		about_dialog.show()
-		
+        # callbacks for destroying the dialog
+        def close(dialog, response, editor):
+            editor.about_dialog = None
+            dialog.destroy()
+        def delete_event(dialog, event, editor):
+            editor.about_dialog = None
+            return True
+        
+        about_dialog.connect("response", close, self)
+        about_dialog.connect("delete-event", delete_event, self)  
+        self.about_dialog = about_dialog
+        about_dialog.show()
+        
+    def present(self):
+        if self.about_dialog is None:
+            self.run()
+        self.about_dialog.present()
diff --git a/pytrainer/gui/color.py b/pytrainer/gui/color.py
new file mode 100644
index 0000000..2e9da1e
--- /dev/null
+++ b/pytrainer/gui/color.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import gtk.gdk
+from pytrainer.lib.color import Color
+
+class ColorConverter(object):
+    
+    """Converts between Pytrainer and GDK color instances.""" 
+    
+    def convert_to_gdk_color(self, color):
+        """Convert a Pytrainer color to a GDK color."""
+        color_format = "#{0:06x}".format(color.rgb_val)
+        return gtk.gdk.color_parse(color_format)
+    
+    def convert_to_color(self, gdk_col):
+        """Convert a GDK color to a Pytrainer color."""
+        red = gdk_col.red >> 8
+        green = gdk_col.green >> 8
+        blue = gdk_col.blue >> 8
+        rgb_val = (red << 16) + (green << 8) + blue
+        return Color(rgb_val)
diff --git a/pytrainer/gui/drawArea.py b/pytrainer/gui/drawArea.py
index 55e51eb..221b847 100644
--- a/pytrainer/gui/drawArea.py
+++ b/pytrainer/gui/drawArea.py
@@ -171,7 +171,7 @@ class DrawArea:
         else:
             return '%1.1f' % x
 
-    def drawStackedBars(self,xvalues,yvalues,ylabel,title, valuesAreTime=False):
+    def drawStackedBars(self,xvalues,yvalues,ylabel,title, valuesAreTime=False, colors={}):
         '''function to draw stacked bars
             xvalues needs to be a list of lists of strings, e.g. [0]["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
             yvalues needs to be a list of dicts e.g. [0]{'Kayak': {'Tue': 10.08, 'Fri': 17.579999999999998, 'Thu': 15.66, 'Sat': 30.619999999999997}, {'Run': {'Mon': 9.65, 'Sun': 15.59}}
@@ -210,14 +210,20 @@ class DrawArea:
         xvals = [x+barOffset for x in range(0, numCols)]
         cellText = []
         self.showGraph=False
+        
+        for k in colors:
+        	if colors[k]==None: colors[k]=''
 
         #Display first axis
+        xticks = []
         for key in keys:
             logging.debug("Day of the week: %s", str(key))
             for ind in inds:
                 ybottoms[ind] += yheights[ind]
                 yheights[ind] = 0 #Zero heights
-            color = self.getColor(keys.index(key))
+            color = "#"+colors.get(key, '')
+            if len(color)<2:
+                color = self.getColor(keys.index(key))
             for xvalue in xvalues[0]:
                 index = xvalues[0].index(xvalue)
                 if xvalue in yvalues[0][key]:
@@ -237,6 +243,8 @@ class DrawArea:
         if len(xvalues) == 1:
             plt.title(title[0])
             axis.legend(loc=0)
+            
+        axis.set_xlim(0,numCols)
 
         logging.debug("X values first axis: %s", str(xvals))
         logging.debug("Y values first axis: %s", str(yheights))
@@ -252,7 +260,9 @@ class DrawArea:
                 for ind in inds:
                     ybottoms[ind] += yheights[ind]
                     yheights[ind] = 0.0 #Zero heights
-                color = self.getColor(keys.index(key))
+                color = "#"+colors.get(key, '')
+                if len(color)<2:
+                    color = self.getColor(keys.index(key))
                 for xvalue in xvalues[0]:
                     index = xvalues[0].index(xvalue)
                     if xvalue in yvalues[1][key]:
@@ -276,6 +286,7 @@ class DrawArea:
                     ax2.bar(xvals, [0]*numCols, bottom=[0]*numCols, width=barWidth, color=color,  align='edge', label=key)
                     pass
             ax2.set_xticklabels('' * len(xvalues[1]))
+            ax2.set_xlim(0,numCols)
             ax2.set_ylabel(ylabel[1])
             ax2.legend(loc=0)
             plt.title("%s vs %s" %(title[0],title[1]))
diff --git a/pytrainer/gui/equipment.py b/pytrainer/gui/equipment.py
index 676acff..9911645 100644
--- a/pytrainer/gui/equipment.py
+++ b/pytrainer/gui/equipment.py
@@ -26,7 +26,17 @@ class EquipmentStore(gtk.ListStore):
         self._equipment_service = equipment_service
         for equipment in equipment_service.get_all_equipment():
             self._append_row(equipment)
-        
+        self.set_default_sort_func(self._sort)
+        self.set_sort_column_id(-1, gtk.SORT_ASCENDING)
+        
+    def _sort(self, store, x, y):
+        if self.get_value(x, 4) != self.get_value(y, 4):
+            return self.get_value(y, 4)-self.get_value(x, 4)
+        elif self.get_value(x, 2) == self.get_value(y, 2):
+            return 0
+        else:
+            return self.get_value(y, 2)*100-self.get_value(x, 2)*100
+    
     def _append_row(self, equipment):
         self.append(self._create_tuple(equipment))
         
@@ -85,11 +95,11 @@ class EquipmentUi(gtk.HBox):
 
     def _init_tree_view(self):
         tree_view = self._get_tree_view()
-        column = gtk.TreeViewColumn("Description", gtk.CellRendererText(), text=1)
+        column = gtk.TreeViewColumn(_("Description"), gtk.CellRendererText(), text=1)
         column.set_resizable(True)
         tree_view.append_column(column)
-        tree_view.append_column(gtk.TreeViewColumn("Usage", gtk.CellRendererProgress(), value=2, text=3))
-        tree_view.append_column(gtk.TreeViewColumn("Active", gtk.CellRendererToggle(), active=4))
+        tree_view.append_column(gtk.TreeViewColumn(_("Usage"), gtk.CellRendererProgress(), value=2, text=3))
+        tree_view.append_column(gtk.TreeViewColumn(_("Active"), gtk.CellRendererToggle(), active=4))
         # add filler column
         tree_view.append_column(gtk.TreeViewColumn())
         tree_view.set_model(self._equipment_store)
diff --git a/pytrainer/gui/filechooser.py b/pytrainer/gui/filechooser.py
index 96e58c7..55d3cc8 100644
--- a/pytrainer/gui/filechooser.py
+++ b/pytrainer/gui/filechooser.py
@@ -20,9 +20,11 @@
 
 from SimpleGladeApp import SimpleGladeApp
 import gtk
+import logging
 
 class FileChooser(SimpleGladeApp):
     def __init__(self,data_path = None, parent = None, method = None, action = None):
+        logging.debug('>>')
         self.data_path = data_path
         self.filename = None
         self.parent = parent
@@ -36,26 +38,35 @@ class FileChooser(SimpleGladeApp):
             filter.add_pattern("*.gpx")
             self.filechooserdialog.set_filter(filter)
         else:
-            self.button14.set_label("Save")
+            self.button14.set_label(_("Save"))
             self.filechooserdialog.set_action(gtk.FILE_CHOOSER_ACTION_SAVE)
-            print self.filechooserdialog.get_action()
             self.filechooserdialog.set_current_name("*.csv")
+        logging.debug('<<')
 
     def on_accept_clicked(self,widget):
+        logging.debug('>>')
         try:
             self.filename = self.filechooserdialog.get_filename()
+            logging.debug("Filename chosen: %s" % self.filename)
         except AttributeError:
             if self.filename is None:
+                logging.debug("No valid filename has been chosen. Exiting")
                 self.quit()
                 return
+        logging.debug("Parent: %s | Method: %s" %(self.parent, self.method))
         parentmethod = getattr(self.parent,self.method)
         parentmethod()
+        logging.debug("Closing current window")
         self.closewindow()
+        logging.debug('<<')
     
     def on_cancel_clicked(self,widget):
+        logging.debug(">>")
         self.closewindow()
+        logging.debug('<<')
 
     def closewindow(self):
-        #self.filechooserdialog.hide()
-        self.filechooserdialog = None
-        self.quit() 
+        if self.filechooserdialog is not None:
+            self.filechooserdialog.hide()
+        else:
+            logging.debug('GTK Dialog no longer exists, nothing to do')
diff --git a/pytrainer/gui/windowimportdata.py b/pytrainer/gui/windowimportdata.py
index 1fe5e11..ba7f935 100644
--- a/pytrainer/gui/windowimportdata.py
+++ b/pytrainer/gui/windowimportdata.py
@@ -32,7 +32,8 @@ from pytrainer.gui.dialogs import fileChooserDialog
 from pytrainer.lib.date import Date
 
 class WindowImportdata(SimpleGladeApp):
-    def __init__(self, data_path = None, parent=None, config=None, pytrainer_main=None):
+    def __init__(self, sport_service, data_path = None, parent=None, config=None, pytrainer_main=None):
+        self._sport_service = sport_service
         self.data_path = data_path
         self.glade_path=data_path+"glade/importdata.glade"
         self.root = "win_importdata"
@@ -202,12 +203,12 @@ class WindowImportdata(SimpleGladeApp):
     def init_csvimport_tab(self):
         logging.debug(">>")
         #Populate Force Sport to combobox
-        sport_list = self.pytrainer_main.profile.getSportList()
+        sport_list = self._sport_service.get_all_sports()
         #Remove placeholder item (needed to ensure correct model for combobox)
         self.comboCSVForceSport.remove_text(0)
         for sport in sport_list:
-            logging.debug('Adding sport: %s' % sport[0])
-            self.comboCSVForceSport.append_text(sport[0])
+            logging.debug('Adding sport: %s' % sport.name)
+            self.comboCSVForceSport.append_text(sport.name)
         self.comboCSVForceSport.set_active(0)
         logging.debug("<<")
         return
@@ -487,11 +488,8 @@ class WindowImportdata(SimpleGladeApp):
         """
             Function to import selected activity
         """
-
-        #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()
-        result = self.pytrainer_main.record.newMultiRecord(activities, list_sport)
+        result = self.pytrainer_main.record.newMultiRecord(activities)
         for activity in result:
             if "db_id" in activity.keys() and type(activity["db_id"]) is types.IntType:
                 #Activity imported correctly
diff --git a/pytrainer/gui/windowmain.py b/pytrainer/gui/windowmain.py
index 9013467..a3c04d9 100644
--- a/pytrainer/gui/windowmain.py
+++ b/pytrainer/gui/windowmain.py
@@ -1,3 +1,6 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+
 #Copyright (C) Fiz Vazquez vud1 at sindominio.net
 # Modified by dgranda
 
@@ -41,6 +44,7 @@ from pytrainer.daygraph import DayGraph
 from pytrainer.weekgraph import WeekGraph
 from pytrainer.monthgraph import MonthGraph
 from pytrainer.yeargraph import YearGraph
+from pytrainer.totalgraph import TotalGraph
 from pytrainer.heartrategraph import HeartRateGraph
 from pytrainer.extensions.mapviewer import MapViewer
 from pytrainer.extensions.waypointeditor import WaypointEditor
@@ -53,7 +57,8 @@ from pytrainer.lib.uc import UC
 
 
 class Main(SimpleGladeApp):
-    def __init__(self, data_path = None, parent = None, version = None, gpxDir = None):
+    def __init__(self, sport_service, data_path = None, parent = None, version = None, gpxDir = None):
+        self._sport_service = sport_service
         def url_hook(dialog, url):
             pytrainer.lib.webUtils.open_url_in_browser(url)
         # Available in PyGTK 2.6 and above
@@ -83,12 +88,14 @@ class Main(SimpleGladeApp):
         self.y1_color = None
         self.y1_linewidth = 1
         # setup Search ListView
-        self.listsearch = ListSearch(self, self.pytrainer_main)
+        self.listsearch = ListSearch(sport_service, self, self.pytrainer_main)
+        
+        self.aboutwindow = None
 
     def new(self):
         self.menublocking = 0
         self.selected_view="day"
-        self.window1.set_title ("pyTrainer %s" % self.version)
+        self.window1.set_title ("pytrainer %s" % self.version)
         try:
             width, height = self.pytrainer_main.profile.getValue("pytraining","window_size").split(',')
             self.window1.resize(int(width), int(height))
@@ -128,6 +135,60 @@ class Main(SimpleGladeApp):
                     {'name':_("Max HR"), 'xalign':1.0}
                 ]
         self.create_treeview(self.athleteTreeView,columns)
+        #create the columns for the stats treeview
+        columns=[   {'name':_("id"), 'visible':False},
+                    {'name':_("Sport")},
+                    {'name':_("Records"), 'xalign':1.0},
+                    {'name':_("Total duration"), 'xalign':1.0, 'format_duration':True},
+                    {'name':_("Total distance"), 'xalign':1.0, 'format_float':'%.1f', 'quantity':'distance'},
+                    {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'maxspeed', 'xalign':1.0},
+                    {'name':_("Max speed"), 'format_float':'%.2f', 'quantity':'maxspeed', 'xalign':1.0},
+                    {'name':_("Avg HR"), 'xalign':1.0},
+                    {'name':_("Max HR"), 'xalign':1.0},
+                    {'name':_("Max duration"), 'xalign':1.0, 'format_duration':True},
+                    {'name':_("Max distance"), 'xalign':1.0, 'format_float':'%.1f', 'quantity':'distance'},
+                ]
+        self.create_treeview(self.statsTreeView,columns)
+
+        #create the columns for the laps treeview
+        columns=[ 
+                    {'name':_("Lap")},
+                    {'name':_("Trigger"), 'xalign':0, 'pixbuf':True},
+                    {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'},
+                    {'name':_("Time"), 'xalign':1.0, 'format_duration':True},
+                    {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'},
+                    {'name':_("Max speed"), 'format_float':'%.2f', 'quantity':'speed'},
+                    {'name':_("Avg pace"), 'xalign':1.0, 'quantity':'pace'},
+                    {'name':_("Max pace"), 'xalign':1.0, 'quantity':'pace'},
+                    {'name':_("Avg HR"), 'xalign':1.0},
+                    {'name':_("Max HR"), 'xalign':1.0},
+                    {'name':_("Calories"), 'xalign':1.0},
+                    {'name':_("Intensity"), 'visible':False},
+                    {'name':_("Comments"), 'xalign':0.0},
+                ]
+        self.create_treeview(self.lapsTreeView,columns)
+        
+        #create the columns for the projected times treeview
+        columns=[ 
+                    {'name':_("id"), 'visible':False},
+                    {'name':_("Race"), 'xalign':1.0},
+                    {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'},
+                    {'name':_("Time"), 'xalign':1.0, 'format_duration':True},
+                ]
+        self.create_treeview(self.analyticsTreeView,columns,sortable=False)
+        
+        #create the columns for the rank treeview
+        columns=[ 
+                    {'name':_("id"), 'visible':False},
+                    {'name':_("Rank"), 'visible':True},
+                    {'name':_("Date"), 'xalign':1.0},
+                    {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'},
+                    {'name':_("Time"), 'xalign':1.0, 'format_duration':True},
+                    {'name':_("Speed"),  'format_float':'%.2f', 'quantity':'speed'},
+                    {'name':_("Color"), 'visible':False},
+                ]
+        self.create_treeview(self.rankingTreeView,columns,sortable=False)
+        
         self.fileconf = self.pytrainer_main.profile.confdir+"/listviewmenu.xml"
         if not os.path.isfile(self.fileconf):
             self._createXmlListView(self.fileconf)
@@ -140,8 +201,7 @@ class Main(SimpleGladeApp):
             self.radiobuttonOSM.set_active(1)
         else:
             self.radiobuttonGMap.set_active(1)
-
-
+        self.comboMapLineType.set_active(0)
 
     def _float_or(self, value, default):
         '''Function to parse and return a float, or the default if the parsing fails'''
@@ -154,7 +214,7 @@ class Main(SimpleGladeApp):
         return result
 
     def setup(self):
-        self.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph)
+        self.createGraphs()
         self.createMap(MapViewer,self.pytrainer_main.waypoint)
         self.createWaypointEditor(WaypointEditor,self.pytrainer_main.waypoint, parent=self.pytrainer_main)
         page = self.notebook.get_current_page()
@@ -209,19 +269,21 @@ class Main(SimpleGladeApp):
             id = selected.get_value(iter,0)
         self.parent.runExtension(extension,id)
 
-    def createGraphs(self,RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph):
+    def createGraphs(self):
         self.drawarearecord = RecordGraph(self.record_graph_vbox, self.window1, self.record_combovalue, self.record_combovalue2, self.btnShowLaps, self.tableConfigY1, pytrainer_main=self.pytrainer_main)
         self.drawareaheartrate = HeartRateGraph(self.heartrate_vbox, self.window1, self.heartrate_vbox2, pytrainer_main=self.pytrainer_main)
-        #self.drawareaday = DayGraph(self.day_vbox, self.day_combovalue)
         self.day_vbox.hide()
-        self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2)
-        self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2)
-        self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2)
+        sports = self._sport_service.get_all_sports()
+        self.drawareaweek = WeekGraph(sports, self.weekview, self.window1, self.week_combovalue, self.week_combovalue2, self.pytrainer_main)
+        self.drawareamonth = MonthGraph(sports, self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2, self.pytrainer_main)
+        self.drawareayear = YearGraph(sports, self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2, self.pytrainer_main)
+        self.drawareatotal = TotalGraph(sports, self.total_vbox, self.window1, self.total_combovalue,self.total_combovalue2, self.pytrainer_main)
 
     def createMap(self,MapViewer,waypoint):
         self.waypoint = waypoint
-        self.mapviewer = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox)
-        self.mapviewer_fs = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox_old)
+        if not getattr(self, 'mapviewer', None):
+            self.mapviewer = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox)
+            self.mapviewer_fs = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox_old)
         #self.googlemaps = Googlemaps(self.data_path, self.map_vbox,waypoint, pytrainer_main=self.parent)
         #self.osm = Osm(self.data_path, self.map_vbox,waypoint, pytrainer_main=self.parent)
         #self.googlemaps_old = Googlemaps(self.data_path, self.map_vbox_old,waypoint, pytrainer_main=self.parent)
@@ -236,33 +298,48 @@ class Main(SimpleGladeApp):
         #Re-add "All Sports"
         liststore.append([firstEntry])
         #Re-add all sports in listSport
-        for i in listSport:
-            liststore.append([i[0]])
+        for sport in listSport:
+            liststore.append([sport.name])
         self.sportlist.set_active(0)
         logging.debug("<<")
 
     def render_duration(self, column, cell, model, iter):
         orig = cell.get_property('text')
-        new = orig
+        if not ':' in orig:
+            h,m,s = self.parent.date.second2time(int(orig))
+            new = '%d:%02d:%02d' % (h,m,s)
+        else:
+            new = orig
         if orig[:4] == ' 0:0':
             new = orig[4:]
         elif orig[:3] == ' 0:':
             new = orig[3:]
+        if len(new)>5:
+		    hours = int(new[:-6])
+		    days = _("d")
+		    if hours>23:
+		    	new = "%d %s %02d:%s" % (hours / 24, days, hours%24 ,new[-5:])
         cell.set_property('text', new)
         
     def render_float(self, column, cell, model, iter, data):
-        _format, _quantity = data
-        _val = model.get_value(iter, column.get_sort_column_id())
+        _format, _quantity, _idx = data
+        _val = model.get_value(iter, _idx)
         _val = self.uc.sys2usr(_quantity, _val)
         _val_str = _format % float(_val)
         cell.set_property('text', _val_str)
 
-    def create_treeview(self,treeview,columns):
+    def create_treeview(self,treeview,columns,sortable=True):
         for column_index, column_dict in enumerate(columns):
+            if 'pixbuf' in column_dict:
+                renderer = gtk.CellRendererPixbuf()
+            else:
+                renderer = gtk.CellRendererText()
             column = gtk.TreeViewColumn(column_dict['name'])
-            renderer = gtk.CellRendererText()
             column.pack_start(renderer, expand=False)
-            column.add_attribute(renderer, 'text', column_index)
+            if 'pixbuf' in column_dict:
+                column.add_attribute(renderer, 'pixbuf', column_index)
+            else:
+                column.add_attribute(renderer, 'text', column_index)
             column.set_resizable(True)
             column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
             if 'xalign' in column_dict:
@@ -270,10 +347,11 @@ class Main(SimpleGladeApp):
             if 'visible' in column_dict:
                 column.set_visible(column_dict['visible'])
             if 'format_float' in column_dict:
-                column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity']])
+                column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity'], column_index])
             if 'format_duration' in column_dict and column_dict['format_duration']:
                 column.set_cell_data_func(renderer, self.render_duration)
-            column.set_sort_column_id(column_index)
+            if sortable:
+                column.set_sort_column_id(column_index)
             treeview.append_column(column)
 
     def actualize_recordview(self,activity):
@@ -295,6 +373,8 @@ class Main(SimpleGladeApp):
             #self.record_second.set_text("")
             self.record_calories.set_text("")
             self.record_title.set_text("")
+            self.label_record_equipment.set_text("")
+            self.frame_laps.hide()
             com_buffer = self.record_comments.get_buffer()
             start,end = com_buffer.get_bounds()
             com_buffer.set_text("")
@@ -335,6 +415,9 @@ class Main(SimpleGladeApp):
             self.record_duration.set_text(activity.get_value_f('time', '%s'))
             self.record_calories.set_text(activity.get_value_f('calories', "%0.0f"))
             self.record_title.set_text(activity.title)
+            hrun,mrun,srun = self.pytrainer_main.date.second2time(activity.time)
+            hpause,mpause,spause = self.pytrainer_main.date.second2time(activity.time_pause)
+            self.record_runrest.set_text("%02d:%02d:%02d / %02d:%02d:%02d" %(hrun,mrun,srun,hpause,mpause,spause)) 
             buffer = self.record_comments.get_buffer()
             start,end = buffer.get_bounds()
             buffer.set_text(activity.comments)
@@ -343,11 +426,108 @@ class Main(SimpleGladeApp):
                 equipment_text = ", ".join(map(lambda(item): item.description, equipment))
                 self.label_record_equipment.set_text(equipment_text)
             else:
-                self.label_record_equipment.set_markup("<i>None</i>")
+                self.label_record_equipment.set_markup("<i>None</i>")    
+            if len(activity.laps)>1:
+                store = gtk.ListStore(
+                    gobject.TYPE_INT,
+                    gtk.gdk.Pixbuf,
+                    gobject.TYPE_FLOAT,
+                    gobject.TYPE_STRING,
+                    gobject.TYPE_FLOAT,
+                    gobject.TYPE_FLOAT,
+                    gobject.TYPE_STRING,
+                    gobject.TYPE_STRING,
+                    gobject.TYPE_INT,
+                    gobject.TYPE_INT,
+                    gobject.TYPE_INT,
+                    gobject.TYPE_STRING,
+                    gobject.TYPE_STRING,
+                    )
+                for lap in activity.laps:
+                    t = lap['elapsed_time'] 
+                    m = lap['distance']
+                    
+                    if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True":
+                        m = km2miles(m)
+                    
+                    s = m / float(t) * 3.6
+                    max_speed = lap['max_speed'] * 3.6
+                    if s > 0:
+                        pace = "%d:%02d" %((3600/s)/60,(3600/s)%60)
+                        if max_speed >0:
+                            max_pace = "%d:%02d" %((3600/max_speed)/60,(3600/max_speed)%60)
+                        else:
+                            max_pace = "0:00"
+                        
+                    color = {
+                        'active' : '#000000',
+                        'rest' : '#808080',
+                        'resting' : '#808080',
+                    }
+                    
+                    pic = gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/trigger_%s.png" % lap['laptrigger'])
+                        
+                    iter = store.append()
+                    store.set(iter, 
+                        0, lap['lap_number']+1, 
+                        1, pic, 
+                        2, m/1000, 
+                        3, str(int(float(t))), 
+                        4, s, 
+                        5, max_speed, 
+                        6, pace, 
+                        7, max_pace, 
+                        8, lap['avg_hr'] if lap['avg_hr'] else 0, 
+                        9, lap['max_hr'] if lap['max_hr'] else 0, 
+                        10, lap['calories'], 
+                        11, color[lap['intensity']], 
+                        12, '' if not lap['comments'] else (lap['comments'] if len(lap['comments'])<40 else "%s..." % lap['comments'][:40]),
+                        )
+                self.lapsTreeView.set_model(store)
+                self.lapsTreeView.set_rules_hint(True)
+                
+                # Use grey color for "rest" laps
+                for c in self.lapsTreeView.get_columns():
+                    for cr in c.get_cell_renderers():
+                        if type(cr)==gtk.CellRendererText:
+                            c.add_attribute(cr, 'foreground', 11)
+
+                def edited_cb(cell, path, new_text, (liststore, activity)):
+                    liststore[path][12] = new_text
+                    activity.laps[int(path)]['comments'] = new_text
+                    self.pytrainer_main.ddbb.update("laps", "comments", [new_text,], "record=%s and lap_number=%s" % (activity.id, path))
+                    
+                def show_tooltip(widget, x, y, keyboard_mode, tooltip, user_param1):
+                     path = self.lapsTreeView.get_path_at_pos(x,y-20)
+                     if not path: return False
+                     if path[1] != self.lapsTreeView.get_columns()[12]: return False
+                     comments = user_param1[1].laps[path[0][0]]['comments']
+                     if comments and len(comments)>40:
+                         tooltip.set_text(comments)
+                         return True
+                     return False
+
+                if getattr(self.lapsTreeView, 'tooltip_handler_id', None):
+                    self.lapsTreeView.disconnect(self.lapsTreeView.tooltip_handler_id)
+                self.lapsTreeView.tooltip_handler_id = self.lapsTreeView.connect('query-tooltip', show_tooltip, (store, activity))
+                i = 0
+                for cr in self.lapsTreeView.get_columns()[12].get_cell_renderers():
+                    cr.set_property('editable', True)
+                    if getattr(self, 'lapview_handler_id', None):
+                        cr.disconnect(self.lapview_handler_id)
+                    self.lapview_handler_id = cr.connect('edited', edited_cb, (store, activity))
+                    tooltip = gtk.Tooltip()
+                    tooltip.set_text(activity.laps[i]['comments'])
+                    self.lapsTreeView.set_tooltip_cell(tooltip, i, self.lapsTreeView.get_columns()[12], cr)
+                    i += 1
+                self.frame_laps.show()
+            else:
+                self.frame_laps.hide()
 
         else:
             self.recordview.set_current_page(0)
             self.recordview.set_sensitive(0)
+   
         logging.debug("<<")
 
     def actualize_recordgraph(self,activity):
@@ -380,10 +560,10 @@ class Main(SimpleGladeApp):
                     if isinstance(child, gtk.Frame):
                         self.graph_data_hbox.remove(child)
                 #Build frames and vboxs to hold checkbuttons
-                xFrame = gtk.Frame(label="Show on X Axis")
-                y1Frame = gtk.Frame(label="Show on Y1 Axis")
-                y2Frame = gtk.Frame(label="Show on Y2 Axis")
-                limitsFrame = gtk.Frame(label="Axis Limits")
+                xFrame = gtk.Frame(label=_("Show on X Axis"))
+                y1Frame = gtk.Frame(label=_("Show on Y1 Axis"))
+                y2Frame = gtk.Frame(label=_("Show on Y2 Axis"))
+                limitsFrame = gtk.Frame(label=_("Axis Limits"))
                 xvbox = gtk.VBox()
                 y1box = gtk.Table()
                 y2box = gtk.Table()
@@ -617,6 +797,115 @@ class Main(SimpleGladeApp):
         #else:
         #   self.recordview.set_sensitive(0)
         logging.debug("<<")
+        
+    def actualize_analytics(self,activity):
+        logging.debug(">>")
+        record_list = activity.tracks
+            
+        def project(d,a):
+            return int(a.time * (d / a.distance)**1.06)
+            
+        DISTANCES = {
+            .8    : _("800 m"),
+            1.5   : _("1500 m"),
+            5     : _("5K"),
+            7     : _("7K"),
+            10    : _("10K"),
+            21.1  : _("Half marathon"),
+            42.195  : _("Marathon"),
+            100   : _("100K"),
+        }
+        
+        projected_store = gtk.ListStore(
+            gobject.TYPE_STRING,       #id
+            gobject.TYPE_STRING,    #name
+            gobject.TYPE_STRING,    #distance
+            gobject.TYPE_STRING,       #time
+            )
+
+        ds = DISTANCES.keys()
+        ds = sorted(ds)
+        for d in ds:
+            v = DISTANCES[d]
+            iter = projected_store.append()
+            projected_store.set (
+                iter,
+                0, str(d),
+                1, v,         
+                2, str(d),
+                3, str(project(d, activity)),
+                )
+        self.analyticsTreeView.set_model(projected_store)
+            
+        self.analytics_activity = activity
+        self.on_change_rank_percentage()
+
+        logging.debug("<<")
+
+    def on_change_rank_percentage(self, widget=None):
+    
+        activity = self.analytics_activity
+        if widget:
+            percentage = widget.get_value() / 100
+        else:
+            percentage = .05
+        records = self.pytrainer_main.ddbb.select_dict("records", ["distance","time","id_record","date","average"], "distance > %f AND distance < %f AND sport=%d order by average desc" % (activity.distance * (1-percentage), activity.distance * (1+percentage), activity.sport_id))
+        
+        count = 1
+        for r in records:
+            if r['average'] > activity.average:
+                count += 1
+
+        import numpy
+        speeds = [r['average'] for r in records]
+        if self.pytrainer_main.profile.prf_us_system:
+            self.label_ranking_range.set_text("%.2f - %.2f %s" % (km2miles(activity.distance * (1-percentage)), km2miles(activity.distance * (1+percentage)), activity.distance_unit))
+        else:
+            self.label_ranking_range.set_text("%.2f - %.2f %s" % (activity.distance * (1-percentage), activity.distance * (1+percentage), activity.distance_unit))
+        self.label_ranking_rank.set_text("%s/%s" % (count, len(records)))
+        self.label_ranking_avg.set_text("%.2f %s" % (km2miles(numpy.average(speeds)) if self.pytrainer_main.profile.prf_us_system else numpy.average(speeds), activity.speed_unit))
+        self.label_ranking_speed.set_text("%.2f %s" % (km2miles(activity.average) if self.pytrainer_main.profile.prf_us_system else activity.average, activity.speed_unit))
+        self.label_ranking_stddev.set_text("%.4f" % (km2miles(numpy.std(speeds)) if self.pytrainer_main.profile.prf_us_system else numpy.std(speeds)))
+        self.label_ranking_dev.set_text("%+.2fσ" % ((activity.average - numpy.average(speeds)) / numpy.std(speeds)))
+
+        rank_store = gtk.ListStore(
+            gobject.TYPE_INT,       #id
+            gobject.TYPE_INT,       #rank
+            gobject.TYPE_STRING,    #date
+            gobject.TYPE_STRING,    #distance
+            gobject.TYPE_STRING,       #time
+            gobject.TYPE_STRING,       #speed
+            gobject.TYPE_STRING,       #color
+            )
+
+        length = len(records)
+        rec_set = [0,]
+        for r in xrange(max(count-3, 1) if count>1 else count, min(count+3, length-2) if count < length else count):
+            rec_set.append(r)
+        if length>1 and count!=length:
+            rec_set.append(-1)
+            
+        for i in rec_set:
+            r = records[i]
+            iter = rank_store.append()
+            rank = length if i==-1 else i+1
+            rank_store.set (
+                iter,
+                0, i,
+                1, rank,
+                2, r['date'],         
+                3, km2miles(r['distance']) if self.pytrainer_main.profile.prf_us_system else r['distance'],
+                4, str(r['time']),
+                5, r['average'],
+                6, '#3AA142' if rank==count else '#000000',
+            )
+            
+            for c in self.rankingTreeView.get_columns()[:-1]:
+                for cr in c.get_cell_renderers():
+                    if type(cr)==gtk.CellRendererText:
+                        c.add_attribute(cr, 'foreground', 6)
+            
+        self.rankingTreeView.set_model(rank_store)
 
     def actualize_dayview(self,record_list=None, activity_list=None):
         logging.debug(">>")
@@ -644,11 +933,15 @@ class Main(SimpleGladeApp):
             average = 0
             maxpace = "0:00"
             pace = "0:00"
+            totalascent = 0 
+            totaldescent = 0
             for record in record_list:
                 distance += self.parseFloat(record[2])
                 calories += self.parseFloat(record[7])
                 timeinseconds += self.parseFloat(record[3])
                 beats = self.parseFloat(record[4])
+                totalascent += self.parseFloat(record[13]) 
+                totaldescent += self.parseFloat(record[14]) 
                 if float(beats)>0:
                     tbeats += beats*(self.parseFloat(record[3])/60/60)
                 if record[9] > maxspeed:
@@ -687,6 +980,7 @@ class Main(SimpleGladeApp):
             self.day_maxspeed.set_text("%0.2f" %maxspeed)
             self.day_pace.set_text("%s" %pace)
             self.day_maxpace.set_text("%s" %maxpace)
+            self.day_ascdesc.set_text("%d/%d" %(int(totalascent),int(totaldescent)))
             self.day_calories.set_text("%0.0f" %calories)
             self.day_topic.set_text(str(record[1]))
 
@@ -709,11 +1003,11 @@ class Main(SimpleGladeApp):
         if self.radiobuttonOSM.get_active():
             #Use OSM to draw map
             logging.debug("Using OSM to draw map....")
-            htmlfile = Osm(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity)
+            htmlfile = Osm(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity, self.comboMapLineType.get_active())
         elif self.radiobuttonGMap.get_active():
             #Use Google to draw map
             logging.debug("Using Google to draw map")
-            htmlfile = Googlemaps(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity)
+            htmlfile = Googlemaps(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity, self.comboMapLineType.get_active())
         else:
             #Unknown map type...
             logging.error("Unknown map viewer requested")
@@ -742,7 +1036,8 @@ class Main(SimpleGladeApp):
         pace = "0:00"
         maxpace = "0:00"
         maxbeats = 0
-
+        totalascent = 0
+        totaldescent = 0
         if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True":
             self.w_distance_unit.set_text(_("miles"))
             self.w_speed_unit.set_text(_("miles/h"))
@@ -763,6 +1058,8 @@ class Main(SimpleGladeApp):
                 average += self.parseFloat(record[5])
                 calories += self.parseFloat(record[6])
                 beats = self.parseFloat(record[3])
+                totalascent += self.parseFloat(record[10])
+                totaldescent += self.parseFloat(record[11])
                 if float(beats) > 0:
                     time_in_min += time/60
                     tbeats += beats*(time/60)
@@ -802,11 +1099,12 @@ class Main(SimpleGladeApp):
             self.weeka_maxspeed.set_text("%0.2f" %maxspeed)
             self.weeka_pace.set_text(pace)
             self.weeka_maxpace.set_text(maxpace)
+            self.weeka_ascdesc.set_text("%d/%d" %(int(totalascent),int(totaldescent)))
             self.weeka_calories.set_text("%0.0f" %calories)
             self.weekview.set_sensitive(1)
         else:
             self.weekview.set_sensitive(0)
-        self.drawareaweek.drawgraph(record_list, date_ini, date_end)
+        self.drawareaweek.drawgraph(record_list, date_ini)
         logging.debug("<<")
 
     def actualize_monthview(self,record_list, nameMonth):
@@ -820,7 +1118,8 @@ class Main(SimpleGladeApp):
         pace = "0:00"
         maxpace = "0:00"
         maxbeats = 0
-
+        totalascent = 0
+        totaldescent = 0
         if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True":
             self.m_distance_unit.set_text(_("miles"))
             self.m_speed_unit.set_text(_("miles/h"))
@@ -841,6 +1140,8 @@ class Main(SimpleGladeApp):
                 average += self.parseFloat(record[5])
                 calories += self.parseFloat(record[6])
                 beats = self.parseFloat(record[3])
+                totalascent += self.parseFloat(record[10])
+                totaldescent += self.parseFloat(record[11])
                 if float(beats) > 0:
                     time_in_min += time/60
                     tbeats += beats*(time/60)
@@ -857,7 +1158,7 @@ class Main(SimpleGladeApp):
                 tbeats = tbeats/time_in_min
             else:
                 tbeats = 0
-            if km > 0:
+            if km > 0 and time > 0:        # time can be zero when a new year starts
                 average = (km/(time/3600))
             else:
                 average = 0
@@ -880,6 +1181,7 @@ class Main(SimpleGladeApp):
             self.montha_maxspeed.set_text("%0.2f" %maxspeed)
             self.montha_pace.set_text(pace)
             self.montha_maxpace.set_text(maxpace)
+            self.montha_ascdesc.set_text("%d/%d" %(int(totalascent),int(totaldescent)))
             self.montha_calories.set_text("%0.0f" %calories)
             self.monthview.set_sensitive(1)
         else:
@@ -902,6 +1204,8 @@ class Main(SimpleGladeApp):
         pace = "0:00"
         maxpace = "0:00"
         maxbeats = 0
+        totalascent = 0 
+        totaldescent = 0
         if num_records>0:
             for record in record_list:
                 km += self.parseFloat(record[1])
@@ -909,6 +1213,8 @@ class Main(SimpleGladeApp):
                 average += self.parseFloat(record[5])
                 calories += self.parseFloat(record[6])
                 beats = self.parseFloat(record[3])
+                totalascent += self.parseFloat(record[10])
+                totaldescent += self.parseFloat(record[11])
                 if float(beats) > 0:
                     time_in_min += time/60
                     tbeats += beats*(time/60)
@@ -943,6 +1249,7 @@ class Main(SimpleGladeApp):
             self.yeara_maxspeed.set_text("%0.2f" %maxspeed)
             self.yeara_pace.set_text(pace)
             self.yeara_maxpace.set_text(maxpace)
+            self.yeara_ascdesc.set_text("%d/%d " %(totalascent,totaldescent))
             self.yeara_calories.set_text("%0.0f" %calories)
             self.yearview.set_sensitive(1)
         else:
@@ -988,6 +1295,56 @@ class Main(SimpleGladeApp):
         self.grapher.drawAthleteGraph(athlete=athlete, box=self.boxAthleteGraph)
         logging.debug("<<")
 
+    def actualize_statsview(self, stats, record_list):
+        logging.debug(">>")
+        self.labelTotalDistance.set_text(str(stats.data['total_distance']) + " km")
+        self.labelTotalDuration.set_text(str(stats.data['total_duration'] / 3600) + " hours")
+        self.labelStartDate.set_text(stats.data['start_date'].strftime('%Y-%m-%d'))
+        self.labelEndDate.set_text(stats.data['end_date'].strftime('%Y-%m-%d'))
+        
+        data = self.parent.stats.data
+        
+        store = gtk.ListStore(
+            gobject.TYPE_INT,
+            gobject.TYPE_STRING,
+            gobject.TYPE_INT,
+            gobject.TYPE_INT,
+            gobject.TYPE_FLOAT,
+            gobject.TYPE_FLOAT,
+            gobject.TYPE_FLOAT,
+            gobject.TYPE_INT,
+            gobject.TYPE_INT,
+            gobject.TYPE_INT,
+            gobject.TYPE_FLOAT
+            )
+        for s in data['sports'].values():
+            iter = store.append()
+            
+            c = 0
+            store.set (iter, c, c)
+            c += 1
+            store.set (iter, c, s['name'])
+            c += 1
+            store.set (iter, c, s['count'])
+            for f in data['fields'][3:]:
+                c += 1
+                store.set (iter, c, s['total_'+f])
+            c += 1
+            if s['total_duration']!=0:    # Avoid division by zero if 0 length sport activity exists in DB
+                store.set (iter, c, s['total_distance'] / s['total_duration'] * 3600.)
+                for f in data['fields']:
+                    c += 1
+                    store.set (iter, c, s[f])
+
+        self.statsTreeView.set_model(store)
+        self.statsTreeView.set_rules_hint(True)
+        
+        store.set_sort_column_id(3, gtk.SORT_DESCENDING)
+
+        self.drawareatotal.drawgraph(record_list)
+
+        logging.debug("<<")    
+    
     def actualize_listview(self,record_list):
         logging.debug(">>")
         #recod list tiene:
@@ -1400,6 +1757,10 @@ class Main(SimpleGladeApp):
         logging.debug( 'on_radiobuttonMap_toggled '+ widget.get_name()+ ' activated')
         self.parent.refreshMapView()
 
+    def on_comboMapLineType_changed(self, widget):
+        logging.debug( 'on_comboMapLineType_changed '+ widget.get_name()+ ' = ' + str(+ widget.get_active()))
+        self.parent.refreshMapView()
+
     def on_hpaned1_move_handle(self, widget):
         print "Handler"
         print widget
@@ -1483,6 +1844,8 @@ class Main(SimpleGladeApp):
             self.selected_view="year"
         elif page == 5:
             self.selected_view="athlete"
+        elif page == 6:
+            self.selected_view="stats"
         else:
             self.selected_view="record"
         self.parent.refreshGraphView(self.selected_view)
@@ -1496,6 +1859,8 @@ class Main(SimpleGladeApp):
             selected_view="map"
         elif page == 3:
             selected_view="heartrate"
+        elif page == 4:
+            selected_view="analytics"
         self.parent.refreshRecordGraphView(selected_view)
 
     def on_showmap_clicked(self,widget):
@@ -1527,6 +1892,10 @@ class Main(SimpleGladeApp):
         logging.debug("--")
         self.parent.refreshGraphView(self.selected_view)
 
+    def on_total_combovalue_changed(self,widget):
+        logging.debug("--")
+        self.parent.refreshGraphView(self.selected_view)
+
     def on_calendar_selected(self,widget):
         logging.debug("--")
         if self.block:
@@ -1577,6 +1946,9 @@ class Main(SimpleGladeApp):
         self.parent.refreshAthleteView()
         #self.athletearea.show()
 
+    def on_statsview_activate(self,widget=None):
+        self.parent.refreshStatsView()
+
     def on_waypointsview_activate(self,widget):
         self.listarea.hide()
         self.classicarea.hide()
@@ -1685,7 +2057,7 @@ class Main(SimpleGladeApp):
             if laps is not None:
                 for lap in laps:
                     #"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 )
+                    lapNumber = "%s %02d" % ( _("lap"), int(lap[9])+1 )
                     if self.pytrainer_main.profile.prf_us_system:
                         dist = km2miles(lap[3])
                     else:
@@ -1707,6 +2079,7 @@ class Main(SimpleGladeApp):
                         2, duration,
                         3, distance
                         )
+                    store.set_sort_column_id(1, gtk.SORT_ASCENDING)
         self.recordTreeView.set_model(store)
         if iterOne:
             self.recordTreeView.get_selection().select_iter(iterOne)
@@ -1730,8 +2103,11 @@ class Main(SimpleGladeApp):
         logging.debug("<<")
 
     def on_about_activate(self,widget):
-        aboutwindow = About(self.data_path, self.version)
-        aboutwindow.run()
+        if self.aboutwindow is None:
+            self.aboutwindow = About(self.data_path, self.version)
+            self.aboutwindow.run()
+        else:
+            self.aboutwindow.present()
 
     def getSportSelected(self):
         sport = self.sportlist.get_active()
@@ -1755,7 +2131,7 @@ class Main(SimpleGladeApp):
         self.actualize_yearview()
 
     def on_recordTree_clicked(self,widget,num,num2):
-        selected,iter = self.recordTreeView.get_selection().get_selected()
+        selected,iter = widget.get_selection().get_selected()
         self.parent.editRecord(selected.get_value(iter,0), self.selected_view)
 
     ### athleteview events ###
@@ -1833,7 +2209,7 @@ class Main(SimpleGladeApp):
         table = gtk.Table(1,2)
         self.entryList = []
         #Add date
-        label = gtk.Label("<b>Date</b>")
+        label = gtk.Label(_("<b>Date</b>"))
         label.set_use_markup(True)
         entry = gtk.Entry()
         entry.set_text(data['date'])
@@ -1849,7 +2225,7 @@ class Main(SimpleGladeApp):
         #table.attach(calbut,2,3,0,1) #TODO
         
         #Add weight
-        label = gtk.Label("<b>Weight</b>")
+        label = gtk.Label(_("<b>Weight</b>"))
         label.set_use_markup(True)
         entry = gtk.Entry()
         entry.set_text(data['weight'])
@@ -1857,7 +2233,7 @@ class Main(SimpleGladeApp):
         table.attach(label,0,1,1,2)
         table.attach(entry,1,2,1,2)
         #Add Body fat
-        label = gtk.Label("<b>Body Fat</b>")
+        label = gtk.Label(_("<b>Body Fat</b>"))
         label.set_use_markup(True)
         entry = gtk.Entry()
         entry.set_text(data['bf'])
@@ -1865,7 +2241,7 @@ class Main(SimpleGladeApp):
         table.attach(label,0,1,2,3)
         table.attach(entry,1,2,2,3)
         #Add Resting HR
-        label = gtk.Label("<b>Resting Heart Rate</b>")
+        label = gtk.Label(_("<b>Resting Heart Rate</b>"))
         label.set_use_markup(True)
         entry = gtk.Entry()
         entry.set_text(data['restingHR'])
@@ -1873,7 +2249,7 @@ class Main(SimpleGladeApp):
         table.attach(label,0,1,3,4)
         table.attach(entry,1,2,3,4)
         #Add Max HR
-        label = gtk.Label("<b>Max Heart Rate</b>")
+        label = gtk.Label(_("<b>Max Heart Rate</b>"))
         label.set_use_markup(True)
         entry = gtk.Entry()
         entry.set_text(data['maxHR'])
diff --git a/pytrainer/gui/windowprofile.py b/pytrainer/gui/windowprofile.py
index f01c226..541153c 100644
--- a/pytrainer/gui/windowprofile.py
+++ b/pytrainer/gui/windowprofile.py
@@ -21,12 +21,16 @@ from SimpleGladeApp import SimpleGladeApp
 from windowcalendar import WindowCalendar
 from pytrainer.equipment import EquipmentService
 from pytrainer.gui.equipment import EquipmentUi
+from pytrainer.sport import Sport
 import gtk
 import gobject
 import logging
+import pytrainer
+import pytrainer.lib.color
+from pytrainer.gui.color import ColorConverter
 
 class WindowProfile(SimpleGladeApp):
-    def __init__(self, data_path = None, parent=None, pytrainer_main=None):
+    def __init__(self, sport_service, data_path = None, parent=None, pytrainer_main=None):
         glade_path="glade/profile.glade"
         root = "newprofile"
         domain = None
@@ -35,6 +39,8 @@ class WindowProfile(SimpleGladeApp):
         self.data_path = data_path
         SimpleGladeApp.__init__(self, data_path+glade_path, root, domain)
         self.conf_options = parent.profile_options
+        self.stored_color = pytrainer.lib.color.Color(0)
+        self._sport_service = sport_service
 
     def new(self):
         self.gender_options = {
@@ -56,9 +62,18 @@ class WindowProfile(SimpleGladeApp):
             self.prf_ddbb.insert_text(i,self.ddbb_type[i])
 
         #preparamos la lista sports:
-        column_names=[_("Sport"),_("MET"),_("Extra Weight"), _("Maximum Pace")]
+        column_names=[_("Sport"),_("MET"),_("Extra Weight"), _("Maximum Pace"), _("Color")]
         for column_index, column_name in enumerate(column_names):
-            column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index)
+            if column_index==4:
+                renderer = gtk.CellRendererPixbuf()
+            else:
+                renderer = gtk.CellRendererText()
+            column = gtk.TreeViewColumn(column_name, text=column_index)
+            column.pack_start(renderer, expand=False)
+            if column_index==4:
+                column.add_attribute(renderer, 'pixbuf', column_index)
+            else:
+                column.add_attribute(renderer, 'text', column_index)
             column.set_resizable(True)
             self.sportTreeView.append_column(column)
 
@@ -67,6 +82,9 @@ class WindowProfile(SimpleGladeApp):
         equipment_ui = EquipmentUi(self.data_path + "/glade", equipment_service)
         self.equipment_container.add(equipment_ui)            
         
+    def present(self):
+        self.newprofile.present()
+        
     def setValues(self,list_options):
         for i in self.conf_options.keys():
             if not list_options.has_key(i):
@@ -138,49 +156,27 @@ class WindowProfile(SimpleGladeApp):
         #print widget, pointer, frame
         if frame==2:
             self.saveOptions()
-            sport_list = self.parent.getSportList()
-            logging.debug("Got sport_list: %s" % str(sport_list) )
-            if sport_list == 0:
-                pass
-            elif sport_list == -1:
-                self.sportlistbutton.set_label("It is not possible connect to the server")
-            else:
-                store = gtk.ListStore(
-                            gobject.TYPE_STRING,
-                            gobject.TYPE_STRING,
-                            gobject.TYPE_STRING,
-                            gobject.TYPE_STRING,
-                            object)
-                for i in sport_list:
-                    try:
-                        met = float(i[1])
-                    except:
-                        met = ""
-                    try:
-                        weight = float(i[2])
-                    except:
-                        weight = ""
-                    try:
-                        max_pace = int(i[4])
-                        if max_pace is None or max_pace == 0:
-                            max_pace = ""
-                    except Exception as e:
-                        #print type(e), e
-                        max_pace = ""
-                    
-                    
-                    iter = store.append()
-                    store.set (
-                                iter,
-                                0, str(i[0]),
-                                1, met,
-                                2, weight,
-                                3, max_pace,
-                                )
-                self.sportTreeView.set_model(store)
-                self.sportTreeView.set_cursor(0)
-                #self.sportlistbutton.hide()
-                self.sportlist.show()
+            sport_list = self._sport_service.get_all_sports()
+            store = gtk.ListStore(
+                        gobject.TYPE_STRING,
+                        gobject.TYPE_STRING,
+                        gobject.TYPE_STRING,
+                        gobject.TYPE_STRING,
+                        gtk.gdk.Pixbuf,
+                        object)
+            for sport in sport_list:
+                iter = store.append()
+                colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 25, 15)
+                colorPixBuf.fill(sport.color.rgba_val)
+                store.set(iter,
+                    0, sport.name,
+                    1, sport.met,
+                    2, sport.weight,
+                    3, sport.max_pace,
+                    4, colorPixBuf)
+            self.sportTreeView.set_model(store)
+            self.sportTreeView.set_cursor(0)
+            self.sportlist.show()
         elif frame == 5: #Startup Parameters page selected
             self.init_params_tab()
     
@@ -204,12 +200,6 @@ class WindowProfile(SimpleGladeApp):
         else:
             self.checkbuttonValidate.set_active(False)
             
-        #Show if database and config check requested 
-        if self.pytrainer_main.startup_options.check:
-            self.checkbuttonCheck.set_active(True)
-        else:
-            self.checkbuttonCheck.set_active(False)
-            
         #Show if new graph activated
         if self.pytrainer_main.startup_options.newgraph:
             self.checkbuttonNewGraph.set_active(True)
@@ -240,18 +230,6 @@ class WindowProfile(SimpleGladeApp):
             logging.debug("Validate deactivated")
             self.pytrainer_main.startup_options.validate = False
             
-    def on_checkbuttonCheck_toggled(self, widget):
-        if self.checkbuttonCheck.get_active():
-            logging.debug( "Check activated")
-            if self.pytrainer_main.startup_options.check is not True:
-                #Need to do sanitycheck
-                logging.debug("Need to do sanitycheck")
-                self.pytrainer_main.sanityCheck()
-            self.pytrainer_main.startup_options.check = True
-        else:
-            logging.debug("Check deactivated")
-            self.pytrainer_main.startup_options.check = False
-                
     def on_checkbuttonNewGraph_toggled(self, widget):
         if self.checkbuttonNewGraph.get_active():
             logging.debug("NewGraph activated")
@@ -260,14 +238,6 @@ class WindowProfile(SimpleGladeApp):
             logging.debug("NewGraph deactivated")
             self.pytrainer_main.startup_options.newgraph = False       
     
-    def on_sportlistbutton_clicked(self,widget):
-        sport_list = self.parent.getSportList()
-        if sport_list == 0:
-            self.parent.build_ddbb()
-            self.sportlistbutton.hide()
-            self.sportlist.show()
-        
-            
     def on_accept_clicked(self,widget):
         self.saveOptions()
         self.close_window()
@@ -313,11 +283,21 @@ class WindowProfile(SimpleGladeApp):
         self.addsport.show()
 
     def on_newsport_accept_clicked(self,widget):
-        sport = self.newsportentry.get_text()
-        met = self.newmetentry.get_text()
-        weight = self.newweightentry.get_text()
-        maxpace = self.newmaxpace.get_text()
-        self.parent.addNewSport(sport,met,weight,maxpace)
+        sport = Sport()
+        sport.name = unicode(self.newsportentry.get_text())
+        sport.met = self._trim_to_null(self.newmetentry.get_text())
+        sport.weight = self.newweightentry.get_text()
+        sport.max_pace = self._trim_to_null(self.newmaxpace.get_text())
+        sport.color = self.stored_color
+        if sport.name.lower() in [s.name.lower() for s in self._sport_service.get_all_sports()]:
+            msg = "Sport '%s' already exists" % sport.name
+            logging.error(msg)
+            md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, _(msg))
+            md.set_title(_("Sport Creation Error"))
+            md.run()
+            md.destroy()
+            return
+        self._sport_service.store_sport(sport)
         self.parent.actualize_mainsportlist()
         self.on_switch_page(None,None,2)
         self.hidesportsteps()
@@ -334,8 +314,9 @@ class WindowProfile(SimpleGladeApp):
             self.deletesport.show()
 
     def on_deletesport_clicked(self,widget):
-        sport = self.sportnamedel.get_text()
-        self.parent.delSport(sport)
+        sport_name = self.sportnamedel.get_text()
+        sport = self._sport_service.get_sport_by_name(sport_name)
+        self._sport_service.remove_sport(sport)
         self.parent.actualize_mainsportlist()
         self.on_switch_page(None,None,2)
         self.hidesportsteps()
@@ -346,38 +327,61 @@ class WindowProfile(SimpleGladeApp):
         selected,iter = self.sportTreeView.get_selection().get_selected()
         if iter:
             self.buttonbox.set_sensitive(0)
-            sport = selected.get_value(iter,0)
-            name,met,weight,maxpace = self.parent.getSportInfo(sport)
-            self.editsportentry.set_text(sport)
-            self.sportnameedit.set_text(sport)
-            if weight is not None:
-                self.editweightentry.set_text(str(weight))
-            else:
-                self.editweightentry.set_text("")
-            if met is not None:
-                self.editmetentry.set_text(str(met))
-            else:
-                self.editmetentry.set_text("")
-            if maxpace is not None:
-                self.editmaxpace.set_text(str(maxpace))
-            else:
-                self.editmaxpace.set_text("")
+            sport_desc = selected.get_value(iter,0)
+            sport = self._sport_service.get_sport_by_name(sport_desc)
+            self.editsportentry.set_text(sport.name)
+            self.sportnameedit.set_text(sport.name)
+            self.editweightentry.set_text(str(sport.weight))
+            met_str = "" if sport.met is None else str(sport.met)
+            self.editmetentry.set_text(met_str)
+            max_pace_str = "" if sport.max_pace is None else str(sport.max_pace)
+            self.editmaxpace.set_text(max_pace_str)
+            colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 250, 20)
+            colorPixBuf.fill(sport.color.rgba_val)
+            self.editcolor.set_from_pixbuf(colorPixBuf)
             self.hidesportsteps()
             self.editsport.show()
+            
+    def on_editcolor_clicked(self, widget):
+        selected,iter = self.sportTreeView.get_selection().get_selected()
+        if iter:
+            sport_desc = selected.get_value(iter,0)
+            sport = self._sport_service.get_sport_by_name(sport_desc)
+            colorseldlg = gtk.ColorSelectionDialog("test")
+            colorseldlg.colorsel.set_has_palette(True)
+            colorseldlg.colorsel.set_current_color(ColorConverter().convert_to_gdk_color(sport.color))
+            colorseldlg.run()
+            gdk_color = colorseldlg.colorsel.get_current_color()
+            self.stored_color = ColorConverter().convert_to_color(gdk_color)
+            colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 250, 20)
+            colorPixBuf.fill(self.stored_color.rgba_val)
+            self.newcolor.set_from_pixbuf(colorPixBuf)
+            self.editcolor.set_from_pixbuf(colorPixBuf)
+            
+            colorseldlg.hide()
+            
+    def on_sporttreeview_row_activated(self, widget, path, column):
+        self.on_editsport_clicked(None)
     
     def on_editsport_accept_clicked(self,widget):
         oldnamesport = self.sportnameedit.get_text()
-        newnamesport = self.editsportentry.get_text()
-        newmetsport = self.editmetentry.get_text()
-        newweightsport = self.editweightentry.get_text()
-        newmaxpace = self.editmaxpace.get_text()
-        self.parent.updateSport(oldnamesport,newnamesport,newmetsport,newweightsport, newmaxpace)
+        sport = self._sport_service.get_sport_by_name(oldnamesport)
+        sport.name = unicode(self.editsportentry.get_text())
+        sport.weight = self.editweightentry.get_text()
+        sport.met = self._trim_to_null(self.editmetentry.get_text())
+        sport.max_pace = self._trim_to_null(self.editmaxpace.get_text())
+        sport.color = self.stored_color
+        self._sport_service.store_sport(sport)
         self.parent.actualize_mainsportlist()
         self.on_switch_page(None,None,2)
         self.hidesportsteps()
         self.buttonbox.set_sensitive(1)
         self.sportlist.show()
         
+    def _trim_to_null(self, string):
+        trimmed = string.strip()
+        return None if trimmed == "" else trimmed
+        
     def on_sportcancel_clicked(self,widget):
         self.hidesportsteps()
         self.buttonbox.set_sensitive(1)
diff --git a/pytrainer/gui/windowrecord.py b/pytrainer/gui/windowrecord.py
index de2d4f9..ee6db8f 100644
--- a/pytrainer/gui/windowrecord.py
+++ b/pytrainer/gui/windowrecord.py
@@ -19,6 +19,7 @@
 from __future__ import division
 import os
 import logging
+import traceback
 import gtk, gobject
 from SimpleGladeApp import SimpleGladeApp
 from windowcalendar import WindowCalendar
@@ -67,8 +68,8 @@ class WindowRecord(SimpleGladeApp):
             "rcd_maxvel",
             ]
         self.listSport = {}
-        for i in listSport:
-            self.listSport[i[3]] = i[0] #Create dictionary using SportID as key (may be non sequential if sports have been deleted)
+        for sport in listSport:
+            self.listSport[sport.id] = sport.name
         for i in self.listSport:    
             self.rcd_sport.insert_text(i,self.listSport[i])
         self.rcd_sport.set_active(0)
@@ -86,7 +87,7 @@ class WindowRecord(SimpleGladeApp):
         if time != None:
             self.setTime(time)
         if distance!=None and time!=None:
-            self.on_calcaverage_clicked(None)
+            self.on_calcavs_clicked(None)
         if upositive != None:
             self.rcd_upositive.set_text(self.uc.height(upositive))
         if unegative != None:
@@ -248,7 +249,8 @@ class WindowRecord(SimpleGladeApp):
                 activity["rcd_title"] = activity["rcd_title"].replace("\"","'")
                 #Add activity to DB etc
                 laps = activity.pop("laps", ())
-                self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps)
+                selected_equipment_ids = self._get_selected_equipment_ids()
+                self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps, equipment=selected_equipment_ids)
                 row += 1
             logging.debug("Processed %d rows of activity data" % row)
         else:
@@ -266,8 +268,11 @@ class WindowRecord(SimpleGladeApp):
             list_options["rcd_upositive"] = self.uc.usr2sys_str('height', self.rcd_upositive.get_text())
             list_options["rcd_unegative"] = self.uc.usr2sys_str('height', self.rcd_unegative.get_text())
             list_options["rcd_maxbeats"] = self.rcd_maxbeats.get_text()
-            list_options["rcd_pace"] = self.uc.usr2sys_str('pace', self.rcd_pace.get_text())
-            list_options["rcd_maxpace"] = self.uc.usr2sys_str('pace', self.rcd_maxpace.get_text())
+            # 2011.11.05 - dgranda
+            # Pace is shown to user in mm:ss format
+            # But pace in database is stored in a mixed way: 4.30 for 4:30 (4.5 in 'decimal'). This needs to be changed!!
+            list_options["rcd_pace"] = self.uc.usr2sys_str('pace', self.rcd_pace.get_text().replace(":","."))
+            list_options["rcd_maxpace"] = self.uc.usr2sys_str('pace', self.rcd_maxpace.get_text().replace(":","."))
             list_options["rcd_maxvel"] = self.uc.usr2sys_str('speed', self.rcd_maxvel.get_text())
             list_options["rcd_time"] = [self.rcd_hour.get_value_as_int(),self.rcd_min.get_value_as_int(),self.rcd_second.get_value_as_int()]
             buffer = self.rcd_comments.get_buffer()
@@ -275,13 +280,21 @@ class WindowRecord(SimpleGladeApp):
             comment = buffer.get_text(start,end, True)
             list_options["rcd_comments"] = comment.replace("\"","'")
             selected_equipment_ids = self._get_selected_equipment_ids()
+            # Added to change start time, only activities without GPX+ source file - dgranda 2011/06/10
+            record_time = self.rcd_starttime.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
 
             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')   
-                    trackSummary=(list_options["rcd_sport"],"","")
-                    self.parent.insertNewRecord(list_options["rcd_gpxfile"], trackSummary)
+                    logging.info('Adding new activity based on GPX file')
+                    self.parent.insertRecord(list_options, None, selected_equipment_ids)
                 else:
                     logging.info('Adding new activity based on provided data')
                     #Manual entry, calculate time info
@@ -344,7 +357,7 @@ class WindowRecord(SimpleGladeApp):
         self.rcd_hour.set_value(h)
         self.rcd_min.set_value(m)
         self.rcd_second.set_value(s)
-        self.rcd_date.set_text(activity.date)
+        self.rcd_date.set_text(str(activity.date))
         
         #self.rcd_distance.set_text("%.2f"%activity.distance)
         #myset_text(self.rcd_distance, 'distance', activity.distance, us=self.us, round=2)
@@ -358,8 +371,8 @@ class WindowRecord(SimpleGladeApp):
         self.rcd_upositive.set_text("%.2f" %self.uc.height(activity.upositive))
         self.rcd_unegative.set_text("%.2f" %self.uc.height(activity.unegative))
         self.rcd_maxvel.set_text("%.2f" %self.uc.speed(activity.maxspeed))
-        self.rcd_maxpace.set_text("%s" %self.parent.pace_from_float(self.uc.pace(activity.maxpace)))
-        self.rcd_pace.set_text("%s" %self.parent.pace_from_float(self.uc.pace(activity.pace)))
+        self.rcd_maxpace.set_text("%s" %self.parent.pace_from_float(self.uc.pace(activity.maxpace),True)) # value coming from DB
+        self.rcd_pace.set_text("%s" %self.parent.pace_from_float(self.uc.pace(activity.pace),True)) # value coming from DB
         self.rcd_maxbeats.set_text("%s"%activity.maxbeats)
         self.rcd_title.set_text(activity.title)
         
@@ -374,6 +387,9 @@ class WindowRecord(SimpleGladeApp):
             self.rcd_gpxfile.set_text(activity.gpx_file)
             self.frameGeneral.set_sensitive(0)      #Currently record values not changed if a GPX file is present
             self.frameVelocity.set_sensitive(0)     #Greying out options to indicate this to user
+            self.framePace.set_sensitive(0)
+            self.frameElevation.set_sensitive(0)
+            self.frameBeats.set_sensitive(0)
         logging.debug("<<")
         
     def setValues(self,values):
@@ -433,13 +449,29 @@ class WindowRecord(SimpleGladeApp):
         return None
     
     def on_calctime_clicked(self,widget):
+        logging.debug(">>")
         try:
-            distance = self.rcd_distance.get_text()
-            average = self.rcd_average.get_text()
-            time_in_hour = float(distance)/float(average)
+            distance = float(self.rcd_distance.get_text()) # distance is mandatory!
+            # we need either pace or speed
+            try:
+                average = float(self.rcd_average.get_text())
+                time_in_hour = distance/average
+                logging.debug("Distance: %0.3f km (mi) | Speed: %0.2f -> Time: %.f hours  " %(distance,average,time_in_hour)) 
+                pace = self.parent.pace_from_float(60/average)
+                logging.debug("Setting pace: %s" %pace)
+                self.rcd_pace.set_text(pace)
+            except:
+                pace_dec = self.parent.pace_to_float(self.rcd_pace.get_text())
+                time_in_hour = pace_dec*distance/60.0
+                logging.debug("Distance: %0.3f km (mi) | Pace_dec: %0.2f -> Time: %.f hours" %(distance,pace_dec,time_in_hour))
+                speed = distance/time_in_hour
+                logging.debug("Setting average speed: %0.2f" %speed)
+                self.rcd_average.set_text("%0.2f" %speed)
             self.set_recordtime(time_in_hour)
         except:
+            logging.debug("Traceback: %s" % traceback.format_exc())
             pass
+        logging.debug("<<")
 
     def update_activity_data(self, row, gpx_file, sport):
         self.activity_data[row]["rcd_comments"] = ""
@@ -599,42 +631,33 @@ class WindowRecord(SimpleGladeApp):
             while gtk.events_pending(): # This allows the GUI to update 
                 gtk.main_iteration()    # before completion of this entire action
             self.show_treeviewEntries_row(path[0])
-        
-    def on_calcaverage_clicked(self,widget):
-        try:
-            hour = self.rcd_hour.get_value_as_int()
-            min = self.rcd_min.get_value_as_int()
-            sec = self.rcd_second.get_value_as_int()
-            time = sec + (min*60) + (hour*3600)
-            time_in_hour = time/3600.0
-            distance = float(self.rcd_distance.get_text())
-            average = distance/time_in_hour
-            self.rcd_average.set_text("%0.2f" %average)
-        except:
-            pass
-    
-    def on_calcpace_clicked(self,widget):
+
+    def on_calcavs_clicked(self,widget):
+        logging.debug(">>")
         hour = self.rcd_hour.get_value_as_int()
         min = self.rcd_min.get_value_as_int()
         sec = self.rcd_second.get_value_as_int()
         time = sec + (min*60) + (hour*3600)
         if time<1:
+            logging.debug("Seems no time value (%s) has been entered, nothing to calculate." %time)
             return False
-        time_in_min = time/60.0
         distance = float(self.rcd_distance.get_text())
         if distance<1:
+            logging.debug("Seems no distance value (%s) has been entered, nothing to calculate." %distance)
             return False
-        #Calc Pace 
-        average = time_in_min/distance
-        #Tranform pace to mm.ss
-        min = int(average)
-        per_min = average - min
-        sec = float(per_min) * 60 / 100
-        dec_pace = min + sec
+        logging.debug("Time: %d seconds | Distance: %0.2f km (mi)" %(time,distance))
+        # Average speed        
+        average_speed = distance*3600.0/time
+        logging.debug("Average speed: %0.2f" %average_speed)
+        self.rcd_average.set_text("%0.2f" %average_speed)
+        # Average pace 
+        dec_pace = 60/average_speed
         #Transform pace to mm:ss
         pace = self.parent.pace_from_float(dec_pace)
+        logging.debug("Average pace: %s" %pace)
         self.rcd_pace.set_text(pace)
-    
+        logging.debug("<<")
+
     def on_calccalories_clicked(self,widget):
         sport = self.rcd_sport.get_active_text()
         hour = self.rcd_hour.get_value_as_int()
@@ -660,17 +683,33 @@ class WindowRecord(SimpleGladeApp):
             self.rcd_calories.set_text(str(calories))
 
     def on_calcdistance_clicked(self,widget):
+        logging.debug(">>")
         try:
             hour = self.rcd_hour.get_value_as_int()
             min = self.rcd_min.get_value_as_int()
             sec = self.rcd_second.get_value_as_int()
             time = sec + (min*60) + (hour*3600)
             time_in_hour = time/3600.0
-            average = float(self.rcd_average.get_text())
-            distance = average*time_in_hour
+            # we need either pace or speed
+            try:
+                average = float(self.rcd_average.get_text())
+                distance = average*time_in_hour
+                logging.debug("Time: %d seconds | Speed: %0.2f -> Distance: %0.3f km (mi)" %(time,average,distance)) 
+                pace = self.parent.pace_from_float(60/average)
+                logging.debug("Setting pace: %s" %pace)
+                self.rcd_pace.set_text(pace)
+            except:
+                pace_dec = self.parent.pace_to_float(self.rcd_pace.get_text())
+                distance = time/(60.0*pace_dec)
+                logging.debug("Time: %d seconds | Pace_dec: %0.2f -> Distance: %0.3f km (mi)" %(time,pace_dec,distance))
+                speed = distance/time_in_hour
+                logging.debug("Setting average speed: %0.2f" %speed)
+                self.rcd_average.set_text("%0.2f" %speed)
             self.set_distance(distance) 
         except:
+            logging.debug("Traceback: %s" % traceback.format_exc())
             pass
+        logging.debug("<<")
     
     def set_distance(self,distance):
         self.rcd_distance.set_text("%0.2f" %distance)
diff --git a/pytrainer/importdata.py b/pytrainer/importdata.py
index a898fe6..4e555a3 100644
--- a/pytrainer/importdata.py
+++ b/pytrainer/importdata.py
@@ -16,17 +16,16 @@
 #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
-
 from gui.windowimportdata import WindowImportdata
 
 class Importdata:
-	def __init__(self, data_path = None, parent = None, config = None):
+	def __init__(self, sport_service, data_path = None, parent = None, config = None):
+		self._sport_service = sport_service
 		self.data_path=data_path
 		self.parent = parent
 		self.pytrainer_main = parent
 		self.configuration = config
 	
 	def runImportdata(self):
-		windowImportdata = WindowImportdata(self.data_path, self, self.configuration, self.pytrainer_main)
+		windowImportdata = WindowImportdata(self._sport_service, self.data_path, self, self.configuration, self.pytrainer_main)
 		windowImportdata.run()
diff --git a/pytrainer/lib/activity.py b/pytrainer/lib/activity.py
index b780072..bfdbc09 100644
--- a/pytrainer/lib/activity.py
+++ b/pytrainer/lib/activity.py
@@ -99,6 +99,7 @@ class Activity:
 		self.has_data = False
 		self.distance_data = {}
 		self.time_data = {}
+		self.time_pause = 0
 		self.pace_limit = None
 		self.starttime = None
 		self.gpx_distance = None
@@ -216,7 +217,12 @@ class Activity:
 		self.tracks = self.gpx.getTrackList() #TODO fix - this should removed and replaced with self.tracklist functionality
 		self.tracklist = self.gpx.trkpoints
 		self.gpx_distance = self.gpx.total_dist
-		logging.debug("GPX Distance: %s" % self.gpx_distance)
+		logging.info("GPX Distance: %s | distance (trkpts): %s | duration: %s | duration (trkpts): %s" % (self.gpx_distance, self.gpx.total_dist_trkpts, self.gpx.total_time, self.gpx.total_time_trkpts))
+		time_diff = self.gpx.total_time_trkpts - self.gpx.total_time
+		acceptable_lapse = 4 # number of seconds that duration calculated using lap and trkpts data can differ
+		if time_diff > acceptable_lapse:
+			self.time_pause = time_diff
+			logging.debug("Identified non active time: %s s" % self.time_pause)
 		logging.debug("<<")
 
 	def _init_from_db(self):
@@ -225,35 +231,39 @@ class Activity:
 		'''
 		logging.debug(">>")
 		#Get base information
-		db_result = self.pytrainer_main.ddbb.select_dict("records,sports",
-					("sports.name","id_sports", "date","distance","time","beats","comments",
+		cols = ("sports.name","id_sports", "date","distance","time","beats","comments",
 						"average","calories","id_record","title","upositive","unegative",
-						"maxspeed","maxpace","pace","maxbeats","date_time_utc","date_time_local", "sports.max_pace"),
-					"id_record=\"%s\" and records.sport=sports.id_sports" %self.id)
+						"maxspeed","maxpace","pace","maxbeats","date_time_utc","date_time_local", "sports.max_pace")
+		# outer join on sport id to workaround bug where sport reference is null on records from GPX import
+		db_result = self.pytrainer_main.ddbb.select("records left outer join sports on records.sport=sports.id_sports",
+					", ".join(cols),
+					"id_record=\"%s\" " %self.id)
 		if len(db_result) == 1:
-			_dict = db_result[0]
-			self.sport_name = _dict['sports.name']
-			self.sport_id = _dict['id_sports']
-			self.pace_limit = _dict['sports.max_pace']
+			row = db_result[0]
+			self.sport_name = row[cols.index('sports.name')]
+			if self.sport_name == None:
+				self.sport_name = ""
+			self.sport_id = row[cols.index('id_sports')]
+			self.pace_limit = row[cols.index('sports.max_pace')]
 			if self.pace_limit == 0 or self.pace_limit == "":
 				self.pace_limit = None
-			self.title = _dict['title']
+			self.title = row[cols.index('title')]
 			if self.title is None:
 				self.title = ""
-			self.date = _dict['date']
-			self.time = self._int(_dict['time'])
+			self.date = row[cols.index('date')]
+			self.time = self._int(row[cols.index('time')])
 			self.time_tuple = Date().second2time(self.time)
-			self.beats = self._int(_dict['beats'])
-			self.comments = _dict['comments']
+			self.beats = self._int(row[cols.index('beats')])
+			self.comments = row[cols.index('comments')]
 			if self.comments is None:
 				self.comments = ""
-			self.calories = self._int(_dict['calories'])
-			self.id_record = _dict['id_record']
-			self.maxbeats = self._int(_dict['maxbeats'])
+			self.calories = self._int(row[cols.index('calories')])
+			self.id_record = row[cols.index('id_record')]
+			self.maxbeats = self._int(row[cols.index('maxbeats')])
 			#Sort time....
 			# ... use local time if available otherwise use date_time_utc and create a local datetime...
-			self.date_time_local = _dict['date_time_local']
-			self.date_time_utc = _dict['date_time_utc']
+			self.date_time_local = row[cols.index('date_time_local')]
+			self.date_time_utc = row[cols.index('date_time_utc')]
 			if self.date_time_local is not None: #Have a local time stored in DB
 				self.date_time = dateutil.parser.parse(self.date_time_local)
 				self.starttime = self.date_time.strftime("%X")
@@ -263,29 +273,29 @@ class Activity:
 				self.starttime = self.date_time.strftime("%X")
 			#Sort data that changes for the US etc
 			#if self.us_system:
-			#	self.distance = km2miles(self._float(_dict['distance']))
-			#	self.average = km2miles(self._float(_dict['average']))
-			#	self.upositive = m2feet(self._float(_dict['upositive']))
-			#	self.unegative = m2feet(self._float(_dict['unegative']))
-			#	self.maxspeed = km2miles(self._float(_dict['maxspeed']))
-			#	self.maxpace = pacekm2miles(self._float(_dict['maxpace']))
-			#	self.pace = pacekm2miles(self._float(_dict['pace']))
+			#	self.distance = km2miles(self._float(row[cols.index('distance')]))
+			#	self.average = km2miles(self._float(row[cols.index('average')]))
+			#	self.upositive = m2feet(self._float(row[cols.index('upositive')]))
+			#	self.unegative = m2feet(self._float(row[cols.index('unegative')]))
+			#	self.maxspeed = km2miles(self._float(row[cols.index('maxspeed')]))
+			#	self.maxpace = pacekm2miles(self._float(row[cols.index('maxpace')]))
+			#	self.pace = pacekm2miles(self._float(row[cols.index('pace')]))
 			#else:
-			self.distance = self._float(_dict['distance'])
+			self.distance = self._float(row[cols.index('distance')])
 			if not self.distance:
 				self.distance = self.gpx_distance
-			self.average = self._float(_dict['average'])
-			self.upositive = self._float(_dict['upositive'])
-			self.unegative = self._float(_dict['unegative'])
-			self.maxspeed = self._float(_dict['maxspeed'])
-			self.maxpace = self._float(_dict['maxpace'])
-			self.pace = self._float(_dict['pace'])
+			self.average = self._float(row[cols.index('average')])
+			self.upositive = self._float(row[cols.index('upositive')])
+			self.unegative = self._float(row[cols.index('unegative')])
+			self.maxspeed = self._float(row[cols.index('maxspeed')])
+			self.maxpace = self._float(row[cols.index('maxpace')])
+			self.pace = self._float(row[cols.index('pace')])
 			self.has_data = True
 		else:
 			raise Exception( "Error - multiple results from DB for id: %s" % self.id )
 		#Get lap information
 		laps = self.pytrainer_main.ddbb.select_dict("laps",
-					("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number"),
+					("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number", "intensity", "avg_hr", "max_hr", "max_speed", "laptrigger", "comments"),
 					"record=\"%s\"" % self.id)
 		if laps is None or laps == [] or len(laps) < 1:  #No laps found
 			logging.debug("No laps in DB for record %d" % self.id)
@@ -674,3 +684,4 @@ class Activity:
 		except ValueError:
 			_value = str(value)
 		return _value.replace('.',':')
+
diff --git a/pytrainer/platform.py b/pytrainer/lib/color.py
similarity index 51%
copy from pytrainer/platform.py
copy to pytrainer/lib/color.py
index a826664..1455f8e 100644
--- a/pytrainer/platform.py
+++ b/pytrainer/lib/color.py
@@ -16,32 +16,30 @@
 #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 sys
+class Color(object):
     
-def get_platform():
-    if sys.platform == "linux2":
-        return _Linux()
-    elif sys.platform == "win32":
-        return _Windows()
-    else:
-        print "Unsupported sys.platform: %s." % sys.platform
-        sys.exit(1)
+    """A color represented as a 24-bit RGB value."""
+    
+    def __init__(self, rgb_val=0):
+        rgb_val_int = int(rgb_val)
+        if rgb_val_int < 0:
+            raise ValueError("RGB value must not be negative.")
+        if rgb_val_int > 0xffffff:
+            raise ValueError("RGB value must not be greater than 0xffffff.")
+        self._rgb_val = rgb_val_int
         
-class _Platform(object):
+    def _get_rgb_val(self):
+        return self._rgb_val
     
-    def get_default_conf_dir(self):
-        """Get the path to the default configuration directory for the platform."""
-        return self._home_dir + "/" + self._conf_dir_name
-
-class _Linux(_Platform):
+    rgb_val = property(_get_rgb_val)
+        
+    def _get_rgba_val(self):
+        return self._rgb_val << 8
     
-    def __init__(self):
-        self._home_dir = os.environ['HOME']
-        self._conf_dir_name = ".pytrainer"
-
-class _Windows(_Platform):
+    rgba_val = property(_get_rgba_val)
+    
+    def to_hex_string(self):
+        return "{0:06x}".format(self._rgb_val)
     
-    def __init__(self):
-        self._home_dir = os.environ['USERPROFILE']
-        self._conf_dir_name = "pytrainer"
+def color_from_hex_string(hex_string):
+    return Color(int(hex_string, 16))
diff --git a/pytrainer/lib/date.py b/pytrainer/lib/date.py
index 4c56b9c..c30c8d1 100644
--- a/pytrainer/lib/date.py
+++ b/pytrainer/lib/date.py
@@ -34,12 +34,16 @@ class Date:
     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)
-        sec = (((time_in_hour-hour)*60)-min)*60
-        sec = seconds-(hour*3600)-(min*60)
-        return hour,min,sec
+        #time_in_hour = seconds/3600.0
+        #hour = int(time_in_hour)
+        #min = int((time_in_hour-hour)*60)
+        #sec = (((time_in_hour-hour)*60)-min)*60
+        #sec = seconds-(hour*3600)-(min*60)
+        hours = seconds // (60*60)       
+        seconds %= (60*60)
+        minutes = seconds // 60
+        seconds %= 60                      
+        return hours,minutes,seconds
 
     def time2second(self,time):
         hour,min,sec = time
@@ -121,7 +125,7 @@ class Date:
                 dayOfWeek += 7
             #print "Adjusted today is %s day of the week:" % dayOfWeek
         date_ini = weekDate + datetime.timedelta(days=0-dayOfWeek)
-        date_end = weekDate + datetime.timedelta(days=6-dayOfWeek)
+        date_end = weekDate + datetime.timedelta(days=7-dayOfWeek)
         #print "weekrange", date_ini.strftime("%A"), date_end.strftime("%A")
         #print "dates", date_ini.strftime("%Y-%m-%d"), date_end.strftime("%Y-%m-%d")
         return date_ini.strftime("%Y-%m-%d"), date_end.strftime("%Y-%m-%d")
diff --git a/pytrainer/lib/ddbb.py b/pytrainer/lib/ddbb.py
index e0e3387..36c02d1 100644
--- a/pytrainer/lib/ddbb.py
+++ b/pytrainer/lib/ddbb.py
@@ -20,10 +20,7 @@
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 import logging
-import traceback
-import commands, os
 import dateutil
-from pytrainer.lib.date import Date
 
 #Define the tables and their columns that should be in the database
 #Obviously, this is not a list but a dict -> TODO: ammend name to avoid confusion!!!
@@ -53,6 +50,7 @@ tablesList = {  "records":{     "id_record":"integer primary key autoincrement",
                                         "weight":"float",
                                         "met":"float",
                                         "max_pace":"integer",
+                                        "color":"char(6)",
                                         },
                         "waypoints":{   "id_waypoint":"integer primary key autoincrement",
                                         "lat":"float",
@@ -73,6 +71,12 @@ tablesList = {  "records":{     "id_record":"integer primary key autoincrement",
                                         "end_lat": "float",
                                         "end_lon": "float",
                                         "calories": "int",
+                                        "intensity": "varchar(7)",
+                                        "laptrigger": "varchar(9)",
+                                        "max_speed": "float",
+                                        "avg_hr": "int",
+                                        "max_hr": "int",
+                                        "comments":"text",
                                         },
                         "athletestats": {
                                         "id_athletestat": "integer primary key autoincrement",
@@ -96,7 +100,11 @@ tablesList = {  "records":{     "id_record":"integer primary key autoincrement",
                                      "equipment_id": "int",
                                      }
                         }
-tablesDefaultData = {  "sports": [({ "name":"Mountain Bike" } ), ( {"name": "Bike"}), ({"name": "Run"}) ]}
+tablesDefaultData = { "sports": [
+    ({ "name": u"Mountain Bike", "weight": 0.0, "color": "0000ff" } ),
+    ({ "name": u"Bike", "weight": 0.0, "color": "00ff00"}),
+    ({ "name": u"Run", "weight": 0.0, "color": "ffff00"})
+]}
 
 
 class DDBB:
@@ -117,27 +125,20 @@ class DDBB:
         ddbb_user = self.configuration.getValue("pytraining","prf_ddbbuser")
         ddbb_pass = self.configuration.getValue("pytraining","prf_ddbbpass")
         self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass,self.configuration)
+        
+    def get_connection_url(self):
+        return self.ddbbObject.get_connection_url()
 
     def connect(self):
         connection_ok, connection_msg = self.ddbbObject.connect()
         if not connection_ok:
-			print "ERROR: Unable to connect to database"
-			print connection_msg
-			sys.exit(connection_ok)
-        #Do a quick check to ensure all tables are present in DB
-        if not self.checkDBTables():
-            #Some tables missing - do DB check
-            self.checkDBIntegrity()
+            print "ERROR: Unable to connect to database"
+            print connection_msg
+            sys.exit(connection_ok)
 
     def disconnect(self):
         self.ddbbObject.disconnect()
 
-    def build_ddbb(self): #TODO Is this needed?
-        self.ddbbObject.createDDBB()
-        self.ddbbObject.connect()
-        self.ddbbObject.createTables()
-        self.ddbbObject.createTableVersion()
-
     def select(self,table,cells,condition=None, mod=None):
         return self.ddbbObject.select(table,cells,condition,mod)
 
@@ -218,6 +219,10 @@ class DDBB:
             #Text so is OK??
             #TODO check length against spec?
             return value
+        elif cell_type.startswith('char'):
+            #Text so is OK??
+            #TODO check length against spec?
+            return value
         elif cell_type.startswith('date'):
             try:
                 result = dateutil.parser.parse(value).date()
@@ -287,158 +292,16 @@ class DDBB:
         ret_val = self.ddbbObject.freeExec(sql)
         return ret_val[0][0]
         
-    def checkDBTables(self):
-        '''Quick check that all expected tables existing in DB
-            return True if OK, False if any tables are missing
-        '''
-        global tablesList
-        logging.debug('>>')
-        tablesDB = self.ddbbObject.getTableList()
-        logging.debug('Tables in DB: '+str(tablesDB));
-        #Check Tables
+    def create_tables(self):
+        """Initialise the database schema from an empty database."""
+        logging.info("Creating database tables")
         for entry in tablesList:
-            logging.debug("Entry: "+entry)
-            if entry not in tablesDB:
-                return False
-        return True
-
-    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
-        args: none
-        returns: none'''
-        global tablesList
-        global tablesDefaultData
-        logging.debug('>>')
-        logging.info('Checking PyTrainer database')
-        #if self.ddbb_type != "sqlite":
-        #    logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check')
-        #    exit(-2)
-        try:
-            tablesDB = self.ddbbObject.getTableList()
-        except:
-            logging.error('Not able to retrieve which tables are in DB. Printing traceback')
-            traceback.print_exc()
-            exit(-1)
-
-        logging.debug('Found '+ str(len(tablesDB))+' tables in DB: '+ str(tablesDB))
-
-        # Create a compressed copy of current DB
-        try:
-            self.ddbbObject.createDatabaseBackup()
-        except:
-            logging.error('Not able to make a copy of current DB. Printing traceback and exiting')
-            traceback.print_exc()
-            exit(-1)
-
-        #Check Tables
-        for entry in tablesList:
-            if entry not in tablesDB:
-                logging.warn('Table '+str(entry)+' does not exist in DB')
-                self.ddbbObject.createTableDefault(entry,tablesList[entry])
-                #Check if this table has default data to add..
-                if entry in tablesDefaultData:
-                    logging.debug("Adding default data to %s" % entry)
-                    for data_dict in tablesDefaultData[entry]:
-                        self.insert_dict(entry, data_dict)
-            else:
-                self.ddbbObject.checkTable(entry,tablesList[entry])
-
-        #Run any functions to update or correct data
-        #These functions _must_ be safe to run at any time (i.e. not be version specfic or only safe to run once)
-        self.populate_date_time_local()
-        self.populate_duration_from_time()
-        logging.debug('<<')
-
-    def checkDBDataValues(self):
-        ''' Check all data in DB and report values that do not match the type '''
-        global tablesList
-
-        for table in tablesList.keys():
-            pass
-
-    def populate_duration_from_time(self):
-        '''
-        Populate duration from time field
-            only for time can be parsed as an int
-            
-            also check pace value
-        '''
-        logging.debug('--')
-        #listOfRecords = self.select_dict("records",('id_record','time'), "duration is NULL")
-        #logging.debug("Found %d records in DB without date_time_local field populated" % (len(listOfRecords) ) )
-        listOfRecords = self.select_dict("records",('id_record','time', 'duration', 'pace', 'average', 'maxspeed', 'maxpace'))
-        logging.debug("Found %d records in DB" % (len(listOfRecords) ) )
-        for record in listOfRecords:
-            data = {}
-            try:
-                duration = int(record['time'])
-            except Exception as e:
-                logging.info( "Error parsing time (%s) as int for record_id: %s" % (record['time'], record['id_record']))
-                continue
-            if duration != record['duration']:
-                logging.debug("setting record %s duration to %d" % (record['id_record'], duration))
-                data['duration'] = duration
-            #Check pace
-            try:
-                db_avg_speed = float(record['average']) #km/hr
-                db_pace = float(record['pace']) #min/km
-                db_max_speed = float(record['maxspeed'])
-                db_max_pace = float(record['maxpace'])
-                calc_pace = 60 / db_avg_speed
-                calc_max_pace = 60 / db_max_speed
-                #Update DB if db_pace != calc_pace 
-                if "%.2f" % db_pace != "%.2f" % calc_pace:
-                    print "DB Pace: %.2f, Calc: %.2f" % (db_pace, calc_pace)
-                    #data['pace'] = calc_pace
-                else:
-                    print "Pace ok: %.2f" % db_pace
-                #Update DB if db_max_pace != calc_max_pace 
-                if "%.2f" % db_max_pace != "%.2f" % calc_max_pace:
-                    print "DB Max Pace: %.2f, Calc: %.2f" % (db_max_pace, calc_max_pace)
-                    #data['max_pace'] = calc_max_pace
-                else:
-                    print "Max pace ok: %.2f" % db_max_pace
-            except Exception as e:
-                #print type(e), e
-                logging.debug("Error with converting pace (%s), average speed(%s), max speed (%s), max pace(%s)" % (record['pace'], record['average'], record['maxspeed'], record['maxpace']))
-            #Update DB if any changes
-            if len(data) > 0:
-                self.update_dict("records",data ,"id_record = %d"%record['id_record'])
-
-    def populate_date_time_local(self):
-        ''' Populate date_time_local and date from date_time_utc
-                only access records that date_time_local is NULL
-                using OS timezone to create local_time
-
-                also updates date if date != local_time
-
-                TODO - leaves date_time_local blank for records that have been manually created (as date_time_utc will actually be local time)
-        '''
-        logging.debug('--')
-        listOfRecords = self.ddbbObject.select("records","id_record,date,date_time_utc,date_time_local", "date_time_local is NULL")
-        logging.debug("Found %d records in DB without date_time_local field populated" % (len(listOfRecords) ) )
-        for record in listOfRecords:
-            try:
-                gpxfile = self.configuration.gpxdir+"/%s.gpx"%(record[0])
-                dateFromUTC = Date().getDateTime(record[2])
-                if os.path.isfile(gpxfile) : #GPX file exists for this record - probably not a manual record
-                    date_time_local = str(dateFromUTC[1])
-                    dateFromLocal = dateFromUTC[1].strftime("%Y-%m-%d")
-                    if record[1] != dateFromLocal:
-                        #date field incorrect - update it
-                        logging.debug("Updating record id: %s with date: %s and date_time_local: %s" % (record[0], dateFromLocal, date_time_local) )
-                        self.ddbbObject.update("records","date, date_time_local",[dateFromLocal, date_time_local], "id_record = %d" %record[0])
-                    else:
-                        #date field OK, just update date_time_local
-                        logging.debug("Updating record id: %s with date_time_local: %s" % (record[0], date_time_local) )
-                        self.ddbbObject.update("records","date_time_local",[date_time_local], "id_record = %d" %record[0])
-                else: #Manual entry?
-                    #For manual entries, the UTC time is the local time
-                    #TODO figure out a way to correct this...
-                    pass
-            except Exception as e:
-                print "Error updating record: " + str(record)
-                print e
-                logging.debug("Error updating record: " + str(record))
-                logging.debug(str(e))
+            self.ddbbObject.createTableDefault(entry, tablesList[entry])
+            if entry in tablesDefaultData:
+                logging.debug("Adding default data to %s" % entry)
+                for data_dict in tablesDefaultData[entry]:
+                    self.insert_dict(entry, data_dict)
+                
+    def create_backup(self):
+        """Create a backup of the current database."""
+        self.ddbbObject.createDatabaseBackup()
diff --git a/pytrainer/lib/fileUtils.py b/pytrainer/lib/fileUtils.py
index 1b00470..9ee2b3a 100644
--- a/pytrainer/lib/fileUtils.py
+++ b/pytrainer/lib/fileUtils.py
@@ -16,14 +16,22 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
+import logging
+
 class fileUtils:
-	def __init__(self, filename, data):
-		self.filename = filename
-		self.data = data
-
-	def run(self):
-        	out = open(self.filename, 'w')
-		out.write(self.data)
-            	out.close()
+    def __init__(self, filename, data):
+        self.filename = filename
+        self.data = data
+
+    def run(self):
+        logging.debug('>>')
+        if self.data is not None:
+            logging.debug("Writing in %s " % self.filename) 
+            out = open(self.filename, 'w')
+            out.write(self.data)
+            out.close()
+        else:
+            logging.error("Nothing to write in %s" % self.filename)
+        logging.debug('<<')
 
 
diff --git a/pytrainer/lib/gpx.py b/pytrainer/lib/gpx.py
index c2e78cc..571d305 100644
--- a/pytrainer/lib/gpx.py
+++ b/pytrainer/lib/gpx.py
@@ -47,6 +47,9 @@ endPointTag = gpxdataNS.substitute(tag="endPoint")
 startPointTag = gpxdataNS.substitute(tag="startPoint")
 elapsedTimeTag = gpxdataNS.substitute(tag="elapsedTime")
 distanceTag = gpxdataNS.substitute(tag="distance")
+intensityTag = gpxdataNS.substitute(tag="intensity")
+triggerTag = gpxdataNS.substitute(tag="trigger")
+summaryTag = gpxdataNS.substitute(tag="summary")
 
 pytrainerNS = string.Template(".//{http://sourceforge.net.project/pytrainer/GPX/0/1}$tag")
 pyt_eleTag = pytrainerNS.substitute(tag="ele")
@@ -63,13 +66,16 @@ class Gpx:
         self.trkpoints = []
         self.vel_array = []
         self.total_dist = 0
+        self.total_dist_trkpts = 0
         self.total_time = 0
+        self.total_time_trkpts = 0
         self.upositive = 0
         self.unegative = 0
         self.maxvel = 0
         self.maxhr = 0
         self.hr_average = 0
         self.date = ""
+        self.start_time = ""
         #self.Date = Date()
         self.calories= 0
         self.tree = None
@@ -99,6 +105,7 @@ class Gpx:
                 trackSegTag = mainNS.substitute(tag="trkseg")
                 elevationTag = mainNS.substitute(tag="ele")
                 nameTag = mainNS.substitute(tag="name")
+                intensityTag = mainNS.substitute(tag="intensity")
 
             logging.debug("getting values...")
             self.Values = self._getValues()
@@ -123,6 +130,7 @@ class Gpx:
             timeResult = trk.find(timeTag)
             if timeResult is not None:
                 time_ = timeResult.text # check timezone
+                logging.debug("TimeResult: %s" %time_)
                 mk_time = self.getDateTime(time_)[0]
                 time_ = mk_time.strftime("%Y-%m-%d")
             else:
@@ -146,6 +154,9 @@ class Gpx:
     def getCalories(self):
         return self.calories
 
+    def getStart_time(self):
+        return self.start_time
+
     def getLaps(self):
         logging.debug(">>")
         lapInfo = []
@@ -161,7 +172,8 @@ class Gpx:
             lat = self.trkpoints[-1]['lat']
             lon = self.trkpoints[-1]['lon']
             #print ((self.total_time, lat, lon, self.calories, self.total_dist, stLat, stLon))
-            lapInfo.append((self.total_time, lat, lon, self.calories, self.total_dist*1000, stLat, stLon))
+            logging.debug("total_time: %s" %self.total_time)
+            lapInfo.append((self.total_time, lat, lon, self.calories, self.total_dist*1000, stLat, stLon, "active", self.hr_average, self.maxhr, self.maxvel, "manual"))
         else:
             for lap in laps:
                 endPoint = lap.find(endPointTag)
@@ -180,8 +192,17 @@ class Gpx:
                     #print elapsedTime
                 calories = lap.findtext(calorieTag)
                 distance = lap.findtext(distanceTag)
+                intensity = lap.findtext(intensityTag).lower()
+                trigger = lap.findtext(triggerTag).lower()
+                summary = lap.find(summaryTag)
+                max_speed = summary.findtext(mainNS.substitute(tag="MaximumSpeed"))
+                if not max_speed:
+                    max_speed = 0
+                    logging.info("No max speed found in lap info. Default setting to 0")
+                avg_hr = summary.findtext(mainNS.substitute(tag="AverageHeartRateBpm"))
+                max_hr =  summary.findtext(mainNS.substitute(tag="MaximumHeartRateBpm"))
                 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, stLat, stLon))
+                lapInfo.append((elapsedTime, lat, lon, calories, distance, stLat, stLon, intensity, avg_hr, max_hr, max_speed, trigger))
         logging.debug("<<")
         return lapInfo
 
@@ -192,13 +213,30 @@ class Gpx:
         logging.debug(">>")
         tree  = self.tree
         # Calories data comes within laps. Maybe more than one, adding them together - dgranda 20100114
+        # Distance data comes within laps where present as well - dgranda 20110204
         laps = tree.findall(lapTag)
         if laps is not None and laps != "":
+            totalDistance = 0
+            totalDuration = 0
             for lap in laps:
-                lapCalories = lap.findtext(calorieTag)
-                logging.debug("Lap calories: "+str(lapCalories))
+                lapCalories = lap.findtext(calorieTag)                
                 self.calories += int(lapCalories)
-            logging.debug("Calories: "+str(self.calories))
+                lapDistance = lap.findtext(distanceTag)
+                totalDistance += float(lapDistance)
+                lapDuration_tmp = lap.findtext(elapsedTimeTag)
+                # When retrieving data from TCX file -> seconds (float)
+                # When retrieving data from GPX+ file -> hh:mm:ss
+                # EAFP -> http://docs.python.org/glossary.html
+                try:
+                    lapDuration = float(lapDuration_tmp)
+                except ValueError:
+                    hour,minu,sec = lapDuration_tmp.split(":")
+                    lapDuration = float(sec) + int(minu)*60 + int(hour)*3600
+                totalDuration += lapDuration 
+                logging.info("Lap distance: %s m | Duration: %s s | Calories: %s kcal" % (lapDistance, lapDuration, lapCalories))
+            self.total_dist = float(totalDistance/1000.0) # Returning km
+            self.total_time = int(totalDuration) # Returning seconds
+            logging.info("Laps - Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories))
         else:
             laps = []
 
@@ -219,11 +257,15 @@ class Gpx:
         logging.debug("%d trkpoints in file" % len(trkpoints))
 
         date_ = tree.find(timeTag).text
-        #mk_time = self.getDateTime(date_)[0] #UTC Date
-        mk_time = self.getDateTime(date_)[1] #Local Date
-        self.date = mk_time.strftime("%Y-%m-%d")
+        if date_ is None:
+            logging.info("time tag is blank")
+            self.date = None
+        else:
+            mk_time = self.getDateTime(date_)[1] #Local Date
+            self.date = mk_time.strftime("%Y-%m-%d")
+            self.start_time = mk_time.strftime("%H:%M:%S")
         waiting_points = []
-
+        logging.debug("date: %s | start_time: %s | mk_time: %s" % (self.date, self.start_time, mk_time))
 
         for i, trkpoint in enumerate(trkpoints):
             #Get data from trkpoint
@@ -252,6 +294,7 @@ class Gpx:
                 cadence = int(cadResult.text)
             else:
                 cadence = None
+
             #get the time
             timeResult = trkpoint.find(timeTag)
             if timeResult is not None:
@@ -262,10 +305,13 @@ class Gpx:
                     time_elapsed = 0
                 else:
                     time_elapsed = time_ - self.trkpoints[i-1]['time'] if self.trkpoints[i-1]['time'] is not None else 0
-                    self.total_time += time_elapsed
+                    self.total_time_trkpts += time_elapsed
+                    if time_elapsed > 15:
+                        logging.debug("Adding %d seconds from last trkpt, someone took a break!" % time_elapsed)
             else:
                 time_ = None
                 time_elapsed = None
+
             #get the elevation
             eleResult = trkpoint.find(elevationTag)
             rel_alt = 0
@@ -312,7 +358,7 @@ class Gpx:
             #Accumulate distances
             if dist is not None:
                 dist_elapsed += dist #TODO fix
-                total_dist += dist
+                self.total_dist_trkpts += dist
 
             #Calculate speed...
             vel = self._calculate_speed(dist, time_elapsed, smoothing_factor=3)
@@ -327,14 +373,15 @@ class Gpx:
                         w_time = (w_dist/dist_elapsed) * time_elapsed
                         w_vel = w_dist/((w_time)/3600.0)
                         w_total_time += w_time
+                        logging.info("Time added: %f" % w_time)
                         retorno.append((w_total_dist, w_alt, w_total_time, w_vel, w_lat, w_lon, w_hr, w_cadence, w_corEle))
                     waiting_points = []
                     dist_elapsed = 0
                 else:
-                    retorno.append((total_dist,ele, self.total_time,vel,lat,lon,hr,cadence,corEle))
+                    retorno.append((self.total_dist_trkpts,ele, self.total_time,vel,lat,lon,hr,cadence,corEle))
                     dist_elapsed = 0
             else: # time_ is None
-                waiting_points.append((total_dist, dist_elapsed, ele, self.total_time, lat, lon, hr, cadence, corEle))
+                waiting_points.append((self.total_dist_trkpts, dist_elapsed, ele, self.total_time, lat, lon, hr, cadence, corEle))
 
             #Add to dict of values to trkpoint list
             self.trkpoints.append({ 'id': i,
@@ -344,11 +391,11 @@ class Gpx:
                                     'cadence':cadence,
                                     'time':time_,
                                     'time_since_previous': time_elapsed,
-                                    'time_elapsed': self.total_time,
+                                    'time_elapsed': self.total_time_trkpts,
                                     'ele':ele,
                                     'ele_change': rel_alt,
                                     'distance_from_previous': dist,
-                                    'elapsed_distance': total_dist,
+                                    'elapsed_distance': self.total_dist_trkpts,
                                     'velocity':vel,
                                     'correctedElevation':corEle,
 
@@ -360,7 +407,18 @@ class Gpx:
         self.hr_average = 0
         if len_validhrpoints > 0:
             self.hr_average = total_hr/len_validhrpoints
-        self.total_dist = total_dist
+        # In case there is no other way to calculate distance, we rely on trackpoints (number of trackpoints is configurable!)
+        if self.total_dist is None or self.total_dist == 0:
+            self.total_dist = self.total_dist_trkpts
+        else:
+            dist_diff = 1000*(self.total_dist_trkpts - self.total_dist)
+            logging.debug("Distance difference between laps and trkpts calculation: %f m" % dist_diff)
+        if self.total_time is None or self.total_time == 0:
+            self.total_time = self.total_time_trkpts
+        else:
+            time_diff = self.total_time_trkpts - self.total_time
+            logging.debug("Duration difference between laps and trkpts calculation: %d s" % time_diff)
+        logging.info("Values - Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories))
         logging.debug("<<")
         return retorno
 
diff --git a/pytrainer/lib/listview.py b/pytrainer/lib/listview.py
index 9d786ad..326c740 100644
--- a/pytrainer/lib/listview.py
+++ b/pytrainer/lib/listview.py
@@ -1,13 +1,13 @@
 import datetime
 
-UC_LISTDISTANCE = {False : [['All Distances', [0.0,999999.9]],
+UC_LISTDISTANCE = {False : [[_('All Distances'), [0.0,999999.9]],
                             ['<1 km', [0.0, 1.0]],
                             ['1-5 km', [1.0, 5.0]],
                             ['5-20 km', [5.0, 20.0]],
                             ['20-50 km', [20.0, 50.0]],
                             ['50-100 km', [50.0, 100.0]],
                             ['>100 km', [100.0, 999999.9]]]  ,
-                    True : [['All Distances', [0.0,999999.9]],
+                    True : [[_('All Distances'), [0.0,999999.9]],
                             ['<1 mi', [0.0, 1.609344]],
                             ['1-5 mi', [1.609344, 8.04672]],
                             ['5-10 mi', [8.04672, 16.09344]],
@@ -17,7 +17,7 @@ UC_LISTDISTANCE = {False : [['All Distances', [0.0,999999.9]],
                     }
 class ListSearch(object):
     """ Builds SQLite condition out of search parameters"""
-    def __init__(self,  parent = None, pytrainer_main = None):
+    def __init__(self, sport_service, parent = None, pytrainer_main = None):
         self.parent = parent    
         self.pytrainer_main = pytrainer_main
         self.uc = self.pytrainer_main.uc
@@ -27,15 +27,15 @@ class ListSearch(object):
         self.past = 0
         self.duration = 0
         self.distance = 0        
-        self.listSport = self.pytrainer_main.profile.getSportList()
+        self.listSport = sport_service.get_all_sports()
         
-        self.listPast = [['All Time', -99999], ['Last 4 Weeks', -31],
-                         ['Last 6 Months', -183], ['Last 12 Months', -366]]
+        self.listPast = [[_('All Time'), -99999], [_('Last 4 Weeks'), -31],
+                         [_('Last 6 Months'), -183], [_('Last 12 Months'), -366]]
                          
-        self.listDuration = [['All Durations', [0,999999]],
-                             ['<1 Hour', [0,3600]],
-                             ['1-2 Hours', [3600,7200]],
-                             ['>2 Hours', [7200,999999]]]
+        self.listDuration = [[_('All Durations'), [0,999999]],
+                             [_('<1 Hour'), [0,3600]],
+                             [_('1-2 Hours'), [3600,7200]],
+                             [_('>2 Hours'), [7200,999999]]]
        
         """
         self.listDistanceUS = [['All Distances', [0.0,999999.9]],
@@ -70,7 +70,7 @@ class ListSearch(object):
             _search = "title like '%" +self.title + "%'"
             _add_and = True
         if self.sport > 0:
-            _sport = self.listSport[self.sport-1][3]
+            _sport = self.listSport[self.sport-1].id
             _here = "sport=%s" % _sport
             if _add_and:
                 _search += " and " + _here
@@ -130,8 +130,8 @@ class ListSearch(object):
         #Re-add "All Sports"
         liststore_lsa.append([firstEntry])
         #Re-add all sports in listSport
-        for i in self.listSport:
-            liststore_lsa.append([i[0]])
+        for sport in self.listSport:
+            liststore_lsa.append([sport.name])
         self.parent.lsa_sport.set_active(0)
         #Add handler manually, so above changes do not trigger recursive loop
         self.parent.lsa_sport.connect("changed", self.parent.on_listareasearch_clicked)
diff --git a/pytrainer/lib/mysqlUtils.py b/pytrainer/lib/mysqlUtils.py
index a87194f..7a6cc02 100644
--- a/pytrainer/lib/mysqlUtils.py
+++ b/pytrainer/lib/mysqlUtils.py
@@ -30,6 +30,9 @@ class Sql:
         self.ddbb_host = host
         self.ddbb = ddbb
         self.db = None
+        
+    def get_connection_url(self):
+        return "mysql://{user}:{passwd}@{host}/{db}".format(user=self.ddbb_user, passwd=self.ddbb_pass, host=self.ddbb_host, db=self.ddbb)
     
     def connect(self):
         #si devolvemos 1 ha ido todo con exito
@@ -165,61 +168,6 @@ class Sql:
         sql = "update %s set %s" %(table,string)
         self.db.query(sql)
         
-    def checkTable(self,tableName,columns):
-        '''
-        Checks column names and values from table and adds something if missed. New in version 1.7.0
-        args:
-            tableName - string with name of the table
-            columns - dictionary containing column names and data types coming from definition
-        returns: none'''
-        logging.debug('>>')
-        logging.info('Inspecting '+str(tableName)+' table')
-        logging.debug('Columns definition: '+str(columns))
-
-        # Retrieving data from DB
-        tableInfo = self.retrieveTableInfo(tableName)
-        logging.debug('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo))
-        #print('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo))
-        #Raw data retrieved from DB sports: [('met', 'float', 'YES', '', None, ''), ('id_sports', 'int(11)', 'NO', 'PRI', None, 'auto_increment'), ('max_pace', 'int(11)', 'YES', '', None, ''), ('name', 'varchar(100)', 'YES', '', None, ''), ('weight', 'float', 'YES', '', None, '')]
-
-        # Comparing data retrieved from DB with what comes from definition
-        columnsDB = {}
-        for field in tableInfo:
-            newField = {field[0]:field[1]}
-            columnsDB.update(newField)
-        logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB))
-        #print('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB))
-
-        # http://mail.python.org/pipermail/python-list/2002-May/141458.html
-        #tempDict = dict(zip(columns,columns))
-        tempDict = dict(columns)
-        #Test for columns that are in DB that shouldn't be
-        result = [x for x in columnsDB if x not in tempDict]
-        #Test for columns that are not in the DB that should be
-        result2 = [x for x in tempDict if x not in columnsDB]
-
-        logging.debug("Columns in DB that shouldnt be: "+str(result))
-        logging.debug("Columns missing from DB: "+str(result2))
-        
-        table_ok = True
-        if len(result) > 0:
-            logging.debug('Found columns in DB that should not be: '+ str(result))
-            table_ok = False
-            for entry in result:
-                logging.debug('Column '+ str(entry) +' in DB but not in definition')
-                print "Column %s in DB but not in definition - please fix manually" % (str(entry))
-                print "#TODO need to add auto fix code"
-                sys.exit(1)
-        if len(result2) > 0: # may have also different data type
-            logging.debug('Found columns missed in DB: '+ str(result2))
-            table_ok = False
-            for entry in result2:
-                logging.debug('Column '+ str(entry) +' not found in DB')
-                self.addColumn(tableName,str(entry),columns[entry])
-        if table_ok:
-            logging.info('Table '+ str(tableName) +' is OK')
-        logging.debug('<<')
-        
     def retrieveTableInfo(self,tableName):
         cur = self.db.cursor()
         sql = "desc %s;" %tableName
@@ -242,6 +190,4 @@ class Sql:
             traceback.print_exc()
             
     def createDatabaseBackup(self):
-        logging.debug('>>')
         logging.info("Unable to create backup for MySQL DB")
-        logging.debug('<<')
diff --git a/pytrainer/lib/sqliteUtils.py b/pytrainer/lib/sqliteUtils.py
index b48b2ea..7623c0b 100644
--- a/pytrainer/lib/sqliteUtils.py
+++ b/pytrainer/lib/sqliteUtils.py
@@ -20,6 +20,7 @@
 
 import logging
 import sys, traceback, commands
+import datetime
 try:
     from sqlite3 import dbapi2 as sqlite
 except ImportError:
@@ -32,6 +33,9 @@ class Sql:
         self.db = None
         confdir = configuration.confdir
         self.ddbb = "%s/pytrainer.ddbb" %confdir
+        
+    def get_connection_url(self):
+        return "sqlite:///" + self.ddbb
     
     def connect(self):
         #si devolvemos 1 ha ido todo con exito
@@ -80,6 +84,7 @@ class Sql:
         logging.debug('<<')
               
     def insert(self,table, cells, values):
+        logging.debug('>>')
         cur = self.db.cursor()  
         val = values
         count = 0
@@ -87,11 +92,28 @@ class Sql:
         for i in val:
             if count>0:
                 string+=","
-            string+="""\"%s\"""" %i
+            string+= self._to_sql_value(i)
             count = count+1
         sql = "insert into %s (%s) values (%s)"  %(table,cells,string)
+        logging.debug('SQL sentence: '+str(sql))
         cur.execute(sql)
         self.db.commit()
+        logging.debug('<<')
+        
+    def _to_sql_value(self, value):
+        logging.debug('>>')
+        logging.debug('Value: %s | type: %s ' %(value,type(value)))
+        if value == None:
+            return "null"
+        elif type(value) in [str, unicode]:
+            return "\"" + value + "\""
+        elif type(value) == datetime.datetime:
+            return value.strftime("\"%Y-%m-%d %H:%M:%S%z\"")
+        elif type(value) == datetime.date:
+            return value.strftime("\"%Y-%m-%d\"")
+        else:
+            return str(value)
+        logging.debug('<<')
 
     def freeExec(self,sql):
         cur = self.db.cursor()
@@ -116,7 +138,7 @@ class Sql:
         for val in values:
             if count>0:
                 string+=","
-            string += """%s="%s" """ %(cells[count],values[count])
+            string += """%s=%s """ %(cells[count], self._to_sql_value(values[count]))
             count = count+1
 
         string +=" where %s" %condition
@@ -141,60 +163,6 @@ class Sql:
             retorno.append(row)
         return retorno
 
-    def checkTable(self,tableName,columns):
-        '''19.11.2009 - dgranda
-        Checks column names and values from table and adds something if missed. New in version 1.7.0
-        args:
-            tableName - string with name of the table
-            columns - dictionary containing column names and data types coming from definition
-        returns: none'''
-        logging.debug('>>')
-        logging.info('Inspecting '+str(tableName)+' table')
-        logging.debug('Columns definition: '+str(columns))
-
-        # Retrieving data from DB
-        tableInfo = self.retrieveTableInfo(tableName)
-        logging.debug('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo))
-        #Raw data retrieved from DB laps: [(0, u'elapsed_time', u'varchar(20)', 0, None, 0), (1, u'record', u'integer', 0, None, 0), (2, u'end_lon', u'float', 0, None, 0), (3, u'lap_number', u'integer', 0, None, 0), (4, u'end_lat', u'float', 0, None, 0), (5, u'distance', u'float', 0, None, 0), (6, u'start_lon', u'float', 0, None, 0), (7, u'id_lap', u'integer', 0, None, 1), (8, u'calories', u'int', 0, None, 0), (9, u'start_lat', u'float', 0, None, 0)]
-
-        # Comparing data retrieved from DB with what comes from definition
-        columnsDB = {}
-        for field in tableInfo:
-            newField = {field[1]:field[2]}
-            columnsDB.update(newField)
-        logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB))
-        #Useful data retrieved from laps in DB: {u'elapsed_time': u'varchar(20)', u'record': u'integer', u'end_lon': u'float', u'start_lon': u'float', u'end_lat': u'float', u'distance': u'float', u'id_lap': u'integer', u'lap_number': u'integer', u'calories': u'int', u'start_lat': u'float'}
-        
-        # http://mail.python.org/pipermail/python-list/2002-May/141458.html
-        #tempDict = dict(zip(columns,columns))
-        tempDict = dict(columns)
-        #Test for columns that are in DB that shouldn't be
-        result = [x for x in columnsDB if x not in tempDict]
-        #Test for columns that are not in the DB that should be
-        result2 = [x for x in tempDict if x not in columnsDB]
-
-        logging.debug("Columns in DB that shouldnt be: "+str(result))
-        logging.debug("Columns missing from DB: "+str(result2))
-
-        table_ok = True
-        if len(result) > 0:
-            logging.debug('Found columns in DB that should not be: '+ str(result))
-            table_ok = False
-            for entry in result:
-                logging.debug('Column '+ str(entry) +' in DB but not in definition')
-                print "Column %s in DB but not in definition - please fix manually" % (str(entry))
-                print "#TODO need to add auto fix code"
-                sys.exit(1)
-        if len(result2) > 0: # may have also different data type
-            logging.debug('Found columns missed in DB: '+ str(result2))
-            table_ok = False
-            for entry in result2:
-                logging.debug('Column '+ str(entry) +' not found in DB')
-                self.addColumn(tableName,str(entry),columns[entry])
-        if table_ok:
-            logging.info('Table '+ str(tableName) +' is OK')
-        logging.debug('<<')
-
     def retrieveTableInfo(self,tableName):
         cur = self.db.cursor()
         sql = "PRAGMA table_info(%s);" %tableName
@@ -215,11 +183,9 @@ class Sql:
 
 
     def createDatabaseBackup(self):
-        logging.debug('>>')
+        logging.info("Creating compressed copy of current DB")
         logging.debug('Database path: '+str(self.ddbb))
         result = commands.getstatusoutput('gzip -c '+self.ddbb+' > '+self.ddbb+'_`date +%Y%m%d_%H%M`.gz')
         if result[0] != 0:
             raise Exception, "Copying current database does not work, error #"+str(result[0])
-        else:
-            logging.info('Database backup successfully created')
-        logging.debug('<<')
+        logging.info('Database backup successfully created')
diff --git a/pytrainer/lib/srtmdownload.py b/pytrainer/lib/srtmdownload.py
index e75a2a8..850c827 100644
--- a/pytrainer/lib/srtmdownload.py
+++ b/pytrainer/lib/srtmdownload.py
@@ -58,7 +58,13 @@ class DownloadLoop:
             os.mkdir(self.srtm_dir)             
         
         urlfile = self.get_urlfile()
-        size_total = int(urlfile.info().getheader('Content-Length').strip())
+        if not urlfile:
+            return False
+        
+        try:
+            size_total = int(urlfile.info().getheader('Content-Length').strip())
+        except:
+            size_total = 0
 
         if size_total == 0:
             loopActive = False
diff --git a/pytrainer/main.py b/pytrainer/main.py
index c02d08f..0486aab 100644
--- a/pytrainer/main.py
+++ b/pytrainer/main.py
@@ -33,6 +33,7 @@ import traceback
 from os import path
 
 from pytrainer import platform
+from upgrade.data import initialize_data
 from environment import Environment
 from record import Record
 from waypoint import Waypoint
@@ -40,9 +41,10 @@ from extension import Extension
 from importdata import Importdata
 from plugins import Plugins
 from profile import Profile
+from pytrainer.sport import SportService
 from athlete import Athlete
+from stats import Stats
 
-from gui.windowimportdata import WindowImportdata
 from gui.windowmain import Main
 from gui.warning import Warning
 from lib.date import Date
@@ -53,16 +55,15 @@ from lib.uc import UC
 class pyTrainer:
     def __init__(self,filename = None, data_path = None):
         #Version constants
-        self.version ="1.8.0"
-        self.DB_version = 6
+        self.version ="1.9.0"
         #Process command line options
         self.startup_options = self.get_options()
+        #Setup logging
         self.environment = Environment(platform.get_platform(), self.startup_options.conf_dir)
         self.environment.create_directories()
-        #Setup logging
-        self.set_logging(self.startup_options.log_level)
+        self.set_logging(self.startup_options.log_level, self.startup_options.log_type)
         logging.debug('>>')
-        logging.debug("PyTrainer version %s, DB version %s" % (self.version, self.DB_version))
+        logging.debug("PyTrainer version %s" % (self.version))
         self.data_path = data_path
         self.date = Date()
         self.ddbb = None
@@ -74,33 +75,22 @@ class pyTrainer:
         self.ddbb = DDBB(self.profile, self)
         logging.debug('connecting to DDBB')
         self.ddbb.connect()
-
-        #Get user's DB version
-        currentDB_version = self.profile.getValue("pytraining","DB_version")
-        logging.debug("Current DB version: "+str(currentDB_version))
-        # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check)
-        if self.startup_options.check:
-            logging.debug("Checking DB as per user's request")
-            self.sanityCheck()
-        elif currentDB_version is None:
-            logging.debug("No stored DB version. Checking DB")
-            self.sanityCheck()
-        elif self.DB_version > int(currentDB_version):
-            logging.debug("DB version newer than user's version")
-            self.sanityCheck()
-        else:
-            logging.info('No sanity check requested')
-        self.record = Record(data_path,self)
+        
+        initialize_data(self.ddbb, self.environment.conf_dir)
+            
+        self._sport_service = SportService(self.ddbb)
+        self.record = Record(self._sport_service, data_path, self)
         self.athlete = Athlete(data_path,self)
+        self.stats = Stats(self._sport_service, self)
         pool_size = self.profile.getIntValue("pytraining","activitypool_size", default=1)
         self.activitypool = ActivityPool(self, size=pool_size)
         #preparamos la ventana principal
-        self.windowmain = Main(data_path,self,self.version, gpxDir=self.profile.gpxdir)
+        self.windowmain = Main(self._sport_service, data_path,self,self.version, gpxDir=self.profile.gpxdir)
         self.date = Date(self.windowmain.calendar)
         self.waypoint = Waypoint(data_path,self)
         self.extension = Extension(data_path, self)
         self.plugins = Plugins(data_path, self)
-        self.importdata = Importdata(data_path, self, self.profile)
+        self.importdata = Importdata(self._sport_service, data_path, self, self.profile)
         self.loadPlugins()
         self.loadExtensions()
         self.windowmain.setup()
@@ -121,24 +111,27 @@ class pyTrainer:
         For more help on valid options try:
            %prog -h '''
         parser = OptionParser(usage=usage)
-        parser.set_defaults(log_level=logging.ERROR, validate=False, equip=False, newgraph=True, conf_dir=None)
+        parser.set_defaults(log_level=logging.ERROR, validate=False, equip=False, newgraph=True, conf_dir=None, log_type="file")
         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("--oldgraph", action="store_false", dest="newgraph", help="Turn off new graphing approach")
         parser.add_option("--newgraph", action="store_true", dest="newgraph", help="Deprecated Option: Turn on new graphing approach")
         parser.add_option("--confdir", dest="conf_dir", help="Specify the directory where application configuration will be stored.")
+        parser.add_option("--logtype", dest="log_type", metavar="TYPE",  type="choice" , choices=["file", "console"], help="Specify where logging should be output to. TYPE is one of 'file' (default), or 'console'.")
         (options, args) = parser.parse_args()
         return options
 
-    def set_logging(self,level):
+    def set_logging(self, level, log_type):
         '''Setup rotating log file with customized format'''
-        rotHandler = logging.handlers.RotatingFileHandler(self.environment.log_file, maxBytes=100000, backupCount=5)
+        if("console" == log_type):
+            handler = logging.StreamHandler(sys.stdout)
+        else:
+            handler = logging.handlers.RotatingFileHandler(self.environment.log_file, maxBytes=100000, backupCount=5)
         formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s')
-        rotHandler.setFormatter(formatter)
-        logging.getLogger('').addHandler(rotHandler)
+        handler.setFormatter(formatter)
+        logging.getLogger('').addHandler(handler)
         self.set_logging_level(self.startup_options.log_level)
 
     def set_logging_level(self, level):
@@ -152,7 +145,7 @@ class pyTrainer:
         #self.webservice.stop()
         self.windowmain.gtk_main_quit()
         logging.shutdown()
-        sys.exit() # Any nonzero value is considered “abnormal termination” by shells and the like
+        sys.exit() # Any nonzero value is considered "abnormal termination" by shells and the like
 
     def loadPlugins(self):
         logging.debug('>>')
@@ -211,8 +204,8 @@ class pyTrainer:
 
     def refreshMainSportList(self):
         logging.debug('>>')
-        listSport = self.profile.getSportList()
-        self.windowmain.updateSportList(listSport)
+        sports = self._sport_service.get_all_sports()
+        self.windowmain.updateSportList(sports)
         logging.debug('<<')
 
     def refreshGraphView(self, view, sport=None):
@@ -232,6 +225,8 @@ class pyTrainer:
                 self.refreshRecordGraphView("map")
              elif self.windowmain.recordview.get_current_page()==3:
                 self.refreshRecordGraphView("heartrate")
+             elif self.windowmain.recordview.get_current_page()==4:
+                self.refreshRecordGraphView("analytics")
         elif view=="day":
              logging.debug('day view')
              sport = self.windowmain.activeSport
@@ -251,7 +246,8 @@ class pyTrainer:
              date_ini, date_end = self.date.getMonthInterval(date_selected)
              sport = self.windowmain.activeSport
              sport_id = self.record.getSportId(sport)
-             record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id)
+#             record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id)
+             record_list = self.record.getrecordPeriod(date_ini, date_end, sport_id)
              nameMonth, daysInMonth = self.date.getNameMonth(date_selected)
              self.windowmain.actualize_monthview(record_list, nameMonth)
              self.windowmain.actualize_monthgraph(record_list, daysInMonth)
@@ -261,7 +257,8 @@ class pyTrainer:
              sport = self.windowmain.activeSport
              sport_id = self.record.getSportId(sport)
              year = self.date.getYear(date_selected)
-             record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id)
+#             record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id)
+             record_list = self.record.getrecordPeriod(date_ini, date_end, sport_id)
              self.windowmain.actualize_yearview(record_list, year)
              self.windowmain.actualize_yeargraph(record_list)
         elif view=="listview":
@@ -270,6 +267,9 @@ class pyTrainer:
         elif view=="athlete":
             logging.debug('athlete view')
             self.windowmain.on_athleteview_activate()
+        elif view=="stats":
+            logging.debug('stats view')
+            self.windowmain.on_statsview_activate()
         else:
             print "Unknown view %s" % view
         logging.debug('<<')
@@ -302,6 +302,8 @@ class pyTrainer:
         if view=="heartrate":
              self.windowmain.actualize_heartrategraph(activity)
              self.windowmain.actualize_hrview(activity)
+        if view=="analytics":
+             self.windowmain.actualize_analytics(activity)
         logging.debug('<<')
 
     def refreshMapView(self, full_screen=False):
@@ -339,6 +341,12 @@ class pyTrainer:
         self.windowmain.actualize_athleteview(self.athlete)
         logging.debug('<<')
 
+    def refreshStatsView(self):
+        logging.debug('>>')
+        self.stats.refresh()
+        self.windowmain.actualize_statsview(self.stats, self.record.getAllRecordList())
+        logging.debug('<<')
+
     def refreshListView(self,condition=None):
         logging.debug('>>')
         record_list = self.record.getRecordListByCondition(condition)
@@ -415,20 +423,17 @@ class pyTrainer:
 
     def newRecord(self,title=None,distance=None,time=None,upositive=None,unegative=None,bpm=None,calories=None,date=None,comment=None,view=None):
         logging.debug('>>')
-        list_sport = self.profile.getSportList()
         if date == None:
              date = self.date.getDate()
-        self.record.newRecord(list_sport, date, title, distance, time, upositive, unegative, bpm, calories, comment)
+        self.record.newRecord(date, title, distance, time, upositive, unegative, bpm, calories, comment)
         self.refreshListRecords()
         if view is not None:
             self.refreshGraphView(view)
         logging.debug('<<')
 
     def editRecord(self, id_record, view=None):
-        logging.debug('>>')
-        list_sport = self.profile.getSportList()
-        logging.debug('id_record: '+str(id_record)+' | list_sport: '+str(list_sport))
-        self.record.editRecord(id_record,list_sport)
+        logging.debug("Editing record with id: '%s'", id_record)
+        self.record.editRecord(id_record)
         self.refreshListRecords()
         if view is not None:
             self.refreshGraphView(view)
@@ -477,19 +482,7 @@ class pyTrainer:
 
     def editProfile(self):
         logging.debug('>>')
-        self.profile.editProfile()
+        self.profile.editProfile(self._sport_service)
         self.activitypool.clear_pool()
         self.windowmain.setup()
         logging.debug('<<')
-
-    def sanityCheck(self):
-        """23.11.2009 - dgranda
-        Checks database and configuration file
-        args: none
-        returns: none"""
-        logging.debug('>>')
-        logging.info('Checking database integrity')
-        self.ddbb.checkDBIntegrity()
-        logging.info('Setting DB version to: ' + str(self.DB_version))
-        self.profile.setValue("pytraining","DB_version", str(self.DB_version))
-        logging.debug('<<')
diff --git a/pytrainer/monthgraph.py b/pytrainer/monthgraph.py
index e33689d..c2c5d59 100644
--- a/pytrainer/monthgraph.py
+++ b/pytrainer/monthgraph.py
@@ -16,68 +16,30 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-from gui.drawArea import DrawArea
 import dateutil
+import datetime
+from timegraph import TimeGraph
 
-class MonthGraph:
-    def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None):
-        self.drawarea = DrawArea(vbox, window)
-        self.combovalue = combovalue
-        self.combovalue2 = combovalue2
+class MonthGraph(TimeGraph):
 
-    def drawgraph(self,values, daysInMonth):
-        xval = []
-        yval = []
-        xlab = []
-        ylab = []
-        tit = []
-        col = []
-        value_selected = self.combovalue.get_active()
-        value_selected2 = self.combovalue2.get_active()
-        if value_selected < 0:
-            self.combovalue.set_active(0)
-            value_selected = 0
-        xlabel,ylabel,title,color = self.get_value_params(value_selected)
-        xvalues,yvalues = self.get_values(values,value_selected,daysInMonth)
+    value_params = [
+        (_("day"),_("Distance (km)"),_("Daily Distance"),"y"),
+        (_("day"),_("Time (hours)"), _("Daily Time"),"b"),
+        (_("day"),_("Average Heart Rate (bpm)"), _("Daily Average Heart Rate"),"r"),
+        (_("day"),_("Average Speed (km/h)"), _("Daily Average Speed"),"g"),
+        (_("day"),_("Calories"), _("Daily Calories"),"b"),
+    ]
 
-        xval.append(xvalues)
-        yval.append(yvalues)
-        if value_selected2 < 0:
-            xlab.append("")
-        else:
-            xlab.append(xlabel)
-        ylab.append(ylabel)
-        tit.append(title)
-        col.append(color)
+    def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None):
+        TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main)
+        self.combovalue = combovalue
+        self.combovalue2 = combovalue2
+        self.KEY_FORMAT = "%d"
         
-        if value_selected2 < 0:
-            self.combovalue2.set_active(0)
-            value_selected2 = 0
-        if value_selected2 > 0:
-            value_selected2 = value_selected2-1
-            xlabel,ylabel,title,color = self.get_value_params(value_selected2)
-            xvalues,yvalues = self.get_values(values,value_selected2,daysInMonth)
-            xval.append(xvalues)
-            yval.append(yvalues)
-            xlab.append(xlabel)
-            ylab.append(ylabel)
-            tit.append(title)
-            col.append(color)
-        self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col)
-
-    def get_value_params(self,value):
-        if value == 0:
-            return _("day"),_("Distance (km)"),_("Daily Distance"),"y"
-        elif value == 1:
-            return _("day"),_("Time (hours)"), _("Daily Time"),"b"
-        elif value == 2:
-            return _("day"),_("Average Heart Rate (bpm)"), _("Daily Average Heart Rate"),"r"
-        elif value == 3:
-            return _("day"),_("Average Speed (km/h)"), _("Daily Average Speed"),"g"
-        elif value == 4:
-            return _("day"),_("Calories"), _("Daily Calories"),"b"
+    def drawgraph(self,values, daysInMonth):
+        TimeGraph.drawgraph(self, values, x_func=lambda x: list([u'%02d' % d for d in xrange(1,daysInMonth+1)]))
 
-    def get_values(self,values,value_selected,daysInMonth):
+    def get_values2(self,values,value_selected,daysInMonth):
         #hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values
         conv = {
             0: 1, #value 0 es kilometros (1)
@@ -131,9 +93,3 @@ class MonthGraph:
 
         return xunits,yunits
     
-    def getFloatValue(self, value):
-        try:
-            return float(value)
-        except:
-            return float(0)
-
diff --git a/pytrainer/platform.py b/pytrainer/platform.py
index a826664..a127e8c 100644
--- a/pytrainer/platform.py
+++ b/pytrainer/platform.py
@@ -1,6 +1,7 @@
 # -*- coding: iso-8859-1 -*-
 
 #Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+#modified by dgranda on behalf of Debian bug #587997 (trac ticket #120)
 
 #This program is free software; you can redistribute it and/or
 #modify it under the terms of the GNU General Public License
@@ -20,12 +21,12 @@ import os
 import sys
     
 def get_platform():
-    if sys.platform == "linux2":
-        return _Linux()
-    elif sys.platform == "win32":
+    if os.name == "posix":
+        return _Linux() #although not true, not changing original return name to avoid side effects
+    elif os.name == "nt":
         return _Windows()
     else:
-        print "Unsupported sys.platform: %s." % sys.platform
+        print "Unsupported os.name: %s." % os.name
         sys.exit(1)
         
 class _Platform(object):
diff --git a/pytrainer/profile.py b/pytrainer/profile.py
index 0753dfc..f927785 100644
--- a/pytrainer/profile.py
+++ b/pytrainer/profile.py
@@ -39,6 +39,7 @@ class Profile:
         self.extensiondir = environment.extension_dir
         self.plugindir = environment.plugin_dir
         self.uc = UC()
+        self.profilewindow = None
         
         environment.clear_temp_dir()
 
@@ -55,7 +56,6 @@ class Profile:
             "prf_ddbbuser":"",
             "prf_ddbbpass":"",
             "version":"0.0",
-            "DB_version":"0",
             "prf_us_system":"False",
             "prf_hrzones_karvonen":"False",
             "prf_maxhr":"",
@@ -81,10 +81,15 @@ class Profile:
         #resthr = self.getValue("pytraining","prf_minhr")
         try:
             maxhr = int(self.getValue("pytraining","prf_maxhr"))
+        except Exception as e:
+            logging.error("Failed when retrieving Max Heartrate value: %s" %e)
+            logging.info("Setting Max Heartrate to default value: 190")
+            maxhr = 190
+        try:
             resthr = int(self.getValue("pytraining","prf_minhr"))
         except Exception as e:
-            logging.debug(str(e))
-            maxhr = 220
+            logging.error("Failed when retrieving Min Heartrate value: %s" %e)
+            logging.info("Setting Min Heartrate to default value: 65")
             resthr = 65
         self.maxhr = maxhr
         self.rethr = resthr
@@ -219,62 +224,21 @@ class Profile:
         self.uc.set_us(list_options['prf_us_system'])
         logging.debug("<<")
 
-    def getSportList(self):
-        logging.debug("--")
-        #connection = self.pytrainer_main.ddbb.connect()
-        #if (connection == 1):
-        logging.debug("retrieving sports info")
-        return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None)
-        #else:
-        #   return connection
-
-    def addNewSport(self,sport,met,weight,maxpace):
-        """31.08.2008 - dgranda
-        It adds a new sport.
-        arguments:
-            sport: sport's name
-            met:
-            weight:
-        returns: id_sports from new sport"""
-        logging.debug(">>")
-        logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met+"|"+maxpace)
-        sport = [sport,met,weight,maxpace]
-        self.pytrainer_main.ddbb.insert("sports","name,met,weight,max_pace",sport)
-        sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))
-        logging.debug("<<")
-        return sport_id
-
-    def delSport(self,sport):
-        logging.debug(">>")
-        condition = "name=\"%s\"" %sport
-        id_sport = self.pytrainer_main.ddbb.select("sports","id_sports",condition)[0][0]
-        logging.debug("removing records from sport "+ sport + " (id_sport: "+str(id_sport)+")")
-        self.pytrainer_main.ddbb.delete("records","sport=\"%d\""%id_sport)
-        self.pytrainer_main.ddbb.delete("sports","id_sports=\"%d\""%id_sport)
-        logging.debug("<<")
-
-    def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport,newmaxpace=None):
-        logging.debug("--")
-        self.pytrainer_main.ddbb.update("sports","name,met,weight,max_pace",[newnamesport,newmetsport,newweightsport, newmaxpace],"name=\"%s\""%oldnamesport)
-
-    def getSportInfo(self,namesport):
-        logging.debug("--")
-        return self.pytrainer_main.ddbb.select("sports","name,met,weight,max_pace","name=\"%s\""%namesport)[0]
-
-    def build_ddbb(self):
-        logging.debug("--")
-        self.pytrainer_main.ddbb.build_ddbb()
-
-    def editProfile(self):
+    def editProfile(self, sport_service):
         logging.debug(">>")
         from gui.windowprofile import WindowProfile
         logging.debug("retrieving configuration data")
         #Refresh configuration
         self.configuration = self._parse_config_file(self.config_file)
-        profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.pytrainer_main)
-        logging.debug("setting data values")
-        profilewindow.setValues(self.configuration)
-        profilewindow.run()
+        if self.profilewindow is None:
+            self.profilewindow = WindowProfile(sport_service, self.data_path, self, pytrainer_main=self.pytrainer_main)
+            logging.debug("setting data values")
+            self.profilewindow.setValues(self.configuration)
+            self.profilewindow.run()
+            self.profilewindow = None
+        else:
+            self.profilewindow.setValues(self.configuration)
+            self.profilewindow.present()
         self.configuration = self._parse_config_file(self.config_file)
         logging.debug("<<")
 
diff --git a/pytrainer/record.py b/pytrainer/record.py
index 7e4b5dc..f0ac594 100644
--- a/pytrainer/record.py
+++ b/pytrainer/record.py
@@ -29,10 +29,12 @@ from lib.xmlUtils import XMLParser
 from lib.date import Date
 from lib.gpx import Gpx
 from pytrainer.equipment import EquipmentService
+from pytrainer.sport import Sport
 
 class Record:
-	def __init__(self, data_path = None, parent = None):
+	def __init__(self, sport_service, data_path = None, parent = None):
 		logging.debug('>>')
+		self._sport_service = sport_service
 		self.parent = parent
 		self.pytrainer_main = parent
 		self._equipment_service = EquipmentService(self.pytrainer_main.ddbb)
@@ -41,40 +43,29 @@ class Record:
 		self.date = Date()
 		logging.debug('<<')
 
-	def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None):
+	def newRecord(self, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None):
 		logging.debug('>>')
-		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport,self, date, title, distance, time, upositive, unegative, bpm, calories, comment)
+		sports = self._sport_service.get_all_sports()
+		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, self, date, title, distance, time, upositive, unegative, bpm, calories, comment)
 		self.recordwindow.run()
 		logging.debug('<<')
 
-	def newMultiRecord(self, activities, list_sport):
+	def newMultiRecord(self, activities):
 		logging.debug('>>')
-		#activities (activity_id, start_time, distance, duration, sport, gpx_file)
-		self.recordwindow = WindowRecord(self._equipment_service, self._equipment_service, self.data_path, list_sport, parent=self, windowTitle="Modify details before importing")
+		sports = self._sport_service.get_all_sports()
+		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, parent=self, windowTitle=_("Modify details before importing"))
 		self.recordwindow.populateMultiWindow(activities)
 		self.recordwindow.run()
 		return self.recordwindow.getActivityData()
 		logging.debug('<<')
 
-	def editRecord(self,id_record,list_sport):
+	def editRecord(self,id_record):
 		logging.debug('>>')
 		activity = self.pytrainer_main.activitypool.get_activity(id_record)
 		record_equipment = self.get_record_equipment(id_record)
-		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport, self, None, windowTitle=_("Edit Entry"), equipment=record_equipment)
+		sports = self._sport_service.get_all_sports()
+		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, self, None, windowTitle=_("Edit Entry"), equipment=record_equipment)
 		self.recordwindow.setValuesFromActivity(activity)
-		'''
-		record = self.pytrainer_main.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record)
-		logging.debug('retrieving data from DB: '+str(record))
-		gpxfile = self.pytrainer_main.profile.gpxdir+"/%d.gpx"%int(id_record)
-		logging.debug('gpx file associated: '+gpxfile)
-		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')
 		self.recordwindow.run()
 		logging.debug('<<')
@@ -90,54 +81,34 @@ class Record:
 			logging.debug('removed gpxfile '+gpxfile)
 		logging.debug('<<')
 
-	def _formatRecord (self, list_options):
-		logging.debug('>>')
-		time = self.date.time2second(list_options["rcd_time"])
-		average = self.parseFloatRecord(list_options["rcd_average"])
-		cells= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats"
-		if (list_options["rcd_beats"] == ""):
-			list_options["rcd_beats"] = 0
-
-		#calculate the sport id
-		sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %list_options["rcd_sport"])[0][0]
-
-		values= (
-			list_options["rcd_date"],
-			sport_id,
-			self.parseFloatRecord(list_options["rcd_distance"]),
-			time,
-			self.parseFloatRecord(list_options["rcd_beats"]),
-			list_options["rcd_comments"],
-			average,
-			self.parseFloatRecord(list_options["rcd_calories"]),
-			list_options["rcd_title"],
-			self.parseFloatRecord(list_options["rcd_upositive"]),
-			self.parseFloatRecord(list_options["rcd_unegative"]),
-			self.parseFloatRecord(list_options["rcd_maxvel"]),
-			self.pace_to_float(list_options["rcd_maxpace"]),
-			self.pace_to_float(list_options["rcd_pace"]),
-			self.parseFloatRecord(list_options["rcd_maxbeats"])
-			)
-		logging.debug('<<')
-		return cells,values
-
 	def pace_to_float(self, value):
 		'''Take a mm:ss or mm.ss and return float'''
-		value = value.replace(':', '.')
 		try:
-			value = float(value)
-		except ValueError:
-			value = None
+			value = float(value)			
+		except:
+			if ":" in value: # 'mm:ss' found
+				mins, sec = value.split(":")
+				value = float(mins + "." + "%02d" %round(int(sec)*5/3))
+			elif "," in value:
+				value = float(value.replace(',','.'))
+			else:
+				logging.error("Wrong value provided: %s" %value)
+				value = None
 		return value
 
-	def pace_from_float(self, value):
+	def pace_from_float(self, value, fromDB=False):
 		'''Helper to generate mm:ss from float representation mm.ss (or mm,ss?)'''
 		#Check that value supplied is a float
 		try:
 			_value = "%0.2f" % float(value)
 		except ValueError:
 			_value = str(value)
-		return _value.replace('.',':')
+		if fromDB:  # paces in DB are stored in mixed format -> 4:30 as 4.3 (NOT as 4.5 aka 'decimal')
+			pace = _value
+		else:
+			mins, sec_dec = _value.split(".")
+			pace = mins + ":" + "%02d" %round(int(sec_dec)*3/5)
+		return pace
 
 	def _formatRecordNew (self, list_options):
 		"""20.07.2008 - dgranda
@@ -237,6 +208,12 @@ class Record:
 			tmp_lap['end_lat'] = lap[1]
 			tmp_lap['end_lon'] = lap[2]
 			tmp_lap['calories'] = lap[3]
+			tmp_lap['intensity'] = lap[7]
+			tmp_lap['avg_hr'] = lap[8]
+			tmp_lap['max_hr'] = lap[9]
+			tmp_lap['max_speed'] = lap[10]
+			tmp_lap['laptrigger'] = lap[11]
+			tmp_lap['comments'] = ""
 			laps.append(tmp_lap)
 		logging.debug('<<')
 		return laps
@@ -294,7 +271,7 @@ class Record:
 		logging.debug('<<')
 		return summaryRecord, laps
 
-	def updateRecord(self, list_options, id_record, equipment=None):
+	def updateRecord(self, list_options, id_record, equipment=None): # ToDo: update only fields that can change if GPX file is present
 		logging.debug('>>')
 		#Remove activity from pool so data is updated
 		self.pytrainer_main.activitypool.remove_activity(id_record)
@@ -305,9 +282,9 @@ class Record:
 				shutil.copy2(gpxOrig, gpxfile)
 		else:
 			if (list_options["rcd_gpxfile"]==""):
-				logging.debug('removing gpxfile') # ein?
-				logging.debug('updating bbdd') #ein?
-		cells,values = self._formatRecord(list_options)
+				logging.debug('Activity not based in GPX file') # ein?
+		logging.debug('Updating bbdd')
+		cells,values = self._formatRecordNew(list_options)
 		self.pytrainer_main.ddbb.update("records",cells,values," id_record=%d" %int(id_record))
 		if equipment is not None:
 			self._update_record_equipment(id_record, equipment)
@@ -335,18 +312,19 @@ class Record:
 	def getrecordList(self,date, id_sport=None):
 		logging.debug('--')
 		if not id_sport:
-			return self.pytrainer_main.ddbb.select("records,sports",
-					"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)
+			# outer join on sport id to workaround bug where sport reference is null on records from GPX import
+			return self.pytrainer_main.ddbb.select("records left outer join sports on records.sport=sports.id_sports",
+					"sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local,upositive,unegative",
+					"date=\"%s\" " %date)
 		else:
 			return self.pytrainer_main.ddbb.select("records,sports",
-					"sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local",
+					"sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local,upositive,unegative",
 					"date=\"%s\" and sports.id_sports=\"%s\" and records.sport=sports.id_sports" %(date,id_sport))
 
 	def getLaps(self, id_record):
 		logging.debug('--')
 		laps = self.pytrainer_main.ddbb.select("laps",
-					"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number",
+					"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, laptrigger, comments",
 					"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)
@@ -363,7 +341,7 @@ class Record:
 					self.insertLaps(lap_keys,lap.values())
 			#Try to get lap info again #TODO? refactor
 			laps = self.pytrainer_main.ddbb.select("laps",
-					"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number",
+					"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, laptrigger, comments",
 					"record=\"%s\"" % id_record)
 		return laps
 
@@ -393,11 +371,11 @@ class Record:
 		#TODO This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two
 		tables = "records,sports"
 		if not sport:
-			condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end)
+			condition = "date>=\"%s\" and date<\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end)
 		else:
-			condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports and sports.id_sports=\"%s\"" %(date_ini,date_end, sport)
+			condition = "date>=\"%s\" and date<\"%s\" and records.sport=sports.id_sports and sports.id_sports=\"%s\"" %(date_ini,date_end, sport)
 
-		return self.pytrainer_main.ddbb.select(tables,"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats, sports.name", condition)
+		return self.pytrainer_main.ddbb.select(tables,"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats, sports.name,upositive,unegative", condition)
 
 	def getrecordPeriodSport(self,date_ini, date_end,sport):
 		if not sport:
@@ -408,56 +386,42 @@ class Record:
 			condition = "date>\"%s\" and date<\"%s\" and records.sport=sports.id_sports and sports.id_sports=\"%s\"" %(date_ini,date_end,sport)
 
 		return self.pytrainer_main.ddbb.select(tables,
-					"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats",
+					"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats,upositive,unegative",
 					condition)
+		
+	def _get_sport(self, sport_name):
+		return self._sport_service.get_sport_by_name(sport_name)
 
-	def getSportMet(self,sport):
+	def getSportMet(self,sport_name):
+		"""Deprecated: use sport.met"""
 		logging.debug('--')
-		return self.pytrainer_main.ddbb.select("sports","met","name=\"%s\"" %(sport))[0][0]
+		return self._get_sport(sport_name).met
 
-	def getSportWeight(self,sport):
+	def getSportWeight(self,sport_name):
+		"""Deprecated: use sport.weight"""
 		logging.debug('--')
-		return self.pytrainer_main.ddbb.select("sports","weight","name=\"%s\"" %(sport))[0][0]
-
-	def getSportId(self,sport,add=None):
-		"""31.08.2008 - dgranda
-		Retrieves id_sports from provided sport. If add is not set to None, sport is added to the system
-		arguments:
-			sport: sport's name to get id from
-			add: attribute to add or not the sport to db
-		returns: id_sports from provided sport"""
-		logging.debug('>>')
-		sport_id=None
-		if sport == "" or sport is None:
-			return sport_id
-		try:
-			sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0]
-		except:
-			logging.error('Error retrieving id_sports from '+ str(sport))
-			#traceback.print_last()
-			if add is None:
-				logging.debug('Sport '+str(sport)+' will not be added to DB')
-			else:
-				logging.debug('Adding sport '+str(sport)+' to DB')
-				sport_id = self.addNewSport(sport,"0","0")
-		logging.debug('<<')
-		return sport_id
+		return self._get_sport(sport_name).weight
 
-	def addNewSport(self,sport,met,weight):
-		"""31.08.2008 - dgranda
-		Copied from Profile class, adds a new sport.
+	def getSportId(self, sport_name, add=None):
+		"""Deprecated: use sport_service.get_sport_by_name()
+		
+		Get the id of a sport by name, optionally adding a new sport if
+		none exists with the given name.
 		arguments:
-			sport: sport's name
-			met:
-			weight:
-		returns: id_sports from new sport"""
-		logging.debug(">>")
-		logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met)
-		sportT = [sport,met,weight]
-		self.pytrainer_main.ddbb.insert("sports","name,met,weight",sportT)
-		sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0]
-		logging.debug("<<")
-		return sport_id
+			sport_name: sport's name to get id for
+			add: whether the sport should be added if not found
+		returns: id for sport with given name or None"""
+		if sport_name is None:
+			return None
+		sport = self._get_sport(sport_name)
+		if sport is None:
+			logging.debug("No sport with name: '%s'", str(sport_name))
+			if add is not None:
+				logging.debug("Adding sport '%s'", str(sport_name))
+				new_sport = Sport()
+				new_sport.name = unicode(sport_name)
+				sport = self._sport_service.store_sport(new_sport)
+		return None if sport is None else sport.id
 
 	def getAllrecord(self):
 		logging.debug('--')
@@ -510,7 +474,7 @@ class Record:
 			logging.debug('Found '+str(len(tracks))+' tracks')
 			self._select_trkfromgpx(gpxfile,tracks)
 		else:
-			msg = _("pyTrainer can't import data from your gpx file")
+			msg = _("pytrainer can't import data from your gpx file")
 			from gui.warning import Warning
 			warning = Warning(self.data_path)
 			warning.set_text(msg)
@@ -524,8 +488,10 @@ class Record:
 		heartrate = gpx.getHeartRateAverage()
 		date = gpx.getDate()
 		calories = gpx.getCalories()
+		start_time = gpx.getStart_time()
 
 		self.recordwindow.rcd_date.set_text(date)
+		self.recordwindow.rcd_starttime.set_text(start_time)
 		self.recordwindow.rcd_upositive.set_text(str(upositive))
 		self.recordwindow.rcd_unegative.set_text(str(unegative))
 		self.recordwindow.rcd_beats.set_text(str(heartrate))
@@ -534,8 +500,7 @@ class Record:
 		self.recordwindow.set_maxspeed(maxspeed)
 		self.recordwindow.set_maxhr(maxheartrate)
 		self.recordwindow.set_recordtime(time/60.0/60.0)
-		self.recordwindow.on_calcaverage_clicked(None)
-		self.recordwindow.on_calcpace_clicked(None)
+		self.recordwindow.on_calcavs_clicked(None)
 		self.recordwindow.on_calccalories_clicked(None)
 		self.recordwindow.rcd_maxpace.set_text("%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60))
 		logging.debug('<<')
@@ -554,18 +519,6 @@ class Record:
 		selectrckdialog.run()
 		logging.debug('<<')
 
-	def newGpxRecord(self,gpxfile,list_sport): #TODO Not used?
-		logging.debug('>>')
-		logging.debug("opening a new window record "+self.data_path+'|'+gpxfile+'|'+str(list_sport))
-		self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport,self, None)
-		logging.debug('setting text in window '+ gpxfile)
-		self.recordwindow.rcd_gpxfile.set_text(gpxfile)
-		logging.debug('retrieving data from gpx file')
-		self.actualize_fromgpx(gpxfile)
-		logging.debug('Launching window...')
-		self.recordwindow.run()
-		logging.debug('<<')
-
 	def importFromGPX(self, gpxFile, sport):
 		"""
 		Add a record from a valid pytrainer type GPX file
diff --git a/pytrainer/save.py b/pytrainer/save.py
index 9baa7d6..c356a26 100644
--- a/pytrainer/save.py
+++ b/pytrainer/save.py
@@ -18,6 +18,8 @@
 
 from lib.fileUtils import fileUtils
 from gui.filechooser import FileChooser
+import logging
+import traceback
 
 class Save:
     def __init__(self, data_path = None, record = None):
@@ -25,33 +27,39 @@ class Save:
         self.data_path = data_path
 
     def run(self):
+        logging.debug('>>')
         self.filewindow = FileChooser(self.data_path, self, "savecsvfile")
-        self.filewindow.run()
+        #self.filewindow.run()
+        logging.debug('<<')
     
     def savecsvfile(self):
+        logging.debug('>>')
         filename = self.filewindow.filename
         records = self.record.getAllrecord()
         # CSV Header
         content = "date,distance,time,beats,comments,average,calories\n"
-        for record in records:
-            line = ""
-            for i, data in enumerate(record):
-                if i in [1, 3, 5]:
-                    try:
-                        data = round(data, 2)
-                    except:
-                        pass             
-                data = "%s" %data
-                data = data.replace(",", " ")  
-                data = data.replace("\n", " ")             
-                data = data.replace("\r", " ")          
-                if i>0: 
-                    line += ",%s" %data
-                else:
-                    line += "%s" %data      
-            content += "%s\n" %line
-        file = fileUtils(filename,content)
-        file.run()
-        
-
+        try:
+            for record in records:
+                line = ""
+                for i, data in enumerate(record):
+                    if i in [1, 3, 5]:
+                        try:
+                            data = round(data, 2)
+                        except:
+                            pass             
+                    data = "%s" %data
+                    data = data.replace(",", " ")  
+                    data = data.replace("\n", " ")             
+                    data = data.replace("\r", " ")          
+                    if i>0: 
+                        line += ",%s" %data
+                    else:
+                        line += "%s" %data      
+                content += "%s\n" %line
+            logging.info("Record data successfully retrieved. Choosing file to save it")
+            file = fileUtils(filename,content)
+            file.run()
+        except:
+            logging.debug("Traceback: %s" % traceback.format_exc())
+        logging.debug('<<')
 
diff --git a/pytrainer/sport.py b/pytrainer/sport.py
new file mode 100644
index 0000000..ba34a2e
--- /dev/null
+++ b/pytrainer/sport.py
@@ -0,0 +1,226 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from pytrainer.lib.color import Color, color_from_hex_string
+import logging
+
+class Sport(object):
+    
+    """A type of exercise. For example: "running" or "cycling"."""
+    
+    def __init__(self):
+        self._id = None
+        self.name = u""
+        self.weight = 0.0
+        self.met = None
+        self.max_pace = None
+        self.color = Color(0x0000ff)
+       
+    def _get_id(self):
+        return self._id
+    
+    def _set_id(self, id):
+        self._id = int(id)
+    
+    id = property(_get_id, _set_id)
+       
+    def _get_name(self):
+        return self._name
+    
+    def _set_name(self, name):
+        if not isinstance(name, unicode):
+            raise TypeError("Name must be unicode string, not {0}.".format(type(name).__name__))
+        self._name = name
+    
+    name = property(_get_name, _set_name)
+       
+    def _get_weight(self):
+        return self._weight
+    
+    def _set_weight(self, weight):
+        weight_float = float(weight)
+        if weight_float < 0:
+            raise ValueError("Weight must not be negative.")
+        self._weight = weight_float
+    
+    weight = property(_get_weight, _set_weight)
+       
+    def _get_met(self):
+        return self._met
+    
+    def _set_met(self, met):
+        met_float = float(met) if met is not None else None
+        if met_float is not None and met_float < 0:
+            raise ValueError("MET must not be negative.")
+        self._met = met_float
+    
+    met = property(_get_met, _set_met)
+       
+    def _get_max_pace(self):
+        return self._max_pace
+    
+    def _set_max_pace(self, max_pace):
+        max_pace_int = int(max_pace) if max_pace is not None else None
+        if max_pace_int is not None and max_pace_int < 0:
+            raise ValueError("Max pace must not be negative.")
+        self._max_pace = max_pace_int
+    
+    max_pace = property(_get_max_pace, _set_max_pace)
+    
+    def _get_color(self):
+        return self._color
+    
+    def _set_color(self, color):
+        if color is None:
+            raise ValueError("Color must be valued.")
+        self._color = color
+        
+    color = property(_get_color, _set_color)
+
+class SportServiceException(Exception):
+    
+    def __init__(self, value):
+        self.value = value
+    
+    def __str__(self):
+        return repr(self.value)
+
+_TABLE = "sports"
+
+_ID_COLUMN = "id_sports"
+
+_NAME_COLUMN = "name"
+
+_UPDATE_COLUMNS = _NAME_COLUMN + ",weight,met,max_pace,color"
+
+_SELECT_COLUMNS = _ID_COLUMN + "," + _UPDATE_COLUMNS
+    
+class SportService(object):
+    
+    """Provides access to stored sports."""
+    
+    def __init__(self, ddbb):
+        self._ddbb = ddbb
+        
+    def _create_sport(self, row):
+        sport = Sport()
+        sport.id = row[0]
+        sport.name = unicode(row[1])
+        sport.weight = row[2]
+        sport.met = row[3]
+        sport.max_pace = row[4]
+        sport.color =  color_from_hex_string(row[5])
+        return sport
+    
+    def _create_row(self, sport):
+        return [sport.name,
+                sport.weight,
+                sport.met,
+                sport.max_pace,
+                sport.color.to_hex_string()]
+        
+    def _create_id_where_clause(self, sport_id):
+        return _ID_COLUMN + "=" + str(sport_id)
+    
+    def _create_name_where_clause(self, sport_name):
+        return _NAME_COLUMN + "=\"{0}\"".format(sport_name)
+    
+    def get_sport(self, sport_id):
+        """Get the sport with the specified id.
+
+        If no sport with the given id exists then None is returned."""
+        if sport_id is None:
+            raise ValueError("Sport id cannot be None")
+        resultSet = self._ddbb.select(_TABLE, _SELECT_COLUMNS, self._create_id_where_clause(sport_id))
+        if len(resultSet) == 0:
+            return None
+        else:
+            return self._create_sport(resultSet[0])
+        
+    def get_sport_by_name(self, name):
+        """Get the sport with the specified name.
+
+        If no sport with the given name exists then None is returned."""
+        if name is None:
+            raise ValueError("Sport name cannot be None")
+        sport_id = self._get_sport_id_from_name(name)
+        if sport_id is None:
+            return None
+        return self.get_sport(sport_id)
+        
+    def _get_sport_id_from_name(self, name):
+        result_set = self._ddbb.select(_TABLE, _ID_COLUMN, self._create_name_where_clause(name))
+        if len(result_set) > 0:
+            return result_set[0][0]
+        return None
+    
+    def get_all_sports(self):
+        """Get all stored sports."""
+        result_set = self._ddbb.select(_TABLE, _SELECT_COLUMNS)
+        logging.debug("Retrieved all sports ({0} results).".format(len(result_set)))
+        sports = []
+        for row in result_set:
+            sport = self._create_sport(row)
+            sports.append(sport)
+        return sports
+    
+    def store_sport(self, sport):
+        """Store a new or update an existing sport.
+       
+       The stored object is returned."""
+        if (sport.id is None):
+            sport_id = self._store_new_sport(sport)
+        else:
+            sport_id = self._update_existing_sport(sport)
+        return self.get_sport(sport_id)
+    
+    def _store_new_sport(self, sport):
+        self._assert_unique(sport)
+        self._ddbb.insert(_TABLE, _UPDATE_COLUMNS, self._create_row(sport))
+        logging.debug("Stored new sport: '{0}'.".format(sport.name))
+        return self._get_sport_id_from_name(sport.name)
+    
+    def _update_existing_sport(self, sport):
+        self._assert_exists(sport)
+        self._assert_unique(sport)
+        self._ddbb.update(_TABLE, _UPDATE_COLUMNS, self._create_row(sport), self._create_id_where_clause(sport.id))
+        logging.debug("Updated sport: '{0}'.".format(sport.name))
+        return sport.id
+        
+    def _assert_unique(self, sport):
+        id = self._get_sport_id_from_name(sport.name)
+        if id is not None and id != sport.id:
+            raise SportServiceException("A sport already exists with name '{0}'".format(sport.name))
+        logging.debug("Asserted sport name is unique: '{0}'.".format(sport.name))
+        
+    def _assert_exists(self, sport):
+        result_set = self._ddbb.select(_TABLE, _ID_COLUMN, self._create_id_where_clause(sport.id))
+        if (result_set == []):
+            raise SportServiceException("Sport does not exist with id: '{0}'.".format(sport.id))
+        logging.debug("Asserted sport exists with id: '{0}'.".format(sport.id))
+        
+    def remove_sport(self, sport):
+        """Delete a stored sport.
+        
+        All records associated with the sport will also be deleted."""
+        if (sport.id is None):
+            raise SportServiceException("Cannot remove sport which has not been stored: '{0}'.".format(sport.name))
+        self._assert_exists(sport)
+        self._ddbb.delete("records", "sport=" + str(sport.id))
+        self._ddbb.delete(_TABLE, self._create_id_where_clause(sport.id))
+        logging.debug("Deleted sport: '{0}'.".format(sport.name))
diff --git a/pytrainer/stats.py b/pytrainer/stats.py
new file mode 100644
index 0000000..69ef389
--- /dev/null
+++ b/pytrainer/stats.py
@@ -0,0 +1,97 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Sigurður H. Pálsson shp at itn.is
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import logging
+
+class Stats:
+    def __init__(self, sport_service, parent = None):
+        logging.debug('>>')
+        self._sport_service = sport_service
+        self.pytrainer_main = parent
+        self.init_from_conf()
+        self.data = self.get_stats()
+        logging.debug('<<')
+
+    def refresh(self):
+        self.init_from_conf()
+        self.data = self.get_stats()
+
+    def init_from_conf(self):
+        logging.debug('>>')
+        logging.debug('<<')
+
+    def get_stats(self):
+        logging.debug('>>')
+        data = {
+            'sports' : {},
+            'total_duration' : 0,
+            'total_distance' : 0,
+        }
+        
+        fields = ['maxspeed', 'beats', 'maxbeats', 'duration', 'distance']
+        data['fields'] = fields
+        
+        for f in fields:
+            data[f] = 0
+        
+        results = self.pytrainer_main.ddbb.select_dict("records", ('id_record', 'date', 'sport', 'distance', 'duration', 'maxbeats', 'maxspeed', 'maxpace', 'average','pace','beats'))
+        for r in results:
+            if r['sport'] is None or r['sport'] is 0:
+                # temporary fix to ignore corrupt records caused by GPX import bug
+                continue
+            if r['sport'] not in data['sports']:
+                sport = self._sport_service.get_sport(r['sport'])
+                data['sports'][r['sport']] = {'name': sport.name, 'count': 0}
+                for f in fields:
+                    data['sports'][r['sport']][f] = 0
+                    data['sports'][r['sport']]['total_'+f] = 0
+            data['sports'][r['sport']]['count'] += 1
+            for f in fields:
+                data['sports'][r['sport']][f] = max(data['sports'][r['sport']][f], r[f])
+                if r[f] is not None:
+                    data['sports'][r['sport']]['total_'+f] += r[f]
+                    data[f] = max(data[f], r[f])
+                else:
+                    logging.info('Skipping null values')
+                    
+            if 'avg_hr' not in data['sports'][r['sport']]:
+                data['sports'][r['sport']]['avg_hr'] = [0, 0]
+            if r['beats']:
+                data['sports'][r['sport']]['avg_hr'][0] += 1
+                data['sports'][r['sport']]['avg_hr'][1] += r['beats']
+                
+            data['total_duration'] += r['duration']
+            data['total_distance'] += r['distance']
+            
+            if not r['maxspeed'] and r['duration']:
+                data['sports'][r['sport']]['maxspeed'] = max(data['sports'][r['sport']]['maxspeed'], r['distance'] / r['duration'] * 3600)
+            
+            if not 'start_date' in data: data['start_date'] = r['date']
+            data['start_date'] = min(data['start_date'], r['date'])
+            if not 'end_date' in data: data['end_date'] = r['date']
+            data['end_date'] = max(data['end_date'], r['date'])
+            
+        for s in data['sports']:
+            if data['sports'][s]['avg_hr'][0]:
+                data['sports'][s]['avg_hr'] = int(data['sports'][s]['avg_hr'][1] / data['sports'][s]['avg_hr'][0])
+            else:
+                data['sports'][s]['avg_hr'] = None
+            
+        logging.debug('<<')
+        return data
+
diff --git a/test/pytrainer/environment_test.py b/pytrainer/test/environment_test.py
similarity index 100%
copy from test/pytrainer/environment_test.py
copy to pytrainer/test/environment_test.py
diff --git a/test/pytrainer/equipment_test.py b/pytrainer/test/equipment_test.py
similarity index 100%
copy from test/pytrainer/equipment_test.py
copy to pytrainer/test/equipment_test.py
diff --git a/pytrainer/test/gui/color_test.py b/pytrainer/test/gui/color_test.py
new file mode 100644
index 0000000..7755bbe
--- /dev/null
+++ b/pytrainer/test/gui/color_test.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from pytrainer.gui.color import ColorConverter
+from pytrainer.lib.color import Color
+import gtk.gdk
+import unittest
+
+class ColorConverterTest(unittest.TestCase):
+    
+    def setUp(self):
+        self._converter = ColorConverter()
+    
+    def test_convert_to_gdk_color_should_create_gdk_color_with_equivalent_rgb_values(self):
+        color = Color(0xaaff33)
+        gdk_color = self._converter.convert_to_gdk_color(color)
+        self.assertEquals(0x3333, gdk_color.blue)
+        self.assertEquals(0xffff, gdk_color.green)
+        self.assertEquals(0xaaaa, gdk_color.red)
+        
+    def test_convert_to_color_should_create_color_with_equivalent_rgb_values(self):
+        gdk_col = gtk.gdk.color_parse("#aaff33")
+        color = self._converter.convert_to_color(gdk_col)
+        self.assertEqual(0xaaff33, color.rgb_val)
diff --git a/test/pytrainer/gui/equipment_test.py b/pytrainer/test/gui/equipment_test.py
similarity index 100%
copy from test/pytrainer/gui/equipment_test.py
copy to pytrainer/test/gui/equipment_test.py
diff --git a/pytrainer/test/lib/color_test.py b/pytrainer/test/lib/color_test.py
new file mode 100644
index 0000000..c842cc6
--- /dev/null
+++ b/pytrainer/test/lib/color_test.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from pytrainer.lib.color import Color, color_from_hex_string
+import unittest
+
+class ColorTest(unittest.TestCase):
+    
+    def test_constructor_should_accept_integer(self):
+        color = Color(12345)
+        self.assertEqual(12345, color.rgb_val)
+    
+    def test_constructor_should_accept_integer_string(self):
+        color = Color("12345")
+        self.assertEqual(12345, color.rgb_val)
+    
+    def test_constructor_should_not_accept_non_integer_string(self):
+        try:
+            Color("ff00ff")
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+    
+    def test_constructor_should_not_accept_none(self):
+        try:
+            Color(None)
+        except(TypeError):
+            pass
+        else:
+            self.fail()
+    
+    def test_constructor_should_not_accept_negative_value(self):
+        try:
+            Color(-1)
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_constructor_should_not_accept_value_over_24_bit(self):
+        try:
+            Color(2 ** 24)
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+
+    def test_rgb_value_should_default_to_0(self):
+        color = Color()
+        self.assertEqual(0, color.rgb_val)
+            
+    def test_rgb_value_should_be_read_only(self):
+        color = Color()
+        try:
+            color.rgb_val = 1
+        except(AttributeError):
+            pass
+        else:
+            self.fail()
+            
+    def test_rgba_value_should_be_rgb_value_with_two_trailing_zero_hex_digits(self):
+        color = Color(0x1177ff)
+        self.assertEquals(0x1177ff00, color.rgba_val)
+        
+    def test_to_hex_string_should_create_six_digit_hex_value(self):
+        color = Color(0xfab)
+        self.assertEquals("000fab", color.to_hex_string())
+        
+    def test_color_from_hex_string_should_correctly_decode_hex_value(self):
+        color = color_from_hex_string("fab")
+        self.assertEquals(0xfab, color.rgb_val)
diff --git a/pytrainer/test/sport_test.py b/pytrainer/test/sport_test.py
new file mode 100644
index 0000000..c52b69a
--- /dev/null
+++ b/pytrainer/test/sport_test.py
@@ -0,0 +1,399 @@
+# -*- coding: utf-8 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import unittest
+from pytrainer.sport import Sport, SportService, SportServiceException
+import mock
+from pytrainer.lib.sqliteUtils import Sql
+import pytrainer
+
+class SportTest(unittest.TestCase):
+    
+    def test_id_should_default_to_none(self):
+        sport = Sport()
+        self.assertEquals(None, sport.id)
+        
+    def test_id_should_accept_integer(self):
+        sport = Sport()
+        sport.id = 1
+        self.assertEquals(1, sport.id)
+        
+    def test_id_should_accept_integer_string(self):
+        sport = Sport()
+        sport.id = "1"
+        self.assertEquals(1, sport.id)
+        
+    def test_id_should_not_accept_non_integer_string(self):
+        sport = Sport()
+        try:
+            sport.id = "1.1"
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_id_should_not_accept_none(self):
+        sport = Sport()
+        try:
+            sport.id = None
+        except(TypeError):
+            pass
+        else:
+            self.fail()
+        
+    def test_name_should_default_to_empty_string(self):
+        sport = Sport()
+        self.assertEquals(u"", sport.name)
+        
+    def test_name_should_accept_unicode_string(self):
+        sport = Sport()
+        sport.name = u"Unicycling"
+        self.assertEquals(u"Unicycling", sport.name)
+        
+    def test_name_should_not_accept_non_unicode_string(self):
+        sport = Sport()
+        try:
+            sport.name = "Juggling"
+        except(TypeError):
+            pass
+        else:
+            self.fail()
+            
+    def test_name_should_not_accept_none(self):
+        sport = Sport()
+        try:
+            sport.name = None
+        except(TypeError):
+            pass
+        else:
+            self.fail()
+            
+    def test_met_should_default_to_None(self):
+        sport = Sport()
+        self.assertEquals(None, sport.met)
+        
+    def test_met_should_accept_float(self):
+        sport = Sport()
+        sport.met = 22.5
+        self.assertEquals(22.5, sport.met)
+        
+    def test_met_should_accept_float_string(self):
+        sport = Sport()
+        sport.met = "22.5"
+        self.assertEquals(22.5, sport.met)
+        
+    def test_met_should_not_accept_non_float_string(self):
+        sport = Sport()
+        try:
+            sport.met = "22.5kg"
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+                     
+    def test_met_should_not_accept_negative_value(self):
+        sport = Sport()
+        try:
+            sport.met = -1
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_met_should_accept_none(self):
+        sport = Sport()
+        sport.met = None
+        self.assertEquals(None, sport.met)
+            
+    def test_weight_should_default_to_zero(self):
+        sport = Sport()
+        self.assertEquals(0, sport.weight)
+        
+    def test_weight_should_accept_float(self):
+        sport = Sport()
+        sport.weight = 22.5
+        self.assertEquals(22.5, sport.weight)
+        
+    def test_weight_should_accept_float_string(self):
+        sport = Sport()
+        sport.weight = "22.5"
+        self.assertEquals(22.5, sport.weight)
+        
+    def test_weight_should_not_accept_non_float_string(self):
+        sport = Sport()
+        try:
+            sport.weight = "22.5kg"
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_weight_should_not_accept_negative_value(self):
+        sport = Sport()
+        try:
+            sport.weight = -1
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_weight_should_not_accept_none(self):
+        sport = Sport()
+        try:
+            sport.weight = None
+        except(TypeError):
+            pass
+        else:
+            self.fail()
+            
+    def test_max_pace_should_default_to_none(self):
+        sport = Sport()
+        self.assertEquals(None, sport.max_pace)
+        
+    def test_max_pace_should_accept_integer(self):
+        sport = Sport()
+        sport.max_pace = 220
+        self.assertEquals(220, sport.max_pace)
+        
+    def test_max_pace_should_accept_integer_string(self):
+        sport = Sport()
+        sport.max_pace = "220"
+        self.assertEquals(220, sport.max_pace)
+        
+    def test_max_pace_should_not_accept_non_integer_string(self):
+        sport = Sport()
+        try:
+            sport.max_pace = "225s"
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+        
+    def test_max_pace_should_take_floor_of_float(self):
+        sport = Sport()
+        sport.max_pace = 220.6
+        self.assertEquals(220, sport.max_pace)
+            
+    def test_max_pace_should_not_accept_negative_value(self):
+        sport = Sport()
+        try:
+            sport.max_pace = -1
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+            
+    def test_max_pace_should_accept_none(self):
+        sport = Sport()
+        sport.max_pace = None
+        self.assertEquals(None, sport.max_pace)
+        
+    def test_color_should_default_to_blue(self):
+        sport = Sport()
+        self.assertEquals(0x0000ff, sport.color.rgb_val)
+        
+    def test_color_should_not_accept_none(self):
+        sport = Sport()
+        try:
+            sport.color = None
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+
+
+class SportServiceTest(unittest.TestCase):
+    
+    def setUp(self):
+        self.mock_ddbb = mock.Mock(spec=Sql)
+        self.sport_service = SportService(self.mock_ddbb)
+        
+    def test_store_sport_should_insert_row_when_sport_has_no_id(self):
+        def mock_select(table, columns, where):
+            call_count = self.mock_ddbb.select.call_count
+            if call_count == 2:
+                return [[1]]
+            return []
+        self.mock_ddbb.select = mock.Mock(wraps=mock_select)
+        sport = Sport()
+        sport.name = u"Test name"
+        self.sport_service.store_sport(sport)
+        self.mock_ddbb.insert.assert_called_with("sports",  "name,weight,met,max_pace,color",
+                                                 [u"Test name", 0.0, None, None, "0000ff"])
+    
+    def test_store_sport_should_update_row_when_sport_has_id(self):
+        def mock_select(table, columns, where):
+            if columns == "id_sports":
+                return [[1]]
+            else:
+                return [(1, u"", 0, 0, 0, "0")]
+        self.mock_ddbb.select = mock.Mock(wraps=mock_select)
+        sport = Sport()
+        sport.id = 1
+        sport.name = u"New name"
+        self.sport_service.store_sport(sport)
+        self.mock_ddbb.update.assert_called_with("sports",  "name,weight,met,max_pace,color",
+                                                 [u"New name", 0.0, None, None, "0000ff"], "id_sports=1")
+        
+    def test_store_sport_should_return_stored_sport(self):
+        sport_ids = []
+        def update_sport_ids(*args):
+            sport_ids.append([1])
+        self.mock_ddbb.insert.side_effect = update_sport_ids
+        def mock_select(table, columns, where):
+            if columns == "id_sports":
+                return sport_ids
+            else:
+                return [(2, u"", 0, 0, 0, "0")]
+        self.mock_ddbb.select = mock.Mock(wraps=mock_select)
+        sport = Sport()
+        stored_sport = self.sport_service.store_sport(sport)
+        self.assertEquals(2, stored_sport.id)
+    
+    def test_store_sport_should_error_when_sport_has_unknown_id(self):
+        self.mock_ddbb.select.return_value = []
+        sport = Sport()
+        sport.id = 100
+        try:
+            self.sport_service.store_sport(sport)
+        except(SportServiceException):
+            pass
+        else:
+            self.fail()
+            
+    def test_store_sport_should_error_when_new_sport_has_duplicate_name(self):
+        self.mock_ddbb.select.return_value = [(1, u"Test name", 150, 12.5, 200, "0")]
+        sport = Sport()
+        sport.name = u"Test name"
+        try:
+            self.sport_service.store_sport(sport)
+        except(SportServiceException):
+            pass
+        else:
+            self.fail()
+
+    def test_store_sport_should_error_when_existing_sport_has_duplicate_name(self):
+        def mock_select(table, columns, where):
+            if columns == pytrainer.sport._ID_COLUMN:
+                return [[2]]
+            else:
+                return [(1, u"Test name", 0, 0.0, "0"), (2, u"New name", 0, 0.0, "0")]
+        self.mock_ddbb.select = mock.Mock(wraps=mock_select)
+        sport = Sport()
+        sport.id = 1
+        sport.name = u"New name"
+        try:
+            self.sport_service.store_sport(sport)
+        except(SportServiceException):
+            pass
+        else:
+            self.fail()
+    
+    def test_get_sport_returns_none_for_nonexistant_sport(self):
+        self.mock_ddbb.select.return_value = []
+        sport = self.sport_service.get_sport(1)
+        self.assertEquals(None, sport)
+        
+    def test_get_sport_returns_sport_with_id(self):
+        self.mock_ddbb.select.return_value = [(1, u"", 0, 0, 0, "0")]
+        sport = self.sport_service.get_sport(1)
+        self.assertEquals(1, sport.id)
+        
+    def test_get_sport_raises_error_for_id_none(self):
+        try:
+            self.sport_service.get_sport(None)
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+        
+    def test_get_sport_by_name_returns_none_for_nonexistant_sport(self):
+        self.mock_ddbb.select.return_value = []
+        sport = self.sport_service.get_sport("no such sport")
+        self.assertEquals(None, sport)
+        
+    def test_get_sport_by_name_returns_sport_with_name(self):
+        def mock_select(table, columns, where):
+            if columns == "id_sport":
+                return [(1)]
+            else:
+                return [(1, u"rugby", 0, 0, 0, "0")]
+        self.mock_ddbb.select = mock.Mock(wraps=mock_select)
+        sport = self.sport_service.get_sport("rugby")
+        self.assertEquals(u"rugby", sport.name)
+        
+    def test_get_sport_by_name_raises_error_for_none_sport_name(self):
+        try:
+            self.sport_service.get_sport_by_name(None)
+        except(ValueError):
+            pass
+        else:
+            self.fail()
+        
+    def test_get_all_sports_should_return_all_sports_in_query_result(self):
+        self.mock_ddbb.select.return_value = [(1, u"Test name", 0, 0, 0, "0"), (2, u"Test name 2", 0, 0, 0, "0")]
+        sports = self.sport_service.get_all_sports()
+        self.assertEquals(2, len(sports))
+        sport1 = sports[0]
+        self.assertEquals(1, sport1.id)
+        sport2 = sports[1]
+        self.assertEquals(2, sport2.id)
+    
+    def test_get_all_sports_should_return_no_sports_when_query_result_empty(self):
+        self.mock_ddbb.select.return_value = []
+        sports = self.sport_service.get_all_sports()
+        self.assertEquals(0, len(sports))
+        
+    def test_remove_sport_should_error_when_sport_has_no_id(self):
+        self.mock_ddbb.select.return_value = [(1, u"Test name", 150, 12.5, 200, "0")]
+        sport = Sport()
+        try:
+            self.sport_service.remove_sport(sport)
+        except(SportServiceException):
+            pass
+        else:
+            self.fail()
+        
+    def test_remove_sport_should_error_when_sport_has_unknown_id(self):
+        self.mock_ddbb.select.return_value = []
+        sport = Sport()
+        sport.id = 100
+        try:
+            self.sport_service.remove_sport(sport)
+        except(SportServiceException):
+            pass
+        else:
+            self.fail()
+            
+    def test_remove_sport_should_delete_sport_with_specified_id(self):
+        self.mock_ddbb.select.return_value = [[1]]
+        sport = Sport()
+        sport.id = 1
+        self.sport_service.remove_sport(sport)
+        self.mock_ddbb.delete.assert_called_with("sports", "id_sports=1")
+
+    def test_remove_sport_should_remove_associated_entries(self):
+        self.mock_ddbb.select.return_value = [[1]]
+        sport = Sport()
+        sport.id = 1
+        delete_arguments = []
+        def mock_delete(*args):
+            delete_arguments.append(args) 
+        self.mock_ddbb.delete = mock.Mock(wraps=mock_delete)
+        self.sport_service.remove_sport(sport)
+        self.assertEquals(("records", "sport=1"), delete_arguments[0])
diff --git a/pytrainer/test/upgrade/data_test.py b/pytrainer/test/upgrade/data_test.py
new file mode 100644
index 0000000..09c9b56
--- /dev/null
+++ b/pytrainer/test/upgrade/data_test.py
@@ -0,0 +1,106 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import unittest
+from mock import Mock
+from pytrainer.upgrade.data import InstalledData, DataState, DataInitializationException
+import pytrainer.upgrade.context
+
+class InstalledDataTest(unittest.TestCase):
+    
+    def setUp(self):
+        self._mock_migratable_db = Mock()
+        self._mock_ddbb = Mock()
+        self._mock_version_provider = Mock()
+        self._mock_upgrade_context = Mock()
+        self._installed_data = InstalledData(self._mock_migratable_db, self._mock_ddbb, self._mock_version_provider, self._mock_upgrade_context)
+        
+    def test_get_version_should_return_migrate_version_when_available(self):
+        self._mock_migratable_db.get_version.return_value = 1
+        self.assertEquals(1, self._installed_data.get_version())
+        
+    def test_get_version_should_return_legacy_version_when_available(self):
+        self._mock_migratable_db.is_versioned.return_value = False
+        self._mock_version_provider.get_legacy_version.return_value = 2
+        self.assertEquals(2, self._installed_data.get_version())
+        
+    def test_get_version_should_return_none_when_no_existing_version(self):
+        self._mock_migratable_db.is_versioned.return_value = False
+        self._mock_version_provider.get_legacy_version.return_value = None
+        self.assertEquals(None, self._installed_data.get_version())
+        
+    def test_get_state_should_return_current_when_data_version_equals_repository_version(self):
+        self._mock_migratable_db.get_version.return_value = 1
+        self._mock_migratable_db.get_upgrade_version.return_value = 1
+        self.assertEquals(DataState.CURRENT, self._installed_data.get_state())
+
+    def test_get_state_should_return_fresh_when_data_version_unavailable(self):
+        self._mock_migratable_db.is_versioned.return_value = False
+        self._mock_version_provider.get_legacy_version.return_value = None
+        self.assertEquals(DataState.FRESH, self._installed_data.get_state())
+
+    def test_get_state_should_return_stale_when_data_version_less_than_repository_version(self):
+        self._mock_migratable_db.get_version.return_value = 1
+        self._mock_migratable_db.get_upgrade_version.return_value = 2
+        self.assertEquals(DataState.STALE, self._installed_data.get_state())
+
+    def test_get_state_should_return_legacy_when_data_version_is_legacy(self):
+        self._mock_migratable_db.is_versioned.return_value = False
+        self._mock_version_provider.get_legacy_version.return_value = 1
+        self.assertEquals(DataState.LEGACY, self._installed_data.get_state())
+
+    def test_get_state_should_raise_error_when_version_too_large(self):
+        self._mock_migratable_db.is_versioned.return_value = True
+        self._mock_migratable_db.get_version.return_value = 2
+        self._mock_migratable_db.get_upgrade_version.return_value = 1
+        try:
+            self._installed_data.get_state()
+        except DataInitializationException:
+            pass
+        else:
+            self.fail()
+            
+    def test_get_available_version_returns_migratable_db_upgrade_version(self):
+        self._mock_migratable_db.get_upgrade_version.return_value = 1
+        self.assertEquals(1, self._installed_data.get_available_version())
+        
+    def test_is_versioned_returns_migratable_db_is_versioned(self):
+        self._mock_migratable_db.is_versioned.return_value = True
+        self.assertEquals(True, self._installed_data.is_versioned())
+        
+    def test_initialize_version_versions_migratable_db(self):
+        self._installed_data.initialize_version(1)
+        self._mock_migratable_db.version.assert_called_with(1)
+        
+    def test_initialize_creates_db_tables(self):
+        self._installed_data.initialize()
+        self.assertTrue(self._mock_ddbb.create_tables.called)
+        
+    def test_upgrade_upgrades_migratable_db(self):
+        self._installed_data.upgrade()
+        self.assertTrue(self._mock_migratable_db.upgrade.called)
+        
+    def test_upgrade_initializes_global_upgrade_context(self):
+        self._installed_data.upgrade()
+        self.assertEqual(self._mock_upgrade_context, pytrainer.upgrade.context.UPGRADE_CONTEXT)
+        
+    def test_update_to_current_delegates_to_data_state(self):
+        mock_state = Mock()
+        self._installed_data.get_state = Mock(return_value=mock_state)
+        self._installed_data.update_to_current()
+        self.assertTrue(mock_state.update_to_current.called)
diff --git a/pytrainer/test/upgrade/versions/version014_test.py b/pytrainer/test/upgrade/versions/version014_test.py
new file mode 100644
index 0000000..0cb68ba
--- /dev/null
+++ b/pytrainer/test/upgrade/versions/version014_test.py
@@ -0,0 +1,81 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import unittest
+import sqlalchemy
+import pytrainer.upgrade.versions.version014 as version014
+
+class UpgradeTest(unittest.TestCase):
+    
+    def setUp(self):
+        self._engine = sqlalchemy.create_engine("sqlite:///:memory:")
+        self._metadata = sqlalchemy.MetaData()
+        self._metadata.bind = self._engine
+        self._sports_table = sqlalchemy.Table("sports", self._metadata,
+            sqlalchemy.Column("id_sports", sqlalchemy.Integer, primary_key=True),
+            sqlalchemy.Column("name", sqlalchemy.String(100)),
+            sqlalchemy.Column("weight", sqlalchemy.Float),
+            sqlalchemy.Column("color", sqlalchemy.String(6)),
+            sqlalchemy.Column("met", sqlalchemy.Float),
+            sqlalchemy.Column("max_pace", sqlalchemy.Integer)
+        )
+        self._metadata.drop_all()
+        self._metadata.create_all()
+        
+    def upgradeAndAssert(self, original, expected):
+        self._engine.execute(sqlalchemy.text("insert into sports (id_sports, name, weight, color, met, max_pace)"
+                                             " values (:id, :name, :weight, :color, :met, :max_pace)"),
+                                           id= 1,
+                                           name= "Test Sport",
+                                           weight= original["weight"],
+                                           color= original["color"],
+                                           met= original["met"],
+                                           max_pace= original["max_pace"])
+        version014.upgrade(self._engine)
+        result = self._engine.execute(self._sports_table.select(self._sports_table.c.id_sports==1))
+        (_, _, weight, color, met, max_pace) = result.fetchone()
+        result.close()
+        self.assertEqual(expected["weight"], weight)
+        self.assertEqual(expected["color"], color)
+        self.assertEqual(expected["met"], met)
+        self.assertEqual(expected["max_pace"], max_pace)
+        
+    def testUpgradeFromNullValues(self):
+        original = { "weight": None, "color": None, "met": None, "max_pace": None }
+        expected = { "weight": 0.0, "color": "0000ff", "met": None, "max_pace": None }
+        self.upgradeAndAssert(original, expected)
+        
+    def testUpgradeFromZeroValues(self):
+        original = { "weight": 0, "color": 0, "met": 0, "max_pace": 0 }
+        expected = { "weight": 0.0, "color": "0", "met": 0, "max_pace": None }
+        self.upgradeAndAssert(original, expected)
+        
+    def testUpgradeFromEmptyValues(self):
+        original = { "weight": "", "color": "", "met": "", "max_pace": "" }
+        expected = { "weight": 0.0, "color": "0000ff", "met": None, "max_pace": None }
+        self.upgradeAndAssert(original, expected)
+        
+    def testUpgradeFromNegativeValues(self):
+        original = { "weight": -1, "color": -1, "met": -1, "max_pace": -1 } 
+        expected = { "weight": 0.0, "color": "-1", "met": None, "max_pace": None }
+        self.upgradeAndAssert(original, expected)
+        
+    def testUpgradeFromValidValues(self):
+        original = { "weight": 3.4, "color": "abc123", "met": 45.6, "max_pace": 123 }
+        expected = { "weight": 3.4, "color": "abc123", "met": 45.6, "max_pace": 123 }
+        self.upgradeAndAssert(original, expected)
diff --git a/pytrainer/timegraph.py b/pytrainer/timegraph.py
new file mode 100644
index 0000000..c929b30
--- /dev/null
+++ b/pytrainer/timegraph.py
@@ -0,0 +1,131 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Sigurður H. Pálsson shp at itn.is
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import datetime
+import logging
+from gui.drawArea import DrawArea
+
+class TimeGraph(object):
+    def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None):
+        self.drawarea = DrawArea(vbox, window)
+        self.SPORT_FIELD = 9
+        self.sport_colors = dict([(sport.name, sport.color.to_hex_string()) for sport in sports])
+
+    def getFloatValue(self, value):
+        try:
+            return float(value)
+        except:
+            return float(0)
+
+    def getValue(self,record,value_selected):
+        #hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values
+        conv = {
+            0: 1, #value 0 es kilometros (1)
+            1: 2, #value 1 es tiempo (2)
+            2: 3, #value 2 es pulsaciones(3)
+            3: 5, #value 3 es media(5)
+            4: 6 #value 4 es calorias(6)
+            }
+        value_sel = conv[value_selected]
+        #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours
+        if (value_sel == 2):
+            return self.getFloatValue(record[value_sel])/3600
+        else:
+            return self.getFloatValue(record[value_sel])
+    
+    def get_values(self, values, value_selected, key_format, sportfield=9):
+        valueDict = {} #Stores the totals
+        valueCount = {} #Counts the totals to allow for averaging if needed
+        sportColors = {}
+
+        for record in values:
+            if record[0]:
+                day = unicode(datetime.datetime.strptime(record[0], "%Y-%m-%d").strftime(key_format)) # Gives year for this record
+                sport = record[sportfield]
+                value = self.getValue(record, value_selected)
+                if sport in valueDict: #Already got this sport
+                    if day in valueDict[sport]: #Already got this sport on this day
+                        valueDict[sport][day] += value
+                        valueCount[sport][day] += 1
+                    else: #New day for this sport
+                        valueDict[sport][day] = value
+                        valueCount[sport][day] = 1
+                else: #New sport
+                    valueDict[sport] = {day: value}
+                    valueCount[sport] = {day: 1}
+            else:
+                logging.debug("No date string found, skipping entry: " + str(record))
+                
+        if value_selected in (2, 3):
+            total = {}
+            count = {}
+            for sport in valueDict.keys():
+                for day in valueDict[sport].keys():
+                    if valueCount[sport][day] > 1: #Only average if 2 or more entries on this day
+                        valueDict[sport][day] /= valueCount[sport][day]
+
+        if value_selected == 1: #Values are of time type
+            valuesAreTime=True
+        else:
+            valuesAreTime=False
+
+        return valueDict, valuesAreTime
+
+    def drawgraph(self,values, extra=None, x_func=None):
+        xval = []
+        yval = []
+        xlab = []
+        ylab = []
+        tit = []
+        
+        valsAreTime = []
+        value_selected = self.combovalue.get_active()
+        value_selected2 = self.combovalue2.get_active()
+        if value_selected < 0:
+            self.combovalue.set_active(0)
+            value_selected = 0
+
+        y1,ylabel,title,y2 = self.get_value_params(value_selected)
+        ylab.append(ylabel)
+        tit.append(title)
+
+        yvalues, valuesAreTime = self.get_values(values,value_selected, self.KEY_FORMAT, sportfield=self.SPORT_FIELD)
+        if not len(values): return
+        
+        xvalues = x_func(yvalues) 
+        
+        yval.append(yvalues)
+        xlab.append(xvalues)
+        valsAreTime.append(valuesAreTime)
+
+        #Second combobox used
+        if value_selected2 > 0:
+            value_selected2 = value_selected2-1
+            y1, ylabel,title,y2 = self.get_value_params(value_selected2)
+            ylab.append(ylabel)
+            tit.append(title)
+            yvalues, valuesAreTime = self.get_values(values,value_selected2, self.KEY_FORMAT, sportfield=self.SPORT_FIELD)
+            yval.append(yvalues)
+            xlab.append(xvalues)
+            valsAreTime.append(valuesAreTime)
+        #Draw chart
+        self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime, colors = self.sport_colors)
+
+    def get_value_params(self,value):
+        return self.value_params[value]
+
diff --git a/pytrainer/totalgraph.py b/pytrainer/totalgraph.py
new file mode 100644
index 0000000..999898e
--- /dev/null
+++ b/pytrainer/totalgraph.py
@@ -0,0 +1,63 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Sigurður H. Pálsson shp at itn.is
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from timegraph import TimeGraph
+
+class TotalGraph(TimeGraph):
+
+    value_params = [
+        (_("year"),_("Distance (km)"),_("Annual Distance"),"y"),
+        (_("year"),_("Time (hours)"), _("Annual Time"),"b"),
+        (_("year"),_("Average Heart Rate (bpm)"), _("Annual Average Heart Rate"),"r"),
+        (_("year"),_("Average Speed (km/h)"), _("Annual Average Speed"),"g"),
+        (_("year"),_("Calories"), _("Annual Calories"),"b"),
+    ]
+
+    def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None):
+        TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main)
+        self.combovalue = combovalue
+        self.combovalue2 = combovalue2
+        self.KEY_FORMAT = "%Y"
+        self.SPORT_FIELD = 4
+
+    def getYears(self, yvalues):
+        years = set()
+        for s in yvalues.values():
+            years |= set([str(x) for x in xrange(int(min(s.keys())), int(max(s.keys()))+1)])
+        return sorted(list(years))
+
+    def drawgraph(self,values):
+        TimeGraph.drawgraph(self, values, x_func=self.getYears)
+
+    def getValue(self,record,value_selected):
+        #hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values
+        conv = {
+            0: 1, #value 0 es kilometros (1)
+            1: 6, #value 1 es tiempo (2)
+            2: 7, #value 2 es pulsaciones(3)
+            3: 5, #value 3 es media(5)
+            4: 8 #value 4 es calorias(6)
+            }
+        value_sel = conv[value_selected]
+        #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours
+        if (value_sel == 6):
+            return self.getFloatValue(record[value_sel])/3600
+        else:
+            return self.getFloatValue(record[value_sel])
+    
+
diff --git a/pytrainer/upgrade/README b/pytrainer/upgrade/README
new file mode 100644
index 0000000..6218f8c
--- /dev/null
+++ b/pytrainer/upgrade/README
@@ -0,0 +1,4 @@
+This is a database migration repository.
+
+More information at
+http://code.google.com/p/sqlalchemy-migrate/
diff --git a/pytrainer/upgrade/__init__.py b/pytrainer/upgrade/__init__.py
new file mode 100644
index 0000000..2f288d3
--- /dev/null
+++ b/pytrainer/upgrade/__init__.py
@@ -0,0 +1 @@
+# template repository default module
diff --git a/plugins/googleearth/main.sh b/pytrainer/upgrade/context.py
old mode 100755
new mode 100644
similarity index 59%
copy from plugins/googleearth/main.sh
copy to pytrainer/upgrade/context.py
index c366d1a..206908d
--- a/plugins/googleearth/main.sh
+++ b/pytrainer/upgrade/context.py
@@ -1,7 +1,6 @@
-#!/bin/sh
 # -*- coding: iso-8859-1 -*-
 
-#Copyright (C) Fiz Vazquez vud1 at sindominio.net
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
 
 #This program is free software; you can redistribute it and/or
 #modify it under the terms of the GNU General Public License
@@ -17,10 +16,16 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-
-var=`zenity --file-selection`
-
-tmpgpx="/tmp/reg.gpx"
-gpsbabel -t -i kml -f $var -o gpx -F $tmpgpx
-
-echo $tmpgpx
+class UpgradeContext(object):
+    
+    """Context used by upgrade scripts.
+    
+    Provides access to the application base dir."""
+    
+    def __init__(self, conf_dir):
+        self.conf_dir = conf_dir
+    
+# sqlalchemy-migrate does not provide any means to inject the context object in
+# to upgrade scripts so instead we provide access via this global which must be
+# initialised before upgrading.
+UPGRADE_CONTEXT = None
diff --git a/pytrainer/upgrade/data.py b/pytrainer/upgrade/data.py
new file mode 100644
index 0000000..b16b291
--- /dev/null
+++ b/pytrainer/upgrade/data.py
@@ -0,0 +1,204 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+import logging
+from lxml import etree
+import pytrainer
+from pytrainer.upgrade.context import UpgradeContext
+from pytrainer.upgrade.migratedb import MigratableDb
+
+MIGRATE_REPOSITORY_PATH = "pytrainer/upgrade"
+
+def initialize_data(ddbb, conf_dir):
+    """Initializes the installation's data."""
+    db_url = ddbb.get_connection_url()
+    migratable_db = MigratableDb(MIGRATE_REPOSITORY_PATH, db_url)
+    InstalledData(migratable_db, ddbb, LegacyVersionProvider(conf_dir), UpgradeContext(conf_dir)).update_to_current()
+        
+class InstalledData(object):
+    
+    """Encapsulates an installation's existing data and provides means to
+    check version state and upgrade."""
+    
+    def __init__(self, migratable_db, ddbb, legacy_version_provider, upgrade_context):
+        self._migratable_db = migratable_db
+        self._ddbb = ddbb
+        self._legacy_version_provider = legacy_version_provider
+        self._upgrade_context = upgrade_context
+        
+    def update_to_current(self):
+        """Check the current state of the installation's data and update them
+        if necessary so they are compatible with the latest version.
+    
+        The update steps depend on the state of the installation's data. The
+        possible states and the update steps from those states are:
+    
+        1. Current (data is up to date):
+            - do nothing
+        2. Fresh (new installation):
+            - initialise empty db
+            - initialise db version metadata
+        3. Stale: (data requires upgrading):
+            - run upgrade scripts
+        4. Legacy (data requires upgrading but is missing version metadata):
+            - initialise db version metadata
+            - run upgrade scripts
+        
+        """
+        data_state = self.get_state()
+        logging.info("Initializing data. Data state is: '%s'.", data_state)
+        data_state.update_to_current(self)
+        
+    def get_state(self):
+        """Get the current state of the installation's data.
+        
+        raises DataInitializationException if the existing data is not
+        compatible and cannot be upgraded.
+        """
+        version = self.get_version()
+        available_version= self.get_available_version()
+        if self.is_versioned():
+            if version == available_version:
+                return DataState.CURRENT
+            elif version > available_version:
+                raise DataInitializationException("Existing data version ({0}) is greater than available version ({1}).".format(version, available_version))
+            else:
+                return DataState.STALE
+        else:
+            if version == None:
+                if self.is_fresh():
+                    return DataState.FRESH
+                else:
+                    raise DataInitializationException("Existing data version cannot be determined.")
+            else:
+                return DataState.LEGACY
+            
+    def is_fresh(self):
+        """Check if this is a fresh installation."""
+        return self._migratable_db.is_empty()
+    
+    def get_version(self):
+        """Get the version number of an installation's data.
+        
+        If the data version cannot be determined then None is returned."""
+        if self.is_versioned():
+            return self._migratable_db.get_version()
+        else:
+            # Calculate data version in older version that does not use the
+            # current data versioning scheme.
+            legacy_version = self._legacy_version_provider.get_legacy_version()
+            if legacy_version is not None:
+                legacy_version = int(legacy_version)
+                if legacy_version == 1: # 1.7.1
+                    return 1
+                elif legacy_version == 2: # 1.7.2-dev
+                    return 2
+                elif legacy_version == 3: # 1.7.2
+                    return 3
+                elif legacy_version == 4: # 1.8.0-dev
+                    return 4
+                elif legacy_version == 5: # 1.8.0-dev
+                    return 5
+                elif legacy_version == 6: # 1.8.0
+                    return 9
+                elif legacy_version == 7: # 1.9.0-dev
+                    return 10
+                elif legacy_version == 8: # 1.9.0-dev
+                    return 12
+                elif legacy_version == 9: # 1.9.0-dev
+                    return 12
+            return None
+        
+    def get_available_version(self):
+        return self._migratable_db.get_upgrade_version()
+        
+    def is_versioned(self):
+        """ Check if the version metadata has been initiaized."""
+        return self._migratable_db.is_versioned()
+    
+    def initialize_version(self, initial_version):
+        """Initialize the version metadata."""
+        logging.info("Initializing version metadata to version: '%s'.", initial_version)
+        self._migratable_db.version(initial_version)
+        
+    def initialize(self):
+        logging.info("Initializing new database.")
+        self._ddbb.create_tables()
+        
+    def upgrade(self):
+        logging.info("Upgrading data from version '%s' to version '%s'.", self.get_version(), self.get_available_version())
+        self._ddbb.create_backup()
+        pytrainer.upgrade.context.UPGRADE_CONTEXT = self._upgrade_context
+        self._migratable_db.upgrade()
+        
+class DataInitializationException(Exception):
+    
+    def __init__(self, value):
+        self.value = value
+        
+class DataState(object):
+    
+    """The state of an installation's data.
+    
+    The state knows how to update the data to the "current" state."""
+
+    def __init__(self, name, update_function):
+        self.name = name
+        self._update_function = update_function
+        
+    def __str__(self):
+        return self.name
+        
+    def update_to_current(self, installed_data):
+        """Update the installed data so it is compatible with the current
+        version."""
+        self._update_function(installed_data)
+
+def _update_fresh(data):
+    data.initialize()
+    data.initialize_version(data.get_available_version())
+
+def _update_stale(data):
+    data.upgrade()
+
+def _update_legacy(data):
+    data.initialize_version(data.get_version())
+    data.upgrade()
+
+DataState.CURRENT = DataState("CURRENT", lambda data: None)
+DataState.FRESH = DataState("FRESH", _update_fresh)
+DataState.STALE = DataState("STALE", _update_stale)
+DataState.LEGACY = DataState("LEGACY", _update_legacy)
+
+class LegacyVersionProvider(object):
+    
+    """Provides the DB version number for data not using the current data
+    versioning scheme."""
+    
+    def __init__(self, conf_dir):
+        self._conf_dir = conf_dir
+        
+    def get_legacy_version(self):
+        # In versions 1.7.1-1.8.0 the database version was stored as a property
+        # in the config file. Versions earlier than 1.7.1 are not supported for
+        # upgrades.
+        config_file = self._conf_dir + "/conf.xml"
+        parser = etree.XMLParser(encoding="UTF8", recover=True)
+        xml_tree = etree.parse(config_file, parser=parser)
+        config_element = xml_tree.getroot()
+        return config_element.get("DB_version")
diff --git a/pytrainer/upgrade/migrate.cfg b/pytrainer/upgrade/migrate.cfg
new file mode 100644
index 0000000..c32b765
--- /dev/null
+++ b/pytrainer/upgrade/migrate.cfg
@@ -0,0 +1,20 @@
+[db_settings]
+# Used to identify which repository this database is versioned under.
+# You can use the name of your project.
+repository_id=pytrainer
+
+# The name of the database table used to track the schema version.
+# This name shouldn't already be used by your project.
+# If this is changed once a database is under version control, you'll need to 
+# change the table name in each database too. 
+version_table=migrate_version
+
+# When committing a change script, Migrate will attempt to generate the 
+# sql for all supported databases; normally, if one of them fails - probably
+# because you don't have that database installed - it is ignored and the 
+# commit continues, perhaps ending successfully. 
+# Databases in this list MUST compile successfully during a commit, or the 
+# entire commit will fail. List the databases your application will actually 
+# be using to ensure your updates to that database work properly.
+# This must be a list; example: ['postgres','sqlite']
+required_dbs=[]
diff --git a/pytrainer/upgrade/migratedb.py b/pytrainer/upgrade/migratedb.py
new file mode 100644
index 0000000..55a3815
--- /dev/null
+++ b/pytrainer/upgrade/migratedb.py
@@ -0,0 +1,91 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from migrate.versioning.api import db_version, upgrade, version, version_control
+# sqlalchemy-migrate 0.6.1 broke backwards compatibility
+# so we need to try importing exceptions from one of two packages
+try:
+    from migrate.exceptions import DatabaseNotControlledError
+except:
+    from migrate.versioning.exceptions import DatabaseNotControlledError
+from sqlalchemy.schema import MetaData
+import logging
+import os
+import sqlalchemy
+import sys
+
+class MigratableDb(object):
+    """Object bridge for sqlalchemy-migrate API functions."""
+    
+    def __init__(self, repository_path, db_url):
+        """Create a migratable DB.
+        
+        Arguments:
+        repository_path -- The path to the migrate repository, relative to the
+            pypath.
+        db_url -- the connection URL string for the DB.
+        """
+        self._repository_path = _get_resource_absolute_path(repository_path)
+        self._db_url = db_url
+        
+    def is_empty(self):
+        """Check if the DB schema is empty.
+        
+        An empty schema indicates a new uninitialised database."""
+        metadata = MetaData()
+        metadata.bind = sqlalchemy.create_engine(self._db_url)
+        metadata.reflect()
+        tables = metadata.tables
+        return not tables
+        
+    def is_versioned(self):
+        """ Check if the DB has been initiaized with version metadata."""
+        try:
+            self.get_version()
+        except DatabaseNotControlledError:
+            return False
+        return True
+        
+    def get_version(self):
+        """Get the current version of the versioned DB.
+        
+        Raises DatabaseNotControlledError if the DB is not initialized."""
+        return db_version(self._db_url, self._repository_path)
+    
+    def get_upgrade_version(self):
+        """Get the latest version available in upgrade repository."""
+        return version(self._repository_path)
+    
+    def version(self, initial_version):
+        """Initialize the database with migrate metadata.
+        
+        Raises DatabaseAlreadyControlledError if the DB is already initialized."""
+        version_control(self._db_url, self._repository_path, initial_version)
+
+    def upgrade(self):
+        """Run all available upgrade scripts for the repository."""
+        upgrade(self._db_url, self._repository_path)
+        
+def _get_resource_absolute_path(resource_name):
+    """Get the absolute path to a resource on the python system path."""
+    for path in sys.path:
+        candidate = os.path.join(path, resource_name)
+        if os.path.exists(candidate):
+            logging.debug("Found resource: %s", candidate)
+            return candidate
+    raise ValueError("Resource '{0}' could not be found".format(resource_name))
diff --git a/pytrainer/upgrade/versions/001_mysql_upgrade.sql b/pytrainer/upgrade/versions/001_mysql_upgrade.sql
new file mode 100644
index 0000000..f437ece
--- /dev/null
+++ b/pytrainer/upgrade/versions/001_mysql_upgrade.sql
@@ -0,0 +1,41 @@
+-- initial schema as of version 1.7.1
+
+create table sports  (
+	id_sports integer primary key auto_increment,
+	name varchar(100),
+	weight float,
+	met float
+);
+
+create table records  (
+	id_record integer primary key auto_increment,
+	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 varchar(20),
+	date_time_utc varchar(20)
+);
+
+create table waypoints  (
+	id_waypoint integer primary key auto_increment,
+	lat float,
+	lon float,
+	ele float,
+	comment varchar(240),
+	time date,
+	name varchar(200),
+	sym varchar(200)
+);
diff --git a/pytrainer/upgrade/versions/001_sqlite_upgrade.sql b/pytrainer/upgrade/versions/001_sqlite_upgrade.sql
new file mode 100644
index 0000000..8e3ba7a
--- /dev/null
+++ b/pytrainer/upgrade/versions/001_sqlite_upgrade.sql
@@ -0,0 +1,41 @@
+-- initial schema as of version 1.7.1
+
+create table sports  (
+	id_sports integer primary key autoincrement,
+	name varchar(100),
+	weight float,
+	met float
+);
+
+create table 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 varchar(20),
+	date_time_utc varchar(20)
+);
+
+create table waypoints  (
+	id_waypoint integer primary key autoincrement,
+	lat float,
+	lon float,
+	ele float,
+	comment varchar(240),
+	time date,
+	name varchar(200),
+	sym varchar(200)
+);
diff --git a/pytrainer/upgrade/versions/002_mysql_upgrade.sql b/pytrainer/upgrade/versions/002_mysql_upgrade.sql
new file mode 100644
index 0000000..471e2e2
--- /dev/null
+++ b/pytrainer/upgrade/versions/002_mysql_upgrade.sql
@@ -0,0 +1,12 @@
+-- laps added in version 1.7.2
+create table laps (
+	id_lap integer primary key auto_increment,
+	record integer,
+	elapsed_time varchar(20),
+	distance float,
+	start_lat float,
+	start_lon float,
+	end_lat float,
+	end_lon float,
+	calories integer
+);
diff --git a/pytrainer/upgrade/versions/002_sqlite_upgrade.sql b/pytrainer/upgrade/versions/002_sqlite_upgrade.sql
new file mode 100644
index 0000000..10558e5
--- /dev/null
+++ b/pytrainer/upgrade/versions/002_sqlite_upgrade.sql
@@ -0,0 +1,12 @@
+-- laps added in version 1.7.2
+create table 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 integer
+);
diff --git a/pytrainer/upgrade/versions/003_default_upgrade.sql b/pytrainer/upgrade/versions/003_default_upgrade.sql
new file mode 100644
index 0000000..c9bace7
--- /dev/null
+++ b/pytrainer/upgrade/versions/003_default_upgrade.sql
@@ -0,0 +1,2 @@
+-- lap number added in version 1.7.2
+alter table laps add lap_number integer;
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/004_default_upgrade.sql b/pytrainer/upgrade/versions/004_default_upgrade.sql
new file mode 100644
index 0000000..35e9a5b
--- /dev/null
+++ b/pytrainer/upgrade/versions/004_default_upgrade.sql
@@ -0,0 +1,2 @@
+-- sport max pace added in version 1.8.0
+alter table sports add max_pace integer;
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/005_mysql_upgrade.sql b/pytrainer/upgrade/versions/005_mysql_upgrade.sql
new file mode 100644
index 0000000..97fbed4
--- /dev/null
+++ b/pytrainer/upgrade/versions/005_mysql_upgrade.sql
@@ -0,0 +1,9 @@
+-- athlete stats added in version 1.8.0
+create table athletestats (
+	id_athletestat integer primary key auto_increment,
+	date date,
+	weight float,
+	bodyfat float,
+	restinghr integer,
+	maxhr integer
+);
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/005_sqlite_upgrade.sql b/pytrainer/upgrade/versions/005_sqlite_upgrade.sql
new file mode 100644
index 0000000..cabfc2c
--- /dev/null
+++ b/pytrainer/upgrade/versions/005_sqlite_upgrade.sql
@@ -0,0 +1,9 @@
+-- athlete stats added in version 1.8.0
+create table athletestats (
+	id_athletestat integer primary key autoincrement,
+	date date,
+	weight float,
+	bodyfat float,
+	restinghr integer,
+	maxhr integer
+);
diff --git a/pytrainer/upgrade/versions/006_default_upgrade.sql b/pytrainer/upgrade/versions/006_default_upgrade.sql
new file mode 100644
index 0000000..1f1f7f8
--- /dev/null
+++ b/pytrainer/upgrade/versions/006_default_upgrade.sql
@@ -0,0 +1,2 @@
+-- record duration added in version 1.8.0
+alter table records add duration integer;
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/007_populate_record_duration.py b/pytrainer/upgrade/versions/007_populate_record_duration.py
new file mode 100644
index 0000000..9b301ef
--- /dev/null
+++ b/pytrainer/upgrade/versions/007_populate_record_duration.py
@@ -0,0 +1,27 @@
+from sqlalchemy.sql.expression import text
+import logging
+
+# record duration added in version 1.8.0
+
+def upgrade(migrate_engine):
+    logging.info("Populating records.duration column")
+    records = migrate_engine.execute("select id_record, time from records where duration is null")
+    for record in records:
+        record_id = record["id_record"]
+        record_time = record["time"]
+        try:
+            duration = int(record_time)
+        except:
+            logging.info("Error parsing time (%s) as int for record_id: %s" % (record_time, record_id))
+            duration = 0
+        logging.debug("setting record %s duration to %d" , record_id, duration)
+        migrate_engine.execute(text("update records set duration=:duration where id_record=:record_id"), duration=duration, record_id=record_id)
+    records.close()
+    
+# work around a migrate bug
+try:
+    import migrate.versioning.exceptions as ex1
+    import migrate.changeset.exceptions as ex2
+    ex1.MigrateDeprecationWarning = ex2.MigrateDeprecationWarning
+except ImportError:
+    pass
diff --git a/pytrainer/upgrade/versions/008_mysql_upgrade.sql b/pytrainer/upgrade/versions/008_mysql_upgrade.sql
new file mode 100644
index 0000000..ad1daf7
--- /dev/null
+++ b/pytrainer/upgrade/versions/008_mysql_upgrade.sql
@@ -0,0 +1,4 @@
+-- record date_time data type changed in version 1.8.0
+alter table records
+	modify date_time_local varchar(40),
+	modify date_time_utc varchar(40);
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/008_sqlite_upgrade.sql b/pytrainer/upgrade/versions/008_sqlite_upgrade.sql
new file mode 100644
index 0000000..6f0c672
--- /dev/null
+++ b/pytrainer/upgrade/versions/008_sqlite_upgrade.sql
@@ -0,0 +1 @@
+-- data type change does not affect sqlite schema
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/009_mysql_upgrade.sql b/pytrainer/upgrade/versions/009_mysql_upgrade.sql
new file mode 100644
index 0000000..e6b25cc
--- /dev/null
+++ b/pytrainer/upgrade/versions/009_mysql_upgrade.sql
@@ -0,0 +1,16 @@
+-- equipment management added in version 1.8.0
+
+create table equipment (
+	id integer primary key auto_increment ,
+	description varchar(200),
+	active boolean,
+	life_expectancy int,
+	prior_usage int,
+	notes text
+);
+
+create table record_equipment (
+	id integer primary key auto_increment,
+	record_id int,
+	equipment_id int
+);
diff --git a/pytrainer/upgrade/versions/009_sqlite_upgrade.sql b/pytrainer/upgrade/versions/009_sqlite_upgrade.sql
new file mode 100644
index 0000000..e2b44b7
--- /dev/null
+++ b/pytrainer/upgrade/versions/009_sqlite_upgrade.sql
@@ -0,0 +1,16 @@
+-- equipment management added in version 1.8.0
+
+create table equipment (
+	id integer primary key autoincrement ,
+	description varchar(200),
+	active boolean,
+	life_expectancy int,
+	prior_usage int,
+	notes text
+);
+
+create table record_equipment (
+	id integer primary key autoincrement,
+	record_id int,
+	equipment_id int
+);
diff --git a/pytrainer/upgrade/versions/010_default_upgrade.sql b/pytrainer/upgrade/versions/010_default_upgrade.sql
new file mode 100644
index 0000000..854212b
--- /dev/null
+++ b/pytrainer/upgrade/versions/010_default_upgrade.sql
@@ -0,0 +1,7 @@
+-- lap info added in version 1.9.0
+alter table laps add intensity varchar(7);
+alter table laps add laptrigger varchar(9);
+alter table laps add max_speed float;
+alter table laps add avg_hr int;
+alter table laps add max_hr int;
+alter table laps add comments text;
diff --git a/pytrainer/upgrade/versions/011_populate_lap_details.py b/pytrainer/upgrade/versions/011_populate_lap_details.py
new file mode 100644
index 0000000..f9e2e13
--- /dev/null
+++ b/pytrainer/upgrade/versions/011_populate_lap_details.py
@@ -0,0 +1,54 @@
+from pytrainer.upgrade.context import UPGRADE_CONTEXT
+from pytrainer.lib import gpx
+from sqlalchemy.sql.expression import text
+import logging
+import os.path
+
+#	lap info added in version 1.9.0
+def upgrade(migrate_engine):
+    logging.info("Populating laps details columns")
+    resultset = migrate_engine.execute(text("select distinct record from laps where intensity is null"))
+    record_ids = []
+    for row in resultset:
+        record_ids.append(row["record"])
+    resultset.close()
+    for record_id in record_ids:
+        gpx_file = UPGRADE_CONTEXT.conf_dir + "/gpx/{0}.gpx".format(record_id)
+        if os.path.isfile(gpx_file):
+            gpx_record = gpx.Gpx(filename=gpx_file)
+            populate_laps_from_gpx(migrate_engine, record_id, gpx_record)
+
+def populate_laps_from_gpx(migrate_engine, record_id, gpx_record):
+        resultset = migrate_engine.execute(text("select id_lap from laps where record=:record_id" ), record_id=record_id)
+        lap_ids = []
+        for row in resultset:
+            lap_ids.append(row["id_lap"])
+        resultset.close()
+        if(len(lap_ids) > 0):
+            logging.info("Populating laps from GPX for record %s" , record_id)
+        for lap_id, gpx_lap in zip(lap_ids, gpx_record.getLaps()):
+            populate_lap_from_gpx(migrate_engine, lap_id, gpx_lap)
+        
+def populate_lap_from_gpx(migrate_engine, lap_id, gpx_lap):
+    logging.info("Populating lap details from GPX for lap %s" , lap_id)
+    migrate_engine.execute(text("""update laps set
+                                    intensity=:intensity,
+                                    avg_hr=:avg_heart_rate,
+                                    max_hr=:max_heart_rate,
+                                    max_speed=:max_speed,
+                                    laptrigger=:lap_trigger 
+                                    where id_lap=:lap_id"""), 
+                                    intensity=gpx_lap[7],
+                                    avg_heart_rate=gpx_lap[8],
+                                    max_heart_rate=gpx_lap[9],
+                                    max_speed=float(gpx_lap[10]), 
+                                    lap_trigger=gpx_lap[11],
+                                    lap_id=lap_id)
+    
+# work around a migrate bug
+try:
+    import migrate.versioning.exceptions as ex1
+    import migrate.changeset.exceptions as ex2
+    ex1.MigrateDeprecationWarning = ex2.MigrateDeprecationWarning
+except ImportError:
+    pass
diff --git a/pytrainer/upgrade/versions/012_default_upgrade.sql b/pytrainer/upgrade/versions/012_default_upgrade.sql
new file mode 100644
index 0000000..c5756f6
--- /dev/null
+++ b/pytrainer/upgrade/versions/012_default_upgrade.sql
@@ -0,0 +1,2 @@
+-- sport color added in version 1.9.0
+alter table sports add color char(6);
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/013_remove_db_version.py b/pytrainer/upgrade/versions/013_remove_db_version.py
new file mode 100644
index 0000000..96c5e85
--- /dev/null
+++ b/pytrainer/upgrade/versions/013_remove_db_version.py
@@ -0,0 +1,10 @@
+from lxml import etree
+from pytrainer.upgrade.context import UPGRADE_CONTEXT
+
+def upgrade(migrate_engine):
+    config_file = UPGRADE_CONTEXT.conf_dir + "/conf.xml"
+    parser = etree.XMLParser(encoding="UTF8", recover=True)
+    xml_tree = etree.parse(config_file, parser=parser)
+    config_element = xml_tree.getroot()
+    del config_element.attrib["DB_version"]
+    xml_tree.write(config_file, xml_declaration=True, encoding="UTF-8")
diff --git a/pytrainer/upgrade/versions/014_clean_sport_data.py b/pytrainer/upgrade/versions/014_clean_sport_data.py
new file mode 100644
index 0000000..a657f63
--- /dev/null
+++ b/pytrainer/upgrade/versions/014_clean_sport_data.py
@@ -0,0 +1,4 @@
+import pytrainer.upgrade.versions.version014 as version14
+
+def upgrade(migrate_engine):
+    version14.upgrade(migrate_engine)
\ No newline at end of file
diff --git a/pytrainer/upgrade/versions/__init__.py b/pytrainer/upgrade/versions/__init__.py
new file mode 100644
index 0000000..507b5ff
--- /dev/null
+++ b/pytrainer/upgrade/versions/__init__.py
@@ -0,0 +1 @@
+# template repository default versions module
diff --git a/pytrainer/upgrade/versions/version014.py b/pytrainer/upgrade/versions/version014.py
new file mode 100644
index 0000000..f58fc4c
--- /dev/null
+++ b/pytrainer/upgrade/versions/version014.py
@@ -0,0 +1,93 @@
+# -*- coding: iso-8859-1 -*-
+
+#Copyright (C) Nathan Jones ncjones at users.sourceforge.net
+
+#This program is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public License
+#as published by the Free Software Foundation; either version 2
+#of the License, or (at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from sqlalchemy.sql.expression import text
+import logging
+
+class _SportNormalizer(object):
+    
+    """A row from the sport DB table that can be "normalized" to have invalid
+    values replaced with valid defaults."""
+    
+    def __init__(self, id, weight, color, met, max_pace):
+        self._id = id
+        self._weight = weight
+        self._color =  color
+        self._met = met
+        self._max_pace = max_pace
+        
+    def normalize(self, migrate_engine):
+        self._normalize_weight(migrate_engine)
+        self._normalize_color(migrate_engine)
+        self._normalize_met(migrate_engine)
+        self._normalize_max_pace(migrate_engine)
+            
+    def _normalize_weight(self, migrate_engine):
+        valid = True
+        try:
+            weight = float(self._weight)
+            if weight < 0:
+                valid = False
+        except:
+            valid = False
+        if not valid:
+            logging.debug("Sport with id '%s' has invalid weight: '%s'. Replacing with default.", self._id, self._weight)
+            migrate_engine.execute(text("update sports set weight=:weight where id_sports=:id"), id=self._id, weight=0.0)
+            
+    def _normalize_color(self, migrate_engine):
+        try:
+            # colors that do not have exactly 6 hexadecimal digits should also
+            # be invalid, but we do not expect such invalid values to exist.
+            int(self._color, 16)
+        except:
+            logging.debug("Sport with id '%s' has invalid color: '%s'. Replacing with default.", self._id, self._color)
+            migrate_engine.execute(text("update sports set color=:color where id_sports=:id"), id=self._id, color="0000ff")
+            
+    def _normalize_met(self, migrate_engine):
+        valid = True
+        if self._met is not None:
+            try:
+                met = float(self._met)
+                if met < 0:
+                    valid = False
+            except:
+                valid = False
+        if not valid:
+            logging.debug("Sport with id '%s' has invalid MET: '%s'. Replacing with default.", self._id, self._met)
+            migrate_engine.execute(text("update sports set met=:met where id_sports=:id"), id=self._id, met=None)
+            
+    def _normalize_max_pace(self, migrate_engine):
+        valid = True
+        if self._max_pace is not None:
+            try:
+                max_pace = int(self._max_pace)
+                if max_pace <= 0:
+                    valid = False
+            except:
+                valid = False
+        if not valid:
+            logging.debug("Sport with id '%s' has invalid max pace: '%s'. Replacing with default.", self._id, self._max_pace)
+            migrate_engine.execute(text("update sports set max_pace=:max_pace where id_sports=:id"), id=self._id, max_pace=None)
+
+def upgrade(migrate_engine):
+    sport_rows = migrate_engine.execute("select id_sports, weight, color, met, max_pace from sports")
+    sport_normalizers = []
+    for (id, weight, color, met, max_pace) in sport_rows:
+        sport_normalizers.append(_SportNormalizer(id, weight, color, met, max_pace))
+    for sport_normalizer in sport_normalizers:
+        sport_normalizer.normalize(migrate_engine)
diff --git a/pytrainer/waypoint.py b/pytrainer/waypoint.py
index 124d493..c9298f4 100644
--- a/pytrainer/waypoint.py
+++ b/pytrainer/waypoint.py
@@ -100,5 +100,5 @@ class Waypoint:
 		self.recordwindow.rcd_unegative.set_text(str(unegative))
 		self.recordwindow.set_distance(distance)
 		self.recordwindow.set_recordtime(time/60.0/60.0)
-		self.recordwindow.on_calcaverage_clicked(None)
+		self.recordwindow.on_calcavs_clicked(None)
 		logging.debug("<<")
diff --git a/pytrainer/weekgraph.py b/pytrainer/weekgraph.py
index 8237126..ff51f33 100644
--- a/pytrainer/weekgraph.py
+++ b/pytrainer/weekgraph.py
@@ -20,136 +20,28 @@ from gui.drawArea import DrawArea
 import logging
 import datetime
 import calendar
+from timegraph import TimeGraph
 
-class WeekGraph:
-	def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None):
-		self.drawarea = DrawArea(vbox, window)
-		self.combovalue = combovalue
-		self.combovalue2 = combovalue2
-
-	def drawgraph(self,values, date_ini, date_end):
-		logging.debug(">>")
-		yval = []
-		xlab = []
-		ylab = []
-		tit = []
-		valsAreTime = []
-
-		logging.debug("Values: "+str(values))
-
-		#Reset the comboboxes if nothing selected
-		value_selected = self.combovalue.get_active()
-		if value_selected < 0:
-			self.combovalue.set_active(0)
-			value_selected = 0
-		value_selected2 = self.combovalue2.get_active()
-		if value_selected2 < 0:
-			self.combovalue2.set_active(0)
-			value_selected2 = 0
-
-		#build localised days list
-		days = self.getDays(date_ini)
+class WeekGraph(TimeGraph):
 
-		ylabel,title = self.get_value_params(value_selected)
-		ylab.append(ylabel)
-		tit.append(title)
-		
-		#TODO
-		yvalues, valuesAreTime = self.get_values(values,value_selected)
-		logging.debug("yvalues: "+str(yvalues))
-		logging.debug("valuesAreTime: "+str(valuesAreTime))
-		yval.append(yvalues)
-		xlab.append(days)
-		valsAreTime.append(valuesAreTime)
-		
-		#Second combobox used
-		if value_selected2 > 0:
-			value_selected2 = value_selected2-1
-			ylabel,title = self.get_value_params(value_selected2)
-			ylab.append(ylabel)
-			tit.append(title)
-			yvalues, valuesAreTime = self.get_values(values,value_selected2)
-			yval.append(yvalues)
-			xlab.append(days)
-			valsAreTime.append(valuesAreTime)
+	value_params = [
+		(None, _("Distance (km)"),_("Daily Distance"), None),
+		(None, _("Time (hours)"), _("Daily Time"), None),
+		(None, _("Average Heart Rate (bpm)"), _("Daily Average Heart Rate"), None),
+		(None, _("Average Speed (km/h)"), _("Daily Average Speed"), None),
+		(None, _("Calories"), _("Daily Calories"), None),
+	]
 
-		#Draw chart
-		self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime)
-		logging.debug("<<")
-
-	def get_values(self, values, value_selected):
-		valueDict = {} #Stores the totals
-		valueCount = {} #Counts the totals to allow for averaging if needed
-
-		for record in values:
-			day = unicode(datetime.datetime.strptime(record[0], "%Y-%m-%d").strftime("%a")) # Gives Sun, Mon etc for this record
-			sport = record[9]
-			value = self.getValue(record, value_selected)
-			if sport in valueDict: #Already got this sport
-				if day in valueDict[sport]: #Already got this sport on this day
-					valueDict[sport][day] += value
-					valueCount[sport][day] += 1
-				else: #New day for this sport
-					valueDict[sport][day] = value
-					valueCount[sport][day] = 1
-			else: #New sport
-				valueDict[sport] = {day: value}
-				valueCount[sport] = {day: 1}
-
-		if value_selected == 2 or value_selected == 3:
-			for sport in valueDict.keys():
-				for day in valueDict[sport].keys():
-					logging.debug("averaging values: before %s (count %s)" % (valueDict[sport][day],valueCount[sport][day]))
-					if valueCount[sport][day] > 1: #Only average if 2 or more entries on this day
-						valueDict[sport][day] /= valueCount[sport][day]
-					logging.debug("averaging values: after %s" % valueDict[sport][day])
-		if value_selected == 1: #Values are of time type
-			valuesAreTime=True
-		else:
-			valuesAreTime=False
-
-		return valueDict, valuesAreTime
+	def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None):
+		TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main)
+		self.combovalue = combovalue
+		self.combovalue2 = combovalue2
+		self.KEY_FORMAT = "%a"
 
-	def get_value_params(self,value):
-		if value == 0:
-			return _("Distance (km)"),_("Daily Distance")
-		elif value == 1:
-			return _("Time (hours)"), _("Daily Time")
-		elif value == 2:
-			return _("Average Heart Rate (bpm)"), _("Daily Average Heart Rate")
-		elif value == 3:
-			return _("Average Speed (km/h)"), _("Daily Average Speed")
-		elif value == 4:
-			return _("Calories"), _("Daily Calories")
+	def drawgraph(self,values, date_ini):
+		TimeGraph.drawgraph(self, values, x_func=lambda x: getDays(date_ini))
 
-	def getValue(self,record,value_selected):
-		#hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values
-		conv = {
-			0: 1, #value 0 es kilometros (1)
-			1: 2, #value 1 es tiempo (2)
-			2: 3, #value 2 es pulsaciones(3)
-			3: 5, #value 3 es media(5)
-			4: 6 #value 4 es calorias(6)
-			}
-		value_sel = conv[value_selected]
-		#si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours
-		if (value_sel == 2):
-			return self.getFloatValue(record[value_sel])/3600
-		else:
-			return self.getFloatValue(record[value_sel])
-	
-	def getFloatValue(self, value):
-		try:
-			return float(value)
-		except:
-			return float(0)
+def getDays(date_ini):
+	#TODO look at using calendar.day_abbr for this
+	return [unicode((datetime.datetime.strptime(date_ini, "%Y-%m-%d")+datetime.timedelta(x)).strftime("%a")) for x in xrange(0,7)]
 
-	def getDays(self, date_ini):
-		#TODO look at using calendar.day_abbr for this
-		days = []
-		for day in range(0, 7):
-			dateTemp = datetime.datetime.strptime(date_ini, "%Y-%m-%d")
-			incrementDay = datetime.timedelta(days=day)
-			dateToUse = dateTemp + incrementDay
-			days.append( unicode(dateToUse.strftime("%a")) )
-		return days
diff --git a/pytrainer/yeargraph.py b/pytrainer/yeargraph.py
index e0db631..b647eda 100644
--- a/pytrainer/yeargraph.py
+++ b/pytrainer/yeargraph.py
@@ -16,22 +16,31 @@
 #along with this program; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-from gui.drawArea import DrawArea
 import calendar
+import datetime
+from timegraph import TimeGraph
 
-class YearGraph:
-    def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None):
-        self.drawarea = DrawArea(vbox, window)
+class YearGraph(TimeGraph):
+
+    value_params = [
+        (_("month"),_("Distance (km)"),_("Monthly Distance"),"y"),
+        (_("month"),_("Time (hours)"), _("Monthly Time"),"b"),
+        (_("month"),_("Average Heart Rate (bpm)"), _("Monthly Average Heart Rate"),"r"),
+        (_("month"),_("Average Speed (km/h)"), _("Monthly Average Speed"),"g"),
+        (_("month"),_("Calories"), _("Monthly Calories"),"b"),
+    ]
+
+    def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None):
+        TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main)
         self.combovalue = combovalue
         self.combovalue2 = combovalue2
+        self.KEY_FORMAT = "%m"
 
     def drawgraph(self,values):
-        xval = []
-        yval = []
-        xlab = []
-        ylab = []
-        tit = []
-        col = []
+        TimeGraph.drawgraph(self, values, x_func=lambda x: ["%02d" % m for m in xrange(1,13)])
+
+    def drawgraph2(self,values):
+        
         value_selected = self.combovalue.get_active()
         value_selected2 = self.combovalue2.get_active()
         if value_selected < 0:
@@ -65,19 +74,7 @@ class YearGraph:
             col.append(color)
         self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col)
 
-    def get_value_params(self,value):
-        if value == 0:
-            return 12,_("month"),_("Distance (km)"),_("Monthly Distance"),"y"
-        elif value == 1:
-            return 12,_("month"),_("Time (hours)"), _("Monthly Time"),"b"
-        elif value == 2:
-            return 12,_("month"),_("Average Heart Rate (bpm)"), _("Monthly Average Heart Rate"),"r"
-        elif value == 3:
-            return 12,_("month"),_("Average Speed (km/h)"), _("Monthly Average Speed"),"g"
-        elif value == 4:
-            return 12,_("month"),_("Calories"), _("Monthly Calories"),"b"
-
-    def get_values(self,values,value_selected,monthsnumber):
+    def get_values2(self,values,value_selected,monthsnumber):
         #hacemos una relacion entre el value_selected y los values
         conv = {
             0: 1, #value 0 es kilometros (1)
@@ -130,9 +127,5 @@ class YearGraph:
                 if list_average[value]>0:
                     yunits[value-1] = list_values[value]/list_average[value]
         return xunits,yunits
-    
-    def getFloatValue(self, value):
-        try:
-            return float(value)
-        except:
-            return float(0)
+
+
diff --git a/setup.py b/setup.py
index 4b132c2..1c2fc3e 100755
--- a/setup.py
+++ b/setup.py
@@ -15,7 +15,7 @@ def install_extension(extension_name):
 	return "share/pytrainer/extensions/%s"%extension_name, glob("extensions/%s/*"%extension_name) 
 
 setup( 	name="pytrainer",
-	version="1.8.0",
+	version="1.9.0",
 	description="The free sport tracking center",
 	long_description="Pytrainer is a tool to log all your sport excursion coming from GPS devices (with a focus on ForeRunner 205, 305 and 405) or GPX (http://www.topografix.com) files. Pytrainer supports GPS track files and displays it in graphs, maps... ",
 	author="Fiz Vazquez, John Blance, David Garcia Granda, Arnd Zapletal, Nathan Jones",
@@ -25,9 +25,12 @@ setup( 	name="pytrainer",
 	packages=[	'pytrainer',
 			'pytrainer.gui',
 			'pytrainer.extensions',
-			'pytrainer.lib'
+			'pytrainer.lib',
+			'pytrainer.upgrade'
 			],
-
+	package_data={
+				'pytrainer.upgrade': ['migrate.cfg', 'versions/*.sql', 'versions/*.py']
+	},
 	data_files=[
 		('share/pytrainer/glade/',glob("glade/*.glade")),
 		('share/pytrainer/glade/',glob("glade/*.png")),
@@ -53,9 +56,12 @@ setup( 	name="pytrainer",
 		(install_locale("es")),
 		(install_locale("eu")),
 		(install_locale("fr")),
+		(install_locale("gl")),
 		(install_locale("no")),
 		(install_locale("pl")),
+		(install_locale("pt")),
 		(install_locale("ru")),
+		(install_locale("sv")),
 		('share/pixmaps/',['pytrainer.png']),
 		('share/applications/',['pytrainer.desktop'])
 		],
diff --git a/utils/translator.sh b/utils/translator.sh
index 38064cc..92c4ef6 100755
--- a/utils/translator.sh
+++ b/utils/translator.sh
@@ -1,29 +1,35 @@
 #!/bin/sh
 
-SOFTWARE=$(zenity --list --text="Select your translation software" --radiolist --column "Pick" --column "Software" TRUE "gtranslator" FALSE "kbabel" FALSE "poedit")
-if [ $? != 0 ]; then exit ; fi
+NO_LANGUAGE='None (generate .pot)'
 
-LANGUAGE=$(zenity --list --text="Select your language" --radiolist --column "Pick" --column "Language" TRUE "es" FALSE "eu" FALSE "ca" FALSE "fr" FALSE "da" FALSE "de" FALSE "pl" FALSE "no" FALSE "cs" FALSE "ru" FALSE "pl")
+LANGUAGE=$(zenity --list --text="Select your language" --radiolist --column "Pick" --column "Language" TRUE "$NO_LANGUAGE" FALSE "ca" FALSE "cs" FALSE "da" FALSE "de" FALSE "es" FALSE "eu" FALSE "fr" FALSE "gl" FALSE "no" FALSE "pl" FALSE "pt" FALSE "ru" FALSE "sv")
 if [ $? != 0 ]; then exit ; fi
 
 cd ../
 
-# Extract translatable strings from input files
+echo "Extracting translatable strings from input files"
 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 {} \;
 
-# Initializing translations for desired language
+CWD=$(pwd)
+echo "Generated $CWD/messages.pot"
+
+if test "$LANGUAGE" = "$NO_LANGUAGE"; then exit; fi
+
+echo "Initializing translations for desired language"
 msginit -i ./messages.pot -l $LANGUAGE -o ./locale/$LANGUAGE/LC_MESSAGES/pytrainer_$LANGUAGE.po_new
-rm ./messages.pot
 
 cd ./locale/$LANGUAGE/LC_MESSAGES/
-# Merging old po file with the one generated as a result of current script
+echo "Merging old po file with newly generated one"
 make merge
 
+SOFTWARE=$(zenity --list --text="Select your translation software" --radiolist --column "Pick" --column "Software" TRUE "gtranslator" FALSE "kbabel" FALSE "poedit" FALSE "virtaal")
+if [ $? != 0 ]; then exit ; fi
+
 # Editing our new gettext catalog (.po file)
 $SOFTWARE pytrainer_$LANGUAGE.po
 if [ $? != 0 ]; then echo "WARNING: $SOFTWARE not found"; exit ; fi
 
-# Compiling our new message catalog into binary files ready for distribution
+echo "Compiling new message catalog"
 make

-- 
Debian package for pytrainer



More information about the Pkg-running-devel mailing list