UoP**}R4<@-4%OQz0fGoB0Fx>$OZ&rXCjbBd07*qo1w^hwV1mH=L_q)m
diff --git a/src/tim/prune/gui/map/CacheFailure.java b/src/tim/prune/gui/map/CacheFailure.java
new file mode 100644
index 0000000..6f9ac28
--- /dev/null
+++ b/src/tim/prune/gui/map/CacheFailure.java
@@ -0,0 +1,8 @@
+package tim.prune.gui.map;
+
+/**
+ * Exception thrown to indicate a failure to cache map tiles
+ */
+public class CacheFailure extends Exception
+{
+}
diff --git a/src/tim/prune/gui/map/DiskTileCacher.java b/src/tim/prune/gui/map/DiskTileCacher.java
index 875fcc3..9be7841 100644
--- a/src/tim/prune/gui/map/DiskTileCacher.java
+++ b/src/tim/prune/gui/map/DiskTileCacher.java
@@ -38,6 +38,8 @@ public class DiskTileCacher implements Runnable
private static int NUMBER_ACTIVE_THREADS = 0;
/** Flag to remember whether any server connection is possible */
private static boolean CONNECTION_ACTIVE = true;
+ /** Flag to remember whether we have already tried to create the base path */
+ private static boolean TRIED_TO_CREATE_BASEPATH = false;
/**
@@ -86,16 +88,17 @@ public class DiskTileCacher implements Runnable
* @param inBasePath base path to disk cache
* @param inTilePath relative path to this tile
* @param inObserver observer to inform when load complete
+ * @throws CacheFailure if tile could not be saved
*/
- public static void saveTile(URL inUrl, String inBasePath, String inTilePath, ImageObserver inObserver)
+ public static void saveTile(URL inUrl, String inBasePath, String inTilePath, ImageObserver inObserver) throws CacheFailure
{
if (inBasePath == null || inTilePath == null) {return;}
// save file if possible
File basePath = new File(inBasePath);
- if (!basePath.exists() || !basePath.isDirectory() || !basePath.canWrite())
+ if (!checkBasePath(basePath))
{
// Can't write to base path
- return;
+ throw new CacheFailure();
}
File tileFile = new File(basePath, inTilePath);
@@ -113,6 +116,21 @@ public class DiskTileCacher implements Runnable
}
}
+ /**
+ * Check the given base path, and try (once) to create it if necessary
+ * @return true if base path can be written to
+ */
+ private static boolean checkBasePath(File inBasePath)
+ {
+ if (!inBasePath.exists() && !TRIED_TO_CREATE_BASEPATH)
+ {
+ TRIED_TO_CREATE_BASEPATH = true;
+ System.out.println("Base path '" + inBasePath.getAbsolutePath() + "' does not exist, trying to create");
+ return inBasePath.mkdirs();
+ }
+ return inBasePath.exists() && inBasePath.isDirectory() && inBasePath.canWrite();
+ }
+
/**
* Start downloading the configured tile
*/
@@ -218,12 +236,14 @@ public class DiskTileCacher implements Runnable
{
success = true;
}
+ else if (_file.delete() && tempFile.renameTo(_file))
+ {
+ success = true;
+ }
else
{
- // File couldn't be moved - delete both to be sure
System.out.println("Failed to rename temp file: " + tempFile.getAbsolutePath());
tempFile.delete();
- _file.delete();
}
}
diff --git a/src/tim/prune/gui/map/MapCanvas.java b/src/tim/prune/gui/map/MapCanvas.java
index d305d1c..a469e99 100644
--- a/src/tim/prune/gui/map/MapCanvas.java
+++ b/src/tim/prune/gui/map/MapCanvas.java
@@ -85,7 +85,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
/** coordinates of popup menu */
private int _popupMenuX = -1, _popupMenuY = -1;
/** Flag to prevent showing too often the error message about loading maps */
- private boolean _shownOsmErrorAlready = false;
+ private boolean _shownMapLoadErrorAlready = false;
/** Current drawing mode */
private int _drawMode = MODE_DEFAULT;
/** Current waypoint icon definition */
@@ -339,8 +339,16 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
*/
private void zoomToFit()
{
- _latRange = _track.getLatRange();
- _lonRange = _track.getLonRange();
+ if (_track.getNumPoints() > 0)
+ {
+ _latRange = _track.getLatRange();
+ _lonRange = _track.getLonRange();
+ }
+ if (_latRange == null || _lonRange == null
+ || !_latRange.hasData() || !_lonRange.hasData())
+ {
+ setDefaultLatLonRange();
+ }
_xRange = new DoubleRange(MapUtils.getXFromLongitude(_lonRange.getMinimum()),
MapUtils.getXFromLongitude(_lonRange.getMaximum()));
_yRange = new DoubleRange(MapUtils.getYFromLatitude(_latRange.getMinimum()),
@@ -349,6 +357,37 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
getWidth(), getHeight());
}
+ /**
+ * Track data is empty, so find a default area on the map to show
+ */
+ private void setDefaultLatLonRange()
+ {
+ String storedRange = Config.getConfigString(Config.KEY_LATLON_RANGE);
+ // Parse it into four latlon values
+ try
+ {
+ String[] values = storedRange.split(";");
+ if (values.length == 4)
+ {
+ final double lat1 = Double.valueOf(values[0]);
+ final double lat2 = Double.valueOf(values[1]);
+ if (lat1 >= -90.0 && lat1 <= 90.0 && lat2 >= -90.0 && lat2 <= 90.0 && lat1 != lat2)
+ {
+ _latRange = new DoubleRange(lat1, lat2);
+ final double lon1 = Double.valueOf(values[2]);
+ final double lon2 = Double.valueOf(values[3]);
+ if (lon1 >= -180.0 && lon1 <= 180.0 && lon2 >= -180.0 && lon2 <= 180.0 && lon1 != lon2)
+ {
+ _lonRange = new DoubleRange(lon1, lon2);
+ return;
+ }
+ }
+ }
+ }
+ catch (Exception e) {}
+ _latRange = new DoubleRange(45.8, 47.9);
+ _lonRange = new DoubleRange(5.9, 10.6);
+ }
/**
* Paint method
@@ -360,7 +399,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
if (_mapImage != null && (_mapImage.getWidth() != getWidth() || _mapImage.getHeight() != getHeight())) {
_mapImage = null;
}
- if (_track.getNumPoints() > 0)
+ final boolean showMap = Config.getConfigBoolean(Config.KEY_SHOW_MAP);
+ final boolean showSomething = _track.getNumPoints() > 0 || showMap;
+ if (showSomething)
{
// Check for autopan if enabled / necessary
if (_autopanCheckBox.isSelected())
@@ -373,6 +414,14 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
_prevSelectedPoint = selectedPoint;
}
+ // Recognise empty map position, if no data has been loaded
+ if (_mapPosition.isEmpty())
+ {
+ // Set to some default area
+ zoomToFit();
+ _recalculate = true;
+ }
+
// Draw the map contents if necessary
if (_mapImage == null || _recalculate)
{
@@ -425,6 +474,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
inG.drawString(I18nManager.getText("display.nodata"), 50, getHeight()/2);
_scaleBar.updateScale(-1, 0);
}
+ // enable or disable panels
+ _topPanel.setVisible(showSomething);
+ _sidePanel.setVisible(showSomething);
// Draw slider etc on top
paintChildren(inG);
}
@@ -503,7 +555,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
}
// reset error message
- if (!showMap) {_shownOsmErrorAlready = false;}
+ if (!showMap) {_shownMapLoadErrorAlready = false;}
_recalculate = false;
// Only get map tiles if selected
if (showMap)
@@ -941,9 +993,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
synchronized(this)
{
// Show message if loading failed (but not too many times)
- if (!inIsOk && !_shownOsmErrorAlready && _mapCheckBox.isSelected())
+ if (!inIsOk && !_shownMapLoadErrorAlready && _mapCheckBox.isSelected())
{
- _shownOsmErrorAlready = true;
+ _shownMapLoadErrorAlready = true;
// use separate thread to show message about failing to load osm images
new Thread(new Runnable() {
public void run() {
@@ -957,6 +1009,15 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
}
}
+ /**
+ * Inform that a cache failure occurred
+ */
+ public void reportCacheFailure()
+ {
+ // Cache can't be used, so disable it - user will be reminded to set it up by the tips
+ Config.setConfigString(Config.KEY_DISK_CACHE, null);
+ }
+
/**
* Zoom out, if not already at minimum zoom
*/
@@ -1074,15 +1135,17 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
*/
public void mouseClicked(MouseEvent inE)
{
- if (_track != null && _track.getNumPoints() > 0)
+ final boolean showMap = Config.getConfigBoolean(Config.KEY_SHOW_MAP);
+ final boolean hasPoints = _track != null && _track.getNumPoints() > 0;
+ if (showMap || hasPoints)
{
// select point if it's a left-click
if (!inE.isMetaDown())
{
if (inE.getClickCount() == 1)
{
- // single click
- if (_drawMode == MODE_DEFAULT)
+ // single left click
+ if (_drawMode == MODE_DEFAULT && hasPoints)
{
int pointIndex = _clickedPoint;
if (pointIndex == INDEX_UNKNOWN)
@@ -1408,10 +1471,6 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
}
}
repaint();
- // enable or disable components
- boolean hasData = _track.getNumPoints() > 0;
- _topPanel.setVisible(hasData);
- _sidePanel.setVisible(hasData);
// grab focus for the key presses
this.requestFocus();
}
diff --git a/src/tim/prune/gui/map/MapPosition.java b/src/tim/prune/gui/map/MapPosition.java
index 25f05fc..a62d782 100644
--- a/src/tim/prune/gui/map/MapPosition.java
+++ b/src/tim/prune/gui/map/MapPosition.java
@@ -17,6 +17,8 @@ public class MapPosition
private int _zoom = 12;
/** Factor to zoom by, 2 to the power of zoom */
private int _zoomFactor = 1 << _zoom;
+ /** Flag to mark if this position has ever been set */
+ private boolean _empty = true;
/** Maximum zoom level */
private static final int MAX_ZOOM = 21;
@@ -47,10 +49,12 @@ public class MapPosition
}
}
if (requiredZoom < 2) requiredZoom = 2;
+ else if (requiredZoom > 18) requiredZoom = 18;
// Set position
setZoom(requiredZoom);
_xPosition = transformToPixels((inMinX + inMaxX) / 2.0);
_yPosition = transformToPixels((inMinY + inMaxY) / 2.0);
+ _empty = false;
}
/**
@@ -61,6 +65,7 @@ public class MapPosition
{
_zoom = inZoom;
_zoomFactor = 1 << _zoom;
+ _empty = false;
}
/**
@@ -93,6 +98,7 @@ public class MapPosition
// Set position
_xPosition = (_xPosition - inWidth/2 + (inMinX + inMaxX) / 2) * multFactor;
_yPosition = (_yPosition - inHeight/2 + (inMinY + inMaxY) / 2) * multFactor;
+ _empty = false;
}
/**
@@ -277,4 +283,12 @@ public class MapPosition
_xPosition += inDeltaX;
_yPosition += inDeltaY;
}
+
+ /**
+ * @return true if this position has never been set
+ */
+ public boolean isEmpty()
+ {
+ return _empty;
+ }
}
diff --git a/src/tim/prune/gui/map/MapTileManager.java b/src/tim/prune/gui/map/MapTileManager.java
index 8c2c6ee..03b364a 100644
--- a/src/tim/prune/gui/map/MapTileManager.java
+++ b/src/tim/prune/gui/map/MapTileManager.java
@@ -210,6 +210,9 @@ public class MapTileManager implements ImageObserver
}
}
catch (MalformedURLException urle) {} // ignore
+ catch (CacheFailure cf) {
+ _consumer.reportCacheFailure();
+ }
}
return tileImage;
}
diff --git a/src/tim/prune/gui/map/TileConsumer.java b/src/tim/prune/gui/map/TileConsumer.java
index 35a557e..a2de40a 100644
--- a/src/tim/prune/gui/map/TileConsumer.java
+++ b/src/tim/prune/gui/map/TileConsumer.java
@@ -7,4 +7,7 @@ public interface TileConsumer
{
/** Let the consumer know that the tiles have been updated */
public void tilesUpdated(boolean inIsOk);
+
+ /** Let the consume know that a cache failure occurred */
+ public void reportCacheFailure();
}
diff --git a/src/tim/prune/lang/prune-texts_af.properties b/src/tim/prune/lang/prune-texts_af.properties
index e12df2c..03acf63 100644
--- a/src/tim/prune/lang/prune-texts_af.properties
+++ b/src/tim/prune/lang/prune-texts_af.properties
@@ -109,7 +109,6 @@ function.selectsegment=Selekteer huidige segment
function.splitsegments=Verdeel baan in segmente
function.sewsegments=Naai baan segmente aanmekaar
function.lookupsrtm=Kry hoogtes vanaf SRTM
-function.downloadsrtm=Laai SRTM te\u00ebls af
function.getwikipedia=Kry nabye Wikipedia artikels
function.searchwikipedianames=Soek Wikiepdia volgens naam
function.searchopencachingde=Soek OpenCaching.de
@@ -582,7 +581,6 @@ confirm.running=Besig om te loop...
confirm.lookupsrtm=%d hoogte waardes gevind
confirm.downloadsrtm=%d leers afgelaai na data stoor
confirm.downloadsrtm.1=%d leer afgelaai na data stoor
-confirm.downloadsrtm.none=Geen leers afgelaai, hulle was alreeds in the data stoor
confirm.deletefieldvalues=Veld waardes verwyder
confirm.audioload=Klank leers bygevoeg
confirm.correlateaudios.single=klankgreep was gekorreleer
diff --git a/src/tim/prune/lang/prune-texts_cy.properties b/src/tim/prune/lang/prune-texts_cy.properties
index 1c2d752..50ef3a2 100644
--- a/src/tim/prune/lang/prune-texts_cy.properties
+++ b/src/tim/prune/lang/prune-texts_cy.properties
@@ -14,6 +14,9 @@ menu.audio=Awdio
menu.view=Golygu
menu.settings=Dewisiadau
menu.help=Cymorth
+# Popup menu for map
+menu.map.zoomin=Chwyddo i mewn
+menu.map.zoomout=Chwyddo allan
# Alt keys for menus
altkey.menu.file=F
@@ -35,6 +38,7 @@ function.exportpov=Cadw POV
function.exportimage=Cadw llun
function.charts=Siartiau
function.distances=Pellterau
+function.viewfulldetails=Manylion
function.help=Cymorth
function.about=Ynghylych GpsPrune
@@ -83,7 +87,12 @@ details.track.file=Ffeil
details.lists.audio=Awdio
# Field names
+fieldname.latitude=Lledred
+fieldname.longitude=Hydred
+fieldname.coordinates=Cyfesurynnau
fieldname.waypointname=Enw
+fieldname.distance=Pellter
+fieldname.comment=Sylw
# How to combine conditions, such as filters
logic.and=a
@@ -93,4 +102,3 @@ logic.or=neu
url.googlemaps=maps.google.co.uk
wikipedia.lang=cy
openweathermap.lang=en
-
diff --git a/src/tim/prune/lang/prune-texts_cz.properties b/src/tim/prune/lang/prune-texts_cz.properties
index 4d4b5c0..96956d9 100644
--- a/src/tim/prune/lang/prune-texts_cz.properties
+++ b/src/tim/prune/lang/prune-texts_cz.properties
@@ -106,7 +106,6 @@ function.setpaths=Nastavit cestu k program\u016fm
function.splitsegments=Rozd\u011blit stopu na \u010d\u00e1sti
function.sewsegments=Spojit \u010d\u00e1sti stopy
function.lookupsrtm=Na\u010d\u00edst nadm. v\u00fd\u0161ku ze SRTM
-function.downloadsrtm=St\u00e1hnout dla\u017edice ze SRTM
function.getwikipedia=Hledat na Wikipedii podle vzd\u00e1lenosti
function.searchwikipedianames=Hledat na Wikipedii podle jm\u00e9na
function.searchopencachingde=Hledat na OpenCaching.de
@@ -572,7 +571,6 @@ confirm.running=Prob\u00edh\u00e1 ...
confirm.lookupsrtm=Nalezeno %d v\u00fd\u0161kov\u00fdch hodnot
confirm.downloadsrtm=Do cache bylo sta\u017eeno %d soubor\u016f
confirm.downloadsrtm.1=Do cache bylo sta\u017eeno %d soubor\u016f
-confirm.downloadsrtm.none=\u017d\u00e1dn\u00fd soubor nebylo t\u0159eba stahovat, v\u0161e u\u017e je v cachi.
confirm.deletefieldvalues=Hodnoty pole smaz\u00e1ny
confirm.audioload=Audionahr\u00e1vky p\u0159id\u00e1ny
confirm.correlateaudios.single=Audionahr\u00e1vka slad\u011bna
@@ -582,7 +580,7 @@ confirm.correlateaudios.multi=Audionahr\u00e1vky slad\u011bny
tip.title=Tip
tip.useamapcache=Kdy\u017e nastav\u00edte odkl\u00e1dac\u00ed prostor na disku \u010dili cache (Nastaven\u00ed -> Ulo\u017eit mapy na disk),\nzrychl\u00ed se zobrazov\u00e1n\u00ed a zmen\u0161\u00ed se mno\u017estv\u00ed p\u0159en\u00e1\u0161en\u00fdch dat.
tip.learntimeparams=V\u00fdsledky budou p\u0159esn\u011bj\u0161\u00ed, kdy\u017e na na\u010dten\u00e9 stopy pou\u017eijete funkci\nAnal\u00fdza stopy pro odhad \u010dasu.
-tip.downloadsrtm=Na\u010d\u00edt\u00e1n\u00ed nadmo\u0159sk\u00fdch v\u00fd\u0161ek bude rychlej\u0161\u00ed, pokud st\u00e1hnete dla\u017edice do cache pomoc\u00ed\nOnline -> St\u00e1hnout dla\u017edice ze SRTM.
+tip.downloadsrtm=Na\u010d\u00edt\u00e1n\u00ed nadmo\u0159sk\u00fdch v\u00fd\u0161ek bude rychlej\u0161\u00ed,\npokud st\u00e1hnete dla\u017edice do cache.
tip.usesrtmfor3d=Tato stopa neobsahuje informaci o nadmo\u0159sk\u00e9 v\u00fd\u0161ce.\nPro na\u010dten\u00ed p\u0159ibli\u017en\u00fdch nadmo\u0159sk\u00fdch v\u00fd\u0161ek pot\u0159ebn\u00fdch\nna trojrozm\u011brn\u00e9 zobrazen\u00ed m\u016f\u017eete pou\u017e\u00edt funkce SRTM.
tip.manuallycorrelateone=Kdy\u017e ru\u010dn\u011b slad\u00edte aspo\u0148 jednu fotografii, \u010dasov\u00fd posun bude vypo\u010d\u00edtat za v\u00e1s.
diff --git a/src/tim/prune/lang/prune-texts_de.properties b/src/tim/prune/lang/prune-texts_de.properties
index d1f6976..ffc031d 100644
--- a/src/tim/prune/lang/prune-texts_de.properties
+++ b/src/tim/prune/lang/prune-texts_de.properties
@@ -113,7 +113,6 @@ function.splitsegments=In Trackabschnitte schneiden
function.sewsegments=Trackabschnitte zusammenf\u00fcgen
function.createmarkerwaypoints=Wegpunkte im bestimmten Abstand kreieren
function.lookupsrtm=H\u00f6hendaten von SRTM nachschlagen
-function.downloadsrtm=SRTM Dateien herunterladen
function.getwikipedia=Wikipediaartikel in der N\u00e4he nachschlagen
function.searchwikipedianames=Wikipedia nach Namen durchsuchen
function.searchosmpois=OpenStreetMap nach Punkten durchsuchen
@@ -638,7 +637,6 @@ confirm.running=In Bearbeitung ...
confirm.lookupsrtm=Es wurden %d H\u00f6henwerte gefunden
confirm.downloadsrtm=Es wurden %d Dateien heruntergeladen
confirm.downloadsrtm.1=Es wurde %d Datei heruntergeladen
-confirm.downloadsrtm.none=Keine Dateien heruntergeladen, alle waren schon gespeichert.
confirm.deletefieldvalues=Feldwerte gel\u00f6scht
confirm.audioload=Audiodateien geladen
confirm.correlateaudios.single=Audio wurde korreliert
@@ -648,7 +646,7 @@ confirm.correlateaudios.multi=Audios wurden korreliert
tip.title=Tipp
tip.useamapcache=Mit lokal-gespeicherten Kartenkacheln (Einstellungen -> Karten auf Festplatte speichern)\nk\u00f6nnen Sie die Darstellung beschleunigen und Netzwerkverkehr reduzieren.
tip.learntimeparams=Wenn Sie Track -> Zeitparameter erlernen mit Ihren Tracks benutzen\ndann werden die berechneten Werte genauer.
-tip.downloadsrtm=Sie k\u00f6nnen diese Funktion beschleunigen indem Sie\nOnline -> SRTM Dateien herunterladen aufrufen\num die Daten lokal zu speichern.
+tip.downloadsrtm=Sie k\u00f6nnen diese Funktion beschleunigen indem Sie\ndie SRTM Daten lokal im Kartenspeicher speichern.
tip.usesrtmfor3d=Dieser Track hat keine H\u00f6heninformation.\nSie k\u00f6nnen die SRTM Funktionen verwenden, um\nH\u00f6henwerte abzusch\u00e4tzen.
tip.manuallycorrelateone=Mit mindestens einem manuell verbundenen Element kann die Zeitdifferenz automatisch berechnet werden.
diff --git a/src/tim/prune/lang/prune-texts_de_CH.properties b/src/tim/prune/lang/prune-texts_de_CH.properties
index e2172ee..555390e 100644
--- a/src/tim/prune/lang/prune-texts_de_CH.properties
+++ b/src/tim/prune/lang/prune-texts_de_CH.properties
@@ -111,7 +111,6 @@ function.splitsegments=In Tracksegm\u00e4nte schniide
function.sewsegments=Tracksegm\u00e4nte z\u00e4mef\u00fcge
function.createmarkerwaypoints=Waypoints inem bestimmten Abstand kreiere
function.lookupsrtm=H\u00f6hendate vonem SRTM hole
-function.downloadsrtm=SRTM Files abalade
function.getwikipedia=Im Wikipedia in dr N\u00f6chi naaluege
function.searchwikipedianames=Wikipedia nachem Namen durasueche
function.searchosmpois=OpenStreetMap na P\u00fcnkt durasueche
@@ -633,7 +632,6 @@ confirm.running=Am Laufe ...
confirm.lookupsrtm=Es sin %d H\u00f6henwerte gfunde
confirm.downloadsrtm=Es sin %d Files abeglade
confirm.downloadsrtm.1=Sisch %d File abeglade
-confirm.downloadsrtm.none=Kei Files abeglade, die sin alli scho da gsi.
confirm.deletefieldvalues=Feldw\u00e4rte gl\u00f6scht worde
confirm.audioload=Audiofiles glade worde
confirm.media.removed=entf\u00e4rnt
@@ -644,7 +642,7 @@ confirm.correlateaudios.multi=Audiofiles sin korreliert worde
tip.title=Tipp
tip.useamapcache=Mit lokali Kartekachle (Iistellige -> Karten uufem Disk speichere)\nk\u00f6nnet Sie d Darstellig bschleunige und Netzwerkverkehr reduziere.
tip.learntimeparams=Wenn Sie Track -> Ziitparameter erlerne mit Ihren Tracks benutze\ndann werdet d ber\u00e4chneti Werte gnauer.
-tip.downloadsrtm=Sie k\u00f6nnet d Funktion beschleunige indem Sie\nOnline -> SRTM Files abalade uufrufe\num d Date lokal z'speichere.
+tip.downloadsrtm=Sie k\u00f6nnet d Funktion beschluunige\nindem Sie Kartekachle lokal speichere\nund d H\u00f6chidate au d\u00f6t speichere.
tip.usesrtmfor3d=Dere Track h\u00e4t kei H\u00f6chiinformation.\nSie k\u00f6nnet d SRTM Funktione verw\u00e4nde, um\nH\u00f6chiwerte abz'sch\u00e4tze.
tip.manuallycorrelateone=Mit mindeschtens einem verbundenen Elem\u00e4nt chann die Ziitdiffer\u00e4nz automatisch ber\u00e4chnet werd\u00e4.
diff --git a/src/tim/prune/lang/prune-texts_en.properties b/src/tim/prune/lang/prune-texts_en.properties
index dbc4be4..ad0d8db 100644
--- a/src/tim/prune/lang/prune-texts_en.properties
+++ b/src/tim/prune/lang/prune-texts_en.properties
@@ -113,7 +113,6 @@ function.splitsegments=Split track into segments
function.sewsegments=Sew track segments together
function.createmarkerwaypoints=Create marker waypoints
function.lookupsrtm=Get altitudes from SRTM
-function.downloadsrtm=Download SRTM tiles
function.getwikipedia=Get nearby Wikipedia articles
function.searchwikipedianames=Search Wikipedia by name
function.searchosmpois=Get nearby OSM points
@@ -553,6 +552,7 @@ dialog.displaysettings.size.large=Large
dialog.displaysettings.windowstyle=Window style (requires restart)
dialog.displaysettings.windowstyle.default=Default
dialog.displaysettings.windowstyle.nimbus=Nimbus
+dialog.displaysettings.windowstyle.gtk=GTK
dialog.downloadosm.desc=Confirm to download the raw OSM data for the specified area:
dialog.searchwikipedianames.search=Search for:
dialog.weather.location=Location
@@ -641,7 +641,6 @@ confirm.running=Running ...
confirm.lookupsrtm=Found %d altitude values
confirm.downloadsrtm=Downloaded %d files to the cache
confirm.downloadsrtm.1=Downloaded %d file to the cache
-confirm.downloadsrtm.none=No files downloaded, they were already in the cache
confirm.deletefieldvalues=Field values deleted
confirm.audioload=Audio files added
confirm.correlateaudios.single=audio was correlated
@@ -651,7 +650,7 @@ confirm.correlateaudios.multi=audios were correlated
tip.title=Tip
tip.useamapcache=By setting up a disk cache (Settings -> Save maps to disk)\nyou can speed up the display and reduce network traffic.
tip.learntimeparams=The results will be more accurate if you use\nTrack -> Learn time estimation parameters\non your recorded tracks.
-tip.downloadsrtm=You can speed this up by calling\nOnline -> Download SRTM tiles\nto save the data in your map cache.
+tip.downloadsrtm=You can speed this up by setting up a disk cache\nto save the SRTM data locally.
tip.usesrtmfor3d=This track doesn't have altitudes.\nYou can use the SRTM functions to get approximate\naltitudes for the 3d view.
tip.manuallycorrelateone=By manually connecting at least one item, the time offset can be calculated for you.
diff --git a/src/tim/prune/lang/prune-texts_es.properties b/src/tim/prune/lang/prune-texts_es.properties
index e4676f6..6d6b76e 100644
--- a/src/tim/prune/lang/prune-texts_es.properties
+++ b/src/tim/prune/lang/prune-texts_es.properties
@@ -12,7 +12,6 @@ menu.track=Track
menu.track.undo=Deshacer
menu.track.clearundo=Despejar la lista de deshacer
menu.track.markrectangle=Marcar puntos dentro de un rect\u00e1ngulo
-function.deletemarked=Eliminar puntos marcados
menu.range=Rango
menu.range.all=Seleccionar todo
menu.range.none=No seleccionar nada
@@ -36,9 +35,10 @@ menu.view.browser.openstreetmap=Openstreetmap
menu.view.browser.mapquest=Mapquest
menu.view.browser.yahoo=Mapas Yahoo
menu.view.browser.bing=Mapas Bing
+menu.view.browser.inlinemap=Mapa en l\u00ednea
+menu.view.browser.graphhopper=GraphHopper
menu.settings=Preferencias
menu.settings.onlinemode=Cargar mapas de Internet
-dialog.displaysettings.antialias=Usar antialiasing
menu.settings.autosave=Auto Guardar
menu.help=Ayuda
@@ -87,6 +87,7 @@ function.exportpov=Exportar POV
function.exportimage=Exportar imagen
function.editwaypointname=Editar nombre de waypoint
function.compress=Comprimir track
+function.deletemarked=Eliminar puntos marcados
function.marklifts=Marcar telef\u00e9ricos
function.deleterange=Eliminar rango
function.croptrack=Truncar track
@@ -98,7 +99,9 @@ function.rearrangewaypoints=Reorganizar waypoints
function.convertnamestotimes=Convertir los nombres de los "waypoints" a tiempo
function.deletefieldvalues=Borrar valores del campo
function.findwaypoint=Buscar waypoint
-function.pastecoordinates=Insertar nuevas coordenadas
+function.pastecoordinates=Insertar coordenadas de un nuevo punto
+function.pastecoordinatelist=Ingrese lista de coordenadas
+function.enterpluscode=Insertar c\u00f3digo plus
function.charts=Diagramas
function.show3d=Mostrar en 3-D
function.distances=Distancias
@@ -111,8 +114,8 @@ function.setpaths=Configurar rutas del programas
function.selectsegment=Seleccionar segmento actual
function.splitsegments=Segmentar el track
function.sewsegments=Ensamblar los segmentos
+function.createmarkerwaypoints=Crear waypoints marcadores
function.lookupsrtm=Obtener altitudes de SRTM
-function.downloadsrtm=Descargar datos de SRTM
function.getwikipedia=Obtener art\u00edculos de Wikipedia cercanos
function.searchwikipedianames=Buscar en Wikipedia por nombre
function.searchosmpois=Buscar en OSM cercanos
@@ -120,7 +123,9 @@ function.searchopencachingde=Buscar en OpenCaching.de
function.mapillary=Buscar en Mapillary
function.downloadosm=Descargar datos OSM del \u00e1rea
function.duplicatepoint=Duplicar punto
+function.projectpoint=Proyectar punto
function.setcolours=Establecer color
+function.setdisplaysettings=Establecer opciones para la visualizaci\u00f3n
function.setlanguage=Establecer lenguaje
function.connecttopoint=Conectar con punto
function.disconnectfrompoint=Desconectar de punto
@@ -145,6 +150,7 @@ function.diskcache=Guardar mapas en disco
function.managetilecache=Administrar cache de mapas
function.getweatherforecast=Obtener pron\u00f3stico del tiempo
function.setaltitudetolerance=Establecer la tolerancia de altitud
+function.selecttimezone=Seleccionar la zona horaria
## Dialogs
dialog.exit.confirm.title=Salir de GpsPrune
@@ -244,10 +250,6 @@ dialog.exportgpx.copysource=Copiar la fuente
dialog.exportgpx.encoding=Codificaci\u00f3n
dialog.exportgpx.encoding.system=Sistema
dialog.exportgpx.encoding.utf8=UTF-8
-dialog.3d.useterrain=Terreno
-dialog.3d.terraingridsize=Dimensi\u00f3n de la cuadr\u00edcula
-dialog.exportpov.cannotmakebaseimage=Fallo al guardar la imagen
-dialog.exportpov.baseimage=Imagen de mapa
dialog.exportpov.text=Introduca los par\u00e1metros para exportar
dialog.exportpov.font=Fuente
dialog.exportpov.camerax=C\u00e1mara X
@@ -268,6 +270,7 @@ dialog.baseimage.zoom=Zoom
dialog.baseimage.incomplete=Imagen incompleta
dialog.baseimage.tiles=Recuadros
dialog.baseimage.size=Tama\u00f1o de la imagen
+dialog.exportimage.noimagepossible=Las im\u00e1genes de mapas deben ser guardadas para poder usarlas para una exportaci\u00f3n.
dialog.exportimage.drawtrack=Dibujar track
dialog.exportimage.drawtrackpoints=Dibujar puntos del track
dialog.exportimage.textscalepercent=Agrandamiento del texto (%)
@@ -345,8 +348,11 @@ dialog.estimatetime.parameters.timefor=Duraci\u00f3n para
dialog.estimatetime.results=Resultados
dialog.estimatetime.results.estimatedtime=Duraci\u00f3n estimada
dialog.estimatetime.results.actualtime=Duraci\u00f3n real
+dialog.estimatetime.error.nodistance=Las estimaciones de tiempo necesitan puntos de v\u00eda conectados, para dar una distancia
dialog.estimatetime.error.noaltitudes=Los rangos seleccionados no contienen altitudes
+dialog.learnestimationparams.intro=Estos son los par\u00e1metros calculados a partir del track
dialog.learnestimationparams.averageerror=Error medio
+dialog.learnestimationparams.combine=Estos par\u00e1metros se pueden combinar con los valores actuales
dialog.learnestimationparams.combinedresults=Resultados combinados
dialog.learnestimationparams.weight.100pccurrent=Mantener datos actuales
dialog.learnestimationparams.weight.current=actuales
@@ -407,8 +413,8 @@ dialog.correlate.timestamp.end=Final
dialog.correlate.audioselect.intro=Seleccione uno de estos audios correlacionados para usarlo como margen temporal.
dialog.correlate.select.audioname=Nombre del audio
dialog.correlate.select.audiolater=Audio m\u00e1s adelante
-dialog.rearrangephotos.desc=Seleccionar el destino y orden de los puntos de las fotos
dialog.rearrangewaypoints.desc=Seleccionar el destino y orden de los waypoints
+dialog.rearrangephotos.desc=Seleccionar el destino y orden de los puntos de las fotos
dialog.rearrange.tostart=Mover al comienzo
dialog.rearrange.toend=Mover al final
dialog.rearrange.tonearest=Mover al punto m\u00e1s pr\u00f3ximo
@@ -432,6 +438,10 @@ dialog.deletemarked.nonefound=Ning\u00fan punto eliminado
dialog.pastecoordinates.desc=Ingresar o pegar las coordenadas aqu\u00ed
dialog.pastecoordinates.coords=Coordenadas
dialog.pastecoordinates.nothingfound=Por favor verificar las coordenadas e intentar nuevamente
+dialog.pastecoordinatelist.desc=Introducir las coordenadas de los nuevos puntos con un punto por l\u00ednea
+dialog.pluscode.desc=Introduzca o pegue el c\u00f3digo plus aqu\u00ed
+dialog.pluscode.code=C\u00f3digo plus
+dialog.pluscode.nothingfound=Por favor, compruebe el c\u00f3digo e int\u00e9ntelo de nuevo
dialog.help.help=Por favor, ver\n https://gpsprune.activityworkshop.net/\npara m\u00e1s informaci\u00f3n y gu\u00edas del usuario.
dialog.about.version=Versi\u00f3n
dialog.about.build=Construcci\u00f3n
@@ -530,12 +540,20 @@ dialog.diskcache.deleted=Borrado %d archivos del cache
dialog.deletefieldvalues.intro=Seleccionar el campo a eliminar para el rango actual
dialog.deletefieldvalues.nofields=No hay campos a eliminar para el rango actual
dialog.displaysettings.linewidth=Anchura de las l\u00edneas para los recorridos (1-4)
+dialog.displaysettings.antialias=Usar antialiasing
dialog.displaysettings.waypointicons=Iconos de los waypoints
+dialog.displaysettings.wpicon.default=Por defecto
+dialog.displaysettings.wpicon.ringpt=Marcador redondeado
dialog.displaysettings.wpicon.plectrum=Plectro
dialog.displaysettings.wpicon.ring=Anillo
+dialog.displaysettings.wpicon.pin=Chincheta
dialog.displaysettings.size.small=Peque\u00f1os
dialog.displaysettings.size.medium=Medianos
dialog.displaysettings.size.large=Grandes
+dialog.displaysettings.windowstyle=Estilo de la ventana
+dialog.displaysettings.windowstyle.default=Por defecto
+dialog.displaysettings.windowstyle.nimbus=Nimbus
+dialog.displaysettings.windowstyle.gtk=GTK
dialog.downloadosm.desc=Confirmar la descarga de datos en bruto de OSM para el \u00e1rea especificada.
dialog.searchwikipedianames.search=Buscar:
dialog.weather.location=Localidad
@@ -559,17 +577,31 @@ dialog.weather.day.sunday=Domingo
dialog.weather.wind=Viento
dialog.weather.temp=Temp
dialog.weather.humidity=Humedad
+dialog.weather.creditnotice=Estos datos est\u00e1n disponibles en openweathermap.org. Su sitio web tiene m\u00e1s detalles.
+dialog.deletebydate.onlyonedate=Todos los puntos se registraron en la misma fecha.
+dialog.deletebydate.intro=Para cada fecha del track, puede elegir entre borrar o mantener los puntos
dialog.deletebydate.nodate=Sin marcas de tiempo
dialog.deletebydate.column.keep=Mantener
dialog.deletebydate.column.delete=Eliminar
dialog.setaltitudetolerance.text.metres=Limite (en metros) por debajo de cual peque\u00f1as subidas o bajadas ser\u00e1n ignoradas
dialog.setaltitudetolerance.text.feet=Limite (en pies) por debajo de cual peque\u00f1as subidas o bajadas ser\u00e1n ignoradas
+dialog.settimezone.intro=Aqu\u00ed se puede seleccionar la zona horaria para mostrar las marcas de tiempo de los puntos
dialog.settimezone.system=Zona horaria del sistema
+dialog.settimezone.custom=Usar la siguiente zona horaria:
+dialog.settimezone.list.toomany=Demasiados por elegir
+dialog.settimezone.selectedzone=Zona horaria seleccionada
+dialog.settimezone.offsetfromutc=Compensaci\u00f3n respecto a UTC
dialog.autoplay.duration=Duraci\u00f3n (seg)
dialog.autoplay.usetimestamps=Usar informaci\u00f3n de tiempo
dialog.autoplay.rewind=Rebobinar
dialog.autoplay.pause=Pausar
dialog.autoplay.play=Jugar
+dialog.markers.halves=Puntos medios
+dialog.markers.half.distance=Media distancia
+dialog.markers.half.climb=Mitad de cuesta
+dialog.markers.half.descent=Mitad de descenso
+dialog.projectpoint.desc=Introduzca la direcci\u00f3n y la distancia para proyectar este punto
+dialog.projectpoint.bearing=Azimut (grados desde el Norte)
## 3d window
dialog.3d.title=GpsPrune vista 3-D
@@ -617,6 +649,10 @@ confirm.correlateaudios.multi=Los audios fueron correlacionados
## Tips, shown just once when appropriate
tip.title=Sugerencia
+tip.useamapcache=Configurando una cach\u00e9 de disco (Preferencias -> Guardar mapas en disco)\npuede acelerar la visualizaci\u00f3n y reducir el tr\u00e1fico de la red.
+tip.learntimeparams=Los resultados ser\u00e1n m\u00e1s precisos si utiliza\nTrack -> Aprender par\u00e1metros de estimaci\u00f3n de tiempo\nen sus pistas grabadas.
+tip.downloadsrtm=Puede acelerar esto si guarda los datos en su cach\u00e9 de mapas.
+tip.usesrtmfor3d=Esta pista no tiene altitudes.\nPuede utilizar las funciones del SRTM\npara obtener altitudes aproximadas para la vista 3d.
tip.manuallycorrelateone=Correlacionando al menos una foto manualmente, el margen de tiempo se calcula autom\u00e1ticamente.
## Buttons
@@ -730,6 +766,7 @@ fieldname.duration=Duraci\u00f3n
fieldname.speed=Velocidad
fieldname.verticalspeed=Velocidad vertical
fieldname.description=Descripci\u00f3n
+fieldname.comment=Comentario
fieldname.mediafilename=Archivo
## Measurement units
@@ -829,6 +866,7 @@ error.load.nopoints=No se encuentra ninguna informaci\u00f3n de coordenadas en e
error.load.unknownxml=Formato xml no reconocido:
error.load.noxmlinzip=No se encuentra ning\u00fan archivo xml en el archivo zip
error.load.othererror=Fallo al cargar datos:
+error.load.nopointsintext=No se encuentra ninguna informaci\u00f3n de coordenadas
error.jpegload.dialogtitle=Error cargando fotos
error.jpegload.nofilesfound=No se encuentra ning\u00fan archivo
error.jpegload.nojpegsfound=No se encuentra ning\u00fan archivo jpeg
@@ -856,32 +894,7 @@ error.playaudiofailed=Fallo reproduciendo archivo de audio
error.cache.notthere=No se encontr\u00f3 la carpeta del cache de recuadros
error.cache.empty=La carpeta del cache de recuadros esta vac\u00edo
error.cache.cannotdelete=No se pudieron borrar recuadros
+error.learnestimationparams.failed=No puede aprender los par\u00e1metros de esta pista.\nIntente cargar m\u00e1s pistas.
error.tracksplit.nosplit=Imposible segmentar el track
error.downloadsrtm.nocache=Imposible guardar los archivos.\nPor favor, compruebe el cache.
error.sewsegments.nothingdone=Imposible ensamblar los segmentos.\nEl track tiene ahora %d segmentos.
-
-dialog.exportimage.noimagepossible=Las im\u00e1genes de mapas deben ser guardadas para poder usarlas para una exportaci\u00f3n.
-dialog.estimatetime.error.nodistance=Las estimaciones de tiempo necesitan puntos de v\u00eda conectados, para dar una distancia
-dialog.learnestimationparams.intro=Estos son los par\u00e1metros calculados a partir del track
-dialog.learnestimationparams.combine=Estos par\u00e1metros se pueden combinar con los valores actuales
-dialog.weather.creditnotice=Estos datos est\u00e1n disponibles en openweathermap.org. Su sitio web tiene m\u00e1s detalles.
-dialog.deletebydate.onlyonedate=Todos los puntos se registraron en la misma fecha.
-dialog.deletebydate.intro=Para cada fecha del track, puede elegir entre borrar o mantener los puntos
-confirm.downloadsrtm.none=No se descargaron archivos, ya estaban en la cache
-tip.useamapcache=Configurando una cach\u00e9 de disco (Preferencias -> Guardar mapas en disco)\npuede acelerar la visualizaci\u00f3n y reducir el tr\u00e1fico de la red.
-tip.learntimeparams=Los resultados ser\u00e1n m\u00e1s precisos si utiliza\nTrack -> Aprender par\u00e1metros de estimaci\u00f3n de tiempo\nen sus pistas grabadas.
-tip.downloadsrtm=Puede acelerar esto si llama a\nOnline -> Descargar datos de SRTM\npara guardar los datos en su cach\u00e9 de mapas.
-tip.usesrtmfor3d=Esta pista no tiene altitudes.\nPuede utilizar las funciones del SRTM\npara obtener altitudes aproximadas para la vista 3d.
-error.learnestimationparams.failed=No puede aprender los par\u00e1metros de esta pista.\nIntente cargar m\u00e1s pistas.
-function.enterpluscode=Insertar c\u00f3digo plus
-function.projectpoint=Proyectar punto
-dialog.pastecoordinatelist.desc=Introducir las coordenadas de los nuevos puntos con un punto por l\u00ednea
-dialog.pluscode.desc=Introduzca o pegue el c\u00f3digo plus aqu\u00ed
-dialog.pluscode.code=C\u00f3digo plus
-dialog.pluscode.nothingfound=Por favor, compruebe el c\u00f3digo e int\u00e9ntelo de nuevo
-dialog.displaysettings.windowstyle=Estilo de la ventana
-dialog.projectpoint.desc=Introduzca la direcci\u00f3n y la distancia para proyectar este punto
-dialog.projectpoint.bearing=Azimut (grados desde el Norte)
-fieldname.comment=Comentario
-dialog.settimezone.selectedzone=Zona horaria seleccionada
-function.selecttimezone=Seleccionar la zona horaria
diff --git a/src/tim/prune/lang/prune-texts_fi.properties b/src/tim/prune/lang/prune-texts_fi.properties
index 8b54aa6..226a84b 100644
--- a/src/tim/prune/lang/prune-texts_fi.properties
+++ b/src/tim/prune/lang/prune-texts_fi.properties
@@ -108,7 +108,6 @@ function.splitsegments=Pilko reitti lohkoihin
function.sewsegments=Yhdist\u00e4 reittilohkot
function.createmarkerwaypoints=Luo merkityt kohdepisteet
function.lookupsrtm=Lue korkeysk\u00e4yr\u00e4t SRTM:st\u00e4
-function.downloadsrtm=Lataa SRTM-palat
function.getwikipedia=Hae likeiset Wikipedia-artikkelit
function.searchwikipedianames=Etsi nimell\u00e4 Wikipedia:sta...
function.searchosmpois=Etsi l\u00e4heiset OSM-pisteet
@@ -596,7 +595,6 @@ confirm.running=Running ...
confirm.lookupsrtm=L\u00f6ytyi %d korkeusarvoa
confirm.downloadsrtm=Ladattu %d tiedostoa v\u00e4limuistiin
confirm.downloadsrtm.1=Ladattu %d tiedosto v\u00e4limuistiin
-confirm.downloadsrtm.none=Tiedostoja ei ladattu, koska ne olivat jo v\u00e4limuistissa
confirm.deletefieldvalues=Kentt\u00e4arvot poistettu
confirm.audioload=\u00c4\u00e4nitiedostot lis\u00e4tty
confirm.correlateaudios.single=\u00e4\u00e4ni oli korreloitu
@@ -606,7 +604,6 @@ confirm.correlateaudios.multi=\u00e4\u00e4net olivat korreloidut
tip.title=Vihje
tip.useamapcache=Jos tallennutat karttapalat v\u00e4limuistina toimivaan hakemistoon levylle\n Valikko: Asetukset -> Talleta kartat hakemistoon,\nn\u00e4yt\u00f6n toiminta nopeutuu ja verkkoliikenne v\u00e4hentyy.
tip.learntimeparams=Tuloset voivat olla tarkempia, jos suoritutat toiminnon\n Valikko: Reitti -> Opi aika-arvion parametrit\ntallentamillesi reiteille.
-tip.downloadsrtm=Voit nopeututtaa t\u00e4t\u00e4 suorituttamalla toiminnon\n Valikko: Online -> Lataa SRTM-palat\nkarttojen v\u00e4limuistihakemistoon.
tip.usesrtmfor3d=T\u00e4ss\u00e4 reitiss\u00e4 ei ole korkeustietoja.\nVoit k\u00e4ytt\u00e4\u00e4 SRTM-toimintoja saadaksesi likim\u00e4\u00e4r\u00e4iset\nkorkeusarvot 3D-n\u00e4kym\u00e4\u00e4 varten.
tip.manuallycorrelateone=Jos korjaat v\u00e4hint\u00e4\u00e4n yhden kohteen aikatiedot, ohjelma voi laskea aikapoikkeamat puolestasi.
diff --git a/src/tim/prune/lang/prune-texts_fr.properties b/src/tim/prune/lang/prune-texts_fr.properties
index 9c0f85a..26981e4 100644
--- a/src/tim/prune/lang/prune-texts_fr.properties
+++ b/src/tim/prune/lang/prune-texts_fr.properties
@@ -86,6 +86,7 @@ function.exportpov=Exporter en POV
function.exportimage=Exporter une image
function.editwaypointname=\u00c9diter le nom du point
function.compress=Compresser la trace
+function.marklifts=Marquer les remont\u00e9es m\u00e9caniques
function.deleterange=Supprimer l'\u00e9tendue
function.croptrack=Recadrer l'\u00e9tendue
function.interpolate=Interpoler les points
@@ -109,17 +110,17 @@ function.autoplay=Jouer la trace
function.selectsegment=S\u00e9lectionner le segment courant
function.splitsegments=S\u00e9pare les segments
function.sewsegments=R\u00e9unis les segments
+function.createmarkerwaypoints=Cr\u00e9ation de points de rep\u00e8re
function.lookupsrtm=R\u00e9cup\u00e9rer les altitudes depuis SRTM
-function.downloadsrtm=T\u00e9l\u00e9charger les donn\u00e9es SRTM
function.getwikipedia=Obtenir les articles de Wikip\u00e9dia \u00e0 proximit\u00e9
function.searchwikipedianames=Rechercher dans Wikip\u00e9dia par nom
-function.searchosmpois=Rechercher dans OSM \u00e0 proximit\u00e9
+function.searchosmpois=Rechercher de marques OSM \u00e0 proximit\u00e9
function.searchopencachingde=Rechercher dans OpenCaching.de
function.mapillary=Rechercher dans Mapillary
function.downloadosm=T\u00e9l\u00e9charger les donn\u00e9es OSM de la zone
function.duplicatepoint=Dupliquer le point
function.setcolours=Choisir les couleurs
-function.setdisplaysettings=Pr\u00e9f\u00e9rences graphiques
+function.setdisplaysettings=Pr\u00e9f\u00e9rences d'affichage
function.setlanguage=Choisir la langue
function.connecttopoint=Relier au point
function.disconnectfrompoint=D\u00e9tacher du point
@@ -431,7 +432,7 @@ dialog.about.summarytext1=GpsPrune est un programme pour charger, afficher et \u
dialog.about.summarytext2=Distribu\u00e9 sous license Gnu GPL pour un usage et une am\u00e9lioration libres, ouverts et mondiaux.
La copie, la redistribution et la modification sont autoris\u00e9es et encourag\u00e9es
selon les conditions d\u00e9taill\u00e9es dans le fichier license.txt
inclus.
dialog.about.summarytext3=Consultez la page https://activityworkshop.net/
pour plus de d\u00e9tails et des manuels utilisateur.
dialog.about.languages=Langues disponibles
-dialog.about.translatedby=Texte en fran\u00e7ais par Petrovsk, theYinYeti, R\u00e9mi et jmr.
+dialog.about.translatedby=Texte en fran\u00e7ais par Petrovsk, theYinYeti, R\u00e9mi, jmr et Tche333.
dialog.about.systeminfo=Info Syst\u00e8me
dialog.about.systeminfo.os=Syst\u00e8me d'exploitation
dialog.about.systeminfo.java=Java Runtime
@@ -598,7 +599,6 @@ confirm.running=En cours...
confirm.lookupsrtm=Trouv\u00e9 %d valeurs d'altitude
confirm.downloadsrtm=%d fichiers ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s
confirm.downloadsrtm.1=%d fichier a \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9
-confirm.downloadsrtm.none=Pas de fichiers ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s, ils sont d\u00e9j\u00e0 l\u00e0
confirm.deletefieldvalues=Valeurs effac\u00e9es
confirm.audioload=Fichiers audio ajout\u00e9s
confirm.correlateaudios.single=fichier audio a \u00e9t\u00e9 corr\u00e9l\u00e9
@@ -608,7 +608,6 @@ confirm.correlateaudios.multi=fichiers audio ont \u00e9t\u00e9 corr\u00e9l\u00e9
tip.title=Astuce
tip.useamapcache=By setting up a disk cache (Pr\u00e9f\u00e9rences -> Enregistrer les cartes sur le disque)\nyou can speed up the display and reduce network traffic.
tip.learntimeparams=The results will be more accurate if you use\nTrace -> Apprentissage de l'estimation\non your recorded tracks.
-tip.downloadsrtm=You can speed this up by calling\nEn ligne -> T\u00e9l\u00e9charger les donn\u00e9es SRTM\nto save the data in your map cache.
tip.manuallycorrelateone=En corr\u00e9lant manuellement au moins une photo, le d\u00e9calage de temps peut \u00eatre calcul\u00e9 pour vous.
# Buttons
diff --git a/src/tim/prune/lang/prune-texts_hu.properties b/src/tim/prune/lang/prune-texts_hu.properties
index 021db53..8239865 100644
--- a/src/tim/prune/lang/prune-texts_hu.properties
+++ b/src/tim/prune/lang/prune-texts_hu.properties
@@ -35,6 +35,8 @@ menu.view.browser.openstreetmap=OpenStreetMap
menu.view.browser.mapquest=Mapquest
menu.view.browser.yahoo=Yahoo! Maps
menu.view.browser.bing=Bing Maps
+menu.view.browser.inlinemap=Inlinemap.net
+menu.view.browser.graphhopper=GraphHopper
menu.settings=Be\u00e1ll\u00edt\u00e1sok
menu.settings.onlinemode=T\u00e9rk\u00e9pek bet\u00f6lt\u00e9se internetr\u0151l
menu.settings.autosave=Be\u00e1ll\u00edt\u00e1sok automatikus ment\u00e9se kil\u00e9p\u00e9skor
@@ -71,6 +73,7 @@ shortcut.menu.file.save=S
shortcut.menu.track.undo=Z
shortcut.menu.track.compress=C
shortcut.menu.range.all=A
+shortcut.menu.point.edit=E
shortcut.menu.help.help=H
# Functions
@@ -97,9 +100,12 @@ function.convertnamestotimes=\u00datpontok neveinek konvert\u00e1l\u00e1sa id\u0
function.deletefieldvalues=Mez\u0151 \u00e9rt\u00e9keinek t\u00f6rl\u00e9se
function.findwaypoint=\u00datpont keres\u00e9se
function.pastecoordinates=\u00daj koordin\u00e1t\u00e1k megad\u00e1sa
+function.pastecoordinatelist=Adja meg a koordin\u00e1t\u00e1k list\u00e1j\u00e1t
+function.enterpluscode=Pluszk\u00f3d megad\u00e1sa
function.charts=Diagramok
function.show3d=3D n\u00e9zet
function.distances=T\u00e1vols\u00e1gok
+function.viewfulldetails=\u00d6sszes r\u00e9szlet
function.estimatetime=Becs\u00fclt id\u0151
function.learnestimationparams=Id\u0151becsl\u00e9s tanul\u00e1s\u00e1nak param\u00e9terei
function.autoplay=Nyomvonal lej\u00e1tsz\u00e1sa
@@ -118,6 +124,7 @@ function.searchopencachingde=Keres\u00e9s az OpenCaching.de-n
function.mapillary=F\u00e9nyk\u00e9pek keres\u00e9se Mapillary-n
function.downloadosm=OSM adatok let\u00f6lt\u00e9se a ter\u00fcletr\u0151l
function.duplicatepoint=Pont kett\u0151z\u00e9se
+function.projectpoint=Pont vet\u00edt\u00e9se
function.setcolours=Sz\u00ednek be\u00e1ll\u00edt\u00e1sa
function.setdisplaysettings=Megjelen\u00edt\u00e9s be\u00e1ll\u00edt\u00e1sa
function.setlanguage=Nyelv be\u00e1ll\u00edt\u00e1sa
@@ -431,6 +438,10 @@ dialog.deletemarked.nonefound=Nem t\u00e1vol\u00edthat\u00f3 el adatpont
dialog.pastecoordinates.desc=Adja meg vagy illessze be a koordin\u00e1t\u00e1kat ide
dialog.pastecoordinates.coords=Koordin\u00e1t\u00e1k
dialog.pastecoordinates.nothingfound=Ellen\u0151rizze a koordin\u00e1t\u00e1kat, \u00e9s pr\u00f3b\u00e1lja \u00fajra
+dialog.pastecoordinatelist.desc=Adja meg az \u00faj pontok koordin\u00e1t\u00e1it, soronk\u00e9nt egy pont\u00e9t
+dialog.pluscode.desc=Adja meg, vagy m\u00e1soja ide a pluszk\u00f3dot
+dialog.pluscode.code=Pluszk\u00f3d
+dialog.pluscode.nothingfound=Ellen\u0151rizze a k\u00f3dot, vagy pr\u00f3b\u00e1lja \u00fajra
dialog.help.help=Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt \u00e9s kezel\u00e9si \u00fatmutat\u00f3\u00e9rt l\u00e1sd a \n https://gpsprune.activityworkshop.net/\nwebhelyet.
dialog.about.version=Verzi\u00f3
dialog.about.build=Build
@@ -539,6 +550,10 @@ dialog.displaysettings.wpicon.pin=Gombost\u0171
dialog.displaysettings.size.small=Kicsi
dialog.displaysettings.size.medium=K\u00f6zepes
dialog.displaysettings.size.large=Nagy
+dialog.displaysettings.windowstyle=Ablak st\u00edlus (\u00fajraind\u00edt\u00e1st ig\u00e9nyel)
+dialog.displaysettings.windowstyle.default=Alap\u00e9rtelmezett
+dialog.displaysettings.windowstyle.nimbus=Nimbus
+dialog.displaysettings.windowstyle.gtk=GTK
dialog.downloadosm.desc=Nyers OSM adatok let\u00f6lt\u00e9s\u00e9nek meger\u0151s\u00edt\u00e9se a megadott ter\u00fcletre:
dialog.searchwikipedianames.search=Keres\u00e9s erre:
dialog.weather.location=Helysz\u00edn
@@ -574,11 +589,19 @@ dialog.settimezone.intro=Kiv\u00e1laszthatja, hogy az \u00fatvonalpontok id\u015
dialog.settimezone.system=Rendszer id\u0151z\u00f3na haszn\u00e1lata
dialog.settimezone.custom=Az al\u00e1bbi id\u0151z\u00f3na haszn\u00e1lata
dialog.settimezone.list.toomany=T\u00fal sok lehet\u0151s\u00e9g
+dialog.settimezone.selectedzone=Kiv\u00e1lasztott id\u0151z\u00f3na
+dialog.settimezone.offsetfromutc=Elt\u00e9r\u00e9s az UTC-t\u0151l
dialog.autoplay.duration=Id\u0151tartam (mp)
dialog.autoplay.usetimestamps=Nyompontok id\u0151b\u00e9lyege alapj\u00e1n
dialog.autoplay.rewind=Vissza az elej\u00e9re
dialog.autoplay.pause=Sz\u00fcnet
dialog.autoplay.play=Lej\u00e1tsz\u00e1s
+dialog.markers.halves=F\u00e9l\u00fat pontok
+dialog.markers.half.distance=F\u00e9lt\u00e1v
+dialog.markers.half.climb=F\u00e9l\u00fat a m\u00e1sz\u00e1sban
+dialog.markers.half.descent=F\u00e9l\u00fat az ereszked\u00e9sben
+dialog.projectpoint.desc=A pont vet\u00edt\u00e9s\u00e9hez adjon meg egy ir\u00e1nyt \u00e9s t\u00e1vols\u00e1got
+dialog.projectpoint.bearing=Ir\u00e1nysz\u00f6g (fok \u00e9szakt\u00f3l)
# 3d window
dialog.3d.title=GpsPrune 3D n\u00e9zet
@@ -729,6 +752,7 @@ map.overzoom=Nem \u00e9rhet\u0151 el t\u00e9rk\u00e9p ezen a nagy\u00edt\u00e1si
# Field names
fieldname.latitude=Sz\u00e9less\u00e9g
fieldname.longitude=Hossz\u00fas\u00e1g
+fieldname.coordinates=Koordin\u00e1t\u00e1k
fieldname.altitude=Magass\u00e1g
fieldname.timestamp=Id\u0151
fieldname.time=Id\u0151
@@ -743,6 +767,7 @@ fieldname.duration=Id\u0151tartam
fieldname.speed=Sebess\u00e9g
fieldname.verticalspeed=F\u00fcgg\u0151leges sebess\u00e9g
fieldname.description=Le\u00edr\u00e1s
+fieldname.comment=Megjegyz\u00e9s
fieldname.mediafilename=F\u00e1jln\u00e9v
# Measurement units
@@ -842,6 +867,7 @@ error.load.nopoints=Nem tal\u00e1lhat\u00f3 koordin\u00e1tainform\u00e1ci\u00f3
error.load.unknownxml=Ismeretlen xml form\u00e1tum:
error.load.noxmlinzip=Nem tal\u00e1lhat\u00f3 xml f\u00e1jl a zip f\u00e1jlon bel\u00fcl
error.load.othererror=Hiba a f\u00e1jl olvas\u00e1sa sor\u00e1n:
+error.load.nopointsintext=Nincs benne koordin\u00e1ta inform\u00e1ci\u00f3
error.jpegload.dialogtitle=Hiba a k\u00e9pek bet\u00f6lt\u00e9sekor
error.jpegload.nofilesfound=Nem tal\u00e1lhat\u00f3 f\u00e1jl
error.jpegload.nojpegsfound=Nem tal\u00e1lhat\u00f3 jpeg f\u00e1jl
diff --git a/src/tim/prune/lang/prune-texts_it.properties b/src/tim/prune/lang/prune-texts_it.properties
index bc5a7b3..2e7b3aa 100644
--- a/src/tim/prune/lang/prune-texts_it.properties
+++ b/src/tim/prune/lang/prune-texts_it.properties
@@ -113,7 +113,6 @@ function.splitsegments=Dividi traccia in segmenti
function.sewsegments=Riorganizza segmenti insieme
function.createmarkerwaypoints=Crea marcatori
function.lookupsrtm=Ottieni quote da SRTM
-function.downloadsrtm=Scarica file da SRTM
function.getwikipedia=Ottieni i punti Wikipedia nelle vicinanze
function.searchwikipedianames=Cerca il nome in Wikipedia
function.searchosmpois=Ottieni i punti OSM nelle vicinanze
@@ -638,7 +637,6 @@ confirm.running=Operazione in corso...
confirm.lookupsrtm=Trovato %d valori di quota
confirm.downloadsrtm=Scarica %d file nella cache
confirm.downloadsrtm.1=Scarica %d file nella cache
-confirm.downloadsrtm.none=Nessun file scaricato, erano gi\u00e0 presenti nella cache
confirm.deletefieldvalues=Valori del campo cancellati
confirm.audioload=Ripresa audio aggiunta
confirm.correlateaudios.single=la ripresa audio era correlata
@@ -648,7 +646,7 @@ confirm.correlateaudios.multi=le riprese audio erano correlate
tip.title=Consiglio
tip.useamapcache=Usando una cache della mappa (Preferenze -> Salva mappe su disco)\npuoi accelerare la visualizzazione e ridurre il traffico.
tip.learntimeparams=I risultati saranno pi\u00f9 precisi usando\nTraccia -> Apprendi parametri di stima\ncon le tue tracce.
-tip.downloadsrtm=Puoi accelerare questa funzione usando\nOnline -> Scarica file da SRTM\nper salvare i dati nella cache.
+tip.downloadsrtm=Puoi accelerare questa funzione salvare i dati nella cache.
tip.usesrtmfor3d=La traccia non include informazioni sull'altitudine.\nPuoi utilizzare la funzione SRTM per ottenere le altitudini\nper la visione 3D.
tip.manuallycorrelateone=Con il collegamento manuale di almeno una foto, lo scarto di orario viene calcolato per te
diff --git a/src/tim/prune/lang/prune-texts_nl.properties b/src/tim/prune/lang/prune-texts_nl.properties
index cde8d6e..c757ccf 100644
--- a/src/tim/prune/lang/prune-texts_nl.properties
+++ b/src/tim/prune/lang/prune-texts_nl.properties
@@ -116,7 +116,6 @@ function.splitsegments=Splits route in segmenten
function.sewsegments=Voeg segmenten samen
function.createmarkerwaypoints=aak waypoints voor markering
function.lookupsrtm=Hoogtes van SRTM ophalen
-function.downloadsrtm=Downloaden SRTM tegels
function.getwikipedia=Wikipedia artikelen uit de buurt ophalen
function.searchwikipedianames=Wikipedia zoeken op naam
function.searchosmpois=Haal nabije OSM punten op
@@ -641,7 +640,6 @@ confirm.running=Bezig...
confirm.lookupsrtm=Gevonden %d hoote waarden
confirm.downloadsrtm=Er zijn %d bestanden gedownload nar de cache
confirm.downloadsrtm.1=Er zijn %d bestanden gedownload nar de cache
-confirm.downloadsrtm.none=Geen bestanden gedownload, waren al aanwezig in de cache.
confirm.deletefieldvalues=Veldwaarden gewist
confirm.audioload=Audiobestanden toegevoegd
confirm.correlateaudios.single=audiobestand gecorreleerd
@@ -651,7 +649,7 @@ confirm.correlateaudios.multi=audiobestanden gecorreleerd
tip.title=Tip
tip.useamapcache=Door het instellen van een schijfcache (Instellingen -> Kaart opslaan op schijf)\nkan je de afbeeldsnelheid verbeteren en het netwerkverkeer verminderen.
tip.learntimeparams=De resultaten zullen nauwkeuriger zijn als je \nRoute -> Parameters voor geschatte tijd\ngebruikt op je opgenomen routes.
-tip.downloadsrtm=Je kan dit versnellen door hier\nOnline -> Download SRTM tegels\nde data in je kaartcache op te slaan.
+tip.downloadsrtm=Je kan dit versnellen door de data in je kaartcache op te slaan.
tip.usesrtmfor3d=Deze route heeft geen hoogten.\nJe kan de SRTM functies gebruiken om een geschatte hoogte\nop te halen voor het 3d beeld.
tip.manuallycorrelateone=Door handmatig een foto te koppelen kan het tijdsverschil voor u berekend worden.
diff --git a/src/tim/prune/lang/prune-texts_no.properties b/src/tim/prune/lang/prune-texts_no.properties
index 86aac6f..b83cc0c 100644
--- a/src/tim/prune/lang/prune-texts_no.properties
+++ b/src/tim/prune/lang/prune-texts_no.properties
@@ -7,8 +7,6 @@ menu.file.addphotos=Legg til bilder
menu.file.recentfiles=Nyeste filer
menu.file.save=Lagre som tekst
menu.file.exit=Avslutt
-menu.online=
-menu.track=
menu.track.undo=Angre
menu.track.clearundo=Nullstill angreliste
menu.track.markrectangle=Marker punkter i rektangel
@@ -54,7 +52,6 @@ menu.map.editmode=Redigeringsmodus
# Alt keys for menus
altkey.menu.file=F
-altkey.menu.online=
altkey.menu.track=S
altkey.menu.range=I
altkey.menu.point=P
@@ -66,7 +63,6 @@ altkey.menu.help=H
# Ctrl shortcuts for menu items
shortcut.menu.file.open=\u00c5
-shortcut.menu.file.load=
shortcut.menu.file.save=L
shortcut.menu.track.undo=g
shortcut.menu.track.compress=K
@@ -82,16 +78,13 @@ function.sendtogps=Overf\u00f8r data til GPS
function.exportkml=Eksporter KML
function.exportgpx=Eksporter GPX
function.exportpov=Eksporter POV
-function.exportimage=
function.editwaypointname=Endre waypoint-navn
function.compress=Komprimer spor
function.deleterange=Fjern valgt intervall
function.croptrack=Beskj\u00e6r sporet
function.interpolate=Interpoler punkter
-function.deletebydate=
function.addtimeoffset=Legg til tidsinkrement
function.addaltitudeoffset=Legg til h\u00f8ideinkrement
-function.rearrangewaypoints=
function.convertnamestotimes=Les waypoint-navn som tidspunkter
function.deletefieldvalues=Slett feltets verdier
function.findwaypoint=Finn waypoint
@@ -100,18 +93,11 @@ function.charts=Grafer
function.show3d=3-D visning
function.distances=Avstander
function.viewfulldetails=Vis alle detaljer
-function.estimatetime=
-function.learnestimationparams=
function.setmapbg=Velg grunnlagskart
function.setpaths=Angi plassering av programmer
-function.selectsegment=
-function.splitsegments=
-function.sewsegments=
function.lookupsrtm=Hent h\u00f8yde fra SRTM
-function.downloadsrtm=
function.getwikipedia=Vis Wikipedia info for omegn
function.searchwikipedianames=S\u00f8k Wikipedia
-function.searchopencachingde=
function.downloadosm=Last ned OSM data for omr\u00e5det
function.duplicatepoint=Dupliser punkt
function.setcolours=Velg farger
diff --git a/src/tim/prune/lang/prune-texts_pl.properties b/src/tim/prune/lang/prune-texts_pl.properties
index d3b72e7..75bfc80 100644
--- a/src/tim/prune/lang/prune-texts_pl.properties
+++ b/src/tim/prune/lang/prune-texts_pl.properties
@@ -111,7 +111,6 @@ function.splitsegments=Podziel \u015bcie\u017ck\u0119 na fragmenty
function.sewsegments=Po\u0142\u0105cz fragmenty
function.createmarkerwaypoints=Stw\u00f3rz markery podzia\u0142u
function.lookupsrtm=Pobierz wysoko\u015bci z SRTM
-function.downloadsrtm=Zapisz dane z SRTM
function.getwikipedia=Szukaj w Wikipedii o okolicy
function.searchwikipedianames=Szukaj nazwy w Wikipedii
function.searchopencachingde=Szukaj w OpenCaching.de
@@ -608,7 +607,6 @@ confirm.running=Przetwarzam dane ...
confirm.lookupsrtm=Znaleziono %d warto\u015bci wysoko\u015bci
confirm.downloadsrtm=Pobrano %d plik\u00f3w do kesza
confirm.downloadsrtm.1=Pobrano %d plik do kesza
-confirm.downloadsrtm.none=Nie pobrano \u017cadnych plik\u00f3w, wszystkie by\u0142y ju\u017c w keszu
confirm.deletefieldvalues=Warto\u015bci p\u00f3l usuni\u0119to
confirm.audioload=dodano pliki audio
confirm.correlateaudios.single=audio zosta\u0142o po\u0142\u0105czone
@@ -618,7 +616,7 @@ confirm.correlateaudios.multi=audio zosta\u0142y po\u0142\u0105czone
tip.title=Porada
tip.useamapcache=Konfiguruj\u0105c kesz dyskowy (Ustawienia -> Zapisz mapy na dysk)\nprzyspieszasz wy\u015bwietlanie i ograniczasz ruch sieciowy
tip.learntimeparams=Resultat b\u0119dzie dok\u0142adniejszy je\u015bli u\u017cyjesz
-tip.downloadsrtm=Mo\u017cesz przyspieszy\u0107 operacj\u0119 wywo\u0142uj\u0105c polecenie
+tip.downloadsrtm=Mo\u017cesz przyspieszy\u0107 operacj\u0119 konfiguruj\u0105c kesz dyskowy
tip.usesrtmfor3d=\u015acie\u017cka nie zawiera danych o wysoko\u015bciach\nMo\u017cesz u\u017cy\u0107 funkcji SRTM by pobrac przybli\u017cone dane\no wysko\u015bciach w trybie widoku 3D.
tip.manuallycorrelateone=Gdy powi\u0105\u017cesz r\u0119cznie przynajmniej jedno zdj\u0119cie, r\u00f3\u017cnica czasowa zostanie policzona automatycznie.
@@ -718,6 +716,7 @@ map.overzoom=Brak map dla danego powi\u0119kszenia
# Field names
fieldname.latitude=Szeroko\u015b\u0107
fieldname.longitude=D\u0142ugo\u015b\u0107
+fieldname.coordinates=Wsp\u00f3\u0142rz\u0119dne
fieldname.altitude=Wysoko\u015b\u0107
fieldname.timestamp=Czas
fieldname.time=Czas
@@ -732,6 +731,7 @@ fieldname.duration=Czas trwania
fieldname.speed=Pr\u0119dko\u015b\u0107
fieldname.verticalspeed=Pr\u0119dko\u015b\u0107 pionowa
fieldname.description=Opis
+fieldname.comment=Komentarz
fieldname.mediafilename=Nazwa pliku
# Measurement units
diff --git a/src/tim/prune/lang/prune-texts_pt.properties b/src/tim/prune/lang/prune-texts_pt.properties
index fd785bf..55f60fa 100644
--- a/src/tim/prune/lang/prune-texts_pt.properties
+++ b/src/tim/prune/lang/prune-texts_pt.properties
@@ -108,7 +108,6 @@ function.selectsegment=Selecionar segmento atual
function.splitsegments=Dividir rota em segmentos
function.sewsegments=Reunir segmentos em rota
function.lookupsrtm=Obter altitudes a partir do SRTM
-function.downloadsrtm=Baixar arquivos SRTM
function.getwikipedia=Obter artigos da Wikip\u00e9dia das redondezas
function.searchwikipedianames=Procurar na Wikip\u00e9dia por nome
function.searchopencachingde=Procurar na OpenCaching.de
@@ -575,7 +574,6 @@ confirm.running=Rodando...
confirm.lookupsrtm=Encontrado %d valores de altitude
confirm.downloadsrtm=%d arquivos baixados para a cache
confirm.downloadsrtm.1=%d arquivo baixados para a cache
-confirm.downloadsrtm.none=Nenhum arquivo baixado, pois j\u00e1 est\u00e3o na cache.
confirm.deletefieldvalues=Valores do campo removidos
confirm.audioload=Arquivos de \u00e1udio adicionados
confirm.correlateaudios.single=\u00e1udio foi correlacionado
@@ -585,7 +583,6 @@ confirm.correlateaudios.multi=\u00e1udios foram correlacionados
tip.title=Dica
tip.useamapcache=Configurando a cache de disco (Configura\u00e7\u00f5es -> Salvar mapas para disco)\nvoc\u00ea pode acelerar a exibi\u00e7\u00e3o e reduzir o tr\u00e1fego de rede.
tip.learntimeparams=Os resultados ser\u00e3o mais precisos se voc\u00ea usar\nRota -> Aprender os par\u00e2metros para estimativa de tempo\nde suas rotas gravadas.
-tip.downloadsrtm=Voc\u00ea pode acelerar chamando\nOnline -> Baixar ladrilhos SRTM\npara obter as altitudes\naproximadas para a vis\u00e3o 3D.
tip.usesrtmfor3d=Esta rota n\u00e3o possui altitudes.\nVoc\u00ea pode usar as fun\u00e7\u00f5es SRTM para obter as altitudes\naproximadas para a vis\u00e3o 3D.
tip.manuallycorrelateone=Correlacionando pelo menos uma foto manualmente, a diferen\u00e7a de tempo pode ser calculada para voc\u00ea.
diff --git a/src/tim/prune/lang/prune-texts_ro.properties b/src/tim/prune/lang/prune-texts_ro.properties
index 70ceab6..e3a5610 100644
--- a/src/tim/prune/lang/prune-texts_ro.properties
+++ b/src/tim/prune/lang/prune-texts_ro.properties
@@ -39,6 +39,12 @@ menu.view.browser.bing=Harta Bing
menu.settings=Set\u0103ri
menu.settings.onlinemode=\u00cencarc\u0103 h\u0103r\u021bi
dialog.displaysettings.antialias=Folose\u0219te antialiasing
+dialog.displaysettings.wpicon.plectrum=Plectru
+dialog.displaysettings.wpicon.ring=Inel
+dialog.displaysettings.size.small=Mic
+dialog.displaysettings.size.medium=Mediu
+dialog.displaysettings.size.large=Mare
+dialog.displaysettings.windowstyle=Stilul ferestrei (este necesar\u0103 o repornire)
menu.settings.autosave=Salveaz\u0103 set\u0103rile automat la ie\u0219ire
menu.help=Ajutor
@@ -99,6 +105,7 @@ function.convertnamestotimes=Converte\u0219te numele waypoint-urilor \u00een tim
function.deletefieldvalues=\u0218terge valorile c\u00e2mpurilor
function.findwaypoint=G\u0103se\u0219te waypoint
function.pastecoordinates=Introdu coordonate noi
+function.pastecoordinatelist=Introdu o list\u0103 de coordonate
function.charts=Grafice
function.show3d=Vizualizare 3D
function.distances=Distan\u0163e
@@ -112,7 +119,6 @@ function.selectsegment=Selecteaz\u0103 segment curent
function.splitsegments=Divizeaz\u0103 traseul \u00een segmente
function.sewsegments=Combin\u0103 segmentele traseului
function.lookupsrtm=Descarc\u0103 date SRTM \u00een cache
-function.downloadsrtm=Descarc\u0103 date SRTM
function.getwikipedia=Caut\u0103 articole Wikipedia din proximitate
function.searchwikipedianames=Caut\u0103 Wikipedia dup\u0103 nume
function.searchopencachingde=Caut\u0103 OpenCaching.de
@@ -144,6 +150,7 @@ function.diskcache=Salvare harti
function.managetilecache=Administreaz\u0103 imaginile salvate
function.getweatherforecast=Prognoz\u0103 meteo
function.setaltitudetolerance=Alege toleran\u021ba varia\u021biei altitudinii
+function.selecttimezone=Selecta\u021Bi fusul orar
# Dialogs
dialog.exit.confirm.title=Ie\u015fire din programul GpsPrune
@@ -601,7 +608,6 @@ confirm.running=Executare ...
confirm.lookupsrtm=Au fost g\u0103site %d valori de altitudine
confirm.downloadsrtm=S-au desc\u0103rcat %d fi\u015fiere
confirm.downloadsrtm.1=S-au desc\u0103rcat %d fi\u015fier
-confirm.downloadsrtm.none=Niciun fi\u0219ier nu a fost desc\u0103rcat, ele erau deja prezente \u00een cache
confirm.deletefieldvalues=Valorile c\u00e2mpurilor au fost \u0219terse
confirm.audioload=Fi\u0219iere audio au fost ad\u0103ugate
confirm.correlateaudios.single=clipul audio a fost corelat
@@ -611,7 +617,6 @@ confirm.correlateaudios.multi=clipurile audio au fost corelate
tip.title=Indiciu
tip.useamapcache=Prin configurarea unui cache pe disc (Set\u0103ri -> Salvare h\u0103r\u021bi)\npute\u021bi \u00eembun\u0103t\u0103\u021bi viteza de afi\u0219are \u0219i reduce traficul de re\u021bea
tip.learntimeparams=Rezultatele vor fi mai corecte dac\u0103 folosi\u021bi\nTraseu -> \u00cenva\u021b\u0103 parametri pentru estim\u0103ri de timp\npe traseele deja \u00eenregistrate.
-tip.downloadsrtm=Pute\u021bi \u00eembun\u0103t\u0103\u021bi viteza prin folosirea\nInternet -> Descarc\u0103 date SRTM
tip.usesrtmfor3d=Acest traseu nu are valori de altitudine.\nPute\u021bi folosi func\u021biile SRTM pentru a aproxima altitudinile \u00een vederea 3D.
tip.manuallycorrelateone=Decalajul de timp poate fi calculat dac\u0103 cel pu\u021bin un element e conectat.
@@ -711,6 +716,7 @@ map.overzoom=Nu exist\u0103 h\u0103r\u021bi la acest nivel de apropiere
# Field names
fieldname.latitude=Latitudine
fieldname.longitude=Longitudine
+fieldname.coordinates=Coordonate
fieldname.altitude=Altitudine
fieldname.timestamp=Timp
fieldname.time=Timp
@@ -725,6 +731,7 @@ fieldname.duration=Durat\u0103
fieldname.speed=Vitez\u0103
fieldname.verticalspeed=Vitez\u0103 vertical\u0103
fieldname.description=Descriere
+fieldname.comment=Comentariu
fieldname.mediafilename=Fi\u0219ier
# Measurement units
diff --git a/src/tim/prune/lang/prune-texts_ru.properties b/src/tim/prune/lang/prune-texts_ru.properties
index 6f99f0f..b1fe180 100644
--- a/src/tim/prune/lang/prune-texts_ru.properties
+++ b/src/tim/prune/lang/prune-texts_ru.properties
@@ -114,7 +114,6 @@ function.splitsegments=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u
function.sewsegments=\u0421\u043a\u043b\u0435\u0438\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0442\u0440\u0435\u043a\u0430 \u0432\u043e\u0435\u0434\u0438\u043d\u043e
function.createmarkerwaypoints=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
function.lookupsrtm=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438\u0437 SRTM
-function.downloadsrtm=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SRTM-\u0442\u0430\u0439\u043b\u044b
function.getwikipedia=\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u0412\u0438\u043a\u0438
function.searchwikipedianames=\u041f\u043e\u0438\u0441\u043a \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0412\u0438\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438
function.searchosmpois=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 OSM
@@ -439,6 +438,7 @@ dialog.pastecoordinates.coords=\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\
dialog.pastecoordinates.nothingfound=\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437
dialog.pastecoordinatelist.desc=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439
dialog.pluscode.desc=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043b\u044e\u0441-\u043a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c
+dialog.pluscode.code=\u041f\u043b\u044e\u0441-\u043a\u043e\u0434
dialog.pluscode.nothingfound=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u0434 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437
dialog.help.help=\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\nhttps://gpsprune.activityworkshop.net/
dialog.about.version=\u0412\u0435\u0440\u0441\u0438\u044f
@@ -638,7 +638,6 @@ confirm.running=\u0420\u0430\u0431\u043e\u0442\u0430\u044e...
confirm.lookupsrtm=\u041d\u0430\u0439\u0434\u0435\u043d\u043e %d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
confirm.downloadsrtm=\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e %d \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043a\u044d\u0448
confirm.downloadsrtm.1=\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e %d \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043a\u044d\u0448
-confirm.downloadsrtm.none=\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0436\u0435 \u0432 \u043a\u044d\u0448\u0435
confirm.deletefieldvalues=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u044b
confirm.audioload=\u0424\u0430\u0439\u043b\u044b \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b
confirm.correlateaudios.single=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430
@@ -648,7 +647,7 @@ confirm.correlateaudios.multi=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u
tip.title=\u0421\u043e\u0432\u0435\u0442
tip.useamapcache=\u041f\u0443\u0442\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u044d\u0448\u0430 \u0434\u0438\u0441\u043a\u0430 (\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -> \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a\u00bb)\n\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a.
tip.learntimeparams=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\n\u0422\u0440\u0435\u043a->\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u043a\u0438.
-tip.downloadsrtm=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e, \u0432\u044b\u0437\u043e\u0432\u043e\u043c\n\u041e\u043d\u043b\u0430\u0439\u043d-> \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SRTM-\u0442\u0430\u0439\u043b\u044b\n\u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u044d\u0448\u0435 \u043a\u0430\u0440\u0442\u044b.
+tip.downloadsrtm=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u044d\u0448\u0435 \u043a\u0430\u0440\u0442\u044b.
tip.usesrtmfor3d=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0441\u043e\u0442.\n\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SRTM, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442 \u0434\u043b\u044f \u0432\u0438\u0434\u0430 3D.
tip.manuallycorrelateone=\u041f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.
diff --git a/src/tim/prune/lang/prune-texts_sv.properties b/src/tim/prune/lang/prune-texts_sv.properties
index e2115aa..f7ed52e 100644
--- a/src/tim/prune/lang/prune-texts_sv.properties
+++ b/src/tim/prune/lang/prune-texts_sv.properties
@@ -1,5 +1,5 @@
# Text entries for the GpsPrune application
-# Swedish entries
+# Swedish entries thanks to erikiiofph7
# Menu entries
menu.file=Arkiv
@@ -17,7 +17,7 @@ menu.range.all=V\u00e4lj alla
menu.range.none=V\u00e4lj ingen
menu.range.start=S\u00e4tt till b\u00f6rjan av intervall
menu.range.end=S\u00e4tt till slutet av intervall
-menu.range.average=Medelv\u00e4rdesval
+menu.range.average=Skapa medelv\u00e4rdespunkt
menu.range.reverse=V\u00e4nd intervall
menu.range.mergetracksegments=Sl\u00e5 ihop sp\u00e5rsegment
menu.range.cutandmove=Klipp och flytta urval
@@ -35,6 +35,8 @@ menu.view.browser.openstreetmap=Openstreetmap
menu.view.browser.mapquest=Mapquest
menu.view.browser.yahoo=Yahoo maps
menu.view.browser.bing=Bing maps
+menu.view.browser.inlinemap=Inline map
+menu.view.browser.graphhopper=GraphHopper
menu.settings=Inst\u00e4llningar
menu.settings.onlinemode=H\u00e4mta kartor fr\u00e5n Internet
menu.settings.autosave=Autospara inst\u00e4llningar vid avslut
@@ -71,6 +73,7 @@ shortcut.menu.file.save=S
shortcut.menu.track.undo=Z
shortcut.menu.track.compress=K
shortcut.menu.range.all=A
+shortcut.menu.point.edit=E
shortcut.menu.help.help=H
# Functions
@@ -96,13 +99,16 @@ 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.pastecoordinates=Skapa punkt via koordinater
+function.pastecoordinatelist=Skapa punkter via en koordinat-lista
+function.enterpluscode=Skapa punkt(er) via pluss-kod
function.charts=Diagram
function.show3d=3D-vy
function.distances=Avst\u00e5nd
function.viewfulldetails=Alla detaljer
function.estimatetime=Uppskatta tid
function.learnestimationparams=L\u00e4r upp tidsuppskattningsparametrar
+function.autoplay=Spela upp sp\u00e5ret
function.setmapbg=V\u00e4lj bakgrundskarta
function.setpaths=V\u00e4lj s\u00f6kv\u00e4gar f\u00f6r program
function.selectsegment=Markera aktuellt segment
@@ -110,7 +116,6 @@ function.splitsegments=Dela upp sp\u00e5ret i segment
function.sewsegments=Sy ihop sp\u00e5r-segment
function.createmarkerwaypoints=Skapa markerings-waypoints
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
@@ -118,6 +123,7 @@ 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.projectpoint=Projicera punkt
function.setcolours=V\u00e4lj f\u00e4rger
function.setdisplaysettings=V\u00e4lj visningsalternativ
function.setlanguage=V\u00e4lj spr\u00e5k
@@ -162,7 +168,9 @@ dialog.load.table.field=F\u00e4lt
dialog.load.table.datatype=Datatyp
dialog.load.table.description=Beskrivning
dialog.delimiter.comma=Komma ,
+dialog.delimiter.tab=Tabb
dialog.delimiter.space=Mellanslag
+dialog.delimiter.semicolon=Semikolon ;
dialog.delimiter.other=Annat
dialog.openoptions.altitudeunits=H\u00f6jdenhet
dialog.openoptions.speedunits=Hastighetsenheter
@@ -178,6 +186,7 @@ dialog.jpegload.loadjpegsoutsidearea=Inkludera foton utanf\u00f6r aktuellt omr\u
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.device=Enhetsnamn
dialog.gpsload.format=Format
dialog.gpsload.getwaypoints=Ladda in waypoints
dialog.gpsload.gettracks=Ladda in sp\u00e5r
@@ -329,9 +338,212 @@ 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.learnestimationparams.averageerror=Medel-avvikelse
+dialog.learnestimationparams.combine=Dessa parametrar kan kombineras med nuvarande v\u00e4rden
+dialog.learnestimationparams.combinedresults=Kombinerat resultat
+dialog.learnestimationparams.weight.100pccurrent=Beh\u00e5ll nuvarande v\u00e4rden
+dialog.learnestimationparams.weight.current=nuvarande
+dialog.learnestimationparams.weight.calculated=ber\u00e4knat
+dialog.learnestimationparams.weight.50pc=Medel av nuvarande v\u00e4rden och ber\u00e4knade v\u00e4rden
+dialog.learnestimationparams.weight.100pccalculated=Anv\u00e4nd dom ber\u00e4knade v\u00e4rdena
+dialog.setmapbg.intro=V\u00e4lj en av kartorna, eller l\u00e4gg till en egen
+dialog.addmapsource.title=L\u00e4gg till en ny karta
+dialog.addmapsource.sourcename=Kartans namn
+dialog.addmapsource.layer1url=URL f\u00f6r f\u00f6rsta lagret
+dialog.addmapsource.layer2url=URL f\u00f6r andra lagret
+dialog.addmapsource.maxzoom=Max zoom-niv\u00e5
+dialog.addmapsource.noname=Namnl\u00f6s
+dialog.gpsies.column.name=Sp\u00e5rnamn
+dialog.gpsies.column.length=L\u00e4ngd
+dialog.gpsies.description=Beskrivning
+dialog.gpsies.nodescription=Ingen beskrivning
+dialog.gpsies.nonefound=Inga sp\u00e5r funna
+dialog.mapillary.nonefound=Inga foton funna
+dialog.wikipedia.column.name=Artikelnamn
+dialog.wikipedia.column.distance=Avst\u00e5nd
+dialog.wikipedia.nonefound=Inga punkter hittade p\u00e5 Wikipedia
+dialog.wikipedia.gallery=Galleri
+dialog.osmpois.column.name=Namn
+dialog.osmpois.column.type=Typ
+dialog.osmpois.nonefound=Inga punkter hittade
+dialog.correlate.photoselect.intro=V\u00e4lj en av dessa korrelerade foton att anv\u00e4nda som tids-offset
+dialog.correlate.select.photoname=Fotonamn
+dialog.correlate.select.timediff=Tidsskillnad
+dialog.correlate.select.photolater=Foto senare
+dialog.correlate.options.intro=V\u00e4lj inst\u00e4llningar f\u00f6r automatisk korrelation
+dialog.correlate.options.offsetpanel=tids-offset
+dialog.correlate.options.offset=Offset
+dialog.correlate.options.offset.hours=timmar,
+dialog.correlate.options.offset.minutes=minuter och
+dialog.correlate.options.offset.seconds=sekunder
+dialog.correlate.options.photolater=Foto senare \u00e4n punkt
+dialog.correlate.options.pointlaterphoto=Punkt senare \u00e4n foto
+dialog.correlate.options.audiolater=Ljud senare \u00e4n punkt
+dialog.correlate.options.pointlateraudio=Punkt senare \u00e4n ljud
+dialog.correlate.options.limitspanel=Korrelationsbegr\u00e4nsningar
+dialog.correlate.options.notimelimit=Ingen tidsbegr\u00e4nsning
+dialog.correlate.options.timelimit=Tidsbegr\u00e4nsning
+dialog.correlate.options.nodistancelimit=Ingen avst\u00e5ndsbegr\u00e4nsning
+dialog.correlate.options.distancelimit=Avst\u00e5ndsbegr\u00e4nsning
+dialog.correlate.options.correlate=Korrelera
+dialog.correlate.alloutsiderange=Alla objekt \u00e4r utanf\u00f6r tidsomf\u00e5nget f\u00f6r sp\u00e5ret, s\u00e5 inga kan korreleras.\nF\u00f6rs\u00f6k att \u00e4ndra offset eller manuellt korrelera \u00e5tminstone ett av objekten.
+dialog.correlate.filetimes=Filens tidsst\u00e4mpel markerar:
+dialog.correlate.filetimes2=av ljudklippet
+dialog.correlate.correltimes=F\u00f6r korrelering, anv\u00e4nd
+dialog.correlate.timestamp.beginning=B\u00f6rjan
+dialog.correlate.timestamp.middle=Mitten
+dialog.correlate.timestamp.end=Slutet
+dialog.correlate.audioselect.intro=V\u00e4lj en av dessa korrelerade ljud att anv\u00e4nda som tids-offset
+dialog.correlate.select.audioname=Ljudnamn
+dialog.correlate.select.audiolater=Ljud senare
+dialog.rearrangewaypoints.desc=V\u00e4lj vart och i vilken ordning waypoints ska hamna
+dialog.rearrangephotos.desc=V\u00e4lj vart och i vilken ordning foto-punkterna ska hamna
+dialog.rearrange.tostart=Alla till b\u00f6rjan
+dialog.rearrange.toend=Alla till slutet
dialog.rearrange.tonearest=Varje till n\u00e4rmaste sp\u00e5rpunkt
+dialog.rearrange.nosort=Sortera inte
+dialog.rearrange.sortbyfilename=Sortera p\u00e5 filnamn
+dialog.rearrange.sortbyname=Sortera p\u00e5 namn
+dialog.rearrange.sortbytime=Sortera p\u00e5 tid
+dialog.compress.closepoints.title=Ta bort punkter f\u00f6r n\u00e4ra varandra
+dialog.compress.closepoints.paramdesc=Spannfaktor
+dialog.compress.wackypoints.title=Ta bort avvikande punkter
+dialog.compress.wackypoints.paramdesc=Avst\u00e5ndsfaktor
+dialog.compress.singletons.title=Ta bort Singletons
+dialog.compress.singletons.paramdesc=Avst\u00e5ndsfaktor
+dialog.compress.duplicates.title=Ta bort dubbletter
+dialog.compress.douglaspeucker.title=Douglas-Peucker-komprimering
+dialog.compress.douglaspeucker.paramdesc=Spannfaktor
+dialog.compress.summarylabel=Punkter att ta bort
+dialog.compress.confirm=%d punkter har markerats.\nVill du ta bort de markerade punkterna?
+dialog.compress.confirmnone=inga punkter har markerats
+dialog.deletemarked.nonefound=Inga datapunkter kunde tas bort
+dialog.pastecoordinates.desc=Fyll i koordinaterna h\u00e4r
+dialog.pastecoordinates.coords=Koordinater
+dialog.pastecoordinates.nothingfound=V\u00e4nligen kontrollera koordinaterna och f\u00f6rs\u00f6k igen
+dialog.pastecoordinatelist.desc=Fyll i koordinaterna f\u00f6r dom nya punkterna, en punkt per rad
+dialog.pluscode.desc=Fyll i pluss-koden (Open Location Code) h\u00e4r
+dialog.pluscode.code=Pluss-kod
+dialog.help.help=L\u00e4s\n https://gpsprune.activityworkshop.net/\nf\u00f6r mer information och tips,\ninklusive en PDF-anv\u00e4ndarhandbok som man kan k\u00f6pa.
+dialog.about.version=Version
+dialog.about.build=Build
+dialog.about.summarytext1=GpsPrune \u00e4r ett program f\u00f6r att ladda in, visa och redigera data fr\u00e5n GPS-mottagare.
+dialog.about.summarytext2=Det \u00e4r publicerat under Gnu GPL f\u00f6r fri, \u00f6ppen, v\u00e4rldsomsp\u00e4nnande anv\u00e4ndning och f\u00f6rb\u00e4ttring.
Kopiering, \u00e5terutgivning och modifieringar \u00e4r till\u00e5tna och uppmuntras
enligt villkoren i den inkluderade filen license.txt
.
+dialog.about.summarytext3=Bes\u00f6k https://activityworkshop.net/
f\u00f6r mer information och tips, inklusive
en PDF-anv\u00e4ndarhandbok som du kan k\u00f6pa.
+dialog.about.languages=Tillg\u00e4ngliga spr\u00e5k
+dialog.about.translatedby=\u00d6versatt till svenska av erikiiofph7.
+dialog.about.systeminfo=System-info
+dialog.about.systeminfo.os=Operativsystem
+dialog.about.systeminfo.java=Java Runtime
+dialog.about.systeminfo.java3d=Java3d installerat
+dialog.about.systeminfo.povray=Povray installerat
+dialog.about.systeminfo.exiftool=Exiftool installerat
+dialog.about.systeminfo.gpsbabel=Gpsbabel installerat
+dialog.about.systeminfo.gnuplot=Gnuplot installerat
+dialog.about.yes=Ja
+dialog.about.no=Nej
+dialog.about.credits=Tillk\u00e4nnagivanden
+dialog.about.credits.code=GpsPune:s kod skriven av
+dialog.about.credits.exifcode=Exif:s kad skriven av
+dialog.about.credits.icons=N\u00e5gra ikoner tagna fr\u00e5n
+dialog.about.credits.translators=\u00d6vers\u00e4ttare
+dialog.about.credits.translations=\u00d6vers\u00e4ttningar hj\u00e4lpta av
+dialog.about.credits.devtools=Utvecklingsverktyg
+dialog.about.credits.othertools=\u00d6vriga verktyg
+dialog.about.credits.thanks=Tack till
+dialog.about.readme=L\u00e4sMig
+dialog.checkversion.error=Versionsnummret kunde inte kollas upp.\nVar god kontrollera din internetuppkoppling.
+dialog.checkversion.uptodate=Du anv\u00e4nder den senaste versionen av GpsPrune.
+dialog.checkversion.newversion1=En ny version av GpsPrune finns nu tillg\u00e4nglig! Den senaste versionen \u00e4r
+dialog.checkversion.newversion2=.
+dialog.checkversion.releasedate1=Denna nya version sl\u00e4pptes
+dialog.checkversion.releasedate2=.
+dialog.checkversion.download=F\u00f6r att ladda ner den nya versionen g\u00e5 till https://gpsprune.activityworkshop.net/download.html.
+dialog.keys.intro=Du kan anv\u00e4nda dessa snabbkommandon ist\u00e4llet f\u00f6r att anv\u00e4nda musen
+dialog.keys.keylist=Piltangenter | Panorera kartan \u00e5t v\u00e4nster, h\u00f6ger, upp, ner |
Ctrl + v\u00e4nster, h\u00f6ger piltangent | Markera f\u00f6reg\u00e5ende eller n\u00e4sta punkt |
Ctrl + pil upp, pil ner | Zooma in eller ut |
Ctrl + PgUp, PgDown | Markera f\u00f6reg\u00e5ende, n\u00e4sta segment |
Ctrl + Home, End | Markera f\u00f6rsta, sista punkt |
Del | Radera markerad punkt |
+dialog.keys.normalmodifier=Ctrl
+dialog.keys.macmodifier=Command
+dialog.paths.prune.gnuplotpath=S\u00f6kv\u00e4g till gnuplot
+dialog.paths.prune.gpsbabelpath=S\u00f6kv\u00e4g till gpsbabel
+dialog.paths.prune.exiftoolpath=S\u00f6kv\u00e4g till exiftool
+dialog.setpaths.intro=Om du beh\u00f6ver kan du ange s\u00f6kv\u00e4gar till dom externa programmen:
+dialog.setpaths.found=S\u00f6kv\u00e4g hittad?
+dialog.addaltitude.noaltitudes=Det valda intervallet inneh\u00e5ller ingen h\u00f6jddata
+dialog.addaltitude.desc=H\u00f6jd-offset att addera
+dialog.lookupsrtm.overwritezeros=Skriva \u00f6ver h\u00f6jd-v\u00e4rden som \u00e4r noll?
+dialog.setcolours.intro=Klicka p\u00e5 en f\u00e4rg-ruta f\u00f6r att \u00e4ndra f\u00e4rg
+dialog.setcolours.background=Bakgrund
+dialog.setcolours.borders=Kanter
+dialog.setcolours.lines=Linjer
+dialog.setcolours.primary=Prim\u00e4r
+dialog.setcolours.secondary=Sekund\u00e4r
+dialog.setcolours.point=Punkter
+dialog.setcolours.selection=Markering
+dialog.setcolours.text=Text
+dialog.colourchooser.title=V\u00e4lj f\u00e4rg
+dialog.colourchooser.red=R\u00f6d
+dialog.colourchooser.green=Gr\u00f6n
+dialog.colourchooser.blue=Bl\u00e5
+dialog.colourer.intro=En punkt-m\u00e5lare kan ge sp\u00e5rpunkter olika f\u00e4rg
+dialog.colourer.type=M\u00e5lar-typ
+dialog.colourer.type.none=Ingen
+dialog.colourer.type.byfile=Efter fil
+dialog.colourer.type.bysegment=Efter segment
+dialog.colourer.type.byaltitude=Efter h\u00f6jd
+dialog.colourer.type.byspeed=Efter hastighet
+dialog.colourer.type.byvertspeed=Efter vertikal hastighet
+dialog.colourer.type.bygradient=Efter gradient
+dialog.colourer.type.bydate=Efter datum
+dialog.colourer.start=Start-f\u00e4rg
+dialog.colourer.end=Slut-f\u00e4rg
+dialog.colourer.maxcolours=Max antal f\u00e4rger
+dialog.setlanguage.firstintro=Du kan antingen v\u00e4lja ett av dom inkluderade spr\u00e5keneller v\u00e4lja att anv\u00e4nda en text-fil ist\u00e4llet.
+dialog.setlanguage.secondintro=Du m\u00e5ste spara dina inst\u00e4llningar och sedan
starta om GpsPrune f\u00f6r att \u00e4ndringarna ska verkst\u00e4llas.
+dialog.setlanguage.language=Spr\u00e5k
+dialog.setlanguage.languagefile=Spr\u00e5k-fil
+dialog.setlanguage.endmessage=Spara dina inst\u00e4llningar nu och starta om GpsPrune\nf\u00f6r att \u00e4ndringarna ska verkst\u00e4llas.
+dialog.setlanguage.endmessagewithautosave=Var god starta om GpsPrune f\u00f6r att bytet av spr\u00e5k ska ske.
+dialog.diskcache.save=Spara kartbilder till h\u00e5rddisk
+dialog.diskcache.dir=Cache-mapp
+dialog.diskcache.createdir=Skapa mapp
+dialog.diskcache.nocreate=Ingen cache-mapp skapad
+dialog.diskcache.cannotwrite=Kart-rutor ("tiles") kan inte sparas i den valda mappen
+dialog.diskcache.table.path=Mapp
+dialog.diskcache.table.usedby=Anv\u00e4nds av
+dialog.diskcache.table.zoom=Zoom
+dialog.diskcache.table.tiles=Kart-rutor ("tiles")
+dialog.diskcache.table.megabytes=Megabytes
+dialog.diskcache.tileset=Upps\u00e4ttning kart-rutor ("tiles")
+dialog.diskcache.tileset.multiple=multipla
+dialog.weather.sunrise=Soluppg\u00e5ng
+dialog.weather.sunset=Solnedg\u00e5ng
+dialog.weather.temperatureunits=Temperaturer
+dialog.weather.currentforecast=Nuvarande v\u00e4der
+dialog.weather.dailyforecast=Flerdygnsprognos
+dialog.weather.day.now=Nuvarande v\u00e4der
+dialog.weather.day.today=Idag
+dialog.weather.day.tomorrow=Imorgon
+dialog.weather.day.monday=M\u00e5ndag
+dialog.weather.day.tuesday=Tisdag
+dialog.weather.day.wednesday=Onsdag
+dialog.weather.day.thursday=Torsdag
+dialog.weather.day.friday=Fredag
+dialog.weather.day.saturday=L\u00f6rdag
+dialog.weather.day.sunday=S\u00f6ndag
+dialog.weather.wind=Vind
+dialog.weather.temp=Temp
+dialog.weather.humidity=Fuktighet
+dialog.deletebydate.nodate=Ingen tidsst\u00e4mpel
+dialog.deletebydate.column.keep=Beh\u00e5ll
+dialog.deletebydate.column.delete=Ta bort
+dialog.settimezone.system=Anv\u00e4nd systemets tidszon
+dialog.settimezone.custom=Anv\u00e4nd f\u00f6ljande tidszon:
+dialog.settimezone.selectedzone=Vald tidszon
+dialog.settimezone.offsetfromutc=Offset fr\u00e5n UTC
+dialog.autoplay.usetimestamps=Anv\u00e4nd tidsst\u00e4mplar fr\u00e5n punkter
+dialog.autoplay.rewind=Tillbaka till b\u00f6rjan
+dialog.autoplay.pause=Paus
+dialog.autoplay.play=Spela upp
# Buttons
button.ok=OK
@@ -349,9 +561,9 @@ 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.select=V\u00e4lj
+button.selectall=V\u00e4lj alla
+button.selectnone=V\u00e4lj ingen
button.preview=F\u00f6rhandsvisa
button.load=Ladda in
button.guessfields=Gissa f\u00e4lt
@@ -385,8 +597,8 @@ 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
+details.coordformat=Koordinatformat
+details.distanceunits=Distansenhet
display.range.time.secs=s
display.range.time.mins=m
display.range.time.hours=h
@@ -410,5 +622,62 @@ details.audio.file=Ljudfil
details.audio.playing=spelar...
map.overzoom=Inga kartor tillg\u00e4ngliga p\u00e5 denna zoom-niv\u00e5
+# Field names
+fieldname.latitude=Latitud
+fieldname.longitude=Longitud
+fieldname.coordinates=Koordinaterna
+fieldname.altitude=Altitud
+fieldname.timestamp=Tidpunkt
+fieldname.time=Tid
+fieldname.date=Datum
+fieldname.waypointname=Namn
+fieldname.waypointtype=Typ
+fieldname.newsegment=Segment
+fieldname.prefix=F\u00e4lt
+fieldname.distance=Distans
+fieldname.speed=Hastighet
+fieldname.verticalspeed=Vertikal hastighet
+fieldname.description=Beskrivning
+fieldname.comment=Kommentar
+fieldname.mediafilename=Filnamn
+
+# Measurement units
+units.original=Original
+units.default=Default
+units.metres=Meter
+units.metres.short=m
+units.feet=Fot
+units.feet.short=fot
+units.kilometres=Kilometer
+units.kilometres.short=km
+units.kilometresperhour=km per timme
+units.kilometresperhour.short=km/h
+units.miles=Miles
+units.miles.short=mi
+units.milesperhour=miles per timme
+units.milesperhour.short=mph
+units.nauticalmiles=Nautiska mil
+units.nauticalmiles.short=N.m.
+units.nauticalmilesperhour.short=knop
+units.metrespersec=meter per sekund
+units.metrespersec.short=m/s
+units.feetpersec=fot per sekund
+units.feetpersec.short=fot/s
+units.hours=timmar
+units.minutes=minuter
+units.seconds=sekunder
+units.degminsec=Grad-min-sek
+units.degmin=Grad-min
+units.deg=Grader
+units.iso8601=ISO 8601
+units.degreescelsius=Celsius
+units.degreescelsius.short=\u00b0C
+units.degreesfahrenheit=Fahrenheit
+units.degreesfahrenheit.short=\u00b0F
+
+# How to combine conditions, such as filters
+logic.and=och
+logic.or=eller
+
# External urls and services
openweathermap.lang=se
diff --git a/src/tim/prune/lang/prune-texts_uk.properties b/src/tim/prune/lang/prune-texts_uk.properties
index 43ef43d..8e82e11 100644
--- a/src/tim/prune/lang/prune-texts_uk.properties
+++ b/src/tim/prune/lang/prune-texts_uk.properties
@@ -106,7 +106,6 @@ function.selectsegment=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043f\u043e\u
function.splitsegments=\u0420\u043e\u0437\u0431\u0438\u0442\u0438 \u0442\u0440\u0435\u043a \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438
function.sewsegments=\u0417\u0448\u0438\u0442\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438 \u0442\u0440\u0435\u043a\u0456\u0432 \u0440\u0430\u0437\u043e\u043c
function.lookupsrtm=\u041e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0432\u0438\u0441\u043e\u0442\u0438 \u0437 SRTM
-function.downloadsrtm=\u0417\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 SRTM-\u0442\u0430\u0439\u043b\u0438
function.getwikipedia=\u041e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0443 \u0441\u0442\u0430\u0442\u0442\u044e \u0437 \u0412\u0456\u043a\u0456\u043f\u0435\u0434\u0456\u0457
function.searchwikipedianames=\u041f\u043e\u0448\u0443\u043a \u0441\u0442\u0430\u0442\u0435\u0439 \u0437 \u0412\u0456\u043a\u0456\u043f\u0435\u0434\u0456\u0457 \u0437\u0430 \u043d\u0430\u0437\u0432\u043e\u044e
function.downloadosm=\u0417\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 OSM-\u0434\u0430\u043d\u0456 \u043d\u0430 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0456\u044e
diff --git a/src/tim/prune/lang/prune-texts_zh.properties b/src/tim/prune/lang/prune-texts_zh.properties
index eba2b71..d915629 100644
--- a/src/tim/prune/lang/prune-texts_zh.properties
+++ b/src/tim/prune/lang/prune-texts_zh.properties
@@ -106,7 +106,6 @@ function.selectsegment=\u9009\u4e2d\u5f53\u524d\u8f68\u8ff9\u6bb5
function.splitsegments=\u5206\u5272\u8f68\u8ff9
function.sewsegments=\u63a5\u5408\u8f68\u8ff9\u7247\u6bb5
function.lookupsrtm=\u4eceSRTM\u83b7\u5f97\u9ad8\u5ea6\u4fe1\u606f
-function.downloadsrtm=\u4e0b\u8f7dSRTM\u6570\u636e
function.getwikipedia=\u7ef4\u57fa\u767e\u79d1\u6709\u5173\u672c\u5730\u6587\u7ae0
function.searchwikipedianames=\u6309\u540d\u5b57\u4ece\u7ef4\u57fa\u767e\u79d1\u67e5\u627e
function.downloadosm=\u4e0b\u8f7d\u6b64\u5730OSM\u6570\u636e
@@ -584,7 +583,6 @@ confirm.running=\u8bf7\u7a0d\u7b49...
confirm.lookupsrtm=\u627e\u5230 %d \u9ad8\u5ea6\u503c
confirm.downloadsrtm=\u4e0b\u8f7d %d \u9ad8\u5ea6\u6587\u4ef6\u5230\u7f13\u5b58\u4e2d
confirm.downloadsrtm.1=\u4e0b\u8f7d %d \u9ad8\u5ea6\u6587\u4ef6\u5230\u7f13\u5b58\u4e2d
-confirm.downloadsrtm.none=\u65e0\u9700\u4e0b\u8f7d\uff0c\u6587\u4ef6\u5df2\u5b58\u50a8\u5728\u7f13\u5b58\u4e2d
confirm.deletefieldvalues=\u533a\u57df\u6570\u636e\u5df2\u5220\u9664
confirm.audioload=\u5df2\u6dfb\u52a0\u58f0\u97f3\u6587\u4ef6
confirm.correlateaudios.single=\u58f0\u97f3\u5df2\u5173\u8054
@@ -594,7 +592,6 @@ confirm.correlateaudios.multi=\u58f0\u97f3\u5df2\u5173\u8054
tip.title=\u63d0\u793a
tip.useamapcache=\u542f\u7528\u78c1\u76d8\u7f13\u5b58 (\u8bbe\u7f6e -> \u4fdd\u5b58\u5730\u56fe)\n\u53ef\u4ee5\u63d0\u9ad8\u663e\u793a\u901f\u5ea6\uff0c\u51cf\u5c11\u7f51\u7edc\u6d41\u91cf
tip.learntimeparams=\u5bf9\u8bb0\u5f55\u7684\u8f68\u8ff9\u542f\u7528 \u8f68\u8ff9 -> \u4f7f\u7528\u5f53\u524d\u8f68\u8ff9\u53c2\u6570\u4f30\u8ba1\u65f6\u95f4\n\u5c06\u4f7f\u7ed3\u679c\u66f4\u52a0\u7cbe\u786e
-tip.downloadsrtm=\u53ef\u4ee5\u70b9\u51fb \u8054\u7f51 -> \u4e0b\u8f7dSRTM\u6570\u636e\n\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u78c1\u76d8\u7f13\u5b58\u4ee5\u63d0\u9ad8\u901f\u5ea6
tip.usesrtmfor3d=\u6b64\u8f68\u8ff9\u6ca1\u6709\u9ad8\u5ea6\u4fe1\u606f\n\u53ef\u4ee5\u901a\u8fc7SRTM\u83b7\u53d6\u5927\u81f4\u9ad8\u5ea6\u4ee5\u663e\u793a3D\u89c6\u56fe
tip.manuallycorrelateone=\u63d0\u793a\uff1a\u624b\u52a8\u94fe\u63a5\u81f3\u5c11\u4e00\u5f20\u7167\u7247\uff0c\u53ef\u81ea\u52a8\u8ba1\u7b97\u65f6\u95f4\u504f\u79fb
diff --git a/src/tim/prune/load/xml/GpxHandler.java b/src/tim/prune/load/xml/GpxHandler.java
index 6f63080..ebd106a 100644
--- a/src/tim/prune/load/xml/GpxHandler.java
+++ b/src/tim/prune/load/xml/GpxHandler.java
@@ -24,7 +24,7 @@ public class GpxHandler extends XmlHandler
private String _latitude = null, _longitude = null;
private GpxTag _elevation = new GpxTag(), _time = new GpxTag();
private GpxTag _type = new GpxTag(), _description = new GpxTag();
- private GpxTag _link = new GpxTag();
+ private GpxTag _link = new GpxTag(), _comment = new GpxTag();
private GpxTag _currentTag = null;
private ArrayList _pointList = new ArrayList();
private ArrayList _linkList = new ArrayList();
@@ -58,6 +58,7 @@ public class GpxHandler extends XmlHandler
_type.setValue(null);
_link.setValue(null);
_description.setValue(null);
+ _comment.setValue(null);
}
else if (tag.equals("ele")) {
_currentTag = _elevation;
@@ -84,6 +85,9 @@ public class GpxHandler extends XmlHandler
else if (tag.equals("description") || tag.equals("desc")) {
_currentTag = _description;
}
+ else if (tag.equals("cmt")) {
+ _currentTag = _comment;
+ }
else if (tag.equals("link")) {
_link.setValue(attributes.getValue("href"));
}
@@ -153,7 +157,7 @@ public class GpxHandler extends XmlHandler
private void processPoint()
{
// Put the values into a String array matching the order in getFieldArray()
- String[] values = new String[8];
+ String[] values = new String[9];
values[0] = _latitude;
values[1] = _longitude;
values[2] = _elevation.getValue();
@@ -166,6 +170,7 @@ public class GpxHandler extends XmlHandler
}
values[6] = _type.getValue();
values[7] = _description.getValue();
+ values[8] = _comment.getValue();
_pointList.add(values);
_trackNameList.addPoint(_trackNum, _trackName.getValue(), _isTrackPoint);
_linkList.add(_link.getValue());
@@ -179,7 +184,7 @@ public class GpxHandler extends XmlHandler
{
final Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE,
Field.WAYPT_NAME, Field.TIMESTAMP, Field.NEW_SEGMENT,
- Field.WAYPT_TYPE, Field.DESCRIPTION};
+ Field.WAYPT_TYPE, Field.DESCRIPTION, Field.COMMENT};
return fields;
}
diff --git a/src/tim/prune/readme.txt b/src/tim/prune/readme.txt
index 0023c74..405a536 100644
--- a/src/tim/prune/readme.txt
+++ b/src/tim/prune/readme.txt
@@ -1,5 +1,5 @@
-GpsPrune version 20
-===================
+GpsPrune version 20.1
+=====================
GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
including format conversion, charting, 3d visualisation, audio and photo correlation, and online resource lookup.
@@ -17,7 +17,7 @@ Running
=======
To run GpsPrune from the jar file, simply call it from a command prompt or shell:
- java -jar gpsprune_20.jar
+ java -jar gpsprune_20.1.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,11 +25,24 @@ 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_20.jar --lang=DE
+ java -jar gpsprune_20.1.jar --lang=DE
-New with version 20
+New with version 20.1
=====================
+The following fixes and additions were made since version 20:
+ - Starting with an empty map (fperrin)
+ - Reading and writing tags from gpx files (Willy)
+ - Add option to use GTK look-and-feel (fperrin)
+ - Translation updates (Carlos, Tche333)
+ - Solve issue #29/973910 regarding missing tile cache (Peter Gervai)
+ - Remove "Download SRTM" function and just do it automatically
+ - Tweak waypoint icons
+ - Fix problem with a recently-used file which has disappeared
+ - Fix problem with moving / renaming downloaded tile files
+
+New with version 20
+===================
The following fixes and additions were made since version 19:
- Add option to use Nimbus look-and-feel (wishlist 77)
- Extend the marker waypoints function to include half the distance, half the climb and half the descent
diff --git a/src/tim/prune/save/GpxExporter.java b/src/tim/prune/save/GpxExporter.java
index 88ac791..8bfd090 100644
--- a/src/tim/prune/save/GpxExporter.java
+++ b/src/tim/prune/save/GpxExporter.java
@@ -583,6 +583,7 @@ public class GpxExporter extends GenericFunction implements Runnable
}
source = replaceGpxTags(source, "", "",
XmlUtils.fixCdata(inPoint.getFieldValue(Field.DESCRIPTION)));
+ source = replaceGpxTags(source, "", "", inPoint.getFieldValue(Field.COMMENT));
}
// photo / audio links
if (source != null && (inPoint.hasMedia() || source.indexOf("") > 0)) {
@@ -733,13 +734,21 @@ public class GpxExporter extends GenericFunction implements Runnable
inWriter.write(XmlUtils.fixCdata(inPoint.getWaypointName().trim()));
inWriter.write("\n");
// description, if any
- String desc = XmlUtils.fixCdata(inPoint.getFieldValue(Field.DESCRIPTION));
+ final String desc = XmlUtils.fixCdata(inPoint.getFieldValue(Field.DESCRIPTION));
if (desc != null && !desc.equals(""))
{
inWriter.write("\t\t");
inWriter.write(desc);
inWriter.write("\n");
}
+ // comment, if any
+ final String comment = XmlUtils.fixCdata(inPoint.getFieldValue(Field.COMMENT));
+ if (comment != null && !comment.equals(""))
+ {
+ inWriter.write("\t\t");
+ inWriter.write(comment);
+ inWriter.write("\n");
+ }
// Media links, if any
if (inSettings.getExportPhotoPoints() && inPoint.getPhoto() != null)
{
diff --git a/src/tim/prune/save/MapGrouter.java b/src/tim/prune/save/MapGrouter.java
index 263a306..28b65ea 100644
--- a/src/tim/prune/save/MapGrouter.java
+++ b/src/tim/prune/save/MapGrouter.java
@@ -108,14 +108,11 @@ public class MapGrouter implements TileConsumer
// Wait until tile is available (loaded asynchronously)
while (tile.getWidth(null) < 0 && !inDownload)
{
- // System.out.println("Wait for tile width");
try {
- Thread.sleep(inDownload ? 500 : 100);
+ Thread.sleep(100);
}
catch (InterruptedException ie) {}
}
- // work out where to copy it to, paint it
- // System.out.println("Painting tile " + x + "," + y + " at " + xOffset + "," + yOffset);
numTilesUsed++;
g.drawImage(tile, xOffset, yOffset, null);
}
@@ -177,4 +174,10 @@ public class MapGrouter implements TileConsumer
{
// Doesn't need any action
}
+
+ /** React to cache problem */
+ public void reportCacheFailure()
+ {
+ // Doesn't need any action
+ }
}
--
2.43.0
From 91b72650132900084810e58144e2d7cc91150924 Mon Sep 17 00:00:00 2001
From: activityworkshop
Date: Sat, 6 Feb 2021 12:09:13 +0100
Subject: [PATCH 3/5] Version 20.2, January 2021
---
src/tim/prune/GpsPrune.java | 4 +-
src/tim/prune/copyright.txt | 2 +-
src/tim/prune/function/AboutScreen.java | 2 +-
src/tim/prune/function/AddTimeOffset.java | 2 +-
src/tim/prune/function/ProjectPoint.java | 2 -
.../prune/function/settings/SetLanguage.java | 4 +-
src/tim/prune/gui/profile/ProfileChart.java | 7 ++-
src/tim/prune/lang/prune-texts_fr.properties | 14 ++++-
src/tim/prune/lang/prune-texts_sv.properties | 56 +++++++++++++++++++
src/tim/prune/readme.txt | 15 +++--
10 files changed, 92 insertions(+), 16 deletions(-)
diff --git a/src/tim/prune/GpsPrune.java b/src/tim/prune/GpsPrune.java
index a7e0f49..1b6872c 100644
--- a/src/tim/prune/GpsPrune.java
+++ b/src/tim/prune/GpsPrune.java
@@ -38,9 +38,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 = "20.1";
+ public static final String VERSION_NUMBER = "20.2";
/** Build number, just used for about screen */
- public static final String BUILD_NUMBER = "382";
+ public static final String BUILD_NUMBER = "384";
/** Static reference to App object */
private static App APP = null;
diff --git a/src/tim/prune/copyright.txt b/src/tim/prune/copyright.txt
index db7f2dd..76ebed3 100644
--- a/src/tim/prune/copyright.txt
+++ b/src/tim/prune/copyright.txt
@@ -1,4 +1,4 @@
-The source code of GpsPrune is copyright 2006-2020 activityworkshop.net
+The source code of GpsPrune is copyright 2006-2021 activityworkshop.net
and is distributed under the terms of the Gnu GPL version 2.
Portions of the package jpeg.drew were taken
diff --git a/src/tim/prune/function/AboutScreen.java b/src/tim/prune/function/AboutScreen.java
index c8044b4..6f98fcd 100644
--- a/src/tim/prune/function/AboutScreen.java
+++ b/src/tim/prune/function/AboutScreen.java
@@ -97,7 +97,7 @@ public class AboutScreen extends GenericFunction
descBuffer.append("").append(I18nManager.getText("dialog.about.summarytext3")).append("
");
descBuffer.append("").append(I18nManager.getText("dialog.about.languages")).append(" : ")
.append("afrikaans, \u010de\u0161tina, deutsch, english, espa\u00F1ol, fran\u00E7ais, italiano,
" +
- " magyar, nederlands, polski, portugu\u00EAs, rom\u00E2n\u0103, suomi, \u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian),
" +
+ " magyar, nederlands, polski, portugu\u00EAs, rom\u00E2n\u0103, suomi, svenska, \u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian),
" +
" \u4e2d\u6587 (chinese), \u65E5\u672C\u8A9E (japanese), \uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean), schwiizerd\u00FC\u00FCtsch
");
descBuffer.append("").append(I18nManager.getText("dialog.about.translatedby")).append("
");
JEditorPane descPane = new JEditorPane("text/html", descBuffer.toString());
diff --git a/src/tim/prune/function/AddTimeOffset.java b/src/tim/prune/function/AddTimeOffset.java
index 115bfa5..9e8306f 100644
--- a/src/tim/prune/function/AddTimeOffset.java
+++ b/src/tim/prune/function/AddTimeOffset.java
@@ -104,7 +104,7 @@ public class AddTimeOffset extends GenericFunction
JPanel descPanel = new JPanel();
descPanel.setLayout(new GridLayout(0, 2));
descPanel.add(makeRightLabel("dialog.addtimeoffset.days"));
- _dayField = new WholeNumberField(3);
+ _dayField = new WholeNumberField(4);
descPanel.add(_dayField);
descPanel.add(makeRightLabel("dialog.addtimeoffset.hours"));
_hourField = new WholeNumberField(3);
diff --git a/src/tim/prune/function/ProjectPoint.java b/src/tim/prune/function/ProjectPoint.java
index 10c0675..ccdc509 100644
--- a/src/tim/prune/function/ProjectPoint.java
+++ b/src/tim/prune/function/ProjectPoint.java
@@ -202,7 +202,6 @@ public class ProjectPoint extends GenericFunction
final double projectRads = Distance.convertDistanceToRadians(_distanceField.getValue(), distUnit);
final double origLatRads = Math.toRadians(currPoint.getLatitude().getDouble());
final double origLonRads = Math.toRadians(currPoint.getLongitude().getDouble());
- System.out.println("Project from: " + origLatRads + ", " + origLonRads);
final double bearingRads = Math.toRadians(_bearingField.getValue());
double lat2 = Math.asin(Math.sin(origLatRads) * Math.cos(projectRads)
@@ -212,7 +211,6 @@ public class ProjectPoint extends GenericFunction
double finalLatDeg = Math.toDegrees(lat2);
double finalLonDeg = Math.toDegrees(lon2);
- System.out.println("Result is: lat=" + finalLatDeg + ", lon=" + finalLonDeg);
// Create point and append to track
DataPoint point = new DataPoint(new Latitude(finalLatDeg, Coordinate.FORMAT_DEG),
diff --git a/src/tim/prune/function/settings/SetLanguage.java b/src/tim/prune/function/settings/SetLanguage.java
index d6edd8b..b64f906 100644
--- a/src/tim/prune/function/settings/SetLanguage.java
+++ b/src/tim/prune/function/settings/SetLanguage.java
@@ -43,12 +43,12 @@ public class SetLanguage extends GenericFunction
/** Names of languages for display in dropdown (not translated) */
private static final String[] LANGUAGE_NAMES = {"afrikaans", "\u010de\u0161tina", "deutsch", "english", "american english",
"espa\u00F1ol", "fran\u00E7ais", "italiano", "magyar", "nederlands", "polski", "portugu\u00EAs", "rom\u00E2n\u0103",
- "suomi", "\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian)", "\u4e2d\u6587 (chinese)",
+ "suomi", "svenska", "\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian)", "\u4e2d\u6587 (chinese)",
"\u65E5\u672C\u8A9E (japanese)", "\uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean)", "schwiizerd\u00FC\u00FCtsch"
};
/** Associated language codes (must be in same order as names!) */
private static final String[] LANGUAGE_CODES = {"af", "cz", "de", "en", "en_us", "es", "fr", "it", "hu",
- "nl", "pl", "pt", "ro", "fi", "ru", "zh", "ja", "ko", "de_ch"
+ "nl", "pl", "pt", "ro", "fi", "sv", "ru", "zh", "ja", "ko", "de_ch"
};
diff --git a/src/tim/prune/gui/profile/ProfileChart.java b/src/tim/prune/gui/profile/ProfileChart.java
index 5d18e1e..95d8004 100644
--- a/src/tim/prune/gui/profile/ProfileChart.java
+++ b/src/tim/prune/gui/profile/ProfileChart.java
@@ -382,6 +382,11 @@ public class ProfileChart extends GenericDisplay implements MouseListener
*/
private synchronized void makePopup()
{
+ if (_track.getNumPoints() < 1)
+ {
+ _popup = null;
+ return;
+ }
_popup = new JPopupMenu();
JMenuItem altItem = new JMenuItem(I18nManager.getText("fieldname.altitude"));
altItem.addActionListener(new ActionListener() {
@@ -527,7 +532,7 @@ public class ProfileChart extends GenericDisplay implements MouseListener
}
}
}
- else
+ else if (_popup != null)
{
// right clicks
_popup.show(this, e.getX(), e.getY());
diff --git a/src/tim/prune/lang/prune-texts_fr.properties b/src/tim/prune/lang/prune-texts_fr.properties
index 26981e4..4294192 100644
--- a/src/tim/prune/lang/prune-texts_fr.properties
+++ b/src/tim/prune/lang/prune-texts_fr.properties
@@ -37,6 +37,7 @@ menu.view.browser.openstreetmap=Openstreetmap
menu.view.browser.mapquest=Mapquest
menu.view.browser.yahoo=Cartes Yahoo
menu.view.browser.bing=Cartes Bing
+menu.view.browser.inlinemap=Carte du roller
menu.settings=Pr\u00e9f\u00e9rences
menu.settings.onlinemode=Charger cartes depuis internet
menu.settings.autosave=Sauver automatiquement en quittant
@@ -97,7 +98,9 @@ function.rearrangewaypoints=R\u00e9arranger les points de navigation
function.convertnamestotimes=Convertir les noms de points de navigation en horodatages
function.deletefieldvalues=Effacer les valeurs du champ
function.findwaypoint=Trouver un waypoint
-function.pastecoordinates=Coller les coordonn\u00e9es
+function.pastecoordinates=Entrer coordonn\u00e9es d'un point
+function.pastecoordinatelist=Entrer liste de coordonn\u00e9es
+function.enterpluscode=Entrer code plus
function.charts=Graphiques
function.show3d=Montrer en 3D
function.distances=Distances
@@ -122,6 +125,7 @@ function.duplicatepoint=Dupliquer le point
function.setcolours=Choisir les couleurs
function.setdisplaysettings=Pr\u00e9f\u00e9rences d'affichage
function.setlanguage=Choisir la langue
+function.projectpoint=Projeter le point
function.connecttopoint=Relier au point
function.disconnectfrompoint=D\u00e9tacher du point
function.removephoto=Retirer la photo
@@ -424,7 +428,10 @@ dialog.compress.confirmnone=Pas de points marqu\u00e9s
dialog.deletemarked.nonefound=Pas de donn\u00e9es \u00e0 effacer
dialog.pastecoordinates.desc=Entrez ou collez les coordonn\u00e9es ici
dialog.pastecoordinates.coords=Coordonn\u00e9es
-dialog.pastecoordinates.nothingfound=V\u00e9rifier les coordonn\u00e9es et essayez \u00e0 nouveau
+dialog.pastecoordinates.nothingfound=V\u00e9rifiez les coordonn\u00e9es et essayez \u00e0 nouveau
+dialog.pluscode.desc=Entrez ou collez le code ici
+dialog.pluscode.code=Code Plus
+dialog.pluscode.nothingfound=V\u00e9rifiez le code et essayez \u00e0 nouveau
dialog.help.help=Consultez la page\n https://gpsprune.activityworkshop.net/\npour plus de d\u00e9tails et des manuels utilisateur.
dialog.about.version=Version
dialog.about.build=Build
@@ -561,6 +568,7 @@ dialog.autoplay.usetimestamps=Utiliser information de temps
dialog.autoplay.rewind=Retour au d\u00e9but
dialog.autoplay.pause=Pause
dialog.autoplay.play=Jouer
+dialog.projectpoint.bearing=Azimut (degr\u00e8s du nord)
# 3d window
dialog.3d.title=Vue 3D de GpsPrune
@@ -721,6 +729,7 @@ fieldname.duration=Dur\u00e9e
fieldname.speed=Vitesse
fieldname.verticalspeed=Vitesse verticale
fieldname.description=Description
+fieldname.comment=Commentaire
fieldname.mediafilename=Nom de fichier
# Measurement units
@@ -820,6 +829,7 @@ error.load.nopoints=Aucune coordonn\u00e9e trouv\u00e9e dans le fichier
error.load.unknownxml=Format xml non-reconnu :
error.load.noxmlinzip=Aucune xml fichier trouv\u00e9e dans le fichier
error.load.othererror=Erreur \u00e0 la lecture du fichier :
+error.load.nopointsintext=Aucune coordonn\u00e9e trouv\u00e9e
error.jpegload.dialogtitle=Erreur au chargement des photos
error.jpegload.nofilesfound=Aucun fichier trouv\u00e9
error.jpegload.nojpegsfound=Aucun fichier jpeg trouv\u00e9
diff --git a/src/tim/prune/lang/prune-texts_sv.properties b/src/tim/prune/lang/prune-texts_sv.properties
index f7ed52e..b2a1bfe 100644
--- a/src/tim/prune/lang/prune-texts_sv.properties
+++ b/src/tim/prune/lang/prune-texts_sv.properties
@@ -515,11 +515,35 @@ dialog.diskcache.table.tiles=Kart-rutor ("tiles")
dialog.diskcache.table.megabytes=Megabytes
dialog.diskcache.tileset=Upps\u00e4ttning kart-rutor ("tiles")
dialog.diskcache.tileset.multiple=multipla
+dialog.diskcache.deleteold=Ta bort gamla kart-rutor ("tiles")
+dialog.diskcache.maximumage=Max antal dagar gammal
+dialog.diskcache.deleteall=Ta bort alla kart-rutor ("tiles")
+dialog.diskcache.deleted=Ta bort %d filer fr\u00e5n cachen
+dialog.deletefieldvalues.intro=V\u00e4lj f\u00e4lt att ta bort f\u00f6r det valda intervallet
+dialog.deletefieldvalues.nofields=Det finns inga f\u00e4lt att ta bort f\u00f6r detta intervallet
+dialog.displaysettings.linewidth=Linjetjocklek f\u00f6r sp\u00e5ren (1-4)
+dialog.displaysettings.antialias=Anv\u00e4nd kantutj\u00e4mning ("antialiasing")
+dialog.displaysettings.waypointicons=Waypoint-ikon
+dialog.displaysettings.wpicon.ringpt=Rund mark\u00f6r
+dialog.displaysettings.wpicon.plectrum=Plektrum
+dialog.displaysettings.wpicon.ring=Ring
+dialog.displaysettings.wpicon.pin=H\u00e4ftstift
+dialog.displaysettings.size.small=Liten
+dialog.displaysettings.size.medium=Mellan
+dialog.displaysettings.size.large=Stor
+dialog.displaysettings.windowstyle=F\u00f6nster-stil (kr\u00e4ver omstart)
+dialog.displaysettings.windowstyle.nimbus=Nimbus
+dialog.displaysettings.windowstyle.gtk=GTK
+dialog.downloadosm.desc=Bekr\u00e4fta att OSM-r\u00e5data laddas ner f\u00f6r det specifika omr\u00e5det:
+dialog.searchwikipedianames.search=S\u00f6k efter:
+dialog.weather.location=Plats
+dialog.weather.update=Prognos uppdaterad
dialog.weather.sunrise=Soluppg\u00e5ng
dialog.weather.sunset=Solnedg\u00e5ng
dialog.weather.temperatureunits=Temperaturer
dialog.weather.currentforecast=Nuvarande v\u00e4der
dialog.weather.dailyforecast=Flerdygnsprognos
+dialog.weather.3hourlyforecast=3-timmars-prognos
dialog.weather.day.now=Nuvarande v\u00e4der
dialog.weather.day.today=Idag
dialog.weather.day.tomorrow=Imorgon
@@ -533,17 +557,49 @@ dialog.weather.day.sunday=S\u00f6ndag
dialog.weather.wind=Vind
dialog.weather.temp=Temp
dialog.weather.humidity=Fuktighet
+dialog.weather.creditnotice=Denna data har tillhandah\u00e5llits av openweathermap.org. Mer detaljer finns p\u00e5 deras hemsida.
+dialog.deletebydate.onlyonedate=Alla punkter \u00e4r fr\u00e5n samma datum.
+dialog.deletebydate.intro=F\u00f6r varje datum i sp\u00e5ret kan du v\u00e4lja att ta bort eller beh\u00e5lla punkterna
dialog.deletebydate.nodate=Ingen tidsst\u00e4mpel
dialog.deletebydate.column.keep=Beh\u00e5ll
dialog.deletebydate.column.delete=Ta bort
+dialog.settimezone.intro=H\u00e4r kan du v\u00e4lja i vilken tidszon du vill visa punkternas tidsst\u00e4mplar
dialog.settimezone.system=Anv\u00e4nd systemets tidszon
dialog.settimezone.custom=Anv\u00e4nd f\u00f6ljande tidszon:
+dialog.settimezone.list.toomany=F\u00f6r m\u00e5nga f\u00f6r att v\u00e4lja
dialog.settimezone.selectedzone=Vald tidszon
dialog.settimezone.offsetfromutc=Offset fr\u00e5n UTC
+dialog.autoplay.duration=L\u00e4ngd (sekunder)
dialog.autoplay.usetimestamps=Anv\u00e4nd tidsst\u00e4mplar fr\u00e5n punkter
dialog.autoplay.rewind=Tillbaka till b\u00f6rjan
dialog.autoplay.pause=Paus
dialog.autoplay.play=Spela upp
+dialog.markers.halves=Halvv\u00e4gs-punkter
+dialog.markers.half.distance=Halva avst\u00e5ndet
+dialog.markers.half.climb=Halva kl\u00e4ttringen
+dialog.markers.half.descent=Halva nedstigningen
+dialog.projectpoint.desc=Fyll i riktning och avst\u00e5nd f\u00f6r att projicera denna punkt
+dialog.projectpoint.bearing=B\u00e4ring (grader fr\u00e5n N)
+
+# 3d window
+dialog.3d.title=GpsPrune 3D-vy
+dialog.3d.altitudefactor=F\u00f6rst\u00e4rkningsfaktor f\u00f6r h\u00f6jddata
+
+# Confirm messages
+confirm.loadfile=Data inladdat fr\u00e5n filen
+confirm.save.ok1=Det gick bra att spara
+confirm.save.ok2=punkter till filen
+confirm.deletepoint.single=datapunkt togs bort
+confirm.deletepoint.multi=datapunkter togs bort
+confirm.point.edit=punkt redigerad
+confirm.mergetracksegments=Sp\u00e5r-segment ihopslagna
+confirm.reverserange=Intervall v\u00e4ndes
+confirm.addtimeoffset=Tids-offset tillagt
+confirm.addaltitudeoffset=H\u00f6jdoffset tillagt
+confirm.rearrangewaypoints=Waypoint:ar omarrangerade
+confirm.rearrangephotos=Foton omarrangerade
+confirm.splitsegments=segment delades upp i %d delar
+confirm.sewsegments=segment slogs ihop p\u00e5 %d st\u00e4llen
# Buttons
button.ok=OK
diff --git a/src/tim/prune/readme.txt b/src/tim/prune/readme.txt
index 405a536..618513d 100644
--- a/src/tim/prune/readme.txt
+++ b/src/tim/prune/readme.txt
@@ -1,11 +1,11 @@
-GpsPrune version 20.1
+GpsPrune version 20.2
=====================
GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
including format conversion, charting, 3d visualisation, audio and photo correlation, and online resource lookup.
Full details can be found at https://gpsprune.activityworkshop.net/
-GpsPrune is copyright 2006-2020 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
+GpsPrune is copyright 2006-2021 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
You may freely use the software, and may help others to freely use it too. For further information
on your rights and how they are protected, see the included license.txt file.
@@ -17,7 +17,7 @@ Running
=======
To run GpsPrune from the jar file, simply call it from a command prompt or shell:
- java -jar gpsprune_20.1.jar
+ java -jar gpsprune_20.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,16 @@ 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_20.1.jar --lang=DE
+ java -jar gpsprune_20.2.jar --lang=DE
+New with version 20.2
+=====================
+The following fixes and additions were made since version 20.1:
+ - Fix for intermittent startup problems
+ - Addition of Swedish (erikiiofph7)
+ - Allow four digits for adding day offsets (fperrin)
+
New with version 20.1
=====================
The following fixes and additions were made since version 20:
--
2.43.0
From 1db53356139320890a8d10e982865a1899e11b81 Mon Sep 17 00:00:00 2001
From: activityworkshop
Date: Fri, 9 Apr 2021 21:27:57 +0200
Subject: [PATCH 4/5] Version 20.3, April 2021
---
src/tim/prune/App.java | 4 +-
src/tim/prune/GpsPrune.java | 6 +-
.../function/distance/DistanceFunction.java | 26 +++-
src/tim/prune/function/srtm/TileFinder.java | 2 +-
src/tim/prune/gui/map/TileDownloader.java | 11 +-
src/tim/prune/lang/prune-texts_cy.properties | 9 ++
src/tim/prune/lang/prune-texts_cz.properties | 15 ++-
src/tim/prune/lang/prune-texts_fr.properties | 44 ++++++-
src/tim/prune/lang/prune-texts_pt.properties | 6 +
src/tim/prune/lang/prune-texts_sv.properties | 122 +++++++++++++++++-
src/tim/prune/readme.txt | 14 +-
src/tim/prune/save/GpxExporter.java | 1 +
12 files changed, 228 insertions(+), 32 deletions(-)
diff --git a/src/tim/prune/App.java b/src/tim/prune/App.java
index 94e10e0..22fa486 100644
--- a/src/tim/prune/App.java
+++ b/src/tim/prune/App.java
@@ -733,11 +733,11 @@ public class App
UndoLoad undo = new UndoLoad(_trackInfo, inLoadedTrack.getNumPoints(), photos);
undo.setNumPhotosAudios(_trackInfo.getPhotoList().getNumPhotos(), _trackInfo.getAudioList().getNumAudios());
_undoStack.add(undo);
- _lastSavePosition = _undoStack.size();
_trackInfo.getSelection().clearAll();
_track.load(inLoadedTrack);
if (inSourceInfo != null)
{
+ _lastSavePosition = _undoStack.size();
// set source information
inSourceInfo.populatePointObjects(_track, _track.getNumPoints());
_trackInfo.getFileInfo().replaceSource(inSourceInfo);
@@ -752,11 +752,11 @@ public class App
UndoLoad undo = new UndoLoad(_trackInfo, inLoadedTrack.getNumPoints(), null);
undo.setNumPhotosAudios(_trackInfo.getPhotoList().getNumPhotos(), _trackInfo.getAudioList().getNumAudios());
_undoStack.add(undo);
- _lastSavePosition = _undoStack.size();
_trackInfo.getSelection().clearAll();
_track.load(inLoadedTrack);
if (inSourceInfo != null)
{
+ _lastSavePosition = _undoStack.size();
inSourceInfo.populatePointObjects(_track, _track.getNumPoints());
_trackInfo.getFileInfo().addSource(inSourceInfo);
}
diff --git a/src/tim/prune/GpsPrune.java b/src/tim/prune/GpsPrune.java
index 1b6872c..8d80875 100644
--- a/src/tim/prune/GpsPrune.java
+++ b/src/tim/prune/GpsPrune.java
@@ -31,16 +31,16 @@ import tim.prune.gui.profile.ProfileChart;
/**
* GpsPrune is a tool to visualize, edit, convert and prune GPS data
* Please see the included readme.txt or https://activityworkshop.net
- * This software is copyright activityworkshop.net 2006-2020 and made available through the Gnu GPL version 2.
+ * This software is copyright activityworkshop.net 2006-2021 and made available through the Gnu GPL version 2.
* For license details please see the included license.txt.
* GpsPrune is the main entry point to the application, including initialisation and launch
*/
public class GpsPrune
{
/** Version number of application, used in about screen and for version check */
- public static final String VERSION_NUMBER = "20.2";
+ public static final String VERSION_NUMBER = "20.3";
/** Build number, just used for about screen */
- public static final String BUILD_NUMBER = "384";
+ public static final String BUILD_NUMBER = "385";
/** Static reference to App object */
private static App APP = null;
diff --git a/src/tim/prune/function/distance/DistanceFunction.java b/src/tim/prune/function/distance/DistanceFunction.java
index e0b7aed..f373324 100644
--- a/src/tim/prune/function/distance/DistanceFunction.java
+++ b/src/tim/prune/function/distance/DistanceFunction.java
@@ -77,8 +77,9 @@ public class DistanceFunction extends GenericFunction
}
_fromModel.init(pointList);
_distModel.init(pointList);
- _pointTable.getSelectionModel().setSelectionInterval(0, 0);
- _distModel.recalculate(0);
+ final int pointIndex = getPointIndex(pointList, _app.getTrackInfo());
+ _pointTable.getSelectionModel().setSelectionInterval(pointIndex, pointIndex);
+ _distModel.recalculate(pointIndex);
_dialog.setVisible(true);
}
@@ -163,4 +164,25 @@ public class DistanceFunction extends GenericFunction
}
return pointList;
}
+
+ /**
+ * Find the point to select from the given point list
+ * @param pointList list of points
+ * @param inTrackInfo current track info to get selected point (if any)
+ * @return index of point to be selected
+ */
+ private static int getPointIndex(ArrayList pointList, TrackInfo inTrackInfo)
+ {
+ DataPoint currPoint = inTrackInfo.getCurrentPoint();
+ if (currPoint != null && currPoint.isWaypoint())
+ {
+ // Currently selected point is a waypoint, so select this one for convenience
+ for (int i=0; i
dialog.gpsbabel.filter.interpolate.time=ou difference de temps >
dialog.saveoptions.title=Enregistrer le fichier
@@ -265,9 +267,10 @@ dialog.baseimage.zoom=Zoom
dialog.baseimage.incomplete=Image incompl\u00e8te
dialog.baseimage.tiles=Dalles
dialog.baseimage.size=Taille de l'image
+dialog.exportimage.noimagepossible=Images de la carte doivent \u00eatre sauvegard\u00e9es dans un cache.
dialog.exportimage.drawtrack=Dessiner la trace sur la carte
dialog.exportimage.drawtrackpoints=Dessiner les points de trace
-dialog.exportimage.textscalepercent=Facteur d'echelle du texte (%)
+dialog.exportimage.textscalepercent=Facteur d'\u00e9chelle du texte (%)
dialog.pointtype.desc=Sauvegarder ces types de points:
dialog.pointtype.track=Points de la trace
dialog.pointtype.waypoint=Waypoints
@@ -426,9 +429,10 @@ dialog.compress.summarylabel=Points \u00e0 supprimer
dialog.compress.confirm=%d point(s) marqu\u00e9(s).\nSupprimer les points?
dialog.compress.confirmnone=Pas de points marqu\u00e9s
dialog.deletemarked.nonefound=Pas de donn\u00e9es \u00e0 effacer
-dialog.pastecoordinates.desc=Entrez ou collez les coordonn\u00e9es ici
+dialog.pastecoordinates.desc=Saisissez ou collez les coordonn\u00e9es ici
dialog.pastecoordinates.coords=Coordonn\u00e9es
dialog.pastecoordinates.nothingfound=V\u00e9rifiez les coordonn\u00e9es et essayez \u00e0 nouveau
+dialog.pastecoordinatelist.desc=Saisissez les coordonn\u00e9es des nouveaux points avec un point par ligne
dialog.pluscode.desc=Entrez ou collez le code ici
dialog.pluscode.code=Code Plus
dialog.pluscode.nothingfound=V\u00e9rifiez le code et essayez \u00e0 nouveau
@@ -492,6 +496,7 @@ dialog.colourchooser.title=Choisissez la couleur
dialog.colourchooser.red=Rouge
dialog.colourchooser.green=Vert
dialog.colourchooser.blue=Bleu
+dialog.colourer.intro=Un coloriste peut s\u00e9lectionner les couleurs pour les points de trace
dialog.colourer.type=Crit\u00e8re de coloriste
dialog.colourer.type.none=Aucun
dialog.colourer.type.byfile=Selon fichier
@@ -530,9 +535,17 @@ dialog.deletefieldvalues.intro=Choisir le champ \u00e0 effacer pour l'\u00e9tend
dialog.deletefieldvalues.nofields=L'\u00e9tendue actuelle n'a pas de champs \u00e0 effacer
dialog.displaysettings.linewidth=L'\u00e9paisseur des lignes des traces (1-4)
dialog.displaysettings.antialias=Anticr\u00e9nelage
+dialog.displaysettings.waypointicons=Ic\u00f4nes des waypoints
+dialog.displaysettings.wpicon.default=D\u00e9faut
+dialog.displaysettings.wpicon.ringpt=Disque
+dialog.displaysettings.wpicon.plectrum=Plectre
+dialog.displaysettings.wpicon.ring=Anneau
+dialog.displaysettings.wpicon.pin=Clouer
dialog.displaysettings.size.small=Petit
dialog.displaysettings.size.medium=Moyen
dialog.displaysettings.size.large=Grand
+dialog.displaysettings.windowstyle=Style de fen\u00eatre (apr\u00e8s red\u00e9marrage)
+dialog.displaysettings.windowstyle.default=D\u00e9faut
dialog.downloadosm.desc=Confirmer le t\u00e9l\u00e9chargement des donn\u00e9es OSM brutes pour la zone indiqu\u00e9e :
dialog.searchwikipedianames.search=Chercher :
dialog.weather.location=Location
@@ -558,16 +571,28 @@ dialog.weather.temp=Temp
dialog.weather.humidity=Humidit\u00e9
dialog.weather.creditnotice=Ces donn\u00e9es sont fournies par openweathermap.org. Consultez la page pour plus de d\u00e9tails.
dialog.deletebydate.onlyonedate=Tous les points sont \u00e0 la m\u00eame date.
+dialog.deletebydate.intro=Pour chaque date, vous pouvez choisir de conserver ou de supprimer les points
dialog.deletebydate.nodate=Sans horodatage
dialog.deletebydate.column.keep=Garder
dialog.deletebydate.column.delete=Supprimer
dialog.setaltitudetolerance.text.metres=Limite (m\u00e8tres) pour les petites diff\u00e9rences d'altitude
dialog.setaltitudetolerance.text.feet=Limite (pieds) pour les petites diff\u00e9rences d'altitude
+dialog.settimezone.intro=Ce fuseau horaire sera utilis\u00e9 pour afficher les horodatages des points
+dialog.settimezone.system=Utiliser fuseau du syst\u00e8me
+dialog.settimezone.custom=Utiliser le fuseau suivant:
+dialog.settimezone.list.toomany=Beaucoup trop de fuseaux
+dialog.settimezone.selectedzone=Fuseau horaire s\u00e9lectionn\u00e9
+dialog.settimezone.offsetfromutc=D\u00e9calage avec UTC
dialog.autoplay.duration=Dur\u00e9e (sec)
dialog.autoplay.usetimestamps=Utiliser information de temps
dialog.autoplay.rewind=Retour au d\u00e9but
dialog.autoplay.pause=Pause
dialog.autoplay.play=Jouer
+dialog.markers.halves=Points \u00e0 mi-chemin
+dialog.markers.half.distance=Demi-distance
+dialog.markers.half.climb=Demi-mont\u00e9e
+dialog.markers.half.descent=Demi-descente
+dialog.projectpoint.desc=Saisissez la direction et la distance de la projection
dialog.projectpoint.bearing=Azimut (degr\u00e8s du nord)
# 3d window
@@ -587,6 +612,8 @@ confirm.addtimeoffset=D\u00e9calage ajout\u00e9
confirm.addaltitudeoffset=D\u00e9calage d'altitude ajout\u00e9
confirm.rearrangewaypoints=Waypoints r\u00e9arrang\u00e9s
confirm.rearrangephotos=Photos r\u00e9arrang\u00e9es
+confirm.splitsegments=%d s\u00e9parations de segments ont \u00e9t\u00e9 effectu\u00e9es
+confirm.sewsegments=%d fusions de segments ont \u00e9t\u00e9 effectu\u00e9es
confirm.cutandmove=S\u00e9lection d\u00e9plac\u00e9e
confirm.pointsadded=%d points ajout\u00e9s
confirm.convertnamestotimes=Noms de waypoints convertis
@@ -614,8 +641,9 @@ confirm.correlateaudios.multi=fichiers audio ont \u00e9t\u00e9 corr\u00e9l\u00e9
# Tips
tip.title=Astuce
-tip.useamapcache=By setting up a disk cache (Pr\u00e9f\u00e9rences -> Enregistrer les cartes sur le disque)\nyou can speed up the display and reduce network traffic.
-tip.learntimeparams=The results will be more accurate if you use\nTrace -> Apprentissage de l'estimation\non your recorded tracks.
+tip.useamapcache=Si vous configurez un cache (Pr\u00e9f\u00e9rences -> Enregistrer les cartes sur le disque)\nl'affichage sera plus rapide et les t\u00e9l\u00e9chargements seront r\u00e9duits.
+tip.learntimeparams=Les r\u00e9sultats seront plus pr\u00e9cis si GpsPrune peut\napprender la vitesse de vos traces\n(Trace -> Apprentissage de l'estimation).
+tip.usesrtmfor3d=Cette trace n'a pas d'altitudes.\nEn utilisant le SRTM, il est possible d'obtenir\ndes altitudes approximatives.
tip.manuallycorrelateone=En corr\u00e9lant manuellement au moins une photo, le d\u00e9calage de temps peut \u00eatre calcul\u00e9 pour vous.
# Buttons
@@ -858,3 +886,5 @@ error.cache.notthere=Le dossier du cache n'a pas \u00e9t\u00e9 trouv\u00e9
error.cache.empty=Le dossier du cache est vide
error.cache.cannotdelete=Effacement des dalles impossible
error.tracksplit.nosplit=Impossible de s\u00e9parer les segments
+error.downloadsrtm.nocache=Les fichiers ne peuvent pas \u00eatre sauvegard\u00e9s.\nV\u00e9rifiez le cache.
+error.sewsegments.nothingdone=Aucune fusion n'a \u00e9t\u00e9 possible.\nIl y a %d segments dans la trace.
diff --git a/src/tim/prune/lang/prune-texts_pt.properties b/src/tim/prune/lang/prune-texts_pt.properties
index 55f60fa..82fc087 100644
--- a/src/tim/prune/lang/prune-texts_pt.properties
+++ b/src/tim/prune/lang/prune-texts_pt.properties
@@ -358,6 +358,8 @@ dialog.gpsies.description=Descri\u00e7\u00e3o
dialog.gpsies.nodescription=Sem descri\u00e7\u00e3o
dialog.gpsies.nonefound=Nenhuma rota encontrada
dialog.mapillary.nonefound=Nenhuma foto encontrada
+dialog.osmpois.column.name=Nome
+dialog.osmpois.column.type=Tipo
dialog.wikipedia.column.name=Nome do artigo
dialog.wikipedia.column.distance=Dist\u00e2ncia
dialog.wikipedia.nonefound=Nenhum artigo encontrado
@@ -418,6 +420,7 @@ dialog.deletemarked.nonefound=Nenhum dado dos pontos pode ser removido
dialog.pastecoordinates.desc=Insira ou cole as coordenadas aqui
dialog.pastecoordinates.coords=Coordenadas
dialog.pastecoordinates.nothingfound=Por favor, verifique as coordenadas novamente
+dialog.pluscode.code=C\u00f3digo
dialog.help.help=Por favor, veja\n https://gpsprune.activityworkshop.net/\npara mais informa\u00e7\u00f5es e guia do usu\u00e1rio.
dialog.about.version=Vers\u00e3o
dialog.about.build=Compila\u00e7\u00e3o
@@ -534,6 +537,7 @@ dialog.autoplay.usetimestamps=Usar data-hora
dialog.autoplay.rewind=Rebobinar
dialog.autoplay.pause=Suspender
dialog.autoplay.play=Tocar
+dialog.projectpoint.bearing=Azimute (graus de N)
# 3d window
dialog.3d.title=Vista 3D do GpsPrune
@@ -682,6 +686,7 @@ map.overzoom=Nenhum mapa dispon\u00edvel neste n\u00edvel de amplia\u00e7\u00e3o
# Field names
fieldname.latitude=Latitude
fieldname.longitude=Longitude
+fieldname.coordinates=Coordenadas
fieldname.altitude=Altura
fieldname.timestamp=Tempo
fieldname.time=Tempo
@@ -696,6 +701,7 @@ fieldname.duration=Dura\u00e7\u00e3o
fieldname.speed=Velocidade
fieldname.verticalspeed=Velocidade vertical
fieldname.description=Descri\u00e7\u00e3o
+fieldname.comment=Coment\u00e1rio
fieldname.mediafilename=Arquivo
# Measurement units
diff --git a/src/tim/prune/lang/prune-texts_sv.properties b/src/tim/prune/lang/prune-texts_sv.properties
index b2a1bfe..6192c5c 100644
--- a/src/tim/prune/lang/prune-texts_sv.properties
+++ b/src/tim/prune/lang/prune-texts_sv.properties
@@ -20,7 +20,7 @@ menu.range.end=S\u00e4tt till slutet av intervall
menu.range.average=Skapa medelv\u00e4rdespunkt
menu.range.reverse=V\u00e4nd intervall
menu.range.mergetracksegments=Sl\u00e5 ihop sp\u00e5rsegment
-menu.range.cutandmove=Klipp och flytta urval
+menu.range.cutandmove=Klipp och flytta intervall
menu.point=Punkt
menu.point.editpoint=Redigera punkt
menu.point.deletepoint=Radera punkt
@@ -113,7 +113,7 @@ 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.sewsegments=Sy ihop sp\u00e5rsegment
function.createmarkerwaypoints=Skapa markerings-waypoints
function.lookupsrtm=H\u00e4mta h\u00f6jddata fr\u00e5n SRTM
function.getwikipedia=H\u00e4mta n\u00e4rliggande Wikipedia-artiklar
@@ -172,6 +172,9 @@ dialog.delimiter.tab=Tabb
dialog.delimiter.space=Mellanslag
dialog.delimiter.semicolon=Semikolon ;
dialog.delimiter.other=Annat
+dialog.openoptions.deliminfo.records=rader, med
+dialog.openoptions.deliminfo.norecords=Inga rader
+dialog.openoptions.deliminfo.fields=f\u00e4lt
dialog.openoptions.altitudeunits=H\u00f6jdenhet
dialog.openoptions.speedunits=Hastighetsenheter
dialog.openoptions.vertspeedunits=Enheter f\u00f6r vertikal hastighet
@@ -424,6 +427,7 @@ dialog.pastecoordinates.nothingfound=V\u00e4nligen kontrollera koordinaterna och
dialog.pastecoordinatelist.desc=Fyll i koordinaterna f\u00f6r dom nya punkterna, en punkt per rad
dialog.pluscode.desc=Fyll i pluss-koden (Open Location Code) h\u00e4r
dialog.pluscode.code=Pluss-kod
+dialog.pluscode.nothingfound=Kontrollera koden och f\u00f6rs\u00f6k igen.
dialog.help.help=L\u00e4s\n https://gpsprune.activityworkshop.net/\nf\u00f6r mer information och tips,\ninklusive en PDF-anv\u00e4ndarhandbok som man kan k\u00f6pa.
dialog.about.version=Version
dialog.about.build=Build
@@ -524,6 +528,7 @@ dialog.deletefieldvalues.nofields=Det finns inga f\u00e4lt att ta bort f\u00f6r
dialog.displaysettings.linewidth=Linjetjocklek f\u00f6r sp\u00e5ren (1-4)
dialog.displaysettings.antialias=Anv\u00e4nd kantutj\u00e4mning ("antialiasing")
dialog.displaysettings.waypointicons=Waypoint-ikon
+dialog.displaysettings.wpicon.default=Standardmark\u00f6r
dialog.displaysettings.wpicon.ringpt=Rund mark\u00f6r
dialog.displaysettings.wpicon.plectrum=Plektrum
dialog.displaysettings.wpicon.ring=Ring
@@ -532,6 +537,7 @@ dialog.displaysettings.size.small=Liten
dialog.displaysettings.size.medium=Mellan
dialog.displaysettings.size.large=Stor
dialog.displaysettings.windowstyle=F\u00f6nster-stil (kr\u00e4ver omstart)
+dialog.displaysettings.windowstyle.default=Standard
dialog.displaysettings.windowstyle.nimbus=Nimbus
dialog.displaysettings.windowstyle.gtk=GTK
dialog.downloadosm.desc=Bekr\u00e4fta att OSM-r\u00e5data laddas ner f\u00f6r det specifika omr\u00e5det:
@@ -600,11 +606,44 @@ confirm.rearrangewaypoints=Waypoint:ar omarrangerade
confirm.rearrangephotos=Foton omarrangerade
confirm.splitsegments=segment delades upp i %d delar
confirm.sewsegments=segment slogs ihop p\u00e5 %d st\u00e4llen
+confirm.cutandmove=Intervall flyttat
+confirm.pointsadded=%d punkter adderade
+confirm.convertnamestotimes=Waypoint-namn konverterade
+confirm.saveexif.ok=%d foton sparade
+confirm.undo.single=operation \u00e5terst\u00e4lld
+confirm.undo.multi=operationer \u00e5terst\u00e4llda
+confirm.jpegload.single=foto lades till
+confirm.jpegload.multi=foton lades till
+confirm.media.connect=media kopplats
+confirm.photo.disconnect=foto kopplats bort
+confirm.audio.disconnect=ljud kopplats bort
+confirm.media.removed=togs bort
+confirm.correlatephotos.single=foto korrelerat
+confirm.correlatephotos.multi=foton korrelerade
+confirm.createpoint=punkt skapad
+confirm.rotatephoto=foto roterat
+confirm.running=P\u00e5g\u00e5r...
+confirm.lookupsrtm=Hittade %d h\u00f6jd-datav\u00e4rden
+confirm.downloadsrtm=Laddade ner %d filer till cache:n
+confirm.downloadsrtm.1=Laddade ner %d fil till cache:n
+confirm.deletefieldvalues=F\u00e4lt-v\u00e4rden borttagna
+confirm.audioload=Ljud-filer adderade
+confirm.correlateaudios.single=ljud korrelerat
+confirm.correlateaudios.multi=ljud korrelerade
+
+# Tips, shown just once when appropriate
+tip.title=Tips
+tip.useamapcache=Genom att definiera en cache-mapp (Inst\u00e4llningar -> Spara kartor p\u00e5 h\u00e5rddisken)\nkan du snabba upp visningen och reducera datatrafiken.
+tip.learntimeparams=Resultaten f\u00e5r b\u00e4ttre nogrannhet om man f\u00f6rst anv\u00e4nder\nSp\u00e5r -> L\u00e4r upp tidsuppskattningsparametrar\np\u00e5 dina sp\u00e5r.
+tip.downloadsrtm=Du kan snabba upp detta genom att definiera en cachemapp\nf\u00f6r att spara SRTM-data lokalt.
+tip.usesrtmfor3d=Detta sp\u00e5r saknar h\u00f6jddata.\nDu kan anv\u00e4nda SRTM-funktioner f\u00f6r att f\u00e5 uppskattad\nh\u00f6jddata f\u00f6r 3d-vyn.
+tip.manuallycorrelateone=Genom att manuellt koppla \u00e5tminstone ett objekt kan tids-offset ber\u00e4knas f\u00f6r dig.
# Buttons
button.ok=OK
button.back=Bak\u00e5t
button.next=N\u00e4sta
+button.finish=Avsluta
button.cancel=Avbryt
button.overwrite=Skriv \u00f6ver
button.moveup=Flytta upp
@@ -612,6 +651,7 @@ button.movedown=Flytta ner
button.edit=Redigera
button.exit=Avsluta
button.close=St\u00e4ng
+button.continue=Forts\u00e4tta
button.yes=Ja
button.no=Nej
button.yestoall=Ja till alla
@@ -624,6 +664,7 @@ button.preview=F\u00f6rhandsvisa
button.load=Ladda in
button.guessfields=Gissa f\u00e4lt
button.showwebpage=Visa hemsida
+button.check=Kontrollera
button.resettodefaults=\u00c5terst\u00e4ll till default
button.browse=Bl\u00e4ddra...
button.addnew=L\u00e4gg till ny
@@ -631,6 +672,18 @@ button.delete=Ta bort
button.manage=Hantera
button.combine=Kombinera
+# File types
+filetype.txt=TXT-filer
+filetype.jpeg=JPG-filer
+filetype.kmlkmz=KML- & KMZ-filer
+filetype.kml=KML-filer
+filetype.kmz=KMZ-filer
+filetype.gpx=GPX-filer
+filetype.pov=POV-filer
+filetype.svg=SVG-filer
+filetype.png=PNG-filer
+filetype.audio=MP3-, OGG- & WAV-filer
+
# Display components
display.nodata=Ingen data laddad
display.noaltitudes=Sp\u00e5rdatan saknar h\u00f6jddata
@@ -736,4 +789,69 @@ logic.and=och
logic.or=eller
# External urls and services
+url.googlemaps=maps.google.se
+wikipedia.lang=sv
openweathermap.lang=se
+webservice.peakfinder=\u00d6ppna Peakfinder.org
+webservice.geohack=\u00d6ppna Geohack-sidan
+
+# Cardinals for 3d plots
+cardinal.n=N
+cardinal.s=S
+cardinal.e=\u00d6
+cardinal.w=V
+
+# Undo operations
+undo.load=Ladda data
+undo.loadphotos=Ladda foton
+undo.loadaudios=Ladda ljudklipp
+undo.editpoint=redigera punkt
+undo.deletepoint=ta bort punkt
+undo.removephoto=ta bort foto
+undo.removeaudio=ta bort ljudklipp
+undo.deleterange=ta bort intervall
+undo.croptrack=besk\u00e4r sp\u00e5r
+undo.deletemarked=ta bort punkter
+undo.insert=infoga punkter
+undo.reverse=v\u00e4nd intervall
+undo.mergetracksegments=sl\u00e5 ihop sp\u00e5rsegment
+undo.splitsegments=dela upp sp\u00e5ret i segment
+undo.sewsegments=sy ihop sp\u00e5rsegment
+undo.addtimeoffset=l\u00e4gg till tids-offset
+undo.addaltitudeoffset=l\u00e4gg till h\u00f6jd-offset
+undo.rearrangewaypoints=omarrangera waypoints
+undo.cutandmove=flytta intervall
+undo.connect=koppla
+undo.disconnect=koppla bort
+undo.correlatephotos=korrelera foton
+undo.rearrangephotos=omarrangera foton
+undo.createpoint=skapa punkt
+undo.rotatephoto=rotera foto
+undo.convertnamestotimes=konvertera namn till tidpunkter
+undo.lookupsrtm=kolla upp h\u00f6jddata via SRTM
+undo.deletefieldvalues=ta bort f\u00e4lt-v\u00e4rden
+undo.correlateaudios=korrelera ljudklipp
+
+# Error messages
+error.save.dialogtitle=Fel vid sparande av data
+error.save.nodata=Ingen data att spara
+error.save.failed=Misslyckades att spara datan till fil
+error.saveexif.filenotfound=Misslyckades att hitta foto-fil
+error.saveexif.cannotoverwrite1=Foto-fil
+error.saveexif.cannotoverwrite2=\u00e4r skrivskyddad och kan inte skrivas \u00f6ver. Spara som kopia?
+error.saveexif.failed=Misslyckades att spara %d foton.
+error.saveexif.forced=%d foton kr\u00e4vde forcering
+error.load.dialogtitle=Fel vid l\u00e4sning av data
+error.load.noread=Kan inte l\u00e4sa fil
+error.load.nopoints=Ingen koordinat-information hittades i filen
+error.load.unknownxml=K\u00e4nde inte igen xml-formatet:
+error.load.noxmlinzip=Ingen xml-fil hittades inuti zip-filen
+error.load.othererror=Fel vid l\u00e4sning av fil:
+error.load.nopointsintext=Ingen koordinat-information kunde hittas
+error.jpegload.dialogtitle=Fel vid l\u00e4sning av foton
+error.jpegload.nofilesfound=Ingen fil hittades
+error.jpegload.nojpegsfound=Ingen jpeg-fil hittades
+error.jpegload.nogpsfound=Ingen GPS-information hittades
+error.audioload.nofilesfound=Inga ljud-klipp hittades
+error.gpsload.unknown=Ok\u00e4nt fel
+error.undofailed.title=\u00c5ngra misslyckades
diff --git a/src/tim/prune/readme.txt b/src/tim/prune/readme.txt
index 618513d..f6efc99 100644
--- a/src/tim/prune/readme.txt
+++ b/src/tim/prune/readme.txt
@@ -1,4 +1,4 @@
-GpsPrune version 20.2
+GpsPrune version 20.3
=====================
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_20.2.jar
+ java -jar gpsprune_20.3.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,17 @@ 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_20.2.jar --lang=DE
+ java -jar gpsprune_20.3.jar --lang=DE
+New with version 20.3
+=====================
+The following fixes and additions were made since version 20.2:
+ - If a waypoint is selected, the distances function should use it
+ - If a point list has been pasted, closing should prompt about unsaved data
+ - Some additional translations
+ - Switching SRTM downloads to use kurviger.de instead of usgs.gov (thanks, kurviger.de!)
+
New with version 20.2
=====================
The following fixes and additions were made since version 20.1:
diff --git a/src/tim/prune/save/GpxExporter.java b/src/tim/prune/save/GpxExporter.java
index 8bfd090..f7de8f7 100644
--- a/src/tim/prune/save/GpxExporter.java
+++ b/src/tim/prune/save/GpxExporter.java
@@ -347,6 +347,7 @@ public class GpxExporter extends GenericFunction implements Runnable
+ " " + _exportFile.getAbsolutePath());
// export successful so need to close dialog and return
_dialog.dispose();
+ _app.informDataSaved();
return;
}
catch (IOException ioe)
--
2.43.0
From cd5dd0c207b676067e85e0885b90f05445b7e229 Mon Sep 17 00:00:00 2001
From: activityworkshop
Date: Mon, 10 May 2021 19:41:33 +0200
Subject: [PATCH 5/5] Version 20.4, May 2021
---
README.md | 4 +-
buildtools/build.sh | 2 +-
buildtools/pom.xml | 31 +-
buildtools/version.properties | 2 +-
src/tim/prune/GpsPrune.java | 4 +-
src/tim/prune/data/RangeStats.java | 14 +-
.../function/srtm/LookupSrtmFunction.java | 2 +-
src/tim/prune/gui/map/MapCanvas.java | 54 +--
src/tim/prune/gui/map/MapSource.java | 32 +-
src/tim/prune/gui/map/MffMapSource.java | 4 +-
src/tim/prune/gui/map/OsmMapSource.java | 37 +-
src/tim/prune/gui/map/SiteNameUtils.java | 73 ++++
src/tim/prune/lang/prune-texts_af.properties | 2 -
src/tim/prune/lang/prune-texts_cz.properties | 3 +-
src/tim/prune/lang/prune-texts_de.properties | 2 -
.../prune/lang/prune-texts_de_CH.properties | 2 -
src/tim/prune/lang/prune-texts_en.properties | 2 -
src/tim/prune/lang/prune-texts_es.properties | 2 -
src/tim/prune/lang/prune-texts_fi.properties | 6 +-
src/tim/prune/lang/prune-texts_fr.properties | 2 -
src/tim/prune/lang/prune-texts_hu.properties | 2 -
src/tim/prune/lang/prune-texts_it.properties | 2 -
src/tim/prune/lang/prune-texts_ja.properties | 2 -
src/tim/prune/lang/prune-texts_ko.properties | 2 -
src/tim/prune/lang/prune-texts_nl.properties | 2 -
src/tim/prune/lang/prune-texts_pl.properties | 14 +-
src/tim/prune/lang/prune-texts_pt.properties | 3 +-
src/tim/prune/lang/prune-texts_ro.properties | 2 -
src/tim/prune/lang/prune-texts_ru.properties | 2 -
src/tim/prune/lang/prune-texts_sv.properties | 6 +
src/tim/prune/lang/prune-texts_zh.properties | 2 -
src/tim/prune/load/BabelFileFormats.java | 1 +
src/tim/prune/load/FileLoader.java | 5 +
src/tim/prune/load/json/JsonBlock.java | 227 ++++++++++++
src/tim/prune/load/json/JsonFileLoader.java | 170 +++++++++
src/tim/prune/load/json/JsonPoint.java | 25 ++
src/tim/prune/readme.txt | 13 +-
src/tim/prune/threedee/Java3DWindow.java | 6 +-
src/tim/prune/threedee/UprightOrbiter.java | 326 ++++++++++++++++++
test/tim/prune/data/RangeStatsTest.java | 197 +++++++++++
.../tim/prune/function/cache/TileSetTest.java | 44 +++
.../prune/function/olc/OlcDecoderTest.java | 75 ++++
.../function/weather/SingleForecastTest.java | 52 +++
test/tim/prune/gui/map/MapSourceTest.java | 31 ++
test/tim/prune/gui/map/SiteNameUtilsTest.java | 63 ++++
test/tim/prune/jpeg/drew/RationalTest.java | 71 ++++
46 files changed, 1477 insertions(+), 148 deletions(-)
create mode 100644 src/tim/prune/gui/map/SiteNameUtils.java
create mode 100644 src/tim/prune/load/json/JsonBlock.java
create mode 100644 src/tim/prune/load/json/JsonFileLoader.java
create mode 100644 src/tim/prune/load/json/JsonPoint.java
create mode 100644 src/tim/prune/threedee/UprightOrbiter.java
create mode 100644 test/tim/prune/data/RangeStatsTest.java
create mode 100644 test/tim/prune/function/cache/TileSetTest.java
create mode 100644 test/tim/prune/function/olc/OlcDecoderTest.java
create mode 100644 test/tim/prune/function/weather/SingleForecastTest.java
create mode 100644 test/tim/prune/gui/map/MapSourceTest.java
create mode 100644 test/tim/prune/gui/map/SiteNameUtilsTest.java
create mode 100644 test/tim/prune/jpeg/drew/RationalTest.java
diff --git a/README.md b/README.md
index 1a1aa06..169f8ee 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 20, 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 and some missing French texts are online, to see whether it's a workable idea or not. Please help with these if you can.
+Here on github you'll find all the sources from version 1 to the current version 20.4, 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 missing French texts and Polish texts are online, to see whether it's a workable idea or not. Please help with these if you can.
diff --git a/buildtools/build.sh b/buildtools/build.sh
index 193244b..f4f00f9 100644
--- a/buildtools/build.sh
+++ b/buildtools/build.sh
@@ -1,7 +1,7 @@
# Build script
set -e
# Version number
-PRUNENAME=gpsprune_20
+PRUNENAME=gpsprune_20.4
# remove compile directory
rm -rf compile
# remove dist directory
diff --git a/buildtools/pom.xml b/buildtools/pom.xml
index 15b6562..b079793 100644
--- a/buildtools/pom.xml
+++ b/buildtools/pom.xml
@@ -7,7 +7,7 @@
tim.prune
gpsprune
- 20
+ 20.4
jar
tim.prune.gpsprune
@@ -44,12 +44,25 @@
j3dutils
${j3dutils.version}
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.7.1
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.7.1
+ test
+
${project.build.directory}/classes
${project.artifactId}_${project.version}
- ${project.basedir}/
+ ${project.basedir}/src
+ ${project.basedir}/test
${project.basedir}/src/
@@ -78,6 +91,11 @@
maven-compiler-plugin
3.8.0
+
+
+ -Xlint:deprecation
+
+
maven-jar-plugin
@@ -126,7 +144,14 @@
${app.mainClass}
-
+
+ maven-surefire-plugin
+ 2.22.2
+
+
+ maven-failsafe-plugin
+ 2.22.2
+
diff --git a/buildtools/version.properties b/buildtools/version.properties
index fe5699b..15c4a26 100644
--- a/buildtools/version.properties
+++ b/buildtools/version.properties
@@ -1 +1 @@
-version=20
+version=20.4
diff --git a/src/tim/prune/GpsPrune.java b/src/tim/prune/GpsPrune.java
index 8d80875..6644642 100644
--- a/src/tim/prune/GpsPrune.java
+++ b/src/tim/prune/GpsPrune.java
@@ -38,9 +38,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 = "20.3";
+ public static final String VERSION_NUMBER = "20.4";
/** Build number, just used for about screen */
- public static final String BUILD_NUMBER = "385";
+ public static final String BUILD_NUMBER = "387";
/** Static reference to App object */
private static App APP = null;
diff --git a/src/tim/prune/data/RangeStats.java b/src/tim/prune/data/RangeStats.java
index d8461c4..b32f12f 100644
--- a/src/tim/prune/data/RangeStats.java
+++ b/src/tim/prune/data/RangeStats.java
@@ -11,7 +11,7 @@ public class RangeStats
private boolean _foundTrackPoint = false;
protected AltitudeRange _totalAltitudeRange = new AltitudeRange();
protected AltitudeRange _movingAltitudeRange = new AltitudeRange();
- private Timestamp _earliestTimestamp = null, _latestTimestamp = null;
+ private Timestamp _earliestTimestamp = null, _latestTimestamp = null, _movingTimestamp = null;
private long _movingMilliseconds = 0L;
private boolean _timesIncomplete = false;
private boolean _timesOutOfSequence = false;
@@ -75,6 +75,12 @@ public class RangeStats
}
// timestamps
+ if (inPoint.getSegmentStart())
+ {
+ // reset movingTimestamp for moving time at the start
+ // of each segment
+ _movingTimestamp = null;
+ }
if (inPoint.hasTimestamp())
{
Timestamp currTstamp = inPoint.getTimestamp();
@@ -84,10 +90,11 @@ public class RangeStats
if (_latestTimestamp == null || currTstamp.isAfter(_latestTimestamp)) {
_latestTimestamp = currTstamp;
}
+
// Work out duration without segment gaps
- if (!inPoint.getSegmentStart() && _prevPoint != null && _prevPoint.hasTimestamp())
+ if (_movingTimestamp != null)
{
- long millisLater = currTstamp.getMillisecondsSince(_prevPoint.getTimestamp());
+ long millisLater = currTstamp.getMillisecondsSince(_movingTimestamp);
if (millisLater < 0) {
_timesOutOfSequence = true;
}
@@ -95,6 +102,7 @@ public class RangeStats
_movingMilliseconds += millisLater;
}
}
+ _movingTimestamp = currTstamp;
}
else {
_timesIncomplete = true;
diff --git a/src/tim/prune/function/srtm/LookupSrtmFunction.java b/src/tim/prune/function/srtm/LookupSrtmFunction.java
index c5986db..cccc7ed 100644
--- a/src/tim/prune/function/srtm/LookupSrtmFunction.java
+++ b/src/tim/prune/function/srtm/LookupSrtmFunction.java
@@ -267,7 +267,7 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
// try to download to cache
TileDownloader cacher = new TileDownloader();
TileDownloader.Result result = cacher.downloadTile(inUrl);
- System.out.println("Result: " + result);
+ // System.out.println("Result: " + result);
if (result == TileDownloader.Result.DOWNLOADED)
{
_numCached++;
diff --git a/src/tim/prune/gui/map/MapCanvas.java b/src/tim/prune/gui/map/MapCanvas.java
index a469e99..1791892 100644
--- a/src/tim/prune/gui/map/MapCanvas.java
+++ b/src/tim/prune/gui/map/MapCanvas.java
@@ -691,8 +691,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
final int[] xPixels = new int[numPoints];
final int[] yPixels = new int[numPoints];
- final int pointSeparationForArrowsSqd = 350;
+ final int pointSeparationForArrowsSqd = 400;
final int pointSeparation1dForArrows = (int) (Math.sqrt(pointSeparationForArrowsSqd) * 0.7);
+ final int hugePointSeparationForArrows = 120;
// try to set line width for painting
if (inG instanceof Graphics2D)
@@ -765,35 +766,38 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
pointsPainted = true;
// Now consider whether we need to draw an arrow as well
- if (drawArrows
- && !drawnLastArrow
- && (Math.abs(prevX-px) > pointSeparation1dForArrows || Math.abs(prevY-py) > pointSeparation1dForArrows))
+ if (drawArrows)
{
- final double pointSeparationSqd = (prevX-px) * (prevX-px) + (prevY-py) * (prevY-py);
- if (pointSeparationSqd > pointSeparationForArrowsSqd)
+ final double pointDist = Math.max(Math.abs(prevX - px), Math.abs(prevY - py));
+ final int separationLimit = (drawnLastArrow ? hugePointSeparationForArrows : pointSeparation1dForArrows);
+ if (pointDist > separationLimit)
{
- final double midX = (prevX + px) / 2.0;
- final double midY = (prevY + py) / 2.0;
- final boolean midPointVisible = midX >= 0 && midX < winWidth && midY >= 0 && midY < winHeight;
- if (midPointVisible)
+ final double pointSeparationSqd = (prevX-px) * (prevX-px) + (prevY-py) * (prevY-py);
+ if (pointSeparationSqd > pointSeparationForArrowsSqd)
{
- final double alpha = Math.atan2(py - prevY, px - prevX);
- //System.out.println("Draw arrow from (" + prevX + "," + prevY + ") to (" + px + "," + py
- // + ") with angle" + (int) (alpha * 180/Math.PI));
- final double MID_TO_VERTEX = 3.0;
- final double arrowX = MID_TO_VERTEX * Math.cos(alpha);
- final double arrowY = MID_TO_VERTEX * Math.sin(alpha);
- final double vertexX = midX + arrowX;
- final double vertexY = midY + arrowY;
- inG.drawLine((int)(midX-arrowX-2*arrowY), (int)(midY-arrowY+2*arrowX), (int)vertexX, (int)vertexY);
- inG.drawLine((int)(midX-arrowX+2*arrowY), (int)(midY-arrowY-2*arrowX), (int)vertexX, (int)vertexY);
+ final double midX = (prevX + px) / 2.0;
+ final double midY = (prevY + py) / 2.0;
+ final boolean midPointVisible = midX >= 0 && midX < winWidth && midY >= 0 && midY < winHeight;
+ if (midPointVisible)
+ {
+ final double alpha = Math.atan2(py - prevY, px - prevX);
+ //System.out.println("Draw arrow from (" + prevX + "," + prevY + ") to (" + px + "," + py
+ // + ") with angle" + (int) (alpha * 180/Math.PI));
+ final double MID_TO_VERTEX = 3.0;
+ final double arrowX = MID_TO_VERTEX * Math.cos(alpha);
+ final double arrowY = MID_TO_VERTEX * Math.sin(alpha);
+ final double vertexX = midX + arrowX;
+ final double vertexY = midY + arrowY;
+ inG.drawLine((int)(midX-arrowX-2*arrowY), (int)(midY-arrowY+2*arrowX), (int)vertexX, (int)vertexY);
+ inG.drawLine((int)(midX-arrowX+2*arrowY), (int)(midY-arrowY-2*arrowX), (int)vertexX, (int)vertexY);
+ }
+ drawnLastArrow = midPointVisible;
}
- drawnLastArrow = midPointVisible;
}
- }
- else
- {
- drawnLastArrow = false;
+ else
+ {
+ drawnLastArrow = false;
+ }
}
}
prevX = px; prevY = py;
diff --git a/src/tim/prune/gui/map/MapSource.java b/src/tim/prune/gui/map/MapSource.java
index c4e2946..aa7127d 100644
--- a/src/tim/prune/gui/map/MapSource.java
+++ b/src/tim/prune/gui/map/MapSource.java
@@ -2,8 +2,7 @@ package tim.prune.gui.map;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
/**
* Class to represent any map source, whether an OsmMapSource
@@ -16,9 +15,6 @@ public abstract class MapSource
/** File extensions */
protected String[] _extensions = null;
- /** Regular expression for catching server wildcards */
- protected static final Pattern WILD_PATTERN = Pattern.compile("^(.*)\\[(.*)\\](.*)$");
-
/**
* @return the number of layers used in this source
@@ -120,32 +116,6 @@ public abstract class MapSource
return urlstr;
}
- /**
- * Fix the site name by stripping off protocol and www.
- * This is used to create the file path for disk caching
- * @param inUrl url to strip
- * @return stripped url
- */
- protected static String fixSiteName(String inUrl)
- {
- if (inUrl == null || inUrl.equals("")) {return null;}
- String url = inUrl.toLowerCase();
- int idx = url.indexOf("://");
- if (idx >= 0) {url = url.substring(idx + 3);}
- if (url.startsWith("www.")) {url = url.substring(4);}
- // Strip out any "[.*]" as well
- if (url.indexOf('[') >= 0)
- {
- Matcher matcher = WILD_PATTERN.matcher(url);
- if (matcher.matches()) {
- url = matcher.group(1) + matcher.group(3);
- if (url.length() > 1 && url.charAt(0) == '.') {
- url = url.substring(1);
- }
- }
- }
- return url;
- }
/**
* @return string which can be written to the Config
diff --git a/src/tim/prune/gui/map/MffMapSource.java b/src/tim/prune/gui/map/MffMapSource.java
index 42806fc..fe3e5a6 100644
--- a/src/tim/prune/gui/map/MffMapSource.java
+++ b/src/tim/prune/gui/map/MffMapSource.java
@@ -32,8 +32,8 @@ public class MffMapSource extends MapSource
_baseUrls[0] = fixBaseUrl(inUrl1);
_baseUrls[1] = fixBaseUrl(inUrl2);
_siteNames = new String[2];
- _siteNames[0] = fixSiteName(_baseUrls[0]);
- _siteNames[1] = fixSiteName(_baseUrls[1]);
+ _siteNames[0] = SiteNameUtils.convertUrlToDirectory(_baseUrls[0]);
+ _siteNames[1] = SiteNameUtils.convertUrlToDirectory(_baseUrls[1]);
_extensions = new String[2];
_extensions[0] = inExt1;
_extensions[1] = inExt2;
diff --git a/src/tim/prune/gui/map/OsmMapSource.java b/src/tim/prune/gui/map/OsmMapSource.java
index 925fcf6..0cb579d 100644
--- a/src/tim/prune/gui/map/OsmMapSource.java
+++ b/src/tim/prune/gui/map/OsmMapSource.java
@@ -1,6 +1,5 @@
package tim.prune.gui.map;
-import java.util.regex.Matcher;
import tim.prune.I18nManager;
/**
@@ -84,8 +83,8 @@ public class OsmMapSource extends MapSource
_extensions[0] = inExt1;
_extensions[1] = inExt2;
_siteNames = new String[2];
- _siteNames[0] = fixSiteName(_baseUrls[0]);
- _siteNames[1] = fixSiteName(_baseUrls[1]);
+ _siteNames[0] = SiteNameUtils.convertUrlToDirectory(_baseUrls[0]);
+ _siteNames[1] = SiteNameUtils.convertUrlToDirectory(_baseUrls[1]);
// Swap layers if second layer given without first
if (_baseUrls[0] == null && _baseUrls[1] != null)
{
@@ -157,7 +156,7 @@ public class OsmMapSource extends MapSource
{
// Check if the base url has a [1234], if so replace at random
StringBuffer url = new StringBuffer();
- url.append(pickServerUrl(_baseUrls[inLayerNum]));
+ url.append(SiteNameUtils.pickServerUrl(_baseUrls[inLayerNum]));
url.append(inZoom).append('/').append(inX).append('/').append(inY);
url.append('.').append(getFileExtension(inLayerNum));
if (_apiKey != null)
@@ -175,36 +174,6 @@ public class OsmMapSource extends MapSource
return _maxZoom;
}
- /**
- * If the base url contains something like [1234], then pick a server
- * @param inBaseUrl base url
- * @return modified base url
- */
- protected static final String pickServerUrl(String inBaseUrl)
- {
- if (inBaseUrl == null || inBaseUrl.indexOf('[') < 0) {
- return inBaseUrl;
- }
- // Check for [.*] (once only)
- // Only need to support one, make things a bit easier
- final Matcher matcher = WILD_PATTERN.matcher(inBaseUrl);
- // if not, return base url unchanged
- if (!matcher.matches()) {
- return inBaseUrl;
- }
- // if so, pick one at random and replace in the String
- final String match = matcher.group(2);
- final int numMatches = match.length();
- String server = null;
- if (numMatches > 0)
- {
- int matchNum = (int) Math.floor(Math.random() * numMatches);
- server = "" + match.charAt(matchNum);
- }
- final String result = matcher.group(1) + (server==null?"":server) + matcher.group(3);
- return result;
- }
-
/**
* @return semicolon-separated list of all fields
*/
diff --git a/src/tim/prune/gui/map/SiteNameUtils.java b/src/tim/prune/gui/map/SiteNameUtils.java
new file mode 100644
index 0000000..cf53f72
--- /dev/null
+++ b/src/tim/prune/gui/map/SiteNameUtils.java
@@ -0,0 +1,73 @@
+package tim.prune.gui.map;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Helper functions for manipulating tile site names
+ */
+public abstract class SiteNameUtils
+{
+ /** Regular expression for catching server wildcards */
+ private static final Pattern WILD_PATTERN = Pattern.compile("^(.*)\\[(.*)\\](.*)$");
+
+
+ /**
+ * If the base url contains something like [1234], then pick a server
+ * @param inBaseUrl base url
+ * @return modified base url
+ */
+ public static String pickServerUrl(String inBaseUrl)
+ {
+ if (inBaseUrl == null || inBaseUrl.indexOf('[') < 0) {
+ return inBaseUrl;
+ }
+ // Check for [.*] (once only)
+ // Only need to support one, make things a bit easier
+ final Matcher matcher = WILD_PATTERN.matcher(inBaseUrl);
+ // if not, return base url unchanged
+ if (!matcher.matches()) {
+ return inBaseUrl;
+ }
+ // if so, pick one at random and replace in the String
+ final String match = matcher.group(2);
+ final int numMatches = match.length();
+ String server = null;
+ if (numMatches > 0)
+ {
+ int matchNum = (int) Math.floor(Math.random() * numMatches);
+ server = "" + match.charAt(matchNum);
+ }
+ final String result = matcher.group(1) + (server==null?"":server) + matcher.group(3);
+ return result;
+ }
+
+
+ /**
+ * Fix the site name by stripping off protocol and www.
+ * This is used to create the file path for disk caching
+ * @param inUrl url to strip
+ * @return stripped url
+ */
+ public static String convertUrlToDirectory(String inUrl)
+ {
+ if (inUrl == null || inUrl.equals("")) {return null;}
+ String url = inUrl.toLowerCase();
+ int idx = url.indexOf("://");
+ if (idx >= 0) {url = url.substring(idx + 3);}
+ if (url.startsWith("www.")) {url = url.substring(4);}
+ // Strip out any "[.*]" as well
+ if (url.indexOf('[') >= 0)
+ {
+ Matcher matcher = WILD_PATTERN.matcher(url);
+ if (matcher.matches())
+ {
+ url = matcher.group(1) + matcher.group(3);
+ if (url.length() > 1 && url.charAt(0) == '.') {
+ url = url.substring(1);
+ }
+ }
+ }
+ return url;
+ }
+}
diff --git a/src/tim/prune/lang/prune-texts_af.properties b/src/tim/prune/lang/prune-texts_af.properties
index 03acf63..8fab157 100644
--- a/src/tim/prune/lang/prune-texts_af.properties
+++ b/src/tim/prune/lang/prune-texts_af.properties
@@ -814,8 +814,6 @@ error.language.wrongfile=Die geselekteerde leer lyk nie soos 'n taal leer vir Gp
error.convertnamestotimes.nonames=Geen name kon in tye omgeskakel word
error.lookupsrtm.nonefound=Geen hoogte waardes beskikbaar vir die punte
error.lookupsrtm.nonerequired=Al die punte het klaar hoogtes, so daar is niks meer om te soek
-error.gpsies.uploadnotok=Die gpsies server het die boodskap terug gestuur
-error.gpsies.uploadfailed=Die oplaai het misluk met die volgende fout boodskap
error.showphoto.failed=Foto het nie gelaai nie
error.playaudiofailed=Klankgreep het nie gespeel nie
error.cache.notthere=Die te\u00ebl stoorarea gids kon nie opgespoor word nie
diff --git a/src/tim/prune/lang/prune-texts_cz.properties b/src/tim/prune/lang/prune-texts_cz.properties
index 92afbf4..39f177e 100644
--- a/src/tim/prune/lang/prune-texts_cz.properties
+++ b/src/tim/prune/lang/prune-texts_cz.properties
@@ -95,6 +95,7 @@ function.convertnamestotimes=P\u0159ev\u00e9st n\u00e1zvy v\u00fdzna\u010dn\u00f
function.deletefieldvalues=Smazat hodnoty pole
function.findwaypoint=Hledat bod
function.pastecoordinates=Zadat sou\u0159adnice
+function.enterpluscode=Zadat plus k\u00f3d
function.charts=Grafy
function.show3d=Trojrozm\u011brn\u011b
function.distances=Vzd\u00e1lenosti
@@ -814,8 +815,6 @@ error.language.wrongfile=Vybran\u00fd soubor nevypad\u00e1 jako jazykov\u00fd so
error.convertnamestotimes.nonames=N\u00e1zvy nemohou b\u00fdt p\u0159evedeny na \u010dasov\u00e9 zna\u010dky
error.lookupsrtm.nonefound=Pro tyto body nen\u00ed k dispozici informace o nadmo\u0159sk\u00e9 v\u00fd\u0161ce
error.lookupsrtm.nonerequired=U v\u0161ech bod\u016f u\u017e je informaci o v\u00fd\u0161ce, tak\u017ee nen\u00ed co dohled\u00e1vat
-error.gpsies.uploadnotok=Server gpsies vr\u00e1til hl\u00e1\u0161en\u00ed
-error.gpsies.uploadfailed=Chyba - nepoda\u0159ilo se nahr\u00e1t data.
error.showphoto.failed=Nepoda\u0159ilo se na\u010d\u00edst fotografii
error.playaudiofailed=Nepoda\u0159ilo se p\u0159ehr\u00e1t zvukov\u00fd soubor.
error.cache.notthere=Nepoda\u0159ilo se nal\u00e9zt adres\u00e1\u0159 s cache map.
diff --git a/src/tim/prune/lang/prune-texts_de.properties b/src/tim/prune/lang/prune-texts_de.properties
index ffc031d..1064211 100644
--- a/src/tim/prune/lang/prune-texts_de.properties
+++ b/src/tim/prune/lang/prune-texts_de.properties
@@ -876,8 +876,6 @@ error.language.wrongfile=Die ausgew\u00e4hlte Datei scheint keine Sprachdatei f\
error.convertnamestotimes.nonames=Es konnten keine Namen umgewandelt werden
error.lookupsrtm.nonefound=Keine H\u00f6hendaten verf\u00fcgbar f\u00fcr diese Punkte
error.lookupsrtm.nonerequired=Alle Punkte haben schon H\u00f6hendaten
-error.gpsies.uploadnotok=Der Gpsies Server hat geantwortet
-error.gpsies.uploadfailed=Das Hochladen ist fehlgeschlagen
error.showphoto.failed=Das Foto konnte nicht geladen werden
error.playaudiofailed=Das Abspielen der Audiodatei ist fehlgeschlagen
error.cache.notthere=Der Ordner wurde nicht gefunden
diff --git a/src/tim/prune/lang/prune-texts_de_CH.properties b/src/tim/prune/lang/prune-texts_de_CH.properties
index 555390e..76771e0 100644
--- a/src/tim/prune/lang/prune-texts_de_CH.properties
+++ b/src/tim/prune/lang/prune-texts_de_CH.properties
@@ -871,8 +871,6 @@ error.language.wrongfile=Die uusgew\u00e4hlti Datei scheint kei Sproch-Datei f\u
error.convertnamestotimes.nonames=Kei Namen han k\u00f6nnet verwondlet werde
error.lookupsrtm.nonefound=Kei H\u00f6hendate verf\u00fcegbar f\u00fcr d'P\u00fcnkte
error.lookupsrtm.nonerequired=Alle P\u00fcnkte han die H\u00f6hendate scho. N\u00fc\u00fct z'tue.
-error.gpsies.uploadnotok=Der Gpsies Server h\u00e4t gseit gha
-error.gpsies.uploadfailed=S Uufalade isch fehlgschlage
error.showphoto.failed=S F\u00f6teli han i n\u00f6d k\u00f6nne lade
error.playaudiofailed=S Abschpiele vonem File isch fehlgschlage
error.cache.notthere=D Ordner isch n\u00f6d gfunde worde
diff --git a/src/tim/prune/lang/prune-texts_en.properties b/src/tim/prune/lang/prune-texts_en.properties
index ad0d8db..f2910cf 100644
--- a/src/tim/prune/lang/prune-texts_en.properties
+++ b/src/tim/prune/lang/prune-texts_en.properties
@@ -886,8 +886,6 @@ error.language.wrongfile=The selected file doesn't appear to be a language file
error.convertnamestotimes.nonames=No names could be converted into times
error.lookupsrtm.nonefound=No altitude values available for these points
error.lookupsrtm.nonerequired=All points already have altitudes, so there's nothing to lookup
-error.gpsies.uploadnotok=The gpsies server returned the message
-error.gpsies.uploadfailed=The upload failed with the error
error.showphoto.failed=Failed to load photo
error.playaudiofailed=Failed to play audio clip
error.cache.notthere=The tile cache directory was not found
diff --git a/src/tim/prune/lang/prune-texts_es.properties b/src/tim/prune/lang/prune-texts_es.properties
index 6d6b76e..9885d80 100644
--- a/src/tim/prune/lang/prune-texts_es.properties
+++ b/src/tim/prune/lang/prune-texts_es.properties
@@ -887,8 +887,6 @@ error.language.wrongfile=El archivo seleccionado no parece ser un archivo de len
error.convertnamestotimes.nonames=Los nombres no pudieron ser convertidos en tiempos
error.lookupsrtm.nonefound=No se encontraron valores de altitud
error.lookupsrtm.nonerequired=Todos los puntos tienen altitudes, as\u00ed que no hay nada que buscar.
-error.gpsies.uploadnotok=El servidor de gpsies ha devuelto el mensaje
-error.gpsies.uploadfailed=La carga ha fallado con el error
error.showphoto.failed=Fallo al cargar la foto
error.playaudiofailed=Fallo reproduciendo archivo de audio
error.cache.notthere=No se encontr\u00f3 la carpeta del cache de recuadros
diff --git a/src/tim/prune/lang/prune-texts_fi.properties b/src/tim/prune/lang/prune-texts_fi.properties
index 226a84b..2b7566e 100644
--- a/src/tim/prune/lang/prune-texts_fi.properties
+++ b/src/tim/prune/lang/prune-texts_fi.properties
@@ -100,6 +100,7 @@ function.pastecoordinates=Anna uudet koordinaatit...
function.charts=Kaaviot
function.show3d=3D-n\u00e4kym\u00e4
function.distances=V\u00e4limatkat
+function.viewfulldetails=Kaikki yksityiskohdat
function.estimatetime=Arvioi aika
function.learnestimationparams=Opi aika-arvion parametrit
function.autoplay=Animoi reitti
@@ -514,6 +515,7 @@ dialog.diskcache.table.zoom=Zoom
dialog.diskcache.table.tiles=Tiles
dialog.diskcache.table.megabytes=Megabytes
dialog.diskcache.tileset=Tileset
+dialog.diskcache.tileset.multiple=usea
dialog.diskcache.deleteold=Poista vanhan karttapalat
dialog.diskcache.maximumage=Enimm\u00e4isik\u00e4 (p\u00e4ivi\u00e4)
dialog.diskcache.deleteall=Poista kaikki kartapalat
@@ -702,6 +704,7 @@ map.overzoom=Ei karttoja t\u00e4lle suurennussuhteelle
# Field names
fieldname.latitude=Leveysaste (Lat.)
fieldname.longitude=Pituusaste (Long.)
+fieldname.coordinates=Koordinaatit
fieldname.altitude=Korkeus
fieldname.timestamp=Aikaleima
fieldname.time=Aika
@@ -716,6 +719,7 @@ fieldname.duration=Kesto
fieldname.speed=Nopeus
fieldname.verticalspeed=Pystysuora nopeus
fieldname.description=Kuvaus
+fieldname.comment=Kommentti
fieldname.mediafilename=Median tiedostonimi
# Measurement units
@@ -834,8 +838,6 @@ error.language.wrongfile=Valittu tiedosto ei n\u00e4yt\u00e4 olevan GpsPrune:n k
error.convertnamestotimes.nonames=Kohdepisteiden nimi\u00e4 ei voitu muuntaa ajoiksi
error.lookupsrtm.nonefound=N\u00e4iss\u00e4 pisteiss\u00e4 ei ole korkeustietoja
error.lookupsrtm.nonerequired=Kaikilla pisteill\u00e4 on jo korkeustieto,\njoten ei ole mit\u00e4\u00e4n haettavaa
-error.gpsies.uploadnotok='gpsies'-palvelin palautti viestin:
-error.gpsies.uploadfailed=Tiedoston uppaus ep\u00e4onnistui virheilmoitukseen:
error.showphoto.failed=Kuvan lataus ei onnistunut
error.playaudiofailed=\u00c4\u00e4nileikkeen toisto ei onnistunut
error.cache.notthere=Karttapalojen v\u00e4limuistihakemistoa ei l\u00f6ytynyt
diff --git a/src/tim/prune/lang/prune-texts_fr.properties b/src/tim/prune/lang/prune-texts_fr.properties
index 9b3efec..2d29392 100644
--- a/src/tim/prune/lang/prune-texts_fr.properties
+++ b/src/tim/prune/lang/prune-texts_fr.properties
@@ -878,8 +878,6 @@ error.language.wrongfile=Le fichier s\u00e9lectionn\u00e9 n'est pas un fichier d
error.convertnamestotimes.nonames=Aucun nom n'a pu \u00eatre converti en horaire
error.lookupsrtm.nonefound=Aucune valeur d'altitude trouv\u00e9e pour les points
error.lookupsrtm.nonerequired=Tous les points ont d\u00e9j\u00e0 une altitude, il n'y a rien \u00e0 r\u00e9cup\u00e9rer
-error.gpsies.uploadnotok=Le serveur de Gpsies a renvoy\u00e9 le message
-error.gpsies.uploadfailed=L'envoi a \u00e9chou\u00e9 avec l'erreur
error.showphoto.failed=Impossible de charger la photo
error.playaudiofailed=\u00c9chec de la lecture du fichier audio
error.cache.notthere=Le dossier du cache n'a pas \u00e9t\u00e9 trouv\u00e9
diff --git a/src/tim/prune/lang/prune-texts_hu.properties b/src/tim/prune/lang/prune-texts_hu.properties
index 8239865..c3e9b1b 100644
--- a/src/tim/prune/lang/prune-texts_hu.properties
+++ b/src/tim/prune/lang/prune-texts_hu.properties
@@ -888,8 +888,6 @@ error.language.wrongfile=\u00dagy t\u0171nik, hogy a kiv\u00e1lasztott f\u00e1jl
error.convertnamestotimes.nonames=A nevek nem konvert\u00e1lhat\u00f3k id\u0151adatokk\u00e1
error.lookupsrtm.nonefound=Nem \u00e9rhet\u0151 el magass\u00e1gi \u00e9rt\u00e9k ezekhez a pontokhoz
error.lookupsrtm.nonerequired=Az \u00f6sszes pont m\u00e1r rendelkezik magass\u00e1gadatokkal, \u00edgy nincs mit keresni
-error.gpsies.uploadnotok=A gpsies szerver a k\u00f6vetkez\u0151 \u00fczenetet adta vissza
-error.gpsies.uploadfailed=A felt\u00f6lt\u00e9s nem siker\u00fclt a k\u00f6vetkez\u0151 hib\u00e1val
error.showphoto.failed=F\u00e9nyk\u00e9p bet\u00f6lt\u00e9se sikertelen
error.playaudiofailed=A hangf\u00e1jl lej\u00e1tsz\u00e1sa nem siker\u00fclt
error.cache.notthere=A csempegyors\u00edt\u00f3t\u00e1r k\u00f6nyvt\u00e1ra nem tal\u00e1lhat\u00f3
diff --git a/src/tim/prune/lang/prune-texts_it.properties b/src/tim/prune/lang/prune-texts_it.properties
index 2e7b3aa..38c4651 100644
--- a/src/tim/prune/lang/prune-texts_it.properties
+++ b/src/tim/prune/lang/prune-texts_it.properties
@@ -882,8 +882,6 @@ error.language.wrongfile=Il file selezionato non sembra essere un file di lingua
error.convertnamestotimes.nonames=Nomi non convertibili in orari
error.lookupsrtm.nonefound=Valori di quota non trovati
error.lookupsrtm.nonerequired=Tutti i punti hanno gi\u00e0 una quota, non c'\u00e8 niente da cercare
-error.gpsies.uploadnotok=Il server Gpsies ha riportato il messaggio
-error.gpsies.uploadfailed=Il caricamento \u00e8 fallito con l'errore
error.showphoto.failed=Caricamento foto fallito
error.playaudiofailed=Ripresa audio non riprodotta
error.cache.notthere=Directory del cache di tasselli non trovato
diff --git a/src/tim/prune/lang/prune-texts_ja.properties b/src/tim/prune/lang/prune-texts_ja.properties
index f698aba..28a9584 100644
--- a/src/tim/prune/lang/prune-texts_ja.properties
+++ b/src/tim/prune/lang/prune-texts_ja.properties
@@ -622,6 +622,4 @@ error.language.wrongfile=\u9078\u629e\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\
error.convertnamestotimes.nonames=\u3069\u306e\u540d\u524d\u3082\u6642\u9593\u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
error.lookupsrtm.nonefound=\u3069\u306e\u6a19\u9ad8\u5024\u3082\u3053\u308c\u3089\u306e\u30dd\u30a4\u30f3\u30c8\u304b\u3089\u53d6\u5f97\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
error.lookupsrtm.nonerequired=\u5168\u3066\u306e\u30dd\u30a4\u30f3\u30c8\u306f\u6a19\u9ad8\u5024\u3092\u6301\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u691c\u7d22\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-error.gpsies.uploadnotok=Gpsies\u30b5\u30fc\u30d0\u30fc\u304c\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8fd4\u3057\u307e\u3057\u305f\u3002
-error.gpsies.uploadfailed=\u30a8\u30e9\u30fc\u306e\u305f\u3081\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f
error.playaudiofailed=\u30aa\u30fc\u30c7\u30a3\u30aa\u30d5\u30a1\u30a4\u30eb\u306e\u518d\u751f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
diff --git a/src/tim/prune/lang/prune-texts_ko.properties b/src/tim/prune/lang/prune-texts_ko.properties
index 75332e4..d553df0 100644
--- a/src/tim/prune/lang/prune-texts_ko.properties
+++ b/src/tim/prune/lang/prune-texts_ko.properties
@@ -626,6 +626,4 @@ error.language.wrongfile=\uc120\ud0dd\ud558\uc2e0 \ud30c\uc77c\uc774 GpsPrune\uc
error.convertnamestotimes.nonames=\uc774\ub984\uc744 \uc2dc\uac04\uc73c\ub85c \ubcc0\ud658 \ud560 \uc218 \uc5c6\uc5b4\uc694./n(\uacbd\uc720\uc9c0\uc774\ub984\uc744 \ucc3e\uc9c0 \ubabb\ud588\uac70\ub098 \ubcc0\ud658\ud560 \uc218 \uc5c6\ub294 \uacbd\uc6b0\uc5d0\uc694.)
error.lookupsrtm.nonefound=\uc774 \uc9c0\uc810\ub4e4\uc5d0\uc11c \uace0\ub3c4\uac12\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5b4\uc694./n\uc774 \uc601\uc5ed\uc5d0\uc11c \ud0c0\uc77c\uc774 \uc5c6\uac70\ub098, \uc790\ub8cc\uac00 \uc54c\uc218 \uc5c6\ub294 \uac83\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \uacbd\uc720.
error.lookupsrtm.nonerequired=\ubaa8\ub4e0 \uc9c0\uc810\uc774 \uace0\ub3c4 \uc815\ubcf4\uac00 \uc788\uc5b4\uc11c, \ucc3e\uc744\uac8c \uc544\ubb34\uac83\ub3c4 \uc5c6\ub124\uc694.
-error.gpsies.uploadnotok=gpsies \uc11c\ubc84\uac00 \uba54\uc138\uc9c0\ub97c \ub2e4\uc74c\uacfc \uac19\uc740 \ub3cc\ub824\uc90d\ub2c8\ub2e4
-error.gpsies.uploadfailed=\ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc720\ub85c \uc5c5\ub85c\ub4dc\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4
error.playaudiofailed=\uc18c\ub9ac\ud30c\uc77c \uc7ac\uc0dd \uc2e4\ud328
diff --git a/src/tim/prune/lang/prune-texts_nl.properties b/src/tim/prune/lang/prune-texts_nl.properties
index c757ccf..009d248 100644
--- a/src/tim/prune/lang/prune-texts_nl.properties
+++ b/src/tim/prune/lang/prune-texts_nl.properties
@@ -885,8 +885,6 @@ error.language.wrongfile=Het geselecteerde bestand is vermoedelijk geen taalbest
error.convertnamestotimes.nonames=Namen konden niet naar tijden worden geconverteerd
error.lookupsrtm.nonefound=Geen hoogtewaarden beschikbaar voor deze punten
error.lookupsrtm.nonerequired=Alle punten hebben reeds hoogte, er hoeft niets te worden opgezocht.
-error.gpsies.uploadnotok=Gpsies server antwoordde met
-error.gpsies.uploadfailed=De upload is mislukt. Fout
error.showphoto.failed=Foto laden mislukt
error.playaudiofailed=Kon audiobestand niet afspelen
error.cache.notthere=De tegelcache map niet gevonden
diff --git a/src/tim/prune/lang/prune-texts_pl.properties b/src/tim/prune/lang/prune-texts_pl.properties
index 75bfc80..2733749 100644
--- a/src/tim/prune/lang/prune-texts_pl.properties
+++ b/src/tim/prune/lang/prune-texts_pl.properties
@@ -97,6 +97,7 @@ function.convertnamestotimes=Zamie\u0144 nazwy punkt\u00f3w na czas
function.deletefieldvalues=Usu\u0144 warto\u015bci
function.findwaypoint=Znajd\u017a punkt po\u015bredni
function.pastecoordinates=Wprowad\u017a nowe wsp\u00f3\u0142rz\u0119dne
+function.enterpluscode=Wpisz kod plus
function.charts=Wykres
function.show3d=Poka\u017c model 3D
function.distances=Odleg\u0142o\u015bci
@@ -117,6 +118,7 @@ function.searchopencachingde=Szukaj w OpenCaching.de
function.mapillary=Szukaj zdj\u0119cia w Mapillary
function.downloadosm=Za\u0142aduj dane obszaru z OSM
function.duplicatepoint=Duplikuj plik
+function.projectpoint=Rzucaj plik
function.setcolours=Ustaw kolory
function.setdisplaysettings=Ustawienia wy\u015bwietlacza
function.setlanguage=Zmie\u0144 j\u0119zyk
@@ -369,6 +371,8 @@ 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.osmpois.column.type=Typ
+dialog.osmpois.nonefound=Nie znaleziono punkt\u00f3w
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?
@@ -525,11 +529,16 @@ dialog.diskcache.deleteall=Usu\u0144 wszystkie p\u0142ytki
dialog.diskcache.deleted=Usuni\u0119to %d plik\u00f3w z kesza
dialog.deletefieldvalues.intro=Wybierz pola do skasowania z wybranego zakresu
dialog.deletefieldvalues.nofields=Brak p\u00f3l do skasowania dla tego zakresu
+dialog.displaysettings.waypointicons=Ikony dla punkt\u00f3w
+dialog.displaysettings.wpicon.plectrum=Plektron
+dialog.displaysettings.wpicon.ring=Pier\u015Bcie\u0144
dialog.displaysettings.linewidth=Wprowad\u017a grubo\u015b\u0107 linii do rysowania \u015bcie\u017cek
dialog.displaysettings.antialias=U\u017Cyj antyaliasingu
dialog.displaysettings.size.small=Ma\u0142e
dialog.displaysettings.size.medium=\u015arednie
dialog.displaysettings.size.large=Du\u017ce
+dialog.displaysettings.windowstyle=Styl okna (wymaga to restartu)
+dialog.displaysettings.windowstyle.default=Domy\u015Blny
dialog.downloadosm.desc=Potwierd\u017a \u015bci\u0105gni\u0119cie danych dla tego obszaru z OSM:
dialog.searchwikipedianames.search=Szukaj
dialog.weather.location=Pozycja
@@ -561,12 +570,14 @@ 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.system=Stref\u0119 czasow\u0105 systemu
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
dialog.autoplay.pause=Pauza
dialog.autoplay.play=Graj
+dialog.projectpoint.bearing=Kierunek (stopnie od p\u00f3\u0142nocy)
# 3d window
dialog.3d.title=GpsPrune widok tr\u00f3jwymiarowy
@@ -831,6 +842,7 @@ error.load.nopoints=Nie znaleziono informacji o wsp\u00f3\u0142rz\u0119dnych w p
error.load.unknownxml=Nieznany format xml:
error.load.noxmlinzip=Nie znaleziono pliku xml w pliku zip
error.load.othererror=B\u0142\u0105d czytania pliku:
+error.load.nopointsintext=Nie znaleziono wsp\u00f3\u0142rz\u0119dnych
error.jpegload.dialogtitle=B\u0142\u0105d \u0142adowania zdj\u0119cia
error.jpegload.nofilesfound=Nie znaleziono plik\u00f3w
error.jpegload.nojpegsfound=Nie znaleziono plik\u00f3w jpeg
@@ -851,8 +863,6 @@ error.language.wrongfile=Wybrany plik nie jest plikiem z t\u0142umaczeniem dla G
error.convertnamestotimes.nonames=\u017badne nazwy nie mog\u0142y zosta\u0107 zmienione na czas
error.lookupsrtm.nonefound=Nie znaleziono danych o wysoko\u015bci.
error.lookupsrtm.nonerequired=Wszystkie pola maj\u0105 informacj\u0119 o wysoko\u015bci, nie ma czego szuka\u0107
-error.gpsies.uploadnotok=Serwer Gpsies zwr\u00f3ci\u0142 informacj\u0119
-error.gpsies.uploadfailed=B\u0142\u0105d wysy\u0142ania
error.showphoto.failed=Nie powiod\u0142o si\u0119 za\u0142adowanie zdj\u0119cia
error.playaudiofailed=Nie powiod\u0142o si\u0119 odtwarzanie pliku audio
error.cache.notthere=Nie znaleziono katalogu kesza
diff --git a/src/tim/prune/lang/prune-texts_pt.properties b/src/tim/prune/lang/prune-texts_pt.properties
index 82fc087..8190965 100644
--- a/src/tim/prune/lang/prune-texts_pt.properties
+++ b/src/tim/prune/lang/prune-texts_pt.properties
@@ -96,6 +96,7 @@ function.convertnamestotimes=Converter nomes dos pontos para tempos
function.deletefieldvalues=Remover valores do campo
function.findwaypoint=Encontrar ponto
function.pastecoordinates=Inserir novas coordenadas
+function.enterpluscode=Inserir um plus code
function.charts=Gr\u00e1ficos
function.show3d=Visualizar 3D
function.distances=Dist\u00e2ncias
@@ -821,8 +822,6 @@ error.language.wrongfile=O arquivo selecionado n\u00e3o parece ser um arquivo de
error.convertnamestotimes.nonames=Nenhum nome pode ser convertido para tempo
error.lookupsrtm.nonefound=Nenhum valor de altitude encontrado
error.lookupsrtm.nonerequired=Todos os pontos j\u00e1 possuem altitude, assim n\u00e3o h\u00e1 nada a procurar
-error.gpsies.uploadnotok=O servidor Gpsies retornou a mensagem
-error.gpsies.uploadfailed=O envio falhou com o erro
error.showphoto.failed=Falha ao carregar foto
error.playaudiofailed=Falha ao reproduzir arquivo de \u00e1udio
error.cache.notthere=A paste de cache de fundos n\u00e3o foi encontrada
diff --git a/src/tim/prune/lang/prune-texts_ro.properties b/src/tim/prune/lang/prune-texts_ro.properties
index e3a5610..7affd24 100644
--- a/src/tim/prune/lang/prune-texts_ro.properties
+++ b/src/tim/prune/lang/prune-texts_ro.properties
@@ -851,8 +851,6 @@ error.language.wrongfile=Fi\u0219ierul selectat nu pare a fi un fi\u0219ier de l
error.convertnamestotimes.nonames=Niciun nume de waypoint nu a fost g\u0103sit sau nu au putut fi convertite
error.lookupsrtm.nonefound=Pentru aceste puncte nu exist\u0103 valori de altitudine
error.lookupsrtm.nonerequired=Toate punctele au deja altitudine, nu e nimic de calculat
-error.gpsies.uploadnotok=Server-ul gpsies a \u00eentors mesajul
-error.gpsies.uploadfailed=Upload-ul a e\u0219uat cu eroarea
error.showphoto.failed=\u00cenc\u0103rcarea foto a e\u0219uat
error.playaudiofailed=\u00cencercarea de a reda clipul audio a e\u0219uat
error.cache.notthere=Directorul tile cache nu a fost g\u0103sit
diff --git a/src/tim/prune/lang/prune-texts_ru.properties b/src/tim/prune/lang/prune-texts_ru.properties
index b1fe180..82a8fa9 100644
--- a/src/tim/prune/lang/prune-texts_ru.properties
+++ b/src/tim/prune/lang/prune-texts_ru.properties
@@ -883,8 +883,6 @@ error.language.wrongfile=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439
error.convertnamestotimes.nonames=\u041d\u0435\u0442 \u0438\u043c\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f
error.lookupsrtm.nonefound=\u041d\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442\u043c\u0435\u0442\u043e\u043a \u0432\u044b\u0441\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a.
error.lookupsrtm.nonerequired=\u0412\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442, \u043d\u0435\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c
-error.gpsies.uploadnotok=Gpsies \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
-error.gpsies.uploadfailed=\u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439
error.showphoto.failed=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e
error.playaudiofailed=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
error.cache.notthere=\u041f\u0430\u043f\u043a\u0430 \u043a\u044d\u0448\u0430 \u0441 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430
diff --git a/src/tim/prune/lang/prune-texts_sv.properties b/src/tim/prune/lang/prune-texts_sv.properties
index 6192c5c..4e46980 100644
--- a/src/tim/prune/lang/prune-texts_sv.properties
+++ b/src/tim/prune/lang/prune-texts_sv.properties
@@ -167,6 +167,7 @@ dialog.openoptions.filesnippet=Filextrakt
dialog.load.table.field=F\u00e4lt
dialog.load.table.datatype=Datatyp
dialog.load.table.description=Beskrivning
+dialog.delimiter.label=Avgr\u00e4nsare
dialog.delimiter.comma=Komma ,
dialog.delimiter.tab=Tabb
dialog.delimiter.space=Mellanslag
@@ -715,6 +716,7 @@ display.range.time.days=d
details.range.avespeed=Medelhastighet
details.range.maxspeed=Maxhastighet
details.range.numsegments=Antal segment
+details.range.pace=Tempo
details.range.gradient=Gradient
details.lists.waypoints=Waypoints
details.lists.photos=Foton
@@ -742,8 +744,10 @@ fieldname.date=Datum
fieldname.waypointname=Namn
fieldname.waypointtype=Typ
fieldname.newsegment=Segment
+fieldname.custom=Anpassad
fieldname.prefix=F\u00e4lt
fieldname.distance=Distans
+fieldname.duration=Varaktighet
fieldname.speed=Hastighet
fieldname.verticalspeed=Vertikal hastighet
fieldname.description=Beskrivning
@@ -855,3 +859,5 @@ error.jpegload.nogpsfound=Ingen GPS-information hittades
error.audioload.nofilesfound=Inga ljud-klipp hittades
error.gpsload.unknown=Ok\u00e4nt fel
error.undofailed.title=\u00c5ngra misslyckades
+error.function.notavailable.title=Funktionen \u00e4r inte tillg\u00e4nglig
+error.readme.notfound=Ingen L\u00e4sMig-fil hittades
diff --git a/src/tim/prune/lang/prune-texts_zh.properties b/src/tim/prune/lang/prune-texts_zh.properties
index d915629..fb68fb2 100644
--- a/src/tim/prune/lang/prune-texts_zh.properties
+++ b/src/tim/prune/lang/prune-texts_zh.properties
@@ -821,8 +821,6 @@ error.language.wrongfile=\u6240\u9009\u8bed\u8a00\u5305\u6587\u4ef6\u683c\u5f0f\
error.convertnamestotimes.nonames=\u540d\u79f0\u65e0\u6cd5\u8f6c\u6362\u6210\u65f6\u95f4
error.lookupsrtm.nonefound=\u65e0\u9ad8\u5ea6\u4fe1\u606f
error.lookupsrtm.nonerequired=\u6240\u6709\u70b9\u5747\u542b\u9ad8\u5ea6\u4fe1\u606f
-error.gpsies.uploadnotok=gpsies\u670d\u52a1\u5668\u8fd4\u56de\u4fe1\u606f\uff1a
-error.gpsies.uploadfailed=\u4e0a\u4f20\u5931\u8d25
error.showphoto.failed=\u52a0\u8f7d\u7167\u7247\u5931\u8d25
error.playaudiofailed=\u65e0\u6cd5\u64ad\u653e\u58f0\u97f3\u6587\u4ef6
error.cache.notthere=\u672a\u627e\u5230\u533a\u57df\u6570\u636e\u7f13\u5b58\u6587\u4ef6\u5939
diff --git a/src/tim/prune/load/BabelFileFormats.java b/src/tim/prune/load/BabelFileFormats.java
index 5c54dfb..73c40ac 100644
--- a/src/tim/prune/load/BabelFileFormats.java
+++ b/src/tim/prune/load/BabelFileFormats.java
@@ -100,6 +100,7 @@ public abstract class BabelFileFormats
"GeocachingDB for Palm/OS", "gcdb", null,
"Geogrid-Viewer ascii overlay file", "ggv_ovl", ".ovl",
"Geogrid-Viewer tracklogs", "ggv_log", ".log",
+ "GeoJSON", "geojson", ".json",
"GEOnet Names Server (GNS)", "geonet", null,
"GlobalSat DG-100/BT-335", "dg-100", null,
"GlobalSat DG-200", "dg-200", null,
diff --git a/src/tim/prune/load/FileLoader.java b/src/tim/prune/load/FileLoader.java
index 52bdef2..ba11005 100644
--- a/src/tim/prune/load/FileLoader.java
+++ b/src/tim/prune/load/FileLoader.java
@@ -10,6 +10,7 @@ import javax.swing.JFrame;
import tim.prune.App;
import tim.prune.config.Config;
import tim.prune.data.Photo;
+import tim.prune.load.json.JsonFileLoader;
import tim.prune.load.xml.GzipFileLoader;
import tim.prune.load.xml.XmlFileLoader;
import tim.prune.load.xml.ZipFileLoader;
@@ -142,6 +143,10 @@ public class FileLoader
_app.informPhotosLoaded(photoSet);
_app.informNoDataLoaded(); // To trigger load of next file if any
}
+ else if (fileExtension.equals("json"))
+ {
+ new JsonFileLoader(_app).openFile(inFile);
+ }
else
{
// Use text loader for everything else
diff --git a/src/tim/prune/load/json/JsonBlock.java b/src/tim/prune/load/json/JsonBlock.java
new file mode 100644
index 0000000..83486c7
--- /dev/null
+++ b/src/tim/prune/load/json/JsonBlock.java
@@ -0,0 +1,227 @@
+package tim.prune.load.json;
+
+import java.util.ArrayList;
+
+/**
+ * Structure to hold the contents of a Json block during parsing.
+ * This will be held within the current [] or {} block
+ */
+public class JsonBlock
+{
+ private String _latitude = null;
+ private String _longitude = null;
+ private String _altitude = null;
+
+ private Expectation _nextField = Expectation.NONE;
+ private BlockType _type = BlockType.NONE;
+ private boolean _hasNonNumbers = false;
+ private ArrayList _pointCoords = null;
+ private ArrayList> _coordList = null;
+
+
+ private enum BlockType {
+ NONE, FIELDS, POINTCOORDS, ISPOINTLIST, HASPOINTLIST
+ }
+ private enum Expectation {
+ NONE, LATITUDE, LONGITUDE, ALTITUDE, COORDS
+ }
+
+ /** Internal method to remove quotes and NaNs from altitude strings */
+ private String modifyAltitudeString(String inAlt)
+ {
+ if (inAlt == null || inAlt.equals("") || inAlt.equals("\"\"")) {
+ return null;
+ }
+ String result = inAlt;
+ if (inAlt.length() > 2 && inAlt.startsWith("\"") && inAlt.endsWith("\""))
+ {
+ result = inAlt.substring(1, inAlt.length()-1);
+ }
+ if (result.equals("NaN")) {return null;}
+ return result;
+ }
+
+ /**
+ * Receive a token to this block
+ * @param inToken token from Json source
+ */
+ public void addToken(String inToken)
+ {
+ if (inToken == null || inToken.isEmpty()) {return;}
+ if (!_hasNonNumbers && !looksLikeNumber(inToken)) {
+ _hasNonNumbers = true;
+ }
+ if (inToken.equals("\"latitude\"")) {
+ _nextField = Expectation.LATITUDE;
+ }
+ else if (inToken.equals("\"longitude\"")) {
+ _nextField = Expectation.LONGITUDE;
+ }
+ else if (inToken.equals("\"altitude\"")) {
+ _nextField = Expectation.ALTITUDE;
+ }
+ else if (inToken.equals("\"coordinates\"")) {
+ _nextField = Expectation.COORDS;
+ }
+ else
+ {
+ switch (_nextField)
+ {
+ case LATITUDE:
+ _latitude = inToken;
+ _type = BlockType.FIELDS;
+ break;
+ case LONGITUDE:
+ _longitude = inToken;
+ _type = BlockType.FIELDS;
+ break;
+ case ALTITUDE:
+ _altitude = modifyAltitudeString(inToken);
+ _type = BlockType.FIELDS;
+ break;
+ default:
+ if (!_hasNonNumbers && looksLikeNumber(inToken))
+ {
+ if (_pointCoords == null) {
+ _pointCoords = new ArrayList();
+ }
+ _pointCoords.add(inToken);
+ _type = BlockType.POINTCOORDS;
+ }
+ break;
+ }
+ _nextField = Expectation.NONE;
+ }
+ }
+
+ /** @return true if String can be parsed as a double */
+ private static boolean looksLikeNumber(String inToken)
+ {
+ double value = Double.NaN;
+ try {
+ value = Double.parseDouble(inToken);
+ }
+ catch (NumberFormatException nfe) {}
+ return !Double.isNaN(value);
+ }
+
+ /** @return true if named fields are valid */
+ public boolean areFieldsValid() {
+ return _type == BlockType.FIELDS && _latitude != null && _longitude != null;
+ }
+
+ /** @return true if list of 2 or 3 doubles for a single point is valid */
+ public boolean areSingleCoordsValid()
+ {
+ return !_hasNonNumbers && _pointCoords != null
+ && _pointCoords.size() >= 2 && _pointCoords.size() <= 3;
+ }
+
+ /**
+ * @param inNewSegment new segment flag
+ * @return created point
+ */
+ public JsonPoint createSinglePoint(boolean inNewSegment)
+ {
+ return new JsonPoint(_latitude, _longitude, _altitude, inNewSegment);
+ }
+
+ /**
+ * Child block has finished processing a single set of point coordinates
+ * @param inChild child block
+ */
+ public void addSingleCoordsFrom(JsonBlock inChild)
+ {
+ if (_type == BlockType.NONE && _nextField == Expectation.COORDS
+ && inChild._type == BlockType.POINTCOORDS)
+ {
+ // Named coordinates field
+ _type = BlockType.FIELDS;
+ _longitude = inChild.getSinglePointCoords(0);
+ _latitude = inChild.getSinglePointCoords(1);
+ _altitude = inChild.getSinglePointCoords(2);
+ }
+ else if ((_type == BlockType.NONE || _type == BlockType.ISPOINTLIST)
+ && !_hasNonNumbers && _nextField == Expectation.NONE
+ && inChild._type == BlockType.POINTCOORDS)
+ {
+ // add coordinates to list
+ _type = BlockType.ISPOINTLIST;
+ if (_coordList == null) {
+ _coordList = new ArrayList>();
+ }
+ _coordList.add(inChild._pointCoords);
+ }
+ }
+
+ /** @return point coordinate for given index, or null if not present */
+ private String getSinglePointCoords(int inIndex)
+ {
+ if (_pointCoords == null || inIndex < 0 || inIndex >= _pointCoords.size()) {
+ return null;
+ }
+ return _pointCoords.get(inIndex);
+ }
+
+ /** @return true if list of point coords is valid */
+ public boolean isCoordListValid()
+ {
+ return !_hasNonNumbers && _type == BlockType.ISPOINTLIST
+ && _coordList != null;
+ }
+
+ /** @return true if this block has a valid list of point coords */
+ public boolean hasValidCoordList()
+ {
+ return _type == BlockType.HASPOINTLIST && _coordList != null;
+ }
+
+ /**
+ * Child block has finished processing a list of point coordinates
+ * @param inChild child block
+ */
+ public void addCoordListFrom(JsonBlock inChild)
+ {
+ if (_type == BlockType.NONE && _nextField == Expectation.COORDS
+ && inChild._type == BlockType.ISPOINTLIST)
+ {
+ _coordList = inChild._coordList;
+ _type = BlockType.HASPOINTLIST;
+ }
+ else if ((_type == BlockType.NONE || _type == BlockType.ISPOINTLIST)
+ && !_hasNonNumbers && inChild._type == BlockType.ISPOINTLIST)
+ {
+ if (_coordList == null) {
+ _coordList = new ArrayList>();
+ }
+ _coordList.addAll(inChild._coordList);
+ _type = BlockType.ISPOINTLIST;
+ }
+ }
+
+ /**
+ * @return number of points in the list, if this block has a list
+ */
+ public int getNumPoints()
+ {
+ if (hasValidCoordList()) {
+ return _coordList.size();
+ }
+ return 0;
+ }
+
+ /**
+ * @param inIndex point index within list
+ * @return created point for specified index
+ */
+ public JsonPoint createPointFromList(int inIndex)
+ {
+ if (inIndex < 0 || inIndex >= getNumPoints()) {return null;}
+ ArrayList pointCoords = _coordList.get(inIndex);
+ if (pointCoords.size() < 2 || pointCoords.size() > 3) {return null;}
+ final String longitude = pointCoords.get(0);
+ final String latitude = pointCoords.get(1);
+ final String altitude = ((pointCoords.size() == 3) ? pointCoords.get(3) : null);
+ return new JsonPoint(latitude, longitude, altitude, inIndex == 0);
+ }
+}
diff --git a/src/tim/prune/load/json/JsonFileLoader.java b/src/tim/prune/load/json/JsonFileLoader.java
new file mode 100644
index 0000000..e1df666
--- /dev/null
+++ b/src/tim/prune/load/json/JsonFileLoader.java
@@ -0,0 +1,170 @@
+package tim.prune.load.json;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Stack;
+
+import tim.prune.App;
+import tim.prune.data.Field;
+import tim.prune.data.SourceInfo;
+
+
+/**
+ * Class to handle the loading of GeoJSON files
+ */
+public class JsonFileLoader
+{
+ /** App for callback of file loading */
+ private App _app = null;
+ /** Stack of blocks */
+ private Stack _jsonBlocks = null;
+ /** List of points extracted */
+ private ArrayList _jsonPoints = null;
+ private boolean _newSegment = true;
+
+
+ /**
+ * Constructor
+ * @param inApp App object
+ */
+ public JsonFileLoader(App inApp)
+ {
+ _app = inApp;
+ _jsonBlocks = new Stack();
+ _jsonPoints = new ArrayList();
+ }
+
+ /**
+ * Open the selected file
+ * @param inFile File to open
+ */
+ public void openFile(File inFile)
+ {
+ BufferedReader reader = null;
+ try
+ {
+ reader = new BufferedReader(new FileReader(inFile));
+ String currLine = reader.readLine();
+ while (currLine != null)
+ {
+ processTokensInLine(currLine);
+ // Read next line, if any
+ currLine = reader.readLine();
+ }
+ }
+ catch (IOException ioe) {
+ _app.showErrorMessage("error.load.dialogtitle", "error.load.noread");
+ }
+ finally
+ {
+ // close file ignoring errors
+ try {
+ if (reader != null) reader.close();
+ }
+ catch (Exception e) {}
+ }
+ if (_jsonPoints.size() > 0)
+ {
+ Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE,
+ Field.NEW_SEGMENT};
+ _app.informDataLoaded(fields, makeDataArray(),
+ null, new SourceInfo(inFile, SourceInfo.FILE_TYPE.JSON), null);
+ }
+ // TODO: Show message if nothing was found?
+ }
+
+ /** Split the given line from the json into tokens
+ * and process them one by one */
+ private void processTokensInLine(String inLine)
+ {
+ if (inLine == null) {return;}
+ String line = inLine.strip();
+ StringBuilder currToken = new StringBuilder();
+ boolean insideQuotes = false;
+ boolean previousSlash = false;
+ for (char x : line.toCharArray())
+ {
+ if (insideQuotes || x=='"') {
+ currToken.append(x);
+ }
+ else
+ {
+ if (" :,".indexOf(x) >= 0) {
+ processToken(currToken.toString());
+ currToken.setLength(0);
+ }
+ else if ("[{".indexOf(x) >= 0) {
+ // start of a new block
+ _jsonBlocks.add(new JsonBlock());
+ }
+ else if ("]}".indexOf(x) >= 0)
+ {
+ processToken(currToken.toString());
+ currToken.setLength(0);
+ // end of the current block
+ processBlock(_jsonBlocks.pop());
+ }
+ else {
+ currToken.append(x);
+ }
+ }
+ if (x == '"' && !previousSlash) {insideQuotes = !insideQuotes;}
+ previousSlash = (x == '\\') && !previousSlash;
+ }
+ processToken(currToken.toString());
+ }
+
+ private void processToken(String inToken)
+ {
+ if (inToken == null || inToken.isBlank()) {return;}
+ if (inToken.equals("\"coordinates\"")) {
+ _newSegment = true;
+ }
+ _jsonBlocks.peek().addToken(inToken);
+ }
+
+ /** Process the end of the given block */
+ private void processBlock(JsonBlock inBlock)
+ {
+ if (inBlock.areFieldsValid())
+ {
+ _jsonPoints.add(inBlock.createSinglePoint(_newSegment));
+ _newSegment = false;
+ }
+ else if (inBlock.areSingleCoordsValid())
+ {
+ // block contains a single point - pass to parent list
+ _jsonBlocks.peek().addSingleCoordsFrom(inBlock);
+ }
+ else if (inBlock.isCoordListValid())
+ {
+ // block contains a list of point coords
+ _jsonBlocks.peek().addCoordListFrom(inBlock);
+ }
+ else if (inBlock.hasValidCoordList())
+ {
+ for (int i=0; i
+ * The rotate action rotates the ViewPlatform around the point of interest
+ * when the mouse is moved with the main mouse button pressed. The
+ * rotation is in the direction of the mouse movement, with a default
+ * rotation of 0.01 radians for each pixel of mouse movement.
+ *
+ * The zoom action moves the ViewPlatform closer to or further from the
+ * point of interest when the mouse is moved with the middle mouse button
+ * pressed (or Alt-main mouse button on systems without a middle mouse button).
+ * The default zoom action is to translate the ViewPlatform 0.01 units for each
+ * pixel of mouse movement. Moving the mouse up moves the ViewPlatform closer,
+ * moving the mouse down moves the ViewPlatform further away.
+ *
+ * The translate action translates the ViewPlatform when the mouse is moved
+ * with the right mouse button pressed. The translation is in the direction
+ * of the mouse movement, with a default translation of 0.01 units for each
+ * pixel of mouse movement.
+ *
+ * The actions can be reversed using the REVERSE_
ACTION
+ * constructor flags. The default action moves the ViewPlatform around the
+ * objects in the scene. The REVERSE_
ACTION flags can
+ * make the objects in the scene appear to be moving in the direction
+ * of the mouse movement.
+ */
+public class UprightOrbiter extends ViewPlatformAWTBehavior
+{
+ private Transform3D _longitudeTransform = new Transform3D();
+ private Transform3D _latitudeTransform = new Transform3D();
+ private Transform3D _rotateTransform = new Transform3D();
+
+ // needed for integrateTransforms but don't want to new every time
+ private Transform3D _temp1 = new Transform3D();
+ private Transform3D _temp2 = new Transform3D();
+ private Transform3D _translation = new Transform3D();
+ private Vector3d _transVector = new Vector3d();
+ private Vector3d _distanceVector = new Vector3d();
+ private Vector3d _centerVector = new Vector3d();
+ private Vector3d _invertCenterVector = new Vector3d();
+
+ private double _deltaYaw = 0.0, _deltaPitch = 0.0;
+ private double _startDistanceFromCenter = 20.0;
+ private double _distanceFromCenter = 20.0;
+ private Point3d _rotationCenter = new Point3d();
+ private Matrix3d _rotMatrix = new Matrix3d();
+
+ private int _mouseX = 0, _mouseY = 0;
+
+ private double _xtrans = 0.0, _ytrans = 0.0, _ztrans = 0.0;
+
+ private static final double MIN_RADIUS = 0.0;
+
+ // the factor to be applied to wheel zooming so that it does not
+ // look much different with mouse movement zooming.
+ private static final float wheelZoomFactor = 50.0f;
+
+ private static final double NOMINAL_ZOOM_FACTOR = .01;
+ private static final double NOMINAL_ROT_FACTOR = .008;
+ private static final double NOMINAL_TRANS_FACTOR = .003;
+
+ private double _pitchAngle = 0.0;
+
+
+ /**
+ * Creates a new OrbitBehaviour
+ * @param inCanvas The Canvas3D to add the behaviour to
+ * @param inInitialPitch pitch angle in degrees
+ */
+ public UprightOrbiter(Canvas3D inCanvas, double inInitialPitch)
+ {
+ super(inCanvas, MOUSE_LISTENER | MOUSE_MOTION_LISTENER | MOUSE_WHEEL_LISTENER );
+ _pitchAngle = Math.toRadians(inInitialPitch);
+ }
+
+ protected synchronized void processAWTEvents( final AWTEvent[] events )
+ {
+ motion = false;
+ for(int i=0; i MIN_RADIUS) {
+ _distanceFromCenter -= ychange * NOMINAL_ZOOM_FACTOR;
+ }
+ else {
+ _distanceFromCenter = MIN_RADIUS;
+ }
+ }
+
+ /**
+ * Sets the ViewingPlatform for this behaviour. This method is
+ * called by the ViewingPlatform.
+ * If a sub-calls overrides this method, it must call
+ * super.setViewingPlatform(vp).
+ * NOTE: Applications should not call this method.
+ */
+ @Override
+ public void setViewingPlatform(ViewingPlatform vp)
+ {
+ super.setViewingPlatform( vp );
+
+ if (vp != null) {
+ resetView();
+ integrateTransforms();
+ }
+ }
+
+ /**
+ * Reset the orientation and distance of this behaviour to the current
+ * values in the ViewPlatform Transform Group
+ */
+ private void resetView()
+ {
+ Vector3d centerToView = new Vector3d();
+
+ targetTG.getTransform( targetTransform );
+
+ targetTransform.get( _rotMatrix, _transVector );
+ centerToView.sub( _transVector, _rotationCenter );
+ _distanceFromCenter = centerToView.length();
+ _startDistanceFromCenter = _distanceFromCenter;
+
+ targetTransform.get( _rotMatrix );
+ _rotateTransform.set( _rotMatrix );
+
+ // compute the initial x/y/z offset
+ _temp1.set(centerToView);
+ _rotateTransform.invert();
+ _rotateTransform.mul(_temp1);
+ _rotateTransform.get(centerToView);
+ _xtrans = centerToView.x;
+ _ytrans = centerToView.y;
+ _ztrans = centerToView.z;
+
+ // reset rotMatrix
+ _rotateTransform.set( _rotMatrix );
+ }
+
+ protected synchronized void integrateTransforms()
+ {
+ // Check if the transform has been changed by another behaviour
+ Transform3D currentXfm = new Transform3D();
+ targetTG.getTransform(currentXfm);
+ if (! targetTransform.equals(currentXfm))
+ resetView();
+
+ // Three-step rotation process, firstly undo the pitch and apply the delta yaw
+ _latitudeTransform.rotX(_pitchAngle);
+ _rotateTransform.mul(_rotateTransform, _latitudeTransform);
+ _longitudeTransform.rotY( _deltaYaw );
+ _rotateTransform.mul(_rotateTransform, _longitudeTransform);
+ // Now update pitch angle according to delta and apply
+ _pitchAngle = Math.min(Math.max(0.0, _pitchAngle - _deltaPitch), Math.PI/2.0);
+ _latitudeTransform.rotX(-_pitchAngle);
+ _rotateTransform.mul(_rotateTransform, _latitudeTransform);
+
+ _distanceVector.z = _distanceFromCenter - _startDistanceFromCenter;
+
+ _temp1.set(_distanceVector);
+ _temp1.mul(_rotateTransform, _temp1);
+
+ // want to look at rotationCenter
+ _transVector.x = _rotationCenter.x + _xtrans;
+ _transVector.y = _rotationCenter.y + _ytrans;
+ _transVector.z = _rotationCenter.z + _ztrans;
+
+ _translation.set(_transVector);
+ targetTransform.mul(_temp1, _translation);
+
+ // handle rotationCenter
+ _temp1.set(_centerVector);
+ _temp1.mul(targetTransform);
+
+ _invertCenterVector.x = -_centerVector.x;
+ _invertCenterVector.y = -_centerVector.y;
+ _invertCenterVector.z = -_centerVector.z;
+
+ _temp2.set(_invertCenterVector);
+ targetTransform.mul(_temp1, _temp2);
+
+ Vector3d finalTranslation = new Vector3d();
+ targetTransform.get(finalTranslation);
+
+ targetTG.setTransform(targetTransform);
+
+ // reset yaw and pitch deltas
+ _deltaYaw = 0.0;
+ _deltaPitch = 0.0;
+ }
+
+ private boolean isRotateEvent(MouseEvent evt)
+ {
+ final boolean isRightDrag = (evt.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) > 0;
+ return !evt.isAltDown() && !isRightDrag;
+ }
+
+ private boolean isZoomEvent(MouseEvent evt)
+ {
+ if (evt instanceof java.awt.event.MouseWheelEvent) {
+ return true;
+ }
+ return evt.isAltDown() && !evt.isMetaDown();
+ }
+
+ private boolean isTranslateEvent(MouseEvent evt)
+ {
+ final boolean isRightDrag = (evt.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) > 0;
+ return !evt.isAltDown() && isRightDrag;
+ }
+}
diff --git a/test/tim/prune/data/RangeStatsTest.java b/test/tim/prune/data/RangeStatsTest.java
new file mode 100644
index 0000000..d068ac1
--- /dev/null
+++ b/test/tim/prune/data/RangeStatsTest.java
@@ -0,0 +1,197 @@
+package tim.prune.data;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for calculation of moving time of a range
+ * based on different timestamp availability
+ * @author fperrin
+ */
+class RangeStatsTest
+{
+ @Test
+ void movingTime()
+ {
+ Track track = new Track();
+ DataPoint[] points = {
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:00",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:05",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:07",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ };
+ track.appendPoints(points);
+
+ RangeStats range = new RangeStats(track, 0, track.getNumPoints() - 1);
+ assertEquals(7, range.getMovingDurationInSeconds());
+ assertEquals(7, range.getTotalDurationInSeconds());
+ assertFalse(range.getTimestampsIncomplete());
+ assertFalse(range.getTimestampsOutOfSequence());
+ }
+
+ @Test
+ void movingTimeWithGap()
+ {
+ Track track = new Track();
+ DataPoint[] points = {
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:00",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {},
+ new FieldList(new Field[] {}),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:05",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:07",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ };
+ track.appendPoints(points);
+
+ RangeStats range = new RangeStats(track, 0, track.getNumPoints() - 1);
+ assertEquals(7, range.getMovingDurationInSeconds());
+ assertEquals(7, range.getTotalDurationInSeconds());
+ assertTrue(range.getTimestampsIncomplete());
+ assertFalse(range.getTimestampsOutOfSequence());
+ }
+
+ @Test
+ void movingTimeSeveralSegments()
+ {
+ Track track = new Track();
+ DataPoint[] points = {
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:01:00",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {},
+ new FieldList(new Field[] {}),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:01:05",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:01:07",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ // start a second segment
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:20",
+ "1",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ Field.NEW_SEGMENT,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:27",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ };
+ track.appendPoints(points);
+
+ RangeStats range = new RangeStats(track, 0, track.getNumPoints() - 1);
+ assertEquals(7 + 7, range.getMovingDurationInSeconds());
+ assertEquals(47, range.getTotalDurationInSeconds());
+ assertTrue(range.getEarliestTimestamp().isEqual(new TimestampUtc("01-Jan-2020 00:00:20")));
+ assertTrue(range.getLatestTimestamp().isEqual(new TimestampUtc("01-Jan-2020 00:01:07")));
+ assertTrue(range.getTimestampsIncomplete());
+
+ // even though segment 2 is earlier than segment 1, timestamps
+ // within each segment are normally ordered
+ assertFalse(range.getTimestampsOutOfSequence());
+ }
+
+ @Test
+ void movingTimeMissingFirstTimestamp()
+ {
+ Track track = new Track();
+ DataPoint[] points = {
+ new DataPoint(
+ new String[] {},
+ new FieldList(new Field[] {}),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:00",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ new DataPoint(
+ new String[] {
+ "01-Jan-2020 00:00:05",
+ },
+ new FieldList(new Field[] {
+ Field.TIMESTAMP,
+ }),
+ null),
+ };
+ track.appendPoints(points);
+
+ RangeStats range = new RangeStats(track, 0, track.getNumPoints() - 1);
+ assertEquals(5, range.getMovingDurationInSeconds());
+ assertEquals(5, range.getTotalDurationInSeconds());
+ assertTrue(range.getTimestampsIncomplete());
+ assertFalse(range.getTimestampsOutOfSequence());
+ }
+}
diff --git a/test/tim/prune/function/cache/TileSetTest.java b/test/tim/prune/function/cache/TileSetTest.java
new file mode 100644
index 0000000..4ff108c
--- /dev/null
+++ b/test/tim/prune/function/cache/TileSetTest.java
@@ -0,0 +1,44 @@
+package tim.prune.function.cache;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for tile name checks
+ */
+class TileSetTest
+{
+ @Test
+ void testIsNumeric()
+ {
+ // not numeric, should be false
+ assertFalse(TileSet.isNumeric(null));
+ assertFalse(TileSet.isNumeric(""));
+ assertFalse(TileSet.isNumeric("a"));
+ assertFalse(TileSet.isNumeric(" "));
+ assertFalse(TileSet.isNumeric("155a"));
+ assertFalse(TileSet.isNumeric("-2"));
+ // numeric, should be true
+ assertTrue(TileSet.isNumeric("1"));
+ assertTrue(TileSet.isNumeric("155"));
+ }
+
+ @Test
+ void testIsNumericUntilDot()
+ {
+ // not numeric, should be false
+ assertFalse(TileSet.isNumericUntilDot(null));
+ assertFalse(TileSet.isNumericUntilDot(""));
+ assertFalse(TileSet.isNumericUntilDot("."));
+ assertFalse(TileSet.isNumericUntilDot(".abc"));
+ assertFalse(TileSet.isNumericUntilDot("a3."));
+ assertFalse(TileSet.isNumericUntilDot("4a"));
+ assertFalse(TileSet.isNumericUntilDot("215327h.png"));
+ // numeric but no dot, should be false
+ assertFalse(TileSet.isNumericUntilDot("1234"));
+ // numeric, should be true
+ System.out.println(TileSet.isNumericUntilDot("44.jpg"));
+ System.out.println(TileSet.isNumericUntilDot("0."));
+ }
+}
diff --git a/test/tim/prune/function/olc/OlcDecoderTest.java b/test/tim/prune/function/olc/OlcDecoderTest.java
new file mode 100644
index 0000000..951a081
--- /dev/null
+++ b/test/tim/prune/function/olc/OlcDecoderTest.java
@@ -0,0 +1,75 @@
+package tim.prune.function.olc;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for decoding of Open Location Codes (Pluscodes)
+ */
+class OlcDecoderTest
+{
+
+ @Test
+ void testDecodeStringsTooShort()
+ {
+ OlcArea area = OlcDecoder.decode(null);
+ assertEquals(area, null, "Decoding null gives null");
+ area = OlcDecoder.decode("");
+ assertEquals(area, null, "Decoding \"\" gives null");
+ area = OlcDecoder.decode("9");
+ assertEquals(area, null, "Decoding \"9\" gives null");
+ area = OlcDecoder.decode("9999999");
+ assertEquals(area, null, "Decoding \"9999999\" gives null");
+ }
+
+ @Test
+ void testDecodeStringsInvalid()
+ {
+ OlcArea area = OlcDecoder.decode("11111111");
+ assertEquals(area, null, "Decoding lots of 1s gives null");
+ area = OlcDecoder.decode("99999991");
+ assertEquals(area, null, "Decoding with a single 1 gives null");
+ area = OlcDecoder.decode("99999999");
+ assertNotEquals(area, null, "Decoding with all 9s gives non-null");
+ area = OlcDecoder.decode("00000000");
+ assertEquals(area, null, "Decoding with all padding gives null");
+ area = OlcDecoder.decode("99000000");
+ assertNotEquals(area, null, "Decoding with some padding gives non-null");
+ }
+
+ @Test
+ void testDecodeZeroes()
+ {
+ OlcArea area = OlcDecoder.decode("22000000");
+ assertNotEquals(area, null, "Decoding with padding gives non-null");
+ assertEquals(-90.0, area.minLat, 0.0, "South 90");
+ assertEquals(-70.0, area.maxLat, 0.0, "South 70");
+ assertEquals(-180.0, area.minLon, 0.0, "West 180");
+ assertEquals(-160.0, area.maxLon, 0.0, "West 160");
+ }
+
+ @Test
+ void testDecodeZeroes2()
+ {
+ OlcArea area = OlcDecoder.decode("22220000");
+ assertNotEquals(area, null, "Decoding with padding gives non-null");
+ assertEquals(-90.0, area.minLat, 0.0, "South 90");
+ assertEquals(-89.0, area.maxLat, 0.0, "South 89");
+ assertEquals(-180.0, area.minLon, 0.0, "West 180");
+ assertEquals(-179.0, area.maxLon, 0.0, "West 179");
+ }
+
+ @Test
+ void testMountainView()
+ {
+ OlcArea area = OlcDecoder.decode("6PH57VP3+PR6");
+ assertNotEquals(area, null, "Decoding with separator gives non-null");
+ System.out.println("Min lat: " + area.minLat);
+ System.out.println("Max lat: " + area.maxLat);
+ System.out.println("Min lon: " + area.minLon);
+ System.out.println("Max lon: " + area.maxLon);
+ assertTrue(area.maxLat > area.minLat, "latitude range");
+ assertTrue(area.maxLon > area.minLon, "longitude range");
+ }
+}
diff --git a/test/tim/prune/function/weather/SingleForecastTest.java b/test/tim/prune/function/weather/SingleForecastTest.java
new file mode 100644
index 0000000..372ab47
--- /dev/null
+++ b/test/tim/prune/function/weather/SingleForecastTest.java
@@ -0,0 +1,52 @@
+package tim.prune.function.weather;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for weather icons
+ */
+class SingleForecastTest
+{
+
+ @Test
+ void testWeatherIcons()
+ {
+ testIconName(null, "100", "");
+ testIconName("storm.png", "200", null);
+ testIconName("storm.png", "204", "");
+ testIconName("lightrain.png", "300", null);
+ testIconName("lightrain.png", "301", null);
+ testIconName(null, "400", null);
+ testIconName("lightrain.png", "500", null);
+ testIconName("rain.png", "501", null);
+ testIconName("rain.png", "599", null);
+ testIconName("hail.png", "511", null);
+ testIconName("snow.png", "600", null);
+ testIconName("fog.png", "700", null);
+ testIconName("clear-day.png", "800", null);
+ testIconName("clear-day.png", "800", "");
+ testIconName("clear-day.png", "800", "01d");
+ testIconName("clear-night.png", "800", "01n");
+ testIconName("clouds-day.png", "802", "01d");
+ testIconName("clouds-night.png", "802", "01n");
+ testIconName("clouds.png", "804", "01n");
+ testIconName("extreme.png", "900", "01d");
+ testIconName("hail.png", "906", "01n");
+ }
+
+ /**
+ * Test getting an icon name according to code and image
+ */
+ private static void testIconName(String inExpect, String inCode, String inImage)
+ {
+ String icon = SingleForecast.getIconName(inCode, inImage);
+ assertEquals(inExpect, icon, showString(inCode) + ", " + showString(inImage));
+ }
+
+ private static String showString(String inString)
+ {
+ return inString == null ? "null" : inString;
+ }
+}
diff --git a/test/tim/prune/gui/map/MapSourceTest.java b/test/tim/prune/gui/map/MapSourceTest.java
new file mode 100644
index 0000000..ff947c3
--- /dev/null
+++ b/test/tim/prune/gui/map/MapSourceTest.java
@@ -0,0 +1,31 @@
+package tim.prune.gui.map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for manipulating base Urls
+ */
+class MapSourceTest
+{
+ @Test
+ void testFixBaseUrls()
+ {
+ // Should succeed
+ testUrlFix("8bitcities.s3.amazonaws.com", "http://8bitcities.s3.amazonaws.com/");
+ testUrlFix("8bitcities.s3.amazonaws.com/", "http://8bitcities.s3.amazonaws.com/");
+ testUrlFix("http://8bitcities.s3.amazonaws.com/", "http://8bitcities.s3.amazonaws.com/");
+ testUrlFix("something.com/ok", "http://something.com/ok/");
+
+ // These should fail and return null
+ testUrlFix("something/wrong", null);
+ testUrlFix("protocol://something.com/16/", null);
+ }
+
+ private void testUrlFix(String inStart, String inExpected)
+ {
+ String result = MapSource.fixBaseUrl(inStart);
+ assertEquals(inExpected, result);
+ }
+}
diff --git a/test/tim/prune/gui/map/SiteNameUtilsTest.java b/test/tim/prune/gui/map/SiteNameUtilsTest.java
new file mode 100644
index 0000000..e01ed52
--- /dev/null
+++ b/test/tim/prune/gui/map/SiteNameUtilsTest.java
@@ -0,0 +1,63 @@
+package tim.prune.gui.map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.HashSet;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for site name utils
+ */
+class SiteNameUtilsTest
+{
+
+ @Test
+ void testPickServerNameWithoutWildcards()
+ {
+ testPickSingleUrl("abc", "abc");
+ testPickSingleUrl("ab[]c", "abc");
+ testPickSingleUrl("[]abc", "abc");
+ testPickSingleUrl("abc[]", "abc");
+ }
+
+ /**
+ * Test a pattern without wildcards which should always produce the expected result
+ * @param inPattern pattern for site name
+ * @param inExpected expected resolved name
+ */
+ private void testPickSingleUrl(String inPattern, String inExpected)
+ {
+ for (int i=0; i<20; i++)
+ {
+ String resolved = SiteNameUtils.pickServerUrl(inPattern);
+ assertEquals(inExpected, resolved, "Failed: " + inPattern);
+ }
+ }
+
+ @Test
+ void testPickUsingWildcards()
+ {
+ testRandomPick("ab[123]c", new String[]{"ab1c", "ab2c", "ab3c"});
+ testRandomPick("1234.[abcd]", new String[]{"1234.a", "1234.b", "1234.c", "1234.d"});
+ }
+
+ /**
+ * Test a pattern with wildcards which should produce several different results randomly
+ * @param inPattern pattern for site name
+ * @param inExpected array of expected resolved names
+ */
+ private void testRandomPick(String inPattern, String[] inExpected)
+ {
+ HashSet results = new HashSet();
+ for (int i=0; i<30; i++)
+ {
+ results.add(SiteNameUtils.pickServerUrl(inPattern));
+ }
+ // Check that all expected results were returned
+ assertEquals(inExpected.length, results.size());
+ for (String expec : inExpected) {
+ assertTrue(results.contains(expec));
+ }
+ }
+}
diff --git a/test/tim/prune/jpeg/drew/RationalTest.java b/test/tim/prune/jpeg/drew/RationalTest.java
new file mode 100644
index 0000000..ae97e0f
--- /dev/null
+++ b/test/tim/prune/jpeg/drew/RationalTest.java
@@ -0,0 +1,71 @@
+package tim.prune.jpeg.drew;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * JUnit tests for the Rational values used by the Exif
+ */
+class RationalTest
+{
+ @Test
+ void testManyInts()
+ {
+ testIntVal(0, 0, 0);
+ testIntVal(1, 0, 0);
+ testIntVal(0, 1, 0);
+ for (int i=0; i<16000; i++)
+ {
+ testIntVal(0, i, 0);
+ testIntVal(i, 0, 0);
+ testIntVal(i, 1, i);
+ testIntVal(-i, 1, -i);
+ testIntVal(i*2, 2, i);
+ testIntVal(i*2+1, 2, i); // rounding down the 0.5
+ testIntVal(-i*2, 2, -i);
+ testIntVal(i*2, -2, -i);
+ testIntVal(-i*2, -2, i);
+ }
+ }
+
+ /**
+ * Check that a rational converts to an integer properly
+ * @param inTop number on top of the rational (numerator)
+ * @param inBottom number on bottom of the rational (denominator)
+ * @param inExpected expected int value
+ */
+ private void testIntVal(long inTop, long inBottom, int inExpected)
+ {
+ Rational value = new Rational(inTop, inBottom);
+ assertEquals(inExpected, value.intValue(), "" + inTop + "/" + inBottom);
+ }
+
+ @Test
+ void testManyDoubles()
+ {
+ for (int i=0; i<16000; i++)
+ {
+ testDoubleVal(0, i, 0.0);
+ testDoubleVal(i, 0, 0.0);
+ testDoubleVal(i, 1, i);
+ testDoubleVal(i*2, 2, i);
+ testDoubleVal(i*2+1, 2, i+0.5);
+ testDoubleVal(i*2, -2, -i);
+ }
+
+ testDoubleVal(123, 3, 123.0/3.0);
+ }
+
+ /**
+ * Check that a rational converts to a double properly
+ * @param inTop number on top of the rational (numerator)
+ * @param inBottom number on bottom of the rational (denominator)
+ * @param inExpected expected double value (exact)
+ */
+ private void testDoubleVal(long inTop, long inBottom, double inExpected)
+ {
+ Rational value = new Rational(inTop, inBottom);
+ assertEquals(inExpected, value.doubleValue(), 0.0, "" + inTop + "/" + inBottom);
+ }
+}
--
2.43.0