From 2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 Mon Sep 17 00:00:00 2001 From: activityworkshop Date: Sat, 2 Feb 2019 11:26:07 +0100 Subject: [PATCH] Version 19.2, December 2018 --- README.md | 2 +- tim/prune/GpsPrune.java | 10 +- tim/prune/config/Config.java | 4 +- tim/prune/data/AltitudeRange.java | 10 - tim/prune/data/FileInfo.java | 48 ++- tim/prune/data/RangeStats.java | 9 +- tim/prune/data/SourceInfo.java | 18 ++ tim/prune/data/TimestampLocal.java | 7 +- tim/prune/data/TrackInfo.java | 31 +- tim/prune/gui/images/add_photo_icon.png | Bin tim/prune/gui/images/add_textfile_icon.png | Bin tim/prune/gui/map/MapCanvas.java | 36 ++- tim/prune/gui/map/MapSource.java | 2 +- tim/prune/gui/map/MapSourceLibrary.java | 11 +- tim/prune/lang/prune-texts_fi.properties | 34 +-- tim/prune/lang/prune-texts_pl.properties | 7 +- tim/prune/lang/prune-texts_sv.properties | 326 ++++++++++++++++++++- tim/prune/load/xml/GpxHandler.java | 28 +- tim/prune/load/xml/XmlFileLoader.java | 6 +- tim/prune/load/xml/XmlHandler.java | 8 + tim/prune/readme.txt | 15 +- tim/prune/save/GpxExporter.java | 72 ++++- tim/prune/save/PovExporter.java | 41 ++- tim/prune/threedee/Java3DWindow.java | 54 ++-- 24 files changed, 641 insertions(+), 138 deletions(-) mode change 100644 => 100755 tim/prune/gui/images/add_photo_icon.png mode change 100644 => 100755 tim/prune/gui/images/add_textfile_icon.png diff --git a/README.md b/README.md index 5820cd0..9e9c08b 100644 --- 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. diff --git a/tim/prune/GpsPrune.java b/tim/prune/GpsPrune.java index af45728..f396e9e 100644 --- a/tim/prune/GpsPrune.java +++ b/tim/prune/GpsPrune.java @@ -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; diff --git a/tim/prune/config/Config.java b/tim/prune/config/Config.java index cd23dbd..84e5fd7 100644 --- a/tim/prune/config/Config.java +++ b/tim/prune/config/Config.java @@ -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; diff --git a/tim/prune/data/AltitudeRange.java b/tim/prune/data/AltitudeRange.java index 6a9f65f..b4b501b 100644 --- a/tim/prune/data/AltitudeRange.java +++ b/tim/prune/data/AltitudeRange.java @@ -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; } } diff --git a/tim/prune/data/FileInfo.java b/tim/prune/data/FileInfo.java index ffcc95b..41900cb 100644 --- a/tim/prune/data/FileInfo.java +++ b/tim/prune/data/FileInfo.java @@ -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 */ diff --git a/tim/prune/data/RangeStats.java b/tim/prune/data/RangeStats.java index 37d061b..13ecaad 100644 --- a/tim/prune/data/RangeStats.java +++ b/tim/prune/data/RangeStats.java @@ -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) { diff --git a/tim/prune/data/SourceInfo.java b/tim/prune/data/SourceInfo.java index 5e40eee..d71280d 100644 --- a/tim/prune/data/SourceInfo.java +++ b/tim/prune/data/SourceInfo.java @@ -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 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 */ diff --git a/tim/prune/data/TimestampLocal.java b/tim/prune/data/TimestampLocal.java index d4c9093..30f8861 100644 --- a/tim/prune/data/TimestampLocal.java +++ b/tim/prune/data/TimestampLocal.java @@ -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()); } } diff --git a/tim/prune/data/TrackInfo.java b/tim/prune/data/TrackInfo.java index 00d6588..2b5b67d 100644 --- a/tim/prune/data/TrackInfo.java +++ b/tim/prune/data/TrackInfo.java @@ -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(); diff --git a/tim/prune/gui/images/add_photo_icon.png b/tim/prune/gui/images/add_photo_icon.png old mode 100644 new mode 100755 diff --git a/tim/prune/gui/images/add_textfile_icon.png b/tim/prune/gui/images/add_textfile_icon.png old mode 100644 new mode 100755 diff --git a/tim/prune/gui/map/MapCanvas.java b/tim/prune/gui/map/MapCanvas.java index 801adbb..aa25dbc 100644 --- a/tim/prune/gui/map/MapCanvas.java +++ b/tim/prune/gui/map/MapCanvas.java @@ -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(); - } } /** diff --git a/tim/prune/gui/map/MapSource.java b/tim/prune/gui/map/MapSource.java index b7a08fc..c4e2946 100644 --- a/tim/prune/gui/map/MapSource.java +++ b/tim/prune/gui/map/MapSource.java @@ -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) { diff --git a/tim/prune/gui/map/MapSourceLibrary.java b/tim/prune/gui/map/MapSourceLibrary.java index 5f44d5e..331d8fe 100644 --- a/tim/prune/gui/map/MapSourceLibrary.java +++ b/tim/prune/gui/map/MapSourceLibrary.java @@ -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)); diff --git a/tim/prune/lang/prune-texts_fi.properties b/tim/prune/lang/prune-texts_fi.properties index fde7a73..e6d6860 100644 --- a/tim/prune/lang/prune-texts_fi.properties +++ b/tim/prune/lang/prune-texts_fi.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_pl.properties b/tim/prune/lang/prune-texts_pl.properties index 1981fc5..eb0a727 100644 --- a/tim/prune/lang/prune-texts_pl.properties +++ b/tim/prune/lang/prune-texts_pl.properties @@ -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=
klawisze strza\u0142ekPrzesuwa map\u0119 w lewo, w prawo, w g\u00f3r\u0119, w d\u00f3\u0142
Ctrl + lewa, prawa strza\u0142kaWybierz punkt poprzedni lub nast\u0119pny
Ctrl + strza\u0142ka w g\u00f3r\u0119, w d\u00f3\u0142Powi\u0119ksz, pomniejsz
DelUsun bie\u017c\u0105cy punkt
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 diff --git a/tim/prune/lang/prune-texts_sv.properties b/tim/prune/lang/prune-texts_sv.properties index 7b227d2..d149f98 100644 --- a/tim/prune/lang/prune-texts_sv.properties +++ b/tim/prune/lang/prune-texts_sv.properties @@ -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 diff --git a/tim/prune/load/xml/GpxHandler.java b/tim/prune/load/xml/GpxHandler.java index 225a667..6f63080 100644 --- a/tim/prune/load/xml/GpxHandler.java +++ b/tim/prune/load/xml/GpxHandler.java @@ -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(); + } } diff --git a/tim/prune/load/xml/XmlFileLoader.java b/tim/prune/load/xml/XmlFileLoader.java index 5af471a..c907d37 100644 --- a/tim/prune/load/xml/XmlFileLoader.java +++ b/tim/prune/load/xml/XmlFileLoader.java @@ -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())); diff --git a/tim/prune/load/xml/XmlHandler.java b/tim/prune/load/xml/XmlHandler.java index fa51ebf..21068be 100644 --- a/tim/prune/load/xml/XmlHandler.java +++ b/tim/prune/load/xml/XmlHandler.java @@ -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; + } } diff --git a/tim/prune/readme.txt b/tim/prune/readme.txt index 635adbb..0c5bf5c 100644 --- a/tim/prune/readme.txt +++ b/tim/prune/readme.txt @@ -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: diff --git a/tim/prune/save/GpxExporter.java b/tim/prune/save/GpxExporter.java index 39b6a36..88ac791 100644 --- a/tim/prune/save/GpxExporter.java +++ b/tim/prune/save/GpxExporter.java @@ -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("\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\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]*", ""); } + + /** + * 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; + } } diff --git a/tim/prune/save/PovExporter.java b/tim/prune/save/PovExporter.java index e0fc9d3..d4a6beb 100644 --- a/tim/prune/save/PovExporter.java +++ b/tim/prune/save/PovExporter.java @@ -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; i0; 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(); -- 2.43.0