]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Version 19.2, December 2018 v19.2
authoractivityworkshop <mail@activityworkshop.net>
Sat, 2 Feb 2019 10:26:07 +0000 (11:26 +0100)
committeractivityworkshop <mail@activityworkshop.net>
Sat, 2 Feb 2019 10:26:07 +0000 (11:26 +0100)
24 files changed:
README.md
tim/prune/GpsPrune.java
tim/prune/config/Config.java
tim/prune/data/AltitudeRange.java
tim/prune/data/FileInfo.java
tim/prune/data/RangeStats.java
tim/prune/data/SourceInfo.java
tim/prune/data/TimestampLocal.java
tim/prune/data/TrackInfo.java
tim/prune/gui/images/add_photo_icon.png [changed mode: 0644->0755]
tim/prune/gui/images/add_textfile_icon.png [changed mode: 0644->0755]
tim/prune/gui/map/MapCanvas.java
tim/prune/gui/map/MapSource.java
tim/prune/gui/map/MapSourceLibrary.java
tim/prune/lang/prune-texts_fi.properties
tim/prune/lang/prune-texts_pl.properties
tim/prune/lang/prune-texts_sv.properties
tim/prune/load/xml/GpxHandler.java
tim/prune/load/xml/XmlFileLoader.java
tim/prune/load/xml/XmlHandler.java
tim/prune/readme.txt
tim/prune/save/GpxExporter.java
tim/prune/save/PovExporter.java
tim/prune/threedee/Java3DWindow.java

index 5820cd0bec06a70349b837b9f4742c5f90133eba..9e9c08b39e92118fefa1561f332b4add6f6b7d54 100644 (file)
--- a/README.md
+++ b/README.md
@@ -3,5 +3,5 @@ GpsPrune is a map-based application for viewing, editing and converting coordina
 
 It's a cross-platform java application, and its home page is at https://gpsprune.activityworkshop.net .
 
-Here on github you'll find all the sources from version 1 to the current version 19, and in the wiki at https://github.com/activityworkshop/GpsPrune/wiki there's the beginning of a translation effort for anyone to contribute.
+Here on github you'll find all the sources from version 1 to the current version 19.2, and in the wiki at https://github.com/activityworkshop/GpsPrune/wiki there's the beginning of a translation effort for anyone to contribute.
 Currently just the Spanish translations are online, to see whether it's a workable idea or not.  Please help with this if you can.
index af45728e44ded8ee6069d400cbe3fd4768ed0a55..f396e9e4fdbc31a4c1ca2deb67cbe24eff7c6b76 100644 (file)
@@ -1,14 +1,14 @@
 package tim.prune;
 
-import java.awt.event.WindowAdapter;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Image;
+import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.util.Locale;
 import java.util.ArrayList;
+import java.util.Locale;
 import javax.swing.JFrame;
 import javax.swing.JSplitPane;
 import javax.swing.JToolBar;
@@ -17,10 +17,10 @@ import javax.swing.WindowConstants;
 import tim.prune.config.Config;
 import tim.prune.config.ConfigException;
 import tim.prune.gui.DetailsDisplay;
-import tim.prune.gui.SidebarController;
 import tim.prune.gui.IconManager;
 import tim.prune.gui.MenuManager;
 import tim.prune.gui.SelectorDisplay;
+import tim.prune.gui.SidebarController;
 import tim.prune.gui.StatusBar;
 import tim.prune.gui.Viewport;
 import tim.prune.gui.map.MapCanvas;
@@ -36,9 +36,9 @@ import tim.prune.gui.profile.ProfileChart;
 public class GpsPrune
 {
        /** Version number of application, used in about screen and for version check */
-       public static final String VERSION_NUMBER = "19.1";
+       public static final String VERSION_NUMBER = "19.2";
        /** Build number, just used for about screen */
-       public static final String BUILD_NUMBER = "363c";
+       public static final String BUILD_NUMBER = "363d";
        /** Static reference to App object */
        private static App APP = null;
 
index cd23dbdc724ba5c738666774a1f186c9458b6cc5..84e5fd7dc6b4a248bb1d2bef51f18be225f90425 100644 (file)
@@ -238,7 +238,9 @@ public abstract class Config
                return val;
        }
 
-       /** @return File from which config was loaded (or null) */
+       /**
+        * @return File from which config was loaded (or null)
+        */
        public static File getConfigFile()
        {
                return _configFile;
index 6a9f65fb1d5fdaf087d118e686fd4991fe0f5c75..b4b501b9ec917d6c5554c4b23e8446c06b0742a0 100644 (file)
@@ -126,16 +126,6 @@ public class AltitudeRange
                                _previousValue = altValue;
                                _gotPreviousValue = true;
                        }
-
-//                     if (!_empty)
-//                     {
-//                             if (altValue > _previousValue)
-//                                     _climb += (altValue - _previousValue);
-//                             else
-//                                     _descent += (_previousValue - altValue);
-//                     }
-//                     _previousValue = altValue;
-//                     _empty = false;
                }
        }
 
index ffcc95b04bcd2a5e7b34bb5fe0ad73eb973eac7b..41900cb8736df60d668238306079256bf2dca175 100644 (file)
@@ -68,16 +68,18 @@ public class FileInfo
         */
        public String getFilename()
        {
-               if (getNumFiles() == 1)
+               if (getNumFiles() == 1) {
                        return _sources.get(0).getName();
+               }
                return "";
        }
 
        /**
-        * @param inIndex index number
+        * @param inIndex index number, starting from zero
         * @return source info object
         */
-       public SourceInfo getSource(int inIndex) {
+       public SourceInfo getSource(int inIndex)
+       {
                return _sources.get(inIndex);
        }
 
@@ -88,7 +90,8 @@ public class FileInfo
         */
        public SourceInfo getSourceForPoint(DataPoint inPoint)
        {
-               for (SourceInfo source : _sources) {
+               for (SourceInfo source : _sources)
+               {
                        if (source.getIndex(inPoint) >= 0) {
                                return source;
                        }
@@ -96,6 +99,43 @@ public class FileInfo
                return null;
        }
 
+       /**
+        * @return the info about the last file loaded, if any
+        */
+       public SourceInfo getLastFileInfo()
+       {
+               if (getNumFiles() == 0)
+               {
+                       return null;
+               }
+               return getSource(getNumFiles()-1);
+       }
+
+       /**
+        * @return the most recent file title loaded, if any
+        */
+       public String getLastFileTitle()
+       {
+               final int numFiles = getNumFiles();
+               if (numFiles == 0)
+               {
+                       return null;
+               }
+               for (int i=(numFiles-1); i>=0; i--)
+               {
+                       SourceInfo info = getSource(i);
+                       if (info != null)
+                       {
+                               String title = info.getFileTitle();
+                               if (title != null && !title.equals(""))
+                               {
+                                       return title;
+                               }
+                       }
+               }
+               return null;
+       }
+
        /**
         * Clone contents of file info
         */
index 37d061bf66cb3318c68a41829f1f286c2a855cd5..13ecaade10d4e6a8d0eccc87a383762ae399cc00 100644 (file)
@@ -21,7 +21,7 @@ public class RangeStats
        private boolean _timesIncomplete = false;
        private boolean _timesOutOfSequence = false;
        private double _totalDistanceRads = 0.0, _movingDistanceRads = 0.0;
-       // Note, maximum speed is not calculated here, use the SpeedData method instead
+       // Note, maximum speed is not calculated here, use the SpeedData class instead
 
        private static final double STEEP_ANGLE = 0.15; // gradient steeper than 15% counts as steep
 
@@ -50,7 +50,8 @@ public class RangeStats
         */
        private boolean calculateStats(Track inTrack, int inStartIndex, int inEndIndex)
        {
-               _startIndex = inStartIndex;  _endIndex = inEndIndex;
+               _startIndex = inStartIndex;
+               _endIndex = inEndIndex;
                _numPoints = inEndIndex - inStartIndex + 1;
                _totalAltitudeRange  = new AltitudeRange();
                _movingAltitudeRange = new AltitudeRange();
@@ -70,7 +71,9 @@ public class RangeStats
                        // ignore all waypoints
                        if (p.isWaypoint()) continue;
 
-                       if (p.getSegmentStart()) {_numSegments++;}
+                       if (p.getSegmentStart()) {
+                               _numSegments++;
+                       }
                        // Get the distance to the previous track point
                        if (prevPoint != null)
                        {
index 5e40eee953e1f31bd7c7755a8201665810215b7c..d71280db8a5e45c28d594b0306b3b82c10797b16 100644 (file)
@@ -17,6 +17,8 @@ public class SourceInfo
        private String _sourceName = null;
        /** File type */
        private FILE_TYPE _fileType = null;
+       /** File title, if any */
+       private String _fileTitle = null;
 
        /** Array of datapoints */
        private DataPoint[] _points = null;
@@ -50,6 +52,14 @@ public class SourceInfo
                _fileType = inType;
        }
 
+       /**
+        * @param inTitle title of file, eg from <name> tag in gpx
+        */
+       public void setFileTitle(String inTitle)
+       {
+               _fileTitle = inTitle;
+       }
+
        /**
         * @return source file
         */
@@ -74,6 +84,14 @@ public class SourceInfo
                return _fileType;
        }
 
+       /**
+        * @return title of file
+        */
+       public String getFileTitle()
+       {
+               return _fileTitle;
+       }
+
        /**
         * @return number of points from this source
         */
index d4c909328262d526a9c499aa4f7723175d4b00e4..30f886173dc9844b1c45093ce5357a297cd8580d 100644 (file)
@@ -91,14 +91,17 @@ public class TimestampLocal extends Timestamp
        /**
         * Utility method for formatting dates / times
         * @param inFormat formatter object
-        * @param inTimezone timezone to use
+        * @param inTimezone timezone to use, or null
         * @return formatted String
         */
        @Override
        protected String format(DateFormat inFormat, TimeZone inTimezone)
        {
                Calendar cal = getCalendar(inTimezone);
-               inFormat.setTimeZone(inTimezone);
+               if (inTimezone != null)
+               {
+                       inFormat.setTimeZone(inTimezone);
+               }
                return inFormat.format(cal.getTime());
        }
 }
index 00d658828d38bf70e912d640caf85e4f7b824991..2b5b67d23a4343ff9534278dbb9a94767ccf7937 100644 (file)
@@ -306,7 +306,8 @@ public class TrackInfo
        {
                boolean firstTrackPoint = true;
                // Loop between start and end
-               for (int i=inStart; i<=inEnd; i++) {
+               for (int i=inStart; i<=inEnd; i++)
+               {
                        DataPoint point = _track.getPoint(i);
                        // Set all segments to false apart from first track point
                        if (point != null && !point.isWaypoint()) {
@@ -316,7 +317,9 @@ public class TrackInfo
                }
                // Find following track point, if any
                DataPoint nextPoint = _track.getNextTrackPoint(inEnd+1);
-               if (nextPoint != null) {nextPoint.setSegmentStart(true);}
+               if (nextPoint != null) {
+                       nextPoint.setSegmentStart(true);
+               }
                _selection.markInvalid();
                UpdateMessageBroker.informSubscribers();
                return true;
@@ -353,8 +356,10 @@ public class TrackInfo
        public void incrementPointIndex(int inPointIncrement)
        {
                int index = _selection.getCurrentPointIndex() + inPointIncrement;
-               if (index < 0) index = 0;
-               else if (index >= _track.getNumPoints()) index = _track.getNumPoints()-1;
+               if (index < 0)
+                       index = 0;
+               else if (index >= _track.getNumPoints())
+                       index = _track.getNumPoints()-1;
                selectPoint(index);
        }
 
@@ -364,7 +369,9 @@ public class TrackInfo
         */
        public void selectPoint(int inPointIndex)
        {
-               if (_selection.getCurrentPointIndex() == inPointIndex || inPointIndex >= _track.getNumPoints()) {return;}
+               if (_selection.getCurrentPointIndex() == inPointIndex || inPointIndex >= _track.getNumPoints()) {
+                       return;
+               }
                DataPoint selectedPoint = _track.getPoint(inPointIndex);
                // get the index of the current photo
                int photoIndex = _selection.getCurrentPhotoIndex();
@@ -397,7 +404,9 @@ public class TrackInfo
         */
        public void selectPhoto(int inPhotoIndex)
        {
-               if (_selection.getCurrentPhotoIndex() == inPhotoIndex) {return;}
+               if (_selection.getCurrentPhotoIndex() == inPhotoIndex) {
+                       return;
+               }
                // Photo is primary selection here, not as a result of a point selection
                // Therefore the photo selection takes priority, deselecting point if necessary
                // Find Photo object
@@ -426,11 +435,13 @@ public class TrackInfo
                // Has the new point got an audio clip?
                DataPoint selectedPoint = _track.getPoint(pointIndex);
                int audioIndex = _selection.getCurrentAudioIndex();
-               if (selectedPoint != null && selectedPoint.getAudio() != null) {
+               if (selectedPoint != null && selectedPoint.getAudio() != null)
+               {
                        // New point has an audio, so select it
                        audioIndex = _audioList.getAudioIndex(selectedPoint.getAudio());
                }
-               else if (currPoint != null && selectedPoint != currPoint && currPoint.getAudio() != null) {
+               else if (currPoint != null && selectedPoint != currPoint && currPoint.getAudio() != null)
+               {
                        // Old point had an audio, so deselect it
                        audioIndex = -1;
                }
@@ -444,7 +455,9 @@ public class TrackInfo
         */
        public void selectAudio(int inAudioIndex)
        {
-               if (_selection.getCurrentAudioIndex() == inAudioIndex) {return;}
+               if (_selection.getCurrentAudioIndex() == inAudioIndex) {
+                       return;
+               }
                // Audio selection takes priority, deselecting point if necessary
                AudioClip audio = _audioList.getAudio(inAudioIndex);
                int pointIndex = _selection.getCurrentPointIndex();
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 801adbb0137e61575d7d00d5468a4e115425c867..aa25dbcd939e39b96a6642f188b68665d4c74c4f 100644 (file)
@@ -1076,7 +1076,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
        {
                if (_track != null && _track.getNumPoints() > 0)
                {
-                        // select point if it's a left-click
+                       // select point if it's a left-click
                        if (!inE.isMetaDown())
                        {
                                if (inE.getClickCount() == 1)
@@ -1269,9 +1269,27 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
         */
        public void mouseDragged(MouseEvent inE)
        {
-               if (!inE.isMetaDown())
+               // Note: One would expect inE.isMetaDown() to give information about whether this is a
+               //       drag with the right mouse button or not - but since java 9 this is buggy,
+               //       so we use the beautifully-named getModifiersEx() instead.
+               //       And logically BUTTON3 refers to the secondary mouse button, not the tertiary one!
+               final boolean isRightDrag = (inE.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) > 0;
+               if (isRightDrag)
+               {
+                       // Right-click and drag - update rectangle
+                       _drawMode = MODE_ZOOM_RECT;
+                       if (_dragFromX == -1) {
+                               _dragFromX = inE.getX();
+                               _dragFromY = inE.getY();
+                       }
+                       _dragToX = inE.getX();
+                       _dragToY = inE.getY();
+                       repaint();
+               }
+               else
                {
-                       // Left mouse drag - either drag the point or pan the map
+                       // Left mouse drag - decide whether to drag the point, drag the
+                       // marking rectangle or pan the map
                        if (_drawMode == MODE_DRAG_POINT || _drawMode == MODE_CREATE_MIDPOINT)
                        {
                                // move point
@@ -1302,18 +1320,6 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
                                _dragFromY = _dragToY = inE.getY();
                        }
                }
-               else
-               {
-                       // Right-click and drag - update rectangle
-                       _drawMode = MODE_ZOOM_RECT;
-                       if (_dragFromX == -1) {
-                               _dragFromX = inE.getX();
-                               _dragFromY = inE.getY();
-                       }
-                       _dragToX = inE.getX();
-                       _dragToY = inE.getY();
-                       repaint();
-               }
        }
 
        /**
index b7a08fcf8d7d19b2314129ed66900b06bc01f460..c4e294665e128def7d1fcbfb048cb516624d5d00 100644 (file)
@@ -89,7 +89,7 @@ public abstract class MapSource
                // check prefix
                try
                {
-                       urlOk = new URL(urlstr.replace('[', 'w').replace(']', 'w')) != null;
+                       urlOk = new URL(urlstr.replace('[', 'w').replace(']', 'w')).toString() != null;
                }
                catch (MalformedURLException e)
                {
index 5f44d5e64d4b757b012667cd2781c912cef325f9..331d8fe94007b27045cc53b15920cd3270be8df3 100644 (file)
@@ -38,14 +38,9 @@ public abstract class MapSourceLibrary
         */
        private static void addFixedSources()
        {
-               final String THUNDERFOREST_APIKEY = "c32212f10b13496786b98dc6c42e5c3c";
-               _sourceList.add(new OsmMapSource("Mapnik", "http://[abc].tile.openstreetmap.org/"));
-               OsmMapSource cycleSource = new OsmMapSource("OpenCycleMap", "http://[abc].tile.thunderforest.com/cycle/");
-               cycleSource.setApiKey(THUNDERFOREST_APIKEY);
-               _sourceList.add(cycleSource);
-               OsmMapSource outdoorsSource = new OsmMapSource("Outdoors", "http://[abc].tile.thunderforest.com/outdoors/");
-               outdoorsSource.setApiKey(THUNDERFOREST_APIKEY);
-               _sourceList.add(outdoorsSource);
+               _sourceList.add(new OsmMapSource("Mapnik", "https://[abc].tile.openstreetmap.org/"));
+               _sourceList.add(new OsmMapSource("Cycling Trails", "https://[abc].tile.openstreetmap.org/", "png",
+                       "https://tile.waymarkedtrails.org/cycling/", "png", 18));
                _sourceList.add(new OsmMapSource("Reitkarte", "http://topo[234].wanderreitkarte.de/topo/"));
                _sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
                        "http://maps-for-free.com/layer/water/", "gif", 11));
index fde7a734ebb1b3fae20f2246e5726d5f7d5597d6..e6d686078ba049b2642ae823d1117864284c7df3 100644 (file)
@@ -127,7 +127,6 @@ function.rearrangephotos=J\u00e4rjest\u00e4 kuvat...
 function.rotatephotoleft=Kierr\u00e4 kuvaa vasemmalle
 function.rotatephotoright=Kierr\u00e4 kuvaa oikealle
 function.photopopup=N\u00e4yt\u00e4 kuvaikkunassa
-function.ignoreexifthumb=Ignore exif thumbnail
 function.loadaudio=Lis\u00e4\u00e4 \u00e4\u00e4nileikkeet...
 function.removeaudio=Poista \u00e4\u00e4nileike
 function.correlateaudios=Korreloi \u00e4\u00e4net
@@ -205,12 +204,9 @@ dialog.gpsbabel.filter.discard.intro=Hylk\u00e4\u00e4 pisteet, jos
 dialog.gpsbabel.filter.discard.hdop=Hdop >
 dialog.gpsbabel.filter.discard.vdop=Vdop >
 dialog.gpsbabel.filter.discard.numsats=Sateliittien lukum\u00e4\u00e4r\u00e4 <
-dialog.gpsbabel.filter.discard.nofix=Point has no fix
-dialog.gpsbabel.filter.discard.unknownfix=Point has unknown fix
 dialog.gpsbabel.filter.simplify.intro=Poista pisteit\u00e4, kunnes
 dialog.gpsbabel.filter.simplify.maxpoints=Pisteiden m\u00e4\u00e4r\u00e4 <
 dialog.gpsbabel.filter.simplify.maxerror=tai virhev\u00e4limatka <
-dialog.gpsbabel.filter.simplify.crosstrack=cross-track
 dialog.gpsbabel.filter.simplify.length=pituusero
 dialog.gpsbabel.filter.simplify.relative=suhteessa hdop:iin
 dialog.gpsbabel.filter.distance.intro=Poista sellaiset pisteet, jotka l\u00e4hell\u00e4 jotain edellist\u00e4 pistett\u00e4
@@ -275,7 +271,6 @@ dialog.pointtype.track=Reittipisteet
 dialog.pointtype.waypoint=Kohdepisteet
 dialog.pointtype.photo=Kuvien pisteet
 dialog.pointtype.audio=\u00c4\u00e4nien pisteet
-dialog.pointtype.selection=Just selection
 dialog.confirmreversetrack.title=Vahvista k\u00e4\u00e4nteisj\u00e4rjest\u00e4minen
 dialog.confirmreversetrack.text=T\u00e4m\u00e4 reitti sis\u00e4lt\u00e4\u00e4 aikaleimoja, joiden aikaj\u00e4rjestys ei ole oikea pisteiden k\u00e4\u00e4teisj\u00e4rjestelyn j\u00e4lkeen.\nHaluatko varmasti k\u00e4\u00e4nteisj\u00e4rjest\u00e4\u00e4 t\u00e4m\u00e4n alueen?
 dialog.confirmcutandmove.title=Vahvista leikkaa ja siirr\u00e4
@@ -370,7 +365,6 @@ dialog.gpsies.nonefound=Reittej\u00e4 ei l\u00f6ytynyt
 dialog.gpsies.username=Gpsies.com:n k\u00e4ytt\u00e4j\u00e4nimi
 dialog.gpsies.password=Gpsies.com:n salasana
 dialog.gpsies.keepprivate=Pid\u00e4 reitti yksityisen\u00e4
-dialog.gpsies.confirmopenpage=Open the web page for the uploaded track?
 dialog.gpsies.activities=Aktiviteettityypit
 dialog.gpsies.activity.trekking=Patikointi
 dialog.gpsies.activity.walking=K\u00e4vely
@@ -548,12 +542,10 @@ dialog.diskcache.createdir=Luodaanko hakemisto
 dialog.diskcache.nocreate=V\u00e4limuistin hakemistoa ei luotu
 dialog.diskcache.cannotwrite=Karttapaloja ei voida tallentaa valittuun hakemistoon
 dialog.diskcache.table.path=Hakemistoolku
-dialog.diskcache.table.usedby=Used by
 dialog.diskcache.table.zoom=Zoom
 dialog.diskcache.table.tiles=Tiles
 dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Tileset
-dialog.diskcache.tileset.multiple=multiple
 dialog.diskcache.deleteold=Poista vanhan karttapalat
 dialog.diskcache.maximumage=Enimm\u00e4isik\u00e4 (p\u00e4ivi\u00e4)
 dialog.diskcache.deleteall=Poista kaikki kartapalat
@@ -620,27 +612,9 @@ dialog.3d.altitudefactor=Korkeuden liioittelukerroin
 
 # Confirm messages
 confirm.loadfile=Paikkatieto ladattu tiedostosta
-confirm.save.ok1=Successfully saved
-confirm.save.ok2=points to file
-confirm.deletepoint.single=data point was removed
-confirm.deletepoint.multi=data points were removed
-confirm.point.edit=point edited
-confirm.mergetracksegments=Track segments merged
-confirm.reverserange=Range reversed
-confirm.addtimeoffset=Time offset added
-confirm.addaltitudeoffset=Altitude offset added
 confirm.rearrangewaypoints=Kohdepisteet j\u00e4rjestetty uudelleen
 confirm.rearrangephotos=Kuvat j\u00e4rjestetty uudelleen
-confirm.splitsegments=%d segment splits were made
-confirm.sewsegments=%d segment joins were made
-confirm.cutandmove=Selection moved
-confirm.interpolate=Points added
 confirm.convertnamestotimes=V\u00e4lipisteiden nimet muunnettu
-confirm.saveexif.ok=Saved %d photo files
-confirm.undo.single=operation undone
-confirm.undo.multi=operations undone
-confirm.jpegload.single=photo was added
-confirm.jpegload.multi=photos were added
 confirm.media.connect=media liitetty
 confirm.photo.disconnect=kuva liitt\u00e4m\u00e4t\u00e6n
 confirm.audio.disconnect=\u00e4\u00e4ni liitt\u00e4m\u00e4t\u00e6n
@@ -755,7 +729,6 @@ details.photo.loading=Lataan
 details.photo.bearing=Suunta
 details.media.connected=Liitetty
 details.media.fullpath=Tiedostopolku
-details.audiodetails=Audio details
 details.noaudio=\u00c4\u00e4nileikett\u00e4 ei valittuna
 details.audio.file=\u00c4\u00e4nitiedosto
 details.audio.playing=toistetaan...
@@ -819,9 +792,9 @@ logic.and=ja
 logic.or=tai
 
 # External urls
-url.googlemaps=maps.google.co.uk
-wikipedia.lang=en
-openweathermap.lang=en
+url.googlemaps=maps.google.fi
+wikipedia.lang=fi
+openweathermap.lang=fi
 webservice.peakfinder=Avaa Peakfinder.org
 webservice.geohack=Avaa Geohack-sivu
 
@@ -858,7 +831,6 @@ undo.rearrangephotos=j\u00e4rjest\u00e4 kuvat
 undo.rotatephoto=kierr\u00e4 kuvaa
 undo.createpoint=luo piste
 undo.convertnamestotimes=muunna nimet ajoiksi
-undo.lookupsrtm=lookup altitudes from SRTM
 undo.deletefieldvalues=poista kentt\u00e4arvot
 undo.correlateaudios=korreloi \u00e4\u00e4nileikkeet
 
index 1981fc5273ff4e0ca030cf14508bcde2fd030c5f..eb0a727c3f4141d3f5024dff42205efab37ee0d1 100644 (file)
@@ -146,6 +146,7 @@ function.diskcache=Zapisz mapy na dysk
 function.managetilecache=Zarz\u0105dzaj keszem p\u0142ytek
 function.getweatherforecast=Pobierz prognoz\u0119 pogody
 function.setaltitudetolerance=Ustaw tolerancj\u0119 wysoko\u015bci
+function.selecttimezone=Ustaw stref\u0119 czasow\u0105
 
 # Dialogs
 dialog.exit.confirm.title=Zako\u0144cz GpsPrune
@@ -383,6 +384,7 @@ dialog.wikipedia.column.name=Tytu\u0142 artyku\u0142u
 dialog.wikipedia.column.distance=Odleg\u0142o\u015b\u0107
 dialog.wikipedia.nonefound=Brak wpis\u00f3w w wikipedii
 dialog.wikipedia.gallery=Galeria
+dialog.osmpois.column.name=Nazwa
 dialog.geocaching.nonefound=Nic nie zosta\u0142o znalezione
 dialog.correlate.notimestamps=Punkty nie maj\u0105 znacznik\u00f3w czasu, nie mo\u017cna ich powi\u0105za\u0107 ze zdj\u0119ciami.
 dialog.correlate.nouncorrelatedphotos=Nie ma nie powi\u0105zanych zdj\u0119\u0107.\nCzy na pewno chcesz kontynuowa\u0107?
@@ -442,7 +444,7 @@ dialog.deletemarked.nonefound=Nie mo\u017cna usun\u0105\u0107 \u017cadnych punkt
 dialog.pastecoordinates.desc=Wprowad\u017a lub wklej wsp\u00f3\u0142rz\u0119dne
 dialog.pastecoordinates.coords=Wsp\u00f3\u0142rz\u0119dne
 dialog.pastecoordinates.nothingfound=Sprawd\u017a wsp\u00f3\u0142rz\u0119dne i spr\u00f3buj jeszcze raz
-dialog.help.help=Na stronie\nhttp://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
+dialog.help.help=Na stronie\nhttps://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
 dialog.about.version=Wersja
 dialog.about.build=Build
 dialog.about.summarytext1=GpsPrune s\u0142u\u017cy do pobierania, wy\u015bwietlania i edycji danych z odbiornik\u00f3w GPS.
@@ -476,7 +478,7 @@ dialog.checkversion.newversion1=Dost\u0119pna jest nowa wersja GpsPrune! Najnows
 dialog.checkversion.newversion2=.
 dialog.checkversion.releasedate1=Nowa wersja zosta\u0142a opublikowana
 dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Aby \u015bci\u0105gn\u0105\u0107 now\u0105 wersj\u0119 przejd\u017a na http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Aby \u015bci\u0105gn\u0105\u0107 now\u0105 wersj\u0119 przejd\u017a na https://gpsprune.activityworkshop.net/download.html.
 dialog.keys.intro=U\u017cuwaj nast\u0119puj\u0105cych klawiszy skr\u00f3t\u00f3w zamiast myszki
 dialog.keys.keylist=<table><tr><td>klawisze strza\u0142ek</td><td>Przesuwa map\u0119 w lewo, w prawo, w g\u00f3r\u0119, w d\u00f3\u0142</td></tr><tr><td>Ctrl + lewa, prawa strza\u0142ka</td><td>Wybierz punkt poprzedni lub nast\u0119pny</td></tr><tr><td>Ctrl + strza\u0142ka w g\u00f3r\u0119, w d\u00f3\u0142</td><td>Powi\u0119ksz, pomniejsz</td></tr><tr><td>Del</td><td>Usun bie\u017c\u0105cy punkt</td></tr></table>
 dialog.keys.normalmodifier=Ctrl
@@ -591,6 +593,7 @@ dialog.deletebydate.column.keep=Zostaw
 dialog.deletebydate.column.delete=Usu\u0144
 dialog.setaltitudetolerance.text.metres=Limit (w metrach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
 dialog.setaltitudetolerance.text.feet=Limit (w stopach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
+dialog.settimezone.selectedzone=Wybrana strefa czasowa
 dialog.autoplay.duration=Czas trwania (sek)
 dialog.autoplay.usetimestamps=U\u017Cyj znacznik\u00f3w czasowych
 dialog.autoplay.rewind=Przewin\u0105\u0107
index 7b227d230531edb1c2d775a93de689f3717ac35b..d149f98baa82de4fd77e0a37ca0bc27cb36fb912 100644 (file)
@@ -7,15 +7,11 @@ menu.file.addphotos=L\u00e4gg till foto
 menu.file.recentfiles=Senaste filer
 menu.file.save=Spara som text
 menu.file.exit=Avsluta
+menu.online=Online
 menu.track=Sp\u00e5r
 menu.track.undo=\u00c5ngra
 menu.track.clearundo=Rensa \u00e5ngra-historik
 menu.track.markrectangle=Markera punkter i rektangel
-function.deletemarked=Radera markerade punkter
-function.rearrangewaypoints=Ordna waypoints
-dialog.rearrange.tostart=Alla till b\u00f6rjan av fil
-dialog.rearrange.toend=Alla till slut av fil
-dialog.rearrange.tonearest=Varje till n\u00e4rmaste sp\u00e5rpunkt
 menu.range=Intervall
 menu.range.all=V\u00e4lj alla
 menu.range.none=V\u00e4lj ingen
@@ -43,6 +39,7 @@ menu.settings=Inst\u00e4llningar
 menu.settings.onlinemode=H\u00e4mta kartor fr\u00e5n Internet
 menu.settings.autosave=Autospara inst\u00e4llningar vid avslut
 menu.help=Hj\u00e4lp
+
 # Popup menu for map
 menu.map.zoomin=Zooma ut
 menu.map.zoomout=Zooma in
@@ -57,6 +54,7 @@ menu.map.editmode=Redigeringsl\u00e4ge
 
 # Alt keys for menus
 altkey.menu.file=A
+altkey.menu.online=N
 altkey.menu.track=S
 altkey.menu.range=I
 altkey.menu.point=P
@@ -71,6 +69,7 @@ shortcut.menu.file.open=O
 shortcut.menu.file.load=L
 shortcut.menu.file.save=S
 shortcut.menu.track.undo=Z
+shortcut.menu.track.compress=K
 shortcut.menu.range.all=A
 shortcut.menu.help.help=H
 
@@ -85,17 +84,334 @@ function.exportpov=Exportera POV
 function.exportimage=Exportera bildfil
 function.editwaypointname=Redigera namn p\u00e5 waypoint
 function.compress=Komprimera sp\u00e5r
+function.deletemarked=Radera markerade punkter
+function.marklifts=Markera liftar
 function.deleterange=Radera intervall
 function.croptrack=Besk\u00e4r sp\u00e5r till intervall
 function.interpolate=Interpolera punkter
+function.deletebydate=Ta bort punkter datumvis
 function.addtimeoffset=Infoga tidsoffset
 function.addaltitudeoffset=Infoga h\u00f6jdoffset
+function.rearrangewaypoints=Ordna waypoints
 function.convertnamestotimes=Omvandla waypointnamn till tidpunkter
+function.deletefieldvalues=Ta bort f\u00e4lt-v\u00e4rden
 function.findwaypoint=S\u00f6k waypoint
 function.pastecoordinates=Infoga koordinater
 function.charts=Diagram
 function.show3d=3D-vy
 function.distances=Avst\u00e5nd
+function.fullrangedetails=Alla intevall-detaljer
 function.estimatetime=Uppskatta tid
+function.learnestimationparams=L\u00e4r upp tidsuppskattningsparametrar
+function.setmapbg=V\u00e4lj bakgrundskarta
+function.setpaths=V\u00e4lj s\u00f6kv\u00e4gar f\u00f6r program
+function.selectsegment=Markera aktuellt segment
+function.splitsegments=Dela upp sp\u00e5ret i segment
+function.sewsegments=Sy ihop sp\u00e5r-segment
+function.createmarkerwaypoints=Skapa markerings-waypoints
+function.getgpsies=H\u00e4mta Gpsies-sp\u00e5r
+function.uploadgpsies=Ladda upp sp\u00e5r till Gpsies
+function.lookupsrtm=H\u00e4mta h\u00f6jddata fr\u00e5n SRTM
+function.downloadsrtm=Ladda ner SRTM-h\u00f6jddata
+function.getwikipedia=H\u00e4mta n\u00e4rliggande Wikipedia-artiklar
+function.searchwikipedianames=S\u00f6k i Wikipedia p\u00e5 namn
+function.searchosmpois=H\u00e4mta n\u00e4rliggande OSM-punkter
+function.searchopencachingde=S\u00f6k p\u00e5 OpenCaching.de
+function.mapillary=S\u00f6k efter foton i Mapillary
+function.downloadosm=Ladda ner OSM-data f\u00f6r omr\u00e5det
+function.duplicatepoint=Duplicera punkt
+function.setcolours=V\u00e4lj f\u00e4rger
+function.setdisplaysettings=V\u00e4lj visningsalternativ
+function.setlanguage=V\u00e4lj spr\u00e5k
+function.connecttopoint=Koppla till punkt
+function.disconnectfrompoint=Ta bort koppling till punkt
+function.removephoto=Ta bort foto
+function.correlatephotos=Korrelera foton
+function.rearrangephotos=Arrangera om foton
+function.rotatephotoleft=Rotera foto moturs
+function.rotatephotoright=Rotera foto medurs
+function.photopopup=Visa foto i eget f\u00f6nster
+function.ignoreexifthumb=Ignorera miniatyrbild i exif
+function.loadaudio=L\u00e4gg till ljudklipp
+function.removeaudio=Ta bort ljudklipp
+function.correlateaudios=Korrelera ljudklipp
+function.playaudio=Spela upp ljudklipp
+function.stopaudio=Stoppa ljudklipp
+function.help=Hj\u00e4lp
+function.showkeys=Visa snabbkommandon
+function.about=Om GpsPrune
+function.checkversion=Kolla efter ny version
+function.saveconfig=Spara inst\u00e4llningar
+function.diskcache=Spara kartor p\u00e5 h\u00e5rddisken
+function.managetilecache=Hantera kart-cache
+function.getweatherforecast=H\u00e4mta v\u00e4derprognos
+function.setaltitudetolerance=S\u00e4tt toleransniv\u00e5 f\u00f6r h\u00f6jd
+function.selecttimezone=V\u00e4lj tidszon
+
+# Dialogs
+dialog.exit.confirm.title=Avsluta GpsPrune
+dialog.exit.confirm.text=Ditt arbete har inte sparats \u00e4n. \u00c4r du s\u00e4ker p\u00e5 att du vill avsluta?
+dialog.openappend.title=L\u00e4gg till datan till existerande data
+dialog.openappend.text=L\u00e4gg till denna datan till datan som redan \u00e4r laddad?
+dialog.deletepoint.title=Ta bort punkt
+dialog.deletepoint.deletephoto=Ta bort fotot som \u00e4r bifogat till denna punkt?
+dialog.deletephoto.title=Ta bort foto
+dialog.deletephoto.deletepoint=Ta bort punkten som \u00e4r bifogad till detta foto?
+dialog.deleteaudio.deletepoint=Ta bort punkten som \u00e4r bifogad till detta ljudklipp?
+dialog.openoptions.title=\u00d6ppna inst\u00e4llningar
+dialog.openoptions.filesnippet=Filextrakt
+dialog.load.table.field=F\u00e4lt
+dialog.load.table.datatype=Datatyp
+dialog.load.table.description=Beskrivning
+dialog.delimiter.comma=Komma ,
+dialog.delimiter.space=Mellanslag
+dialog.delimiter.other=Annat
+dialog.openoptions.altitudeunits=H\u00f6jdenhet
+dialog.openoptions.speedunits=Hastighetsenheter
+dialog.openoptions.vertspeedunits=Enheter f\u00f6r vertikal hastighet
+dialog.openoptions.vspeed.positiveup=Positiv hastighet upp\u00e5t
+dialog.openoptions.vspeed.positivedown=Positiv hastighet ned\u00e5t
+dialog.open.contentsdoubled=Denna filen inneh\u00e5ller tv\u00e5 kopior av varje punkt,\nen g\u00e5ng som waypoint och en g\u00e5ng som punkt i ett sp\u00e5r.
+dialog.selecttracks.intro=V\u00e4lj sp\u00e5r att ladda in
+dialog.selecttracks.noname=Namnl\u00f6s
+dialog.jpegload.subdirectories=Inkludera undermappar
+dialog.jpegload.loadjpegswithoutcoords=Inkludera foton utan koordinater
+dialog.jpegload.loadjpegsoutsidearea=Inkludera foton utanf\u00f6r aktuellt omr\u00e5de
+dialog.jpegload.progress.title=Laddar in foton
+dialog.jpegload.progress=V\u00e4nta medan foton s\u00f6ks
+dialog.gpsload.nogpsbabel=Inget GPSBabel-program kunde hittas. Forts\u00e4tt \u00e4nd\u00e5?
+dialog.gpsload.format=Format
+dialog.gpsload.getwaypoints=Ladda in waypoints
+dialog.gpsload.gettracks=Ladda in sp\u00e5r
+dialog.gpsload.save=Spara till fil
+dialog.gpssend.sendwaypoints=Skicka waypoints
+dialog.gpssend.sendtracks=Skicka sp\u00e5r
+dialog.gpssend.trackname=Namn p\u00e5 sp\u00e5r
+dialog.gpsbabel.filters=Filter
+dialog.addfilter.title=L\u00e4gg till filter
+dialog.gpsbabel.filter.discard=Skippa
+dialog.gpsbabel.filter.simplify=F\u00f6renkla
+dialog.gpsbabel.filter.distance=Avst\u00e5nd
+dialog.gpsbabel.filter.interpolate=Interpolera
+dialog.gpsbabel.filter.discard.intro=Skippa punkter om
+dialog.gpsbabel.filter.discard.numsats=Antal satelliter <
+dialog.gpsbabel.filter.simplify.intro=Ta bort punkter tills
+dialog.gpsbabel.filter.simplify.maxpoints=Antal punkter <
+dialog.gpsbabel.filter.simplify.length=l\u00e4ngdskillnad
+dialog.gpsbabel.filter.distance.intro=Ta bort punkter n\u00e4ra f\u00f6reg\u00e5ende punkter
+dialog.gpsbabel.filter.distance.distance=Om avst\u00e5ndet <
+dialog.gpsbabel.filter.distance.time=och tidsskillnaden <
+dialog.gpsbabel.filter.interpolate.intro=L\u00e4gg till extra punkter inemellan sp\u00e5rets punkter
+dialog.gpsbabel.filter.interpolate.distance=Om avst\u00e5ndet >
+dialog.gpsbabel.filter.interpolate.time=eller tidsskillnaden >
+dialog.saveoptions.title=Spara fil
+dialog.save.fieldstosave=F\u00e4lt att spara
+dialog.save.table.field=F\u00e4lt
+dialog.save.table.hasdata=Har data
+dialog.save.table.save=Spara
+dialog.save.headerrow=Skriv ut titelrad
+dialog.save.coordinateunits=Koordinat-format
+dialog.save.altitudeunits=H\u00f6jdenhet
+dialog.save.timestampformat=Tidsst\u00e4mpel-format
+dialog.save.overwrite.title=Filen existerar redan
+dialog.save.overwrite.text=Denna filen existerar redan. \u00c4r du s\u00e4ker p\u00e5 att du vill skriva \u00f6ver den?
+dialog.save.notypesselected=Inga punkt-typer har valts
+dialog.exportkml.text=Titel f\u00f6r datan
+dialog.exportkml.altitude=Absolut h\u00f6jddata (f\u00f6r flyg)
+dialog.exportkml.kmz=Komprimera till kmz-fil
+dialog.exportkml.imagesize=Bild-storlek
+dialog.exportkml.trackcolour=F\u00e4rg p\u00e5 sp\u00e5r
+dialog.exportkml.standardkml=Standard KML
+dialog.exportkml.extendedkml=KML ut\u00f6kad med tidsst\u00e4mplar
+dialog.exportgpx.name=Namn
+dialog.exportgpx.desc=Beskrivning
+dialog.exportgpx.includetimestamps=Inkludera tidsst\u00e4mplar
+dialog.exportgpx.copysource=Kopiera k\u00e4ll-xml
+dialog.exportgpx.encoding=Teckenkodning
+dialog.exportgpx.encoding.system=System
+dialog.exportgpx.encoding.utf8=UTF-8
+dialog.exportpov.text=Fyll i parametrar f\u00f6r POV-export
+dialog.exportpov.font=Font
+dialog.exportpov.camerax=Kamera X
+dialog.exportpov.cameray=Kamera Y
+dialog.exportpov.cameraz=Kamera Z
+dialog.exportpov.modelstyle=Modell-typ
+dialog.exportpov.ballsandsticks=Kulor och stavar
+dialog.exportpov.tubesandwalls=R\u00f6r och v\u00e4ggar
+dialog.3d.warningtracksize=Detta sp\u00e5r har v\u00e4ldigt m\u00e5nga punkter som Java3D kan ha problem med att visa.\n\u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?
+dialog.3d.useterrain=Visa terr\u00e4ng
+dialog.3d.terraingridsize=Storlek p\u00e5 rutn\u00e4t
+dialog.exportpov.baseimage=Bild f\u00f6r basplanet
+dialog.exportpov.cannotmakebaseimage=Kunde inte skriva bild f\u00f6r basplanet
+dialog.baseimage.title=Kart-bild
+dialog.baseimage.useimage=Anv\u00e4nd bild
+dialog.baseimage.mapsource=Kart-k\u00e4lla
+dialog.baseimage.zoom=Zoom-niv\u00e5
+dialog.baseimage.incomplete=Bilden ofullst\u00e4ndig
+dialog.baseimage.tiles=Rutor
+dialog.baseimage.size=Bild-storlek
+dialog.exportimage.noimagepossible=Kart-bilder m\u00e5ste cachas f\u00f6r att kunna anv\u00e4nda dom i en export.
+dialog.exportimage.drawtrack=Rita ut sp\u00e5ret p\u00e5 kartan
+dialog.exportimage.drawtrackpoints=Rita ut sp\u00e5r-punkterna
+dialog.exportimage.textscalepercent=Textstorleksfaktor (%)
+dialog.pointtype.desc=Spara f\u00f6ljande punkt-typer:
+dialog.pointtype.track=Sp\u00e5r-punkter
+dialog.pointtype.waypoint=Waypoints
+dialog.pointtype.photo=Foto-punkter
+dialog.pointtype.audio=Ljud-punkter
+dialog.pointtype.selection=Endast markerat omr\u00e5de
+dialog.confirmreversetrack.title=Bekr\u00e4fta riktningsbyte p\u00e5 sp\u00e5ret
+dialog.confirmreversetrack.text=Detta sp\u00e5r inneh\u00e5ller tidsst\u00e4mplar som kommer hamna i oordning efter en v\u00e4ndning av sp\u00e5r-sektionen.\n\u00c4r du s\u00e4ker p\u00e5 att du vill v\u00e4nda riktning p\u00e5 denna sp\u00e5r-sektion?
+dialog.confirmcutandmove.title=Bekr\u00e4fta urklippning och flytt
+dialog.confirmcutandmove.text=Detta sp\u00e5r inneh\u00e5ller tidsst\u00e4mplar som kommer hamna i oordning efter en flytt av sp\u00e5r-sektionen.\n\u00c4r du s\u00e4ker p\u00e5 att du vill flytta sp\u00e5r-sektionen?
+dialog.interpolate.parameter.text=Antal punkter att infoga mellan varje nuvarande punkt
+dialog.interpolate.betweenwaypoints=Interpolera mellan waypoints?
+dialog.undo.title=\u00c5ngra \u00e4ndring(ar)
+dialog.undo.pretext=V\u00e4lj \u00e4ndring(ar) att \u00e5ngra
+dialog.undo.none.title=Kan inte \u00e5ngra
+dialog.undo.none.text=Inga \u00e4ndringar att \u00e5ngra!
+dialog.clearundo.title=T\u00f6m \u00e5ngringslistan
+dialog.clearundo.text=\u00c4r du s\u00e4ker p\u00e5 att du vill t\u00f6mma \u00e5ngringslistan?\nAll \u00e5ngerinformation kommer att f\u00f6rsvinna!
+dialog.pointedit.title=Redigera punkt
+dialog.pointedit.intro=V\u00e4lj varje f\u00e4lt var f\u00f6r sig f\u00f6r att se och \u00e4ndra v\u00e4rde
+dialog.pointedit.table.field=F\u00e4lt
+dialog.pointedit.nofield=Inget f\u00e4lt valt
+dialog.pointedit.table.value=V\u00e4rde
+dialog.pointnameedit.name=Waypoint-namn
+dialog.pointnameedit.uppercase=STORA BOKST\u00c4VER
+dialog.pointnameedit.lowercase=sm\u00e5 bokst\u00e4ver
+dialog.pointnameedit.titlecase=F\u00f6rsta Stor
+dialog.addtimeoffset.add=L\u00e4gg till tid
+dialog.addtimeoffset.subtract=Dra ifr\u00e5n tid
+dialog.addtimeoffset.days=Dagar
+dialog.addtimeoffset.hours=Timmar
+dialog.addtimeoffset.minutes=Minuter
+dialog.addtimeoffset.notimestamps=Kan inte utf\u00f6ra en tidsoffset eftersom detta intervall inte inneh\u00e5ller n\u00e5gra tidsst\u00e4mplar
+dialog.findwaypoint.intro=Fyll i del av waypoint-namnet
+dialog.findwaypoint.search=S\u00f6k
+dialog.saveexif.title=Spara Exif
+dialog.saveexif.intro=V\u00e4lj foton att spara med kryssrutorna
+dialog.saveexif.nothingtosave=Koordinat-data of\u00f6r\u00e4ndrat, ingen \u00e4ndring att spara
+dialog.saveexif.noexiftool=Inget exiftool-program kunde hittas. Forts\u00e4tt?
+dialog.saveexif.table.photoname=Foto-namn
+dialog.saveexif.table.status=Status
+dialog.saveexif.table.save=Spara
+dialog.saveexif.photostatus.connected=Kopplad
+dialog.saveexif.photostatus.disconnected=Bortkopplad
+dialog.saveexif.photostatus.modified=\u00c4ndrad
+dialog.saveexif.overwrite=Skriv \u00f6ver filer
+dialog.saveexif.force=Tvinga trots mindre fel
+dialog.charts.xaxis=X-axel
+dialog.charts.yaxis=Y-axlar
+dialog.charts.output=Utdata
+dialog.charts.screen=Utdata till bildsk\u00e4rm
+dialog.charts.svg=Utdata till SVG-fil
+dialog.charts.svgwidth=SVG bredd
+dialog.charts.svgheight=SVG h\u00f6jd
+dialog.charts.needaltitudeortimes=Sp\u00e5ret m\u00e5ste ha antingen h\u00f6jd- eller tidsdata f\u00f6r att kunna skapa grafer
+dialog.charts.gnuplotnotfound=Kunde inte hitta gnuplot p\u00e5 angiven s\u00f6kv\u00e4g
+dialog.distances.intro=F\u00e5gelv\u00e4g mellan punkter
+dialog.distances.column.from=Fr\u00e5n punkt
+dialog.distances.column.to=Till punkt
+dialog.distances.currentpoint=Nuvarande punkt
+dialog.distances.toofewpoints=Denna funktion beh\u00f6ver waypoints f\u00f6r att ber\u00e4kna avst\u00e5nden d\u00e4remellan
+dialog.fullrangedetails.intro=H\u00e4r \u00e4r alla detaljer f\u00f6r det markerade intervallet
+dialog.fullrangedetails.coltotal=Inklusive gap
+dialog.fullrangedetails.colsegments=Utan gap
+dialog.estimatetime.details=Detaljer
+dialog.estimatetime.gentle=Flackt
+dialog.estimatetime.steep=Brant
+dialog.estimatetime.climb=Kl\u00e4ttring
+dialog.estimatetime.descent=Nedf\u00f6r
+dialog.estimatetime.parameters=Parametrar
+dialog.estimatetime.parameters.timefor=Tid f\u00f6r
+dialog.estimatetime.results=Resultat
+dialog.estimatetime.results.estimatedtime=Ber\u00e4knad tid
+dialog.estimatetime.results.actualtime=Faktisk tid
+dialog.estimatetime.error.nodistance=Tidsuppskattningen kr\u00e4ver kopplade sp\u00e5rpunkter f\u00f6r att f\u00e5 avst\u00e5nd
+dialog.estimatetime.error.noaltitudes=Intervallet har ingen h\u00f6jd-data
+dialog.learnestimationparams.intro=Detta \u00e4r parametrarna ber\u00e4knade fr\u00e5n detta sp\u00e5ret
+dialog.rearrange.tostart=Alla till b\u00f6rjan av fil
+dialog.rearrange.toend=Alla till slut av fil
+dialog.rearrange.tonearest=Varje till n\u00e4rmaste sp\u00e5rpunkt
+
+# Buttons
+button.ok=OK
+button.back=Bak\u00e5t
+button.next=N\u00e4sta
+button.cancel=Avbryt
+button.overwrite=Skriv \u00f6ver
+button.moveup=Flytta upp
+button.movedown=Flytta ner
+button.edit=Redigera
+button.exit=Avsluta
+button.close=St\u00e4ng
+button.yes=Ja
+button.no=Nej
+button.yestoall=Ja till alla
+button.notoall=Nej till alla
+button.always=Alltid
+button.select=Markera
+button.selectall=Markera alla
+button.selectnone=Markera inget
+button.preview=F\u00f6rhandsvisa
+button.load=Ladda in
+button.upload=Ladda upp
+button.guessfields=Gissa f\u00e4lt
+button.showwebpage=Visa hemsida
+button.resettodefaults=\u00c5terst\u00e4ll till default
+button.browse=Bl\u00e4ddra...
+button.addnew=L\u00e4gg till ny
+button.delete=Ta bort
+button.manage=Hantera
+button.combine=Kombinera
+
+# Display components
+display.nodata=Ingen data laddad
+display.noaltitudes=Sp\u00e5rdatan saknar h\u00f6jddata
+display.notimestamps=Sp\u00e5rdatan saknar tidsst\u00e4mplar
+display.novalues=Sp\u00e5rdatan saknar v\u00e4rden f\u00f6r detta f\u00e4lt
+details.trackdetails=Sp\u00e5r-detaljer
+details.notrack=Inget sp\u00e5r laddat
+details.track.points=Punkter
+details.track.file=Fil
+details.track.numfiles=Antal filer
+details.pointdetails=Punkt-detaljer
+details.index.selected=Index
+details.index.of=av
+details.nopointselection=Ingen punkt markerad
+details.photofile=Foto-fil
+details.norangeselection=Inget intervall markerat
+details.rangedetails=Intervall-detaljer
+details.range.selected=Markerat
+details.range.to=till
+details.altitude.to=till
+details.range.climb=Uppf\u00f6r
+details.range.descent=Nedf\u00f6r
+details.coordformat=Koortinat-format
+details.distanceunits=Distans-enhet
+display.range.time.secs=s
+display.range.time.mins=m
+display.range.time.hours=h
+display.range.time.days=d
+details.range.avespeed=Medelhastighet
+details.range.maxspeed=Maxhastighet
+details.range.numsegments=Antal segment
+details.range.gradient=Gradient
+details.lists.waypoints=Waypoints
+details.lists.photos=Foton
+details.lists.audio=Ljud
+details.photodetails=Foto-detaljer
+details.nophoto=Inget foto valt
+details.photo.loading=Laddar
+details.photo.bearing=B\u00e4ring
+details.media.connected=Kopplad
+details.media.fullpath=Fullst\u00e4ndig s\u00f6kv\u00e4g
+details.audiodetails=Ljud-detaljer
+details.noaudio=Inget ljudklipp valt
+details.audio.file=Ljudfil
+details.audio.playing=spelar...
+map.overzoom=Inga kartor tillg\u00e4ngliga p\u00e5 denna zoom-niv\u00e5
 
+# External urls and services
 openweathermap.lang=se
index 225a667870033caa90b3a681e71f923a412a5887..6f63080ceb98461a89ada946fda0d9f35b4fc6f4 100644 (file)
@@ -19,7 +19,8 @@ public class GpxHandler extends XmlHandler
        private boolean _startSegment = true;
        private boolean _isTrackPoint = false;
        private int _trackNum = -1;
-       private GpxTag _name = new GpxTag(), _trackName = new GpxTag();
+       private GpxTag _fileTitle = new GpxTag();
+       private GpxTag _pointName = new GpxTag(), _trackName = new GpxTag();
        private String _latitude = null, _longitude = null;
        private GpxTag _elevation = new GpxTag(), _time = new GpxTag();
        private GpxTag _type = new GpxTag(), _description = new GpxTag();
@@ -52,7 +53,7 @@ public class GpxHandler extends XmlHandler
                                else if (att.equals("lon")) {_longitude = attributes.getValue(i);}
                        }
                        _elevation.setValue(null);
-                       _name.setValue(null);
+                       _pointName.setValue(null);
                        _time.setValue(null);
                        _type.setValue(null);
                        _link.setValue(null);
@@ -61,8 +62,18 @@ public class GpxHandler extends XmlHandler
                else if (tag.equals("ele")) {
                        _currentTag = _elevation;
                }
-               else if (tag.equals("name")) {
-                       _currentTag = (_insidePoint?_name:_trackName);
+               else if (tag.equals("name"))
+               {
+                       if (_insidePoint) {
+                               _currentTag = _pointName;
+                       }
+                       else if (_trackNum < 0)
+                       {
+                               _currentTag = _fileTitle;
+                       }
+                       else {
+                               _currentTag = _trackName;
+                       }
                }
                else if (tag.equals("time")) {
                        _currentTag = _time;
@@ -146,7 +157,7 @@ public class GpxHandler extends XmlHandler
                values[0] = _latitude;
                values[1] = _longitude;
                values[2] = _elevation.getValue();
-               if (_insideWaypoint) {values[3] = _name.getValue();}
+               if (_insideWaypoint) {values[3] = _pointName.getValue();}
                values[4] = _time.getValue();
                if (_startSegment && !_insideWaypoint)
                {
@@ -212,4 +223,11 @@ public class GpxHandler extends XmlHandler
        public TrackNameList getTrackNameList() {
                return _trackNameList;
        }
+
+       /**
+        * @return file title
+        */
+       public String getFileTitle() {
+               return _fileTitle.getValue();
+       }
 }
index 5af471a2119e2e839589ec1af042d479d75f6016..c907d373ded1a80a3f8b30783bc5298673302dcf 100644 (file)
@@ -93,9 +93,11 @@ public class XmlFileLoader extends DefaultHandler implements Runnable
                        }
                        else
                        {
+                               SourceInfo.FILE_TYPE sourceType = (_handler instanceof GpxHandler ? SourceInfo.FILE_TYPE.GPX : SourceInfo.FILE_TYPE.KML);
+                               SourceInfo sourceInfo = new SourceInfo(_file, sourceType);
+                               sourceInfo.setFileTitle(_handler.getFileTitle());
+
                                // Pass information back to app
-                               SourceInfo sourceInfo = new SourceInfo(_file,
-                                       (_handler instanceof GpxHandler?SourceInfo.FILE_TYPE.GPX:SourceInfo.FILE_TYPE.KML));
                                _app.informDataLoaded(_handler.getFieldArray(), _handler.getDataArray(),
                                        null, sourceInfo, _handler.getTrackNameList(),
                                        new MediaLinkInfo(_handler.getLinkArray()));
index fa51ebf1118e7b3c8b697bc8a31138dd47094a55..21068be4df5025812260fb0b33fea6af3d3359ff 100644 (file)
@@ -36,4 +36,12 @@ public abstract class XmlHandler extends DefaultHandler
        public String[] getLinkArray() {
                return null;
        }
+
+       /**
+        * Can be overridden (eg by gpx handler) to provide the title of the file
+        * @return file title, or null
+        */
+       public String getFileTitle() {
+               return null;
+       }
 }
index 635adbb97788e18ef7f06b08014733d7a093b0bc..0c5bf5c33987915d36f012cc929f77710549a950 100644 (file)
@@ -1,4 +1,4 @@
-GpsPrune version 19.1
+GpsPrune version 19.2
 =====================
 
 GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
@@ -17,7 +17,7 @@ Running
 =======
 
 To run GpsPrune from the jar file, simply call it from a command prompt or shell:
-   java -jar gpsprune_19.1.jar
+   java -jar gpsprune_19.2.jar
 
 If the jar file is saved in a different directory, you will need to include the path.
 Depending on your system settings, you may be able to click or double-click on the jar file
@@ -25,9 +25,18 @@ in a file manager window to execute it.  A shortcut, menu item, alias, desktop i
 or other link can of course be made should you wish.
 
 To specify a language other than the default, use an additional parameter, eg:
-   java -jar gpsprune_19.1.jar --lang=DE
+   java -jar gpsprune_19.2.jar --lang=DE
 
 
+New with version 19.2
+=====================
+The following fixes and additions were made since version 19.1:
+  - Fix right-click-and-drag bug for zooming with Java 9 and Java 10
+  - Fix export of timestamps when photo points don't have timestamps
+  - Lighting of 3d views from the northwest (thanks, PeHar)
+  - Remember the name tag from a loaded gpx file, suggest it again for gpx export
+  - Removal of the Thunderforest tile sources (OpenCycleMap, Outdoors)
 New with version 19.1
 =====================
 The following fixes and additions were made since version 19:
index 39b6a362589ce72150cdb4e8a56d85609618e92a..88ac7914c29a1b92a235ff426e782f07ca4fcae3 100644 (file)
@@ -41,6 +41,7 @@ import tim.prune.data.Field;
 import tim.prune.data.MediaObject;
 import tim.prune.data.Photo;
 import tim.prune.data.RecentFile;
+import tim.prune.data.SourceInfo;
 import tim.prune.data.Timestamp;
 import tim.prune.data.TrackInfo;
 import tim.prune.data.UnitSetLibrary;
@@ -66,6 +67,8 @@ public class GpxExporter extends GenericFunction implements Runnable
        private JPanel _encodingsPanel = null;
        private JRadioButton _useSystemRadio = null, _forceUtf8Radio = null;
        private File _exportFile = null;
+       /** Remember the previous sourceInfo object to tell whether it has changed */
+       private SourceInfo _previousSourceInfo = null;
 
        /** this program name */
        private static final String GPX_CREATOR = "GpsPrune v" + GpsPrune.VERSION_NUMBER + " activityworkshop.net";
@@ -108,6 +111,7 @@ public class GpxExporter extends GenericFunction implements Runnable
                        _useSystemRadio.setText(I18nManager.getText("dialog.exportgpx.encoding.system")
                                + " (" + (systemEncoding == null ? "unknown" : systemEncoding) + ")");
                }
+               setFileTitle();
                _dialog.setVisible(true);
        }
 
@@ -196,6 +200,34 @@ public class GpxExporter extends GenericFunction implements Runnable
                return dialogPanel;
        }
 
+       /**
+        * Set the suggestion for the name with which to export
+        */
+       private void setFileTitle()
+       {
+               // Get the most recent file info
+               SourceInfo currentSource = _app.getTrackInfo().getFileInfo().getLastFileInfo();
+               if (currentSource != _previousSourceInfo)
+               {
+                       String lastTitle = currentSource.getFileTitle();
+                       if (lastTitle != null && !lastTitle.equals(""))
+                       {
+                               // Take the title of the last file loaded
+                               _nameField.setText(lastTitle);
+                       }
+               }
+               if (_nameField.getText().equals(""))
+               {
+                       // no name given in the field already, so try to overwrite it
+                       String lastTitle = _app.getTrackInfo().getFileInfo().getLastFileTitle();
+                       if (lastTitle != null && !lastTitle.equals(""))
+                       {
+                               _nameField.setText(lastTitle);
+                       }
+               }
+               // Remember this source info so we don't use it again
+               _previousSourceInfo = currentSource;
+       }
 
        /**
         * Start the export process based on the input parameters
@@ -758,16 +790,21 @@ public class GpxExporter extends GenericFunction implements Runnable
                        inWriter.write(inPoint.hasAltitude() ? inPoint.getAltitude().getStringValue(UnitSetLibrary.UNITS_METRES) : "0");
                        inWriter.write("</ele>\n");
                }
+               // Maybe take timestamp from photo if the point hasn't got one
+               Timestamp pointTimestamp = getPointTimestamp(inPoint, inSettings);
                // timestamp if available (and selected)
-               if (inPoint.hasTimestamp() && inSettings.getExportTimestamps())
+               if (pointTimestamp != null && inSettings.getExportTimestamps())
                {
                        inWriter.write("\t\t\t\t<time>");
-                       inWriter.write(inPoint.getTimestamp().getText(Timestamp.Format.ISO8601, null));
+                       inWriter.write(pointTimestamp.getText(Timestamp.Format.ISO8601, null));
                        inWriter.write("</time>\n");
                }
                // photo, audio
-               if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints()) {
+               if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints())
+               {
+                       inWriter.write("\t\t\t\t");
                        inWriter.write(makeMediaLink(inPoint.getPhoto()));
+                       inWriter.write("\n");
                }
                if (inPoint.getAudio() != null && inSettings.getExportAudioPoints()) {
                        inWriter.write(makeMediaLink(inPoint.getAudio()));
@@ -825,4 +862,33 @@ public class GpxExporter extends GenericFunction implements Runnable
        {
                return inPointSource.replaceAll("[ \t]*<time>.*?</time>", "");
        }
+
+       /**
+        * Get the timestamp from the point or its media
+        * @param inPoint point object
+        * @param inSettings export settings
+        * @return Timestamp object if available, or null
+        */
+       private static Timestamp getPointTimestamp(DataPoint inPoint, SettingsForExport inSettings)
+       {
+               if (inPoint.hasTimestamp())
+               {
+                       return inPoint.getTimestamp();
+               }
+               if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints())
+               {
+                       if (inPoint.getPhoto().hasTimestamp())
+                       {
+                               return inPoint.getPhoto().getTimestamp();
+                       }
+               }
+               if (inPoint.getAudio() != null && inSettings.getExportAudioPoints())
+               {
+                       if (inPoint.getAudio().hasTimestamp())
+                       {
+                               return inPoint.getAudio().getTimestamp();
+                       }
+               }
+               return null;
+       }
 }
index e0fc9d35be049168096f68d97c1b7286901ae462..d4a6beb87a0482219c5ecedb5620bd2f72992f1c 100644 (file)
@@ -511,6 +511,18 @@ public class PovExporter extends Export3dFunction
                // Definition of terrain shape if any
                final String terrainDefinition = makeTerrainString(inTerrainFile, inImageFile, inLineSeparator);
 
+               final String[] pointLights = {
+                       "// lights",
+                       "light_source { <-1, 9, -4> color rgb <0.5 0.5 0.5>}",
+                       "light_source { <1, 6, -14> color rgb <0.6 0.6 0.6>}",
+                       "light_source { <11, 12, 8> color rgb <0.3 0.3 0.3>}"
+               };
+               final String[] northwestLight = {
+                       "// lights from NW",
+                       "light_source { <-10, 10, 10> color rgb <1.5 1.5 1.5> parallel }",
+               };
+               final String[] lightsLines = (inTerrainFile == null ? pointLights : northwestLight);
+
                // Set up output
                String[] outputLines = {
                  "global_settings { ambient_light rgb <4, 4, 4> }", "",
@@ -626,21 +638,30 @@ public class PovExporter extends Export3dFunction
                  "  ttf \"" + fontPath + "\" \"" + I18nManager.getText("cardinal.w") + "\" 0.3, 0",
                  "  pigment { color rgb <1 1 1> }",
                  "  translate <-10.3, 0.2, 0>",
-                 "}", "",
-                 // MAYBE: Light positions should relate to model size
-                 "// lights",
-                 "light_source { <-1, 9, -4> color rgb <0.5 0.5 0.5>}",
-                 "light_source { <1, 6, -14> color rgb <0.6 0.6 0.6>}",
-                 "light_source { <11, 12, 8> color rgb <0.3 0.3 0.3>}",
-                 "",
+                 "}"
                };
+
                // write strings to file
-               int numLines = outputLines.length;
-               for (int i=0; i<numLines; i++)
+               writeLinesToFile(inWriter, inLineSeparator, outputLines);
+               writeLinesToFile(inWriter, inLineSeparator, lightsLines);
+       }
+
+       /**
+        * Write the given lines to the file
+        * @param inWriter writer object
+        * @param inLineSeparator line separator string
+        * @param lines array of lines to write
+        * @throws IOException
+        */
+       private void writeLinesToFile(FileWriter inWriter, String inLineSeparator, String[] lines)
+               throws IOException
+       {
+               for (int i=0; i<lines.length; i++)
                {
-                       inWriter.write(outputLines[i]);
+                       inWriter.write(lines[i]);
                        inWriter.write(inLineSeparator);
                }
+               inWriter.write(inLineSeparator);
        }
 
        /**
index 7b9e973c90360fabfa99d0e8492682e27db73c2d..f5b324390139f6f4af96271e19ce702a87ee52af 100644 (file)
@@ -17,6 +17,7 @@ import javax.media.j3d.Billboard;
 import javax.media.j3d.BoundingSphere;
 import javax.media.j3d.BranchGroup;
 import javax.media.j3d.Canvas3D;
+import javax.media.j3d.DirectionalLight;
 import javax.media.j3d.Font3D;
 import javax.media.j3d.FontExtrusion;
 import javax.media.j3d.GeometryArray;
@@ -41,6 +42,7 @@ import javax.vecmath.Point3d;
 import javax.vecmath.Point3f;
 import javax.vecmath.TexCoord2f;
 import javax.vecmath.Vector3d;
+import javax.vecmath.Vector3f;
 
 import tim.prune.DataStatus;
 import tim.prune.FunctionLibrary;
@@ -374,11 +376,13 @@ public class Java3DWindow implements ThreeDWindow
                // N, S, E, W
                GeneralPath bevelPath = new GeneralPath();
                bevelPath.moveTo(0.0f, 0.0f);
-               for (int i=0; i<91; i+= 5) {
+               for (int i=0; i<91; i+= 5)
+               {
                        bevelPath.lineTo((float) (0.1 - 0.1 * Math.cos(Math.toRadians(i))),
                          (float) (0.1 * Math.sin(Math.toRadians(i))));
                }
-               for (int i=90; i>0; i-=5) {
+               for (int i=90; i>0; i-=5)
+               {
                        bevelPath.lineTo((float) (0.3 + 0.1 * Math.cos(Math.toRadians(i))),
                          (float) (0.1 * Math.sin(Math.toRadians(i))));
                }
@@ -393,26 +397,40 @@ public class Java3DWindow implements ThreeDWindow
                // Add points to model
                objTrans.addChild(createDataPoints(_model));
 
-               // Create lights
-               BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+               // Create lights - always add ambient light
+               BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
                AmbientLight aLgt = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f));
                aLgt.setInfluencingBounds(bounds);
                objTrans.addChild(aLgt);
 
-               PointLight pLgt = new PointLight(new Color3f(1.0f, 1.0f, 1.0f),
-                       new Point3f(0f, 0f, 2f), new Point3f(0.25f, 0.05f, 0.0f) );
-               pLgt.setInfluencingBounds(bounds);
-               objTrans.addChild(pLgt);
-
-               PointLight pl2 = new PointLight(new Color3f(0.8f, 0.9f, 0.4f),
-                       new Point3f(6f, 1f, 6f), new Point3f(0.2f, 0.1f, 0.05f) );
-               pl2.setInfluencingBounds(bounds);
-               objTrans.addChild(pl2);
-
-               PointLight pl3 = new PointLight(new Color3f(0.7f, 0.7f, 0.7f),
-                       new Point3f(0.0f, 12f, -2f), new Point3f(0.1f, 0.1f, 0.0f) );
-               pl3.setInfluencingBounds(bounds);
-               objTrans.addChild(pl3);
+               // Additional lights depend on whether there's a terrain or not
+               if (showTerrain)
+               {
+                       // If there's a terrain, just have directional light from northwest
+                       DirectionalLight dl = new DirectionalLight(true,
+                               new Color3f(1.0f, 1.0f, 1.0f),
+                               new Vector3f(1.0f, -1.0f, 1.0f));
+                       dl.setInfluencingBounds(bounds);
+                       objTrans.addChild(dl);
+               }
+               else
+               {
+                       // There is no terrain, so use point lights as before
+                       PointLight pLgt = new PointLight(new Color3f(1.0f, 1.0f, 1.0f),
+                               new Point3f(0f, 0f, 2f), new Point3f(0.25f, 0.05f, 0.0f) );
+                       pLgt.setInfluencingBounds(bounds);
+                       objTrans.addChild(pLgt);
+
+                       PointLight pl2 = new PointLight(new Color3f(0.8f, 0.9f, 0.4f),
+                               new Point3f(6f, 1f, 6f), new Point3f(0.2f, 0.1f, 0.05f) );
+                       pl2.setInfluencingBounds(bounds);
+                       objTrans.addChild(pl2);
+
+                       PointLight pl3 = new PointLight(new Color3f(0.7f, 0.7f, 0.7f),
+                               new Point3f(0.0f, 12f, -2f), new Point3f(0.1f, 0.1f, 0.0f) );
+                       pl3.setInfluencingBounds(bounds);
+                       objTrans.addChild(pl3);
+               }
 
                // Have Java 3D perform optimizations on this scene graph.
                objRoot.compile();