]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Version 20.1, December 2020
authoractivityworkshop <mail@activityworkshop.net>
Thu, 31 Dec 2020 15:49:40 +0000 (16:49 +0100)
committeractivityworkshop <mail@activityworkshop.net>
Thu, 31 Dec 2020 15:49:40 +0000 (16:49 +0100)
49 files changed:
.gitignore
src/tim/prune/FunctionLibrary.java
src/tim/prune/GpsPrune.java
src/tim/prune/config/Config.java
src/tim/prune/data/Field.java
src/tim/prune/function/AboutScreen.java
src/tim/prune/function/DiskCacheConfig.java
src/tim/prune/function/ShowFullDetails.java
src/tim/prune/function/settings/SaveConfig.java
src/tim/prune/function/settings/SetDisplaySettings.java
src/tim/prune/function/srtm/DownloadSrtmFunction.java [deleted file]
src/tim/prune/function/srtm/LookupSrtmFunction.java
src/tim/prune/function/srtm/SrtmTile.java
src/tim/prune/function/srtm/TileDownloader.java [new file with mode: 0644]
src/tim/prune/function/srtm/TileFinder.java
src/tim/prune/gui/DisplayUtils.java
src/tim/prune/gui/MenuManager.java
src/tim/prune/gui/images/wpicon_ring_l.png
src/tim/prune/gui/images/wpicon_ring_m.png
src/tim/prune/gui/map/CacheFailure.java [new file with mode: 0644]
src/tim/prune/gui/map/DiskTileCacher.java
src/tim/prune/gui/map/MapCanvas.java
src/tim/prune/gui/map/MapPosition.java
src/tim/prune/gui/map/MapTileManager.java
src/tim/prune/gui/map/TileConsumer.java
src/tim/prune/lang/prune-texts_af.properties
src/tim/prune/lang/prune-texts_cy.properties
src/tim/prune/lang/prune-texts_cz.properties
src/tim/prune/lang/prune-texts_de.properties
src/tim/prune/lang/prune-texts_de_CH.properties
src/tim/prune/lang/prune-texts_en.properties
src/tim/prune/lang/prune-texts_es.properties
src/tim/prune/lang/prune-texts_fi.properties
src/tim/prune/lang/prune-texts_fr.properties
src/tim/prune/lang/prune-texts_hu.properties
src/tim/prune/lang/prune-texts_it.properties
src/tim/prune/lang/prune-texts_nl.properties
src/tim/prune/lang/prune-texts_no.properties
src/tim/prune/lang/prune-texts_pl.properties
src/tim/prune/lang/prune-texts_pt.properties
src/tim/prune/lang/prune-texts_ro.properties
src/tim/prune/lang/prune-texts_ru.properties
src/tim/prune/lang/prune-texts_sv.properties
src/tim/prune/lang/prune-texts_uk.properties
src/tim/prune/lang/prune-texts_zh.properties
src/tim/prune/load/xml/GpxHandler.java
src/tim/prune/readme.txt
src/tim/prune/save/GpxExporter.java
src/tim/prune/save/MapGrouter.java

index 8e9e79486342529033b2eb09b83e85aab4dff345..a57e45f28ff0735e61249aa5a4ca8322d35b1db0 100644 (file)
@@ -1,2 +1,3 @@
 *.class
 *.jar
+/bin/
index 68303ed95946466daf23cf1adc5b15aa24f31786..a1cb9edc6addb71fb8505f50b7e65f04b28ae685 100644 (file)
@@ -59,7 +59,6 @@ import tim.prune.function.settings.SetMapBgFunction;
 import tim.prune.function.settings.SetPathsFunction;
 import tim.prune.function.sew.SewTrackSegmentsFunction;
 import tim.prune.function.sew.SplitSegmentsFunction;
-import tim.prune.function.srtm.DownloadSrtmFunction;
 import tim.prune.function.srtm.LookupSrtmFunction;
 import tim.prune.function.weather.GetWeatherForecastFunction;
 import tim.prune.load.AudioLoader;
@@ -102,7 +101,6 @@ public abstract class FunctionLibrary
        public static GenericFunction FUNCTION_DELETE_BY_DATE = null;
        public static SingleNumericParameterFunction FUNCTION_INTERPOLATE = null;
        public static GenericFunction FUNCTION_LOOKUP_SRTM = null;
-       public static GenericFunction FUNCTION_DOWNLOAD_SRTM = null;
        public static GenericFunction FUNCTION_NEARBY_WIKIPEDIA = null;
        public static GenericFunction FUNCTION_SEARCH_WIKIPEDIA = null;
        public static GenericFunction FUNCTION_SEARCH_OSMPOIS = null;
@@ -180,7 +178,6 @@ public abstract class FunctionLibrary
                FUNCTION_DELETE_BY_DATE = new DeleteByDateFunction(inApp);
                FUNCTION_INTERPOLATE = new InterpolateFunction(inApp);
                FUNCTION_LOOKUP_SRTM = new LookupSrtmFunction(inApp);
-               FUNCTION_DOWNLOAD_SRTM = new DownloadSrtmFunction(inApp);
                FUNCTION_NEARBY_WIKIPEDIA = new GetWikipediaFunction(inApp);
                FUNCTION_SEARCH_WIKIPEDIA = new SearchWikipediaNames(inApp);
                FUNCTION_SEARCH_OSMPOIS = new SearchOsmPoisFunction(inApp);
index 874ece5a7b7dce6314c5179525b516cf88e31e56..a7e0f49e5da016441c2caf494d4f1ac7917f708c 100644 (file)
@@ -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";
+       public static final String VERSION_NUMBER = "20.1";
        /** Build number, just used for about screen */
-       public static final String BUILD_NUMBER = "378";
+       public static final String BUILD_NUMBER = "382";
        /** Static reference to App object */
        private static App APP = null;
 
index 8c6eefec498706d0c789ad1ae3b4302a8e4022ac..a5226b37fe2f5cb272f683f975788b58928f167a 100644 (file)
@@ -109,6 +109,8 @@ public abstract class Config
        public static final String KEY_WAYPOINT_ICON_SIZE = "prune.waypointiconsize";
        /** Id of selected timezone */
        public static final String KEY_TIMEZONE_ID = "prune.timezoneid";
+       /** Last used latlon range */
+       public static final String KEY_LATLON_RANGE = "prune.latlonrange";
 
 
        /** Initialise the default properties */
@@ -194,14 +196,14 @@ public abstract class Config
                props.put(KEY_GPS_DEVICE, "usb:");
                props.put(KEY_GPS_FORMAT, "garmin");
                props.put(KEY_POVRAY_FONT, "crystal.ttf"); // alternative: DejaVuSans-Bold.ttf
-               props.put(KEY_SHOW_MAP, "0"); // hide by default
+               props.put(KEY_SHOW_MAP, "1"); // show by default
                props.put(KEY_EXIFTOOL_PATH, "exiftool");
                props.put(KEY_GNUPLOT_PATH, "gnuplot");
                props.put(KEY_GPSBABEL_PATH, "gpsbabel");
                props.put(KEY_IMPORT_FILE_FORMAT, "-1"); // no file format selected
                props.put(KEY_KMZ_IMAGE_SIZE, "240");
                props.put(KEY_ANTIALIAS, "1"); // antialias on by default
-               props.put(KEY_AUTOSAVE_SETTINGS, "0"); // autosave false by default
+               props.put(KEY_AUTOSAVE_SETTINGS, "1"); // autosave by default
                props.put(KEY_UNITSET_KEY, "unitset.kilometres"); // metric by default
                props.put(KEY_COORD_DISPLAY_FORMAT, "0"); // original
                props.put(KEY_HEIGHT_EXAGGERATION, "100"); // 100%, no exaggeration
index 7b9d77925c1f39fbd4a1d842d63539245fe93b5b..399d931b5397ddfe4ae43cbcbdbf0a5f33588cea 100644 (file)
@@ -18,6 +18,7 @@ public class Field
        public static final Field WAYPT_NAME = new Field("fieldname.waypointname", true);
        public static final Field WAYPT_TYPE = new Field("fieldname.waypointtype", true);
        public static final Field DESCRIPTION = new Field("fieldname.description", true);
+       public static final Field COMMENT = new Field("fieldname.comment", true);
        public static final Field NEW_SEGMENT = new Field("fieldname.newsegment", true);
 
        public static final Field SPEED          = new Field("fieldname.speed", true);
@@ -66,8 +67,9 @@ public class Field
         */
        public String getName()
        {
-               if (_labelKey != null)
+               if (_labelKey != null) {
                        return I18nManager.getText(_labelKey);
+               }
                return _customLabel;
        }
 
index 518b10e1568fbb29a2407f61cfee3682cf568b8f..c8044b431cffccac56ae91d5f51d73f8411ca32e 100644 (file)
@@ -196,7 +196,7 @@ public class AboutScreen extends GenericFunction
                        new JLabel(" Gy\u00F6rgy, HooAU, Sergey, P\u00E9ter, serhijdubyk, Peter, Cristian,"),
                        1, 6);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
-                       new JLabel(" Roman, Erkki"),
+                       new JLabel(" Roman, Erkki, Carlos, Tche333"),
                        1, 7);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel(I18nManager.getText("dialog.about.credits.translations") + " : "),
index 915bed1041bd6fdc7342c390ed70ab4575d4868c..2e2fa06d5f7e1f4a4ce08a40ecf26299232c76db 100644 (file)
@@ -9,6 +9,7 @@ import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.io.File;
 
+import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JDialog;
@@ -17,6 +18,7 @@ import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
+import javax.swing.border.EtchedBorder;
 
 import tim.prune.App;
 import tim.prune.DataSubscriber;
@@ -62,6 +64,9 @@ public class DiskCacheConfig extends GenericFunction
        private Component makeContents()
        {
                JPanel dialogPanel = new JPanel();
+               dialogPanel.setBorder(BorderFactory.createCompoundBorder(
+                       BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(4, 4, 4, 4))
+               );
                dialogPanel.setLayout(new BorderLayout(0, 5));
                // top panel
                JPanel topPanel = new JPanel();
index 8f8289e4e0eb38b9523dcd4a8fcdb7549e37fb76..8bba3d0cb65b3e8a53b4146e8ebbe4942467b987 100644 (file)
@@ -239,6 +239,8 @@ public class ShowFullDetails extends GenericFunction
 
                addTextPair(result, "fieldname.description", point.getFieldValue(Field.DESCRIPTION));
 
+               addTextPair(result, "fieldname.comment", point.getFieldValue(Field.COMMENT));
+
                addTextPair(result, "fieldname.waypointtype", point.getFieldValue(Field.WAYPT_TYPE));
 
                // Speed can come from either timestamps and distances, or speed values in data
index b737bd2671cb98d22efe0e63d0742dd15c682915..ca88174011ae7f028c57b71eee4f7cb1a1b134db 100644 (file)
@@ -11,6 +11,8 @@ import tim.prune.App;
 import tim.prune.GenericFunction;
 import tim.prune.I18nManager;
 import tim.prune.config.Config;
+import tim.prune.data.DoubleRange;
+import tim.prune.data.Track;
 
 /**
  * Class to provide the function to save the config settings
@@ -86,6 +88,12 @@ public class SaveConfig extends GenericFunction
                        + currBounds.width + "x" + currBounds.height;
                Config.setConfigString(Config.KEY_WINDOW_BOUNDS, windowBounds);
 
+               final String latlonString = createLatLonStringForConfig();
+               if (latlonString != null)
+               {
+                       Config.setConfigString(Config.KEY_LATLON_RANGE, latlonString);
+               }
+
                FileOutputStream outStream = null;
                try
                {
@@ -103,4 +111,30 @@ public class SaveConfig extends GenericFunction
                // Remember where it was saved to
                Config.setConfigFile(inSaveFile);
        }
+
+       /**
+        * @return semicolon-separated string containing the four values, or null
+        */
+       private String createLatLonStringForConfig()
+       {
+               Track track = _app.getTrackInfo().getTrack();
+               if (track.getNumPoints() >= 2)
+               {
+                       final DoubleRange latRange = track.getLatRange();
+                       final DoubleRange lonRange = track.getLonRange();
+                       if (latRange.getRange() > 0.0 && lonRange.getRange() > 0.0)
+                       {
+                               StringBuffer buffer = new StringBuffer();
+                               buffer.append(Double.toString(latRange.getMinimum()));
+                               buffer.append(';');
+                               buffer.append(Double.toString(latRange.getMaximum()));
+                               buffer.append(';');
+                               buffer.append(Double.toString(lonRange.getMinimum()));
+                               buffer.append(';');
+                               buffer.append(Double.toString(lonRange.getMaximum()));
+                               return buffer.toString();
+                       }
+               }
+               return null;
+       }
 }
index fd15a5097399cacd20ff8640954746889c045504..0a9efd985cd7734b54a8599d0f28ddb57d4e3e57 100644 (file)
@@ -97,6 +97,7 @@ public class SetDisplaySettings extends GenericFunction
        private JButton _okButton = null;
 
        private static final String STYLEKEY_NIMBUS = "javax.swing.plaf.nimbus.NimbusLookAndFeel";
+       private static final String STYLEKEY_GTK = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
 
 
        /**
@@ -188,14 +189,17 @@ public class SetDisplaySettings extends GenericFunction
                windowStylePanel.add(new JLabel(I18nManager.getText("dialog.displaysettings.windowstyle")));
                windowStylePanel.add(Box.createHorizontalStrut(10));
                ButtonGroup styleGroup = new ButtonGroup();
-               final String[] styleKeys = {"default", "nimbus"};
-               _windowStyleRadios = new JRadioButton[2];
-               for (int i=0; i<2; i++)
+               final String[] styleKeys = {"default", "nimbus", "gtk"};
+               _windowStyleRadios = new JRadioButton[3];
+               for (int i=0; i<3; i++)
                {
                        _windowStyleRadios[i] = new JRadioButton(
                                I18nManager.getText("dialog.displaysettings.windowstyle." + styleKeys[i]));
                        styleGroup.add(_windowStyleRadios[i]);
-                       windowStylePanel.add(_windowStyleRadios[i]);
+                       if (i != 2 || platformHasPlaf(STYLEKEY_GTK))
+                       {
+                               windowStylePanel.add(_windowStyleRadios[i]);
+                       }
                }
                midPanel.add(windowStylePanel);
                mainPanel.add(midPanel, BorderLayout.CENTER);
@@ -223,6 +227,19 @@ public class SetDisplaySettings extends GenericFunction
                return mainPanel;
        }
 
+       /**
+        * @return true if the specified style name is available on this platform
+        */
+       private static boolean platformHasPlaf(String styleName)
+       {
+               for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
+               {
+                       if (info.getClassName().equals(styleName)) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 
        /**
         * Show window
@@ -274,6 +291,10 @@ public class SetDisplaySettings extends GenericFunction
                {
                        selectedRadio = 1;
                }
+               else if (inValue != null && inValue.equals(STYLEKEY_GTK) && _windowStyleRadios[2] != null)
+               {
+                       selectedRadio = 2;
+               }
                _windowStyleRadios[selectedRadio].setSelected(true);
        }
 
@@ -292,6 +313,20 @@ public class SetDisplaySettings extends GenericFunction
                return 1; // default is medium
        }
 
+       /**
+        * @return the style string according to the selected radio button
+        */
+       private String getSelectedStyleString()
+       {
+               if (_windowStyleRadios[1].isSelected()) {
+                       return STYLEKEY_NIMBUS;
+               }
+               if (_windowStyleRadios[2] != null && _windowStyleRadios[2].isSelected()) {
+                       return STYLEKEY_GTK;
+               }
+               return null;
+       }
+
        /**
         * Save settings and close
         */
@@ -304,8 +339,7 @@ public class SetDisplaySettings extends GenericFunction
                Config.setConfigBoolean(Config.KEY_ANTIALIAS, _antialiasCheckbox.isSelected());
                Config.setConfigInt(Config.KEY_WAYPOINT_ICONS, _wpIconCombobox.getSelectedIndex());
                Config.setConfigInt(Config.KEY_WAYPOINT_ICON_SIZE, getSelectedIconSize());
-               final String styleString = (_windowStyleRadios[1].isSelected() ? STYLEKEY_NIMBUS : null);
-               Config.setConfigString(Config.KEY_WINDOW_STYLE, styleString);
+               Config.setConfigString(Config.KEY_WINDOW_STYLE, getSelectedStyleString());
                // refresh display
                UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED);
                _dialog.dispose();
diff --git a/src/tim/prune/function/srtm/DownloadSrtmFunction.java b/src/tim/prune/function/srtm/DownloadSrtmFunction.java
deleted file mode 100644 (file)
index 0350ce3..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-package tim.prune.function.srtm;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-
-import javax.swing.JOptionPane;
-
-import tim.prune.App;
-import tim.prune.GenericFunction;
-import tim.prune.GpsPrune;
-import tim.prune.I18nManager;
-import tim.prune.config.Config;
-import tim.prune.data.DoubleRange;
-import tim.prune.gui.ProgressDialog;
-
-/**
- * Class to provide a download function for the Space Shuttle's SRTM data files.
- * HGT files are downloaded into memory via HTTP and stored in the map cache.
- */
-public class DownloadSrtmFunction extends GenericFunction implements Runnable
-{
-       /** Progress dialog */
-       private ProgressDialog _progress = null;
-       /** Flag to check whether this function is currently running or not */
-       private boolean _running = false;
-
-
-       /**
-        * Constructor
-        * @param inApp  App object
-        */
-       public DownloadSrtmFunction(App inApp) {
-               super(inApp);
-       }
-
-       /** @return name key */
-       public String getNameKey() {
-               return "function.downloadsrtm";
-       }
-
-       /**
-        * Begin the download
-        */
-       public void begin()
-       {
-               _running = true;
-               if (_progress == null) {
-                       _progress = new ProgressDialog(_parentFrame, getNameKey());
-               }
-               _progress.show();
-               // start new thread for time-consuming part
-               new Thread(this).start();
-       }
-
-       /**
-        * Run method using separate thread
-        */
-       public void run()
-       {
-               // Compile list of tiles to get
-               ArrayList<SrtmTile> tileList = new ArrayList<SrtmTile>();
-
-               // First, loop to see which tiles are needed
-               DoubleRange lonRange = _app.getTrackInfo().getTrack().getLonRange();
-               DoubleRange latRange = _app.getTrackInfo().getTrack().getLatRange();
-               final int minLon = (int) Math.floor(lonRange.getMinimum());
-               final int maxLon = (int) Math.floor(lonRange.getMaximum());
-               final int minLat = (int) Math.floor(latRange.getMinimum());
-               final int maxLat = (int) Math.floor(latRange.getMaximum());
-
-               for (int lon=minLon; lon<= maxLon; lon++)
-               {
-                       for (int lat=minLat; lat <= maxLat; lat++)
-                       {
-                               SrtmTile tile = new SrtmTile(lat, lon);
-                               boolean alreadyGot = false;
-                               for (int t = 0; t < tileList.size(); t++)
-                               {
-                                       if (tileList.get(t).equals(tile)) {
-                                               alreadyGot = true;
-                                       }
-                               }
-                               if (!alreadyGot) {tileList.add(tile);}
-                       }
-               }
-
-               downloadTiles(tileList);
-               // Finished
-               _running = false;
-       }
-
-
-       /**
-        * Download the tiles of SRTM data
-        * @param inTileList list of tiles to get
-        */
-       private void downloadTiles(ArrayList<SrtmTile> inTileList)
-       {
-               // Update progress bar
-               if (_progress != null)
-               {
-                       _progress.setMaximum(inTileList.size());
-                       _progress.setValue(0);
-               }
-
-               String errorMessage = null;
-
-               // Check the cache is ok
-               final String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE);
-               if (diskCachePath != null)
-               {
-                       File srtmDir = new File(diskCachePath, "srtm");
-                       if (!srtmDir.exists() && !srtmDir.mkdir()) {
-                               // can't create the srtm directory
-                               errorMessage = I18nManager.getText("error.downloadsrtm.nocache");
-                       }
-               }
-               else {
-                       // no cache set up
-                       errorMessage = I18nManager.getText("error.downloadsrtm.nocache");
-               }
-
-               // Get urls for each tile
-               URL[] urls = TileFinder.getUrls(inTileList);
-               int numDownloaded = 0;
-               for (int t=0; t<inTileList.size() && !_progress.isCancelled(); t++)
-               {
-                       if (urls[t] != null)
-                       {
-                               // Define streams
-                               FileOutputStream outStream = null;
-                               InputStream inStream = null;
-                               try
-                               {
-                                       // Set progress
-                                       _progress.setValue(t);
-                                       // See if we've already got this tile or not
-                                       File outputFile = getFileToWrite(urls[t]);
-                                       if (outputFile != null)
-                                       {
-                                               // System.out.println("Download: Need to download: " + urls[t]);
-                                               outStream = new FileOutputStream(outputFile);
-                                               URLConnection conn = urls[t].openConnection();
-                                               conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER);
-                                               inStream = conn.getInputStream();
-                                               // Copy all the bytes to the file
-                                               int c;
-                                               while ((c = inStream.read()) != -1)
-                                               {
-                                                       outStream.write(c);
-                                               }
-
-                                               numDownloaded++;
-                                       }
-                                       // else System.out.println("Don't need to download: " + urls[t].getFile());
-                               }
-                               catch (IOException ioe) {errorMessage = ioe.getClass().getName() + " - " + ioe.getMessage();
-                               }
-                               // Make sure streams are closed
-                               try {inStream.close();} catch (Exception e) {}
-                               try {outStream.close();} catch (Exception e) {}
-                       }
-               }
-
-               _progress.dispose();
-               if (_progress.isCancelled()) {
-                       return;
-               }
-
-               if (errorMessage != null) {
-                       _app.showErrorMessageNoLookup(getNameKey(), errorMessage);
-               }
-               else if (numDownloaded == 1)
-               {
-                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getTextWithNumber("confirm.downloadsrtm.1", numDownloaded),
-                               I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE);
-               }
-               else if (numDownloaded > 1)
-               {
-                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getTextWithNumber("confirm.downloadsrtm", numDownloaded),
-                               I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE);
-               }
-               else if (inTileList.size() > 0) {
-                       _app.showErrorMessage(getNameKey(), "confirm.downloadsrtm.none");
-               }
-       }
-
-       /**
-        * See whether the SRTM file is already available locally
-        * @param inUrl URL for online resource
-        * @return file object to write to, or null if already there
-        */
-       private static File getFileToWrite(URL inUrl)
-       {
-               String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE);
-               if (diskCachePath != null)
-               {
-                       File srtmDir = new File(diskCachePath, "srtm");
-                       if (srtmDir.exists() && srtmDir.isDirectory() && srtmDir.canRead())
-                       {
-                               File srtmFile = new File(srtmDir, new File(inUrl.getFile()).getName());
-                               if (!srtmFile.exists() || !srtmFile.canRead() || srtmFile.length() <= 400) {
-                                       return srtmFile;
-                               }
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * @return true if a thread is currently running
-        */
-       public boolean isRunning()
-       {
-               return _running;
-       }
-}
index c48af016b889f0df84a094de2df84db0db0ef272..c5986dba48710517b5432d8a9776370764857ac5 100644 (file)
@@ -4,7 +4,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URL;
-import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -40,6 +40,8 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
        private boolean _normalTrack = true;
        /** Flag set when any tiles had to be downloaded (rather than just loaded locally) */
        private boolean _hadToDownload = false;
+       /** Count the number of tiles downloaded and cached */
+       private int _numCached = 0;
        /** Flag to check whether this function is currently running or not */
        private boolean _running = false;
 
@@ -100,8 +102,6 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
         */
        public void run()
        {
-               // Compile list of tiles to get
-               ArrayList<SrtmTile> tileList = new ArrayList<SrtmTile>();
                boolean hasZeroAltitudePoints = false;
                boolean hasNonZeroAltitudePoints = false;
                // First, loop to see what kind of points we have
@@ -128,64 +128,63 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
                }
 
                // Now loop again to extract the required tiles
+               HashSet<SrtmTile> tileSet = new HashSet<SrtmTile>();
                for (int i = 0; i < _track.getNumPoints(); i++)
                {
                        // Consider points which don't have altitudes or have zero values
                        if (!_track.getPoint(i).hasAltitude()
                                || (overwriteZeros && _track.getPoint(i).getAltitude().getValue() == 0))
                        {
-                               SrtmTile tile = new SrtmTile(_track.getPoint(i));
-                               boolean alreadyGot = false;
-                               for (int t = 0; t < tileList.size(); t++)
-                               {
-                                       if (tileList.get(t).equals(tile)) {
-                                               alreadyGot = true;
-                                       }
-                               }
-                               if (!alreadyGot) {tileList.add(tile);}
+                               tileSet.add(new SrtmTile(_track.getPoint(i)));
                        }
                }
-               lookupValues(tileList, overwriteZeros);
+               lookupValues(tileSet, overwriteZeros);
                // Finished
                _running = false;
                // Show tip if lots of online lookups were necessary
                if (_hadToDownload) {
                        _app.showTip(TipManager.Tip_DownloadSrtm);
                }
+               else if (_numCached > 0) {
+                       showConfirmMessage(_numCached);
+               }
        }
 
 
        /**
         * Lookup the values from SRTM data
-        * @param inTileList list of tiles to get
+        * @param inTileSet set of tiles to get
         * @param inOverwriteZeros true to overwrite zero altitude values
         */
-       private void lookupValues(ArrayList<SrtmTile> inTileList, boolean inOverwriteZeros)
+       private void lookupValues(HashSet<SrtmTile> inTileSet, boolean inOverwriteZeros)
        {
                UndoLookupSrtm undo = new UndoLookupSrtm(_app.getTrackInfo());
                int numAltitudesFound = 0;
+               TileFinder tileFinder = new TileFinder();
+               String errorMessage = null;
+               final int numTiles = inTileSet.size();
+
                // Update progress bar
                if (_progress != null)
                {
-                       _progress.setMaximum(inTileList.size());
+                       _progress.setMaximum(numTiles);
                        _progress.setValue(0);
                }
-               String errorMessage = null;
-               // Get urls for each tile
-               URL[] urls = TileFinder.getUrls(inTileList);
-               for (int t=0; t<inTileList.size() && !_progress.isCancelled() && urls != null; t++)
+               int currentTileIndex = 0;
+               _numCached = 0;
+               for (SrtmTile tile : inTileSet)
                {
-                       if (urls[t] != null)
+                       URL url = tileFinder.getUrl(tile);
+                       if (url != null)
                        {
-                               SrtmTile tile = inTileList.get(t);
                                try
                                {
                                        // Set progress
-                                       _progress.setValue(t);
+                                       _progress.setValue(currentTileIndex++);
                                        final int ARRLENGTH = 1201 * 1201;
                                        int[] heights = new int[ARRLENGTH];
                                        // Open zipinputstream on url and check size
-                                       ZipInputStream inStream = getStreamToHgtFile(urls[t]);
+                                       ZipInputStream inStream = getStreamToSrtmData(url);
                                        boolean entryOk = false;
                                        if (inStream != null)
                                        {
@@ -238,7 +237,7 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
                else if (errorMessage != null) {
                        _app.showErrorMessageNoLookup(getNameKey(), errorMessage);
                }
-               else if (inTileList.size() > 0) {
+               else if (numTiles > 0) {
                        _app.showErrorMessage(getNameKey(), "error.lookupsrtm.nonefound");
                }
                else {
@@ -251,7 +250,45 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
         * @param inUrl URL for online resource
         * @return ZipInputStream either on the local file or on the downloaded zip file
         */
-       private ZipInputStream getStreamToHgtFile(URL inUrl)
+       private ZipInputStream getStreamToSrtmData(URL inUrl)
+       throws IOException
+       {
+               ZipInputStream localData = null;
+               try {
+                       localData = getStreamToLocalHgtFile(inUrl);
+               }
+               catch (IOException ioe) {
+                       localData = null;
+               }
+               if (localData != null)
+               {
+                       return localData;
+               }
+               // try to download to cache
+               TileDownloader cacher = new TileDownloader();
+               TileDownloader.Result result = cacher.downloadTile(inUrl);
+               System.out.println("Result: " + result);
+               if (result == TileDownloader.Result.DOWNLOADED)
+               {
+                       _numCached++;
+                       return getStreamToLocalHgtFile(inUrl);
+               }
+               // If we don't have a cache, we may be able to download it temporarily
+               if (result != TileDownloader.Result.DOWNLOAD_FAILED)
+               {
+                       _hadToDownload = true;
+                       return new ZipInputStream(inUrl.openStream());
+               }
+               // everything failed
+               return null;
+       }
+
+       /**
+        * Get the SRTM file from the local cache, if available
+        * @param inUrl URL for online resource
+        * @return ZipInputStream on the local file or null if not there
+        */
+       private ZipInputStream getStreamToLocalHgtFile(URL inUrl)
        throws IOException
        {
                String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE);
@@ -270,10 +307,7 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
                                }
                        }
                }
-               // System.out.println("Lookup: Trying online: " + inUrl.toString());
-               _hadToDownload = true;
-               // MAYBE: Only download if we're in online mode?
-               return new ZipInputStream(inUrl.openStream());
+               return null;
        }
 
        /**
@@ -399,4 +433,18 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
        {
                return _running;
        }
+
+       private void showConfirmMessage(int numDownloaded)
+       {
+               if (numDownloaded == 1)
+               {
+                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getTextWithNumber("confirm.downloadsrtm.1", numDownloaded),
+                               I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE);
+               }
+               else if (numDownloaded > 1)
+               {
+                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getTextWithNumber("confirm.downloadsrtm", numDownloaded),
+                               I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE);
+               }
+       }
 }
index 301bbaf2ccb7849f1378a6f910999c188965a12a..058132c9470b9721f82b058f822d4ab602f99020 100644 (file)
@@ -36,14 +36,25 @@ public class SrtmTile
                _longitude = inLongitude;
        }
 
+       @Override
+       public int hashCode()
+       {
+               return _latitude * 1000 + _longitude;
+       }
+
        /**
         * Check for equality
         * @param inOther other tile object
         * @return true if both represent same tile
         */
-       public boolean equals(SrtmTile inOther)
+       @Override
+       public boolean equals(Object inOther)
        {
-               return (_latitude == inOther._latitude) && (_longitude == inOther._longitude);
+               if (inOther == null || inOther.getClass() != getClass()) {
+                       return false;
+               }
+               SrtmTile otherTile = (SrtmTile) inOther;
+               return (_latitude == otherTile._latitude) && (_longitude == otherTile._longitude);
        }
 
        /** @return latitude as int */
diff --git a/src/tim/prune/function/srtm/TileDownloader.java b/src/tim/prune/function/srtm/TileDownloader.java
new file mode 100644 (file)
index 0000000..831d4dd
--- /dev/null
@@ -0,0 +1,107 @@
+package tim.prune.function.srtm;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+import tim.prune.GpsPrune;
+import tim.prune.config.Config;
+
+/**
+ * Class to provide a download function for the Space Shuttle's SRTM data files.
+ * HGT files are downloaded into memory via HTTP and stored in the map cache.
+ */
+public class TileDownloader
+{
+       /** Possible results of the download */
+       public enum Result {DOWNLOADED, NOTHING_TO_DO, DOWNLOAD_FAILED, CACHE_FAILED};
+
+       /**
+        * Download a single tile of SRTM data
+        * @param inUrl remote URL to get
+        */
+       public Result downloadTile(URL inUrl)
+       {
+               if (inUrl == null) {
+                       return Result.NOTHING_TO_DO;
+               }
+
+               // Check the cache is ok
+               final String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE);
+               if (diskCachePath != null)
+               {
+                       File srtmDir = new File(diskCachePath, "srtm");
+                       if (srtmDir.exists() && !srtmDir.isDirectory()) {
+                               // exists but isn't a directory - can't be used
+                               return Result.CACHE_FAILED;
+                       }
+                       if (!srtmDir.exists() && !srtmDir.mkdir()) {
+                               // can't create the srtm directory
+                               return Result.CACHE_FAILED;
+                       }
+               }
+               else {
+                       // no cache set up
+                       return Result.CACHE_FAILED;
+               }
+
+               // Define streams
+               FileOutputStream outStream = null;
+               InputStream inStream = null;
+               Result result = Result.NOTHING_TO_DO;
+               try
+               {
+                       // See if we've already got this tile or not
+                       File outputFile = getFileToWrite(inUrl);
+                       if (outputFile != null)
+                       {
+                               System.out.println("Download: Need to download: " + inUrl);
+                               outStream = new FileOutputStream(outputFile);
+                               URLConnection conn = inUrl.openConnection();
+                               conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER);
+                               inStream = conn.getInputStream();
+                               // Copy all the bytes to the file
+                               int c;
+                               while ((c = inStream.read()) != -1)
+                               {
+                                       outStream.write(c);
+                               }
+                               result = Result.DOWNLOADED;
+                       }
+               }
+               catch (IOException ioe) {
+                       System.err.println(ioe.getClass().getName() + " - " + ioe.getMessage());
+                       result = Result.DOWNLOAD_FAILED;
+               }
+               // Make sure streams are closed
+               try {inStream.close();} catch (Exception e) {}
+               try {outStream.close();} catch (Exception e) {}
+
+               return result;
+       }
+
+       /**
+        * See whether the SRTM file is already available locally
+        * @param inUrl URL for online resource
+        * @return file object to write to, or null if already there
+        */
+       private static File getFileToWrite(URL inUrl)
+       {
+               String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE);
+               if (diskCachePath != null)
+               {
+                       File srtmDir = new File(diskCachePath, "srtm");
+                       if (srtmDir.exists() && srtmDir.isDirectory() && srtmDir.canRead())
+                       {
+                               File srtmFile = new File(srtmDir, new File(inUrl.getFile()).getName());
+                               if (!srtmFile.exists() || !srtmFile.canRead() || srtmFile.length() <= 400) {
+                                       return srtmFile;
+                               }
+                       }
+               }
+               return null;
+       }
+}
index 5ada68ca1b65e5428c3d6f961db1086e6b8086db..e2b01fa166dbd9b607f9e13890f0a12a7f5b7302 100644 (file)
@@ -3,15 +3,17 @@ package tim.prune.function.srtm;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
 
 
 /**
  * Class to get the URLs of the SRTM tiles
  * using the srtmtiles.dat file
  */
-public abstract class TileFinder
+public class TileFinder
 {
+       /** tile data loaded from file */
+       private byte[] _tileData = null;
+
        /** URL prefix for all tiles */
        private static final String URL_PREFIX = "https://dds.cr.usgs.gov/srtm/version2_1/SRTM3/";
        /** Directory names for each continent */
@@ -24,33 +26,33 @@ public abstract class TileFinder
         * @param inTiles list of Tiles to get
         * @return array of URLs
         */
-       public static URL[] getUrls(ArrayList<SrtmTile> inTiles)
+       public URL getUrl(SrtmTile inTile)
        {
-               if (inTiles == null || inTiles.size() < 1) {return null;}
-               URL[] urls = new URL[inTiles.size()];
-               // Read dat file into array
-               byte[] lookup = readDatFile();
-               if (lookup == null)
-               {
-                       System.err.println("Build error: resource srtmtiles.dat missing!");
-                       return null;
-               }
-               for (int t=0; t<inTiles.size(); t++)
+               if (inTile == null) {return null;}
+               if (_tileData == null)
                {
-                       SrtmTile tile = inTiles.get(t);
-                       // Get byte from lookup array
-                       int idx = (tile.getLatitude() + 59)*360 + (tile.getLongitude() + 180);
-                       try
+                       _tileData = readDatFile();
+                       if (_tileData == null)
                        {
-                               int dir = lookup[idx];
-                               if (dir > 0) {
-                                       try {
-                                               urls[t] = new URL(URL_PREFIX + CONTINENTS[dir] + "/" + tile.getTileName());
-                                       } catch (MalformedURLException e) {} // ignore error, url stays null
-                               }
-                       } catch (ArrayIndexOutOfBoundsException e) {} // ignore error, url stays null
+                               System.err.println("Build error: resource srtmtiles.dat missing!");
+                               return null;
+                       }
                }
-               return urls;
+
+               URL url = null;
+               // Get byte from lookup array
+               int idx = (inTile.getLatitude() + 59)*360 + (inTile.getLongitude() + 180);
+               try
+               {
+                       int dir = _tileData[idx];
+                       if (dir > 0) {
+                               try {
+                                       url = new URL(URL_PREFIX + CONTINENTS[dir] + "/" + inTile.getTileName());
+                               } catch (MalformedURLException e) {} // ignore error, url stays null
+                       }
+               } catch (ArrayIndexOutOfBoundsException e) {} // ignore error, url stays null
+
+               return url;
        }
 
        /**
index 25640d8e5072bfc2e70acfc3e26c7de208a494e3..2300296760fa1febfeb8f2dc59d393ca35bb639a 100644 (file)
@@ -36,7 +36,8 @@ public abstract class DisplayUtils
                if (inNumSecs < 86400L) return "" + (inNumSecs / 60 / 60) + I18nManager.getText("display.range.time.hours")
                        + " " + ((inNumSecs / 60) % 60) + I18nManager.getText("display.range.time.mins");
                if (inNumSecs < 432000L) return "" + (inNumSecs / 86400L) + I18nManager.getText("display.range.time.days")
-                       + " " + (inNumSecs / 60 / 60) % 24 + I18nManager.getText("display.range.time.hours");
+                       + " " + (inNumSecs / 60 / 60) % 24 + I18nManager.getText("display.range.time.hours")
+                       + " " + ((inNumSecs / 60) % 60) + I18nManager.getText("display.range.time.mins");
                if (inNumSecs < 86400000L) return "" + (inNumSecs / 86400L) + I18nManager.getText("display.range.time.days");
                return "big";
        }
index d289b7828fca0086eacf58a6ce74275b1471c786..d87f459851fe62f3906c508a374fad6438e10c73 100644 (file)
@@ -96,7 +96,6 @@ public class MenuManager implements DataSubscriber
        private JMenuItem _routingGraphHopperItem = null;
        private JMenuItem _chartItem = null;
        private JMenuItem _lookupSrtmItem = null;
-       private JMenuItem _downloadSrtmItem = null;
        private JMenuItem _nearbyWikipediaItem = null;
        private JMenuItem _nearbyOsmPoiItem = null;
        private JMenuItem _showPeakfinderItem = null;
@@ -260,8 +259,6 @@ public class MenuManager implements DataSubscriber
                // SRTM
                _lookupSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_LOOKUP_SRTM, false);
                onlineMenu.add(_lookupSrtmItem);
-               _downloadSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_DOWNLOAD_SRTM, false);
-               onlineMenu.add(_downloadSrtmItem);
 
                onlineMenu.addSeparator();
                // browser submenu
@@ -894,8 +891,6 @@ public class MenuManager implements DataSubscriber
                _downloadOsmItem.setEnabled(hasData);
                _getWeatherItem.setEnabled(hasData);
                _findWaypointItem.setEnabled(hasData && _track.hasWaypoints());
-               // have we got a cache?
-               _downloadSrtmItem.setEnabled(hasData && Config.getConfigString(Config.KEY_DISK_CACHE) != null);
                // have we got any timestamps?
                _deleteByDateItem.setEnabled(hasData && _track.hasData(Field.TIMESTAMP));
 
@@ -1003,6 +998,7 @@ public class MenuManager implements DataSubscriber
                        }
                        else
                        {
+                               rfl.verifyAll();
                                // Rebuild menus
                                _recentFileMenu.removeAll();
                                for (int i=0; i<rfl.getSize(); i++)
index 66b190d576a491b8f4d94a908bdd179490de4bc7..c26d5842c33b5fa3fe39c4f109437c56b85fde13 100644 (file)
Binary files a/src/tim/prune/gui/images/wpicon_ring_l.png and b/src/tim/prune/gui/images/wpicon_ring_l.png differ
index 3ae352b757942ac9f3b5187cdb875f55d0ef4f3e..9e7f1713c3ec8a235432115f5deb6cc596fcea2c 100644 (file)
Binary files a/src/tim/prune/gui/images/wpicon_ring_m.png and b/src/tim/prune/gui/images/wpicon_ring_m.png differ
diff --git a/src/tim/prune/gui/map/CacheFailure.java b/src/tim/prune/gui/map/CacheFailure.java
new file mode 100644 (file)
index 0000000..6f9ac28
--- /dev/null
@@ -0,0 +1,8 @@
+package tim.prune.gui.map;
+
+/**
+ * Exception thrown to indicate a failure to cache map tiles
+ */
+public class CacheFailure extends Exception
+{
+}
index 875fcc3b7feb5d0bbad49f55774ba257369f0451..9be7841372299894abd9a26ca85ea149ee9ad8fa 100644 (file)
@@ -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();
                        }
                }
 
index d305d1c4f7bd3b9dae59066bf4f32423b9426c39..a469e99d014c4254d3c5529402589baa58ab05df 100644 (file)
@@ -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();
        }
index 25f05fc1a2a238370d8888ea4b807b7d3f5f8adb..a62d7821c6b1d54db906b73949449b4ef26a39a2 100644 (file)
@@ -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;
+       }
 }
index 8c2c6eed9e3f7e70ccf251ba91e01ebe4f550be9..03b364aa66ca919fe4557ae75c19fee495cf3e91 100644 (file)
@@ -210,6 +210,9 @@ public class MapTileManager implements ImageObserver
                                }
                        }
                        catch (MalformedURLException urle) {} // ignore
+                       catch (CacheFailure cf) {
+                               _consumer.reportCacheFailure();
+                       }
                }
                return tileImage;
        }
index 35a557e5556bf5582f88971bfe911276f660dc84..a2de40a78bce3d62c2e143f33ff0d92b4fdae901 100644 (file)
@@ -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();
 }
index e12df2c1362834ccc79a69df9248012ca3631d67..03acf63bb8c824f19c88b3f2d5e7deeceae6d480 100644 (file)
@@ -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
index 1c2d752c63184c65f1202bd4321aebfce7d36407..50ef3a20e82baca7c89da57e4b9b2baf99b11688 100644 (file)
@@ -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
-
index 4d4b5c01fb0e74c9023d148d9ccff7d8226f3cbb..96956d9927deb5d18e4e1296c5c2f6762004d4c8 100644 (file)
@@ -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.
 
index d1f6976ac07aa891535aa05092754c87984d2d4e..ffc031dccb29d1eec26f56d75de872fd9a845972 100644 (file)
@@ -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.
 
index e2172ee69f5b430879f3298ef20a39553ff2d75c..555390e08ea5d6d4d161b88ff7d977146fb6373b 100644 (file)
@@ -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.
 
index dbc4be4a59d3cff49a9dbea409a07beab1dca1cc..ad0d8db8e14083b34d5f49754b007e3b5e530460 100644 (file)
@@ -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.
 
index e4676f684a2c61730722ab78fbdd5a6418a22dd8..6d6b76ed4e65242a778060e5f071a491a8234f6b 100644 (file)
@@ -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
index 8b54aa65bc4c0993229655f5c790446b4344042c..226a84b7a9ad9ae819177a2ee2d073d627f5d711 100644 (file)
@@ -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.
 
index 9c0f85a460b5bbf533012c907d1873402546a107..26981e4d01055efd691d752f3b317fcc41a58578 100644 (file)
@@ -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.<br>La copie, la redistribution et la modification sont autoris\u00e9es et encourag\u00e9es<br>selon les conditions d\u00e9taill\u00e9es dans le fichier <code>license.txt</code> inclus.
 dialog.about.summarytext3=Consultez la page <code style="font-weight:bold">https://activityworkshop.net/</code> 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
index 021db5302dc8cbe002440f74130370f422bc36f5..82398652143e853cf526ce5fd8f707e9cca556f7 100644 (file)
@@ -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
index bc5a7b33defb0108ce424cfc9a49316c5c1a9ab3..2e7b3aa860bea6ead5aff3ea9f3743dd7ec89c6b 100644 (file)
@@ -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
 
index cde8d6ea4b1cdd2baabe5b0da649efc66cc3ea01..c757ccf44d3fcad74f61adc11cf2a174a8fdb9cb 100644 (file)
@@ -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.
 
index 86aac6f28ef8c8d947bf635d7cea8b6489c2aa12..b83cc0c7fc985050869ee77e2bdbc746b80b5395 100644 (file)
@@ -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
index d3b72e775c26c25fc7be63b65ee4dbca76040b25..75bfc804d42f85ecff6cb508491c50a30d894364 100644 (file)
@@ -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
index fd785bf94773d6d04666b76b873a7ba8c32b8544..55f60fa11d86d3ea1368d5d193d43765bfafb7cb 100644 (file)
@@ -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.
 
index 70ceab6c9ff2df677bbb34a6b93b21a50998095b..e3a5610410c74c72104902c01ae485f7533c14b3 100644 (file)
@@ -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
index 6f99f0f952aa669053c1ca4c981bdb557f6a3a6d..b1fe18064303b417686f4040b450765eada2384f 100644 (file)
@@ -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.
 
index e2115aac56fdf23fb4d013d0dd92bd8432c277c8..f7ed52e8efd26e06cdf6489373d20ebd64e531b0 100644 (file)
@@ -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.<br>Kopiering, \u00e5terutgivning och modifieringar \u00e4r till\u00e5tna och uppmuntras<br>enligt villkoren i den inkluderade filen <code>license.txt</code>.
+dialog.about.summarytext3=Bes\u00f6k <code style="font-weight:bold">https://activityworkshop.net/</code> f\u00f6r mer information och tips, inklusive<br>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=<table><tr><td>Piltangenter</td><td>Panorera kartan \u00e5t v\u00e4nster, h\u00f6ger, upp, ner</td></tr><tr><td>Ctrl + v\u00e4nster, h\u00f6ger piltangent</td><td>Markera f\u00f6reg\u00e5ende eller n\u00e4sta punkt</td></tr><tr><td>Ctrl + pil upp, pil ner</td><td>Zooma in eller ut</td></tr><tr><td>Ctrl + PgUp, PgDown</td><td>Markera f\u00f6reg\u00e5ende, n\u00e4sta segment</td></tr><tr><td>Ctrl + Home, End</td><td>Markera f\u00f6rsta, sista punkt</td></tr><tr><td>Del</td><td>Radera markerad punkt</td></tr></table>
+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\u00e5ken<p>eller v\u00e4lja att anv\u00e4nda en text-fil ist\u00e4llet.
+dialog.setlanguage.secondintro=Du m\u00e5ste spara dina inst\u00e4llningar och sedan<p>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
index 43ef43d6b54a34a922b3f6e9da3ea70c4bc87957..8e82e11ea284092c640651e56a335661cc5df77d 100644 (file)
@@ -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
index eba2b714906cc5f9e6cbb5f4d16562d222b9305c..d915629508ca5685d584579a7f57ff69ed76a03a 100644 (file)
@@ -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
 
index 6f63080ceb98461a89ada946fda0d9f35b4fc6f4..ebd106ab59cd77657a7ce7ec1b1943f863146679 100644 (file)
@@ -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<String[]> _pointList = new ArrayList<String[]>();
        private ArrayList<String> _linkList = new ArrayList<String>();
@@ -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;
        }
 
index 0023c7426ed68dcb0527af98b360bac6cdd67036..405a5366e37528360b3cacc7fe1c0f71d6309d28 100644 (file)
@@ -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 <cmt> 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
index 88ac7914c29a1b92a235ff426e782f07ca4fcae3..8bfd0905f857b5c744ca8a25c9455da656dbd516 100644 (file)
@@ -583,6 +583,7 @@ public class GpxExporter extends GenericFunction implements Runnable
                        }
                        source = replaceGpxTags(source, "<desc>", "</desc>",
                                XmlUtils.fixCdata(inPoint.getFieldValue(Field.DESCRIPTION)));
+                       source = replaceGpxTags(source, "<cmt>", "</cmt>", inPoint.getFieldValue(Field.COMMENT));
                }
                // photo / audio links
                if (source != null && (inPoint.hasMedia() || source.indexOf("</link>") > 0)) {
@@ -733,13 +734,21 @@ public class GpxExporter extends GenericFunction implements Runnable
                inWriter.write(XmlUtils.fixCdata(inPoint.getWaypointName().trim()));
                inWriter.write("</name>\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<desc>");
                        inWriter.write(desc);
                        inWriter.write("</desc>\n");
                }
+               // comment, if any
+               final String comment = XmlUtils.fixCdata(inPoint.getFieldValue(Field.COMMENT));
+               if (comment != null && !comment.equals(""))
+               {
+                       inWriter.write("\t\t<cmt>");
+                       inWriter.write(comment);
+                       inWriter.write("</cmt>\n");
+               }
                // Media links, if any
                if (inSettings.getExportPhotoPoints() && inPoint.getPhoto() != null)
                {
index 263a3067f4902b5916c2b5e43d63bfeccdb21c5c..28b65ea0dddacd1b731eda3fdc9e7f8b80b5b7c4 100644 (file)
@@ -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
+       }
 }