]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Version 13.4, May 2012
authoractivityworkshop <mail@activityworkshop.net>
Sun, 15 Feb 2015 10:04:35 +0000 (11:04 +0100)
committeractivityworkshop <mail@activityworkshop.net>
Sun, 15 Feb 2015 10:04:35 +0000 (11:04 +0100)
49 files changed:
tim/prune/App.java
tim/prune/GpsPrune.java
tim/prune/config/Config.java
tim/prune/correlate/Correlator.java
tim/prune/data/Coordinate.java
tim/prune/data/Track.java
tim/prune/function/AboutScreen.java
tim/prune/function/AddMapSourceDialog.java
tim/prune/function/AsyncMediaLoader.java
tim/prune/function/DiskCacheConfig.java
tim/prune/function/SetLanguage.java
tim/prune/function/SetMapBgFunction.java
tim/prune/function/cache/ManageCacheFunction.java
tim/prune/function/gpsies/GenericDownloaderFunction.java
tim/prune/gui/images/add_photo_icon.png [changed mode: 0644->0755]
tim/prune/gui/images/add_textfile_icon.png [changed mode: 0644->0755]
tim/prune/gui/map/CloudmadeMapSource.java
tim/prune/gui/map/DiskTileCacher.java
tim/prune/gui/map/MapCanvas.java
tim/prune/gui/map/MapSource.java
tim/prune/gui/map/MapSourceLibrary.java
tim/prune/gui/map/MapTileManager.java
tim/prune/gui/map/MffMapSource.java
tim/prune/gui/map/OsmMapSource.java
tim/prune/gui/map/OverlayPanel.java [new file with mode: 0644]
tim/prune/gui/profile/AltitudeData.java
tim/prune/jpeg/drew/ExifReader.java
tim/prune/lang/prune-texts_cz.properties
tim/prune/lang/prune-texts_de.properties
tim/prune/lang/prune-texts_de_CH.properties
tim/prune/lang/prune-texts_en.properties
tim/prune/lang/prune-texts_en_US.properties [new file with mode: 0644]
tim/prune/lang/prune-texts_es.properties
tim/prune/lang/prune-texts_hu.properties
tim/prune/lang/prune-texts_it.properties
tim/prune/lang/prune-texts_nl.properties
tim/prune/lang/prune-texts_pl.properties
tim/prune/lang/prune-texts_pt.properties
tim/prune/lang/prune-texts_ro.properties
tim/prune/lang/prune-texts_ru.properties [new file with mode: 0644]
tim/prune/lang/prune-texts_zh.properties
tim/prune/load/FieldGuesser.java
tim/prune/load/MediaHelper.java
tim/prune/load/TextFileLoader.java
tim/prune/load/xml/KmlHandler.java
tim/prune/load/xml/ZipFileLoader.java
tim/prune/readme.txt
tim/prune/save/GpxExporter.java
tim/prune/save/SvgExporter.java

index 8189ffb6b4aafff66d62d60906961ebaf1ea3e67..770fd2089aaac23518ecd687bec0f0d8878ee738 100644 (file)
@@ -702,7 +702,7 @@ public class App
                {
                        String[] linkArray = inLinkInfo.getLinkArray();
                        if (linkArray != null) {
-                               new AsyncMediaLoader(this, inLinkInfo.getZipFile(), linkArray, loadedTrack).begin();
+                               new AsyncMediaLoader(this, inLinkInfo.getZipFile(), linkArray, loadedTrack, inSourceInfo.getFile()).begin();
                        }
                }
                // Look at TrackNameList, decide whether to filter or not
index 41dac2b0d0300538ecb9813bd8f71462e5b8c828..a444a02c9960b5fc41e35ebc245c9c914b0aa413 100644 (file)
@@ -35,9 +35,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 = "13";
+       public static final String VERSION_NUMBER = "13.4";
        /** Build number, just used for about screen */
-       public static final String BUILD_NUMBER = "240";
+       public static final String BUILD_NUMBER = "244c";
        /** Static reference to App object */
        private static App APP = null;
 
@@ -90,8 +90,10 @@ public class GpsPrune
                                if (f.exists() && f.canRead()) {
                                        dataFiles.add(f);
                                }
-                               else {
-                                       System.out.println("Unknown parameter '" + arg + "'.");
+                               else
+                               {
+                                       // Make a useful String from the unknown parameter - could it be a mistyped filename?
+                                       System.out.println(makeUnknownParameterString(arg));
                                        showUsage = true;
                                }
                        }
@@ -134,13 +136,15 @@ public class GpsPrune
                        // If langfilename is blank on command line parameters then don't use setting from config
                        langFilename = Config.getConfigString(Config.KEY_LANGUAGE_FILE);
                }
-               if (langFilename != null && !langFilename.equals("")) {
+               if (langFilename != null)
+               {
                        try {
                                I18nManager.addLanguageFile(langFilename);
                                Config.setConfigString(Config.KEY_LANGUAGE_FILE, langFilename);
                        }
                        catch (FileNotFoundException fnfe) {
                                System.err.println("Failed to load language file: " + langFilename);
+                               Config.setConfigString(Config.KEY_LANGUAGE_FILE, "");
                        }
                }
                // Set up the window and go
@@ -245,4 +249,26 @@ public class GpsPrune
                // Finally, give the files to load to the App
                APP.loadDataFiles(inDataFiles);
        }
+
+       /**
+        * Try to guess whether it's a mistyped parameter or a mistyped filename
+        * @param inParam command line argument
+        * @return error message
+        */
+       private static String makeUnknownParameterString(String inParam)
+       {
+               File file = new File(inParam);
+               if (file.exists()) {
+                       return (file.canRead() ? "Something wrong with file" : "Cannot read file") + " '" + inParam + "'";
+               }
+               do
+               {
+                       String name = file.getName();
+                       file = file.getParentFile();
+                       if (file != null && file.exists() && file.canRead()) return "Tried to load file '" + inParam + "' but cannot find '" + name + "'";
+               }
+               while (file != null);
+
+               return "Unknown parameter '" + inParam + "'";
+       }
 }
index 412f408b803c79055ffbe7eb100ab9d707d606c2..a286d7fcc116315d03d4666b3af2d0cd4883b8af 100644 (file)
@@ -16,7 +16,7 @@ public abstract class Config
        private static File _configFile = null;
 
        /** Hashtable containing all config values */
-       private static Properties _configValues = new Properties();
+       private static Properties _configValues = null;
        /** Colour scheme object is also part of config */
        private static ColourScheme _colourScheme = new ColourScheme();
        /** Recently-used file list */
@@ -44,6 +44,8 @@ public abstract class Config
        public static final String KEY_METRIC_UNITS = "prune.metricunits";
        /** Key for index of map source */
        public static final String KEY_MAPSOURCE_INDEX = "prune.mapsource";
+       /** Key for number of fixed map sources */
+       public static final String KEY_NUM_FIXED_MAPS = "prune.numfixedmapsources";
        /** Key for String containing custom map sources */
        public static final String KEY_MAPSOURCE_LIST = "prune.mapsourcelist";
        /** Key for show map flag */
@@ -74,6 +76,12 @@ public abstract class Config
        public static final String KEY_RECENT_FILES = "prune.recentfiles";
 
 
+       /** Initialise the default properties */
+       static
+       {
+               _configValues = getDefaultProperties();
+       }
+
        /**
         * Load the default configuration file
         */
index 7ac2da797f855ab8e1a892829e2a2ef24c130771..2a4b49f882937100705aa67195c48552676f70f1 100644 (file)
@@ -115,6 +115,7 @@ public abstract class Correlator extends GenericFunction
                _cards.showCard(card);
                showCard(0); // does set up and next/prev enabling
                _okButton.setEnabled(false);
+               _tipLabel.setVisible(!isCardEnabled(1));
                _dialog.setVisible(true);
        }
 
index 40853ebc62505983b132abb71c85afcc041bc115..a230e775a21424a9d1fcc06aa004d0b35e92d015 100644 (file)
@@ -32,6 +32,11 @@ public abstract class Coordinate
        static {
                if (EIGHT_DP instanceof DecimalFormat) ((DecimalFormat) EIGHT_DP).applyPattern("0.00000000");
        }
+       /** Number formatter for fixed decimals with forced decimal point */
+       private static final NumberFormat FIVE_DP = NumberFormat.getNumberInstance(Locale.UK);
+       static {
+               if (FIVE_DP instanceof DecimalFormat) ((DecimalFormat) FIVE_DP).applyPattern("0.00000");
+       }
 
        // Instance variables
        private boolean _valid = false;
@@ -170,7 +175,8 @@ public abstract class Coordinate
                        if (_cardinal == WEST || _cardinal == SOUTH || inString.charAt(0) == '-')
                                _asDouble = -_asDouble;
                        // validate fields
-                       _valid = _valid && (_degrees <= getMaxDegrees() && _minutes < 60 && _seconds < 60 && _fracs < _fracDenom);
+                       _valid = _valid && (_degrees <= getMaxDegrees() && _minutes < 60 && _seconds < 60 && _fracs < _fracDenom)
+                               && Math.abs(_asDouble) <= getMaxDegrees();
                }
                else _valid = false;
        }
@@ -298,7 +304,7 @@ public abstract class Coordinate
                                case FORMAT_DEG_MIN:
                                {
                                        answer = "" + PRINTABLE_CARDINALS[_cardinal] + threeDigitString(_degrees) + "\u00B0"
-                                               + (_minutes + _seconds / 60.0 + _fracs / 60.0 / _fracDenom) + "'";
+                                               + FIVE_DP.format((Math.abs(_asDouble) - _degrees) * 60.0) + "'";
                                        break;
                                }
                                case FORMAT_DEG_WHOLE_MIN:
@@ -314,8 +320,11 @@ public abstract class Coordinate
                                case FORMAT_DEG:
                                case FORMAT_DEG_WITHOUT_CARDINAL:
                                {
-                                       answer = (_asDouble<0.0?"-":"")
-                                               + (_degrees + _minutes / 60.0 + _seconds / 3600.0 + _fracs / 3600.0 / _fracDenom);
+                                       if (_originalFormat != FORMAT_DEG_WITHOUT_CARDINAL)
+                                       {
+                                               answer = (_asDouble<0.0?"-":"")
+                                                       + (_degrees + _minutes / 60.0 + _seconds / 3600.0 + _fracs / 3600.0 / _fracDenom);
+                                       }
                                        break;
                                }
                                case FORMAT_DECIMAL_FORCE_POINT:
index fc65959bd3c6f2c25442d4e3bd15a78d98842f60..63cd01faaf488028085a6712c5648ad9ffa8ea1d 100644 (file)
@@ -489,7 +489,7 @@ public class Track
        {
                // TODO: Move cut/move into separate function?
                // Check that indices make sense
-               if (inSectionStart > 0 && inSectionEnd > inSectionStart && inMoveTo >= 0
+               if (inSectionStart >= 0 && inSectionEnd > inSectionStart && inMoveTo >= 0
                        && (inMoveTo < inSectionStart || inMoveTo > (inSectionEnd+1)))
                {
                        // do the cut and move
index c2dc3fee7d08f1d1f7791408757b7d3cefbdfb67..0ec7ae6fc06ad1063531f605eff95ea2fe47054d 100644 (file)
@@ -98,8 +98,8 @@ public class AboutScreen extends GenericFunction
                descBuffer.append("<p>").append(I18nManager.getText("dialog.about.summarytext3")).append("</p>");
                descBuffer.append("<p>").append(I18nManager.getText("dialog.about.languages")).append(" : ")
                        .append("\u010de\u0161tina, deutsch, english, espa\u00F1ol, fran\u00E7ais, italiano, magyar,<br>" +
-                               " nederlands, polski, portugu\u00EAs, \u4e2d\u6587 (chinese), \u65E5\u672C\u8A9E (japanese), \uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean),<br>" +
-                               " schwiizerd\u00FC\u00FCtsch, t\u00FCrk\u00E7e, rom\u00E2n\u0103, afrikaans, bahasa indonesia</p>");
+                               " nederlands, polski, portugu\u00EAs, \u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian), \u4e2d\u6587 (chinese), \u65E5\u672C\u8A9E (japanese),<br>" +
+                               " \uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean), schwiizerd\u00FC\u00FCtsch, t\u00FCrk\u00E7e, rom\u00E2n\u0103, afrikaans, bahasa indonesia</p>");
                descBuffer.append("<p>").append(I18nManager.getText("dialog.about.translatedby")).append("</p>");
                JEditorPane descPane = new JEditorPane("text/html", descBuffer.toString());
                descPane.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
@@ -195,32 +195,35 @@ public class AboutScreen extends GenericFunction
                        new JLabel(" theYinYeti, Rothermographer, Sam, Rudolph, nazotoko,"),
                        1, 4);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
-                       new JLabel(" katpatuka, R\u00E9mi, Marcus, Ali, Javier, Jeroen, prot_d, Gy\u00F6rgy, HooAU"),
+                       new JLabel(" katpatuka, R\u00E9mi, Marcus, Ali, Javier, Jeroen, prot_d, Gy\u00F6rgy,"),
                        1, 5);
+               addToGridBagPanel(creditsPanel, gridBag, constraints,
+                       new JLabel(" HooAU, Sergey"),
+                       1, 6);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel(I18nManager.getText("dialog.about.credits.translations") + " : "),
-                       0, 6);
+                       0, 7);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel("Open Office, Gpsdrive, Babelfish, Leo, Launchpad"),
-                       1, 6);
+                       1, 7);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel(I18nManager.getText("dialog.about.credits.devtools") + " : "),
-                       0, 7);
+                       0, 8);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel("Debian Linux, Sun Java, Eclipse, Svn, Gimp, Inkscape"),
-                       1, 7);
+                       1, 8);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel(I18nManager.getText("dialog.about.credits.othertools") + " : "),
-                       0, 8);
+                       0, 9);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel("Openstreetmap, Povray, Exiftool, Google Earth, Gpsbabel, Gnuplot"),
-                       1, 8);
+                       1, 9);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel(I18nManager.getText("dialog.about.credits.thanks") + " : "),
-                       0, 9);
+                       0, 10);
                addToGridBagPanel(creditsPanel, gridBag, constraints,
                        new JLabel("Friends and loved ones, for encouragement and support"),
-                       1, 9);
+                       1, 10);
                _tabs.add(I18nManager.getText("dialog.about.credits"), creditsPanel);
 
                // Read me
index ec13bb1132dc52d64d3059c0d71b147a58890233..da1f15e8a951e0d6c258041e5872d5e84c799299 100644 (file)
@@ -4,7 +4,10 @@ import java.awt.BorderLayout;
 import java.awt.CardLayout;
 import java.awt.Component;
 import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
 import java.awt.GridLayout;
+import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
@@ -33,11 +36,13 @@ public class AddMapSourceDialog
 {
        private SetMapBgFunction _parent = null;
        private JDialog _addDialog = null;
-       private JRadioButton[] _typeRadios = null;
+       private JRadioButton[] _sourceTypeRadios = null;
        private JPanel _cards = null;
+       private MapSource _originalSource = null;
        // controls for osm panel
        private JTextField _oNameField = null;
        private JTextField _baseUrlField = null, _topUrlField = null;
+       private JRadioButton[] _baseTypeRadios = null, _topTypeRadios = null;
        private JComboBox _oZoomCombo = null;
        // controls for cloudmade panel
        private JTextField _cNameField = null;
@@ -45,6 +50,9 @@ public class AddMapSourceDialog
        private JComboBox _cZoomCombo = null;
        private JButton _okButton = null;
 
+       /** array of file types */
+       private static final String[] FILE_TYPES = {"png", "jpg", "gif"};
+
 
        /**
         * Constructor
@@ -72,25 +80,22 @@ public class AddMapSourceDialog
                JPanel radioPanel = new JPanel();
                ButtonGroup radioGroup = new ButtonGroup();
                radioPanel.setLayout(new GridLayout(1, 0));
-               _typeRadios = new JRadioButton[2];
-               _typeRadios[0] = new JRadioButton("Openstreetmap");
-               radioGroup.add(_typeRadios[0]);
-               radioPanel.add(_typeRadios[0]);
-               _typeRadios[1] = new JRadioButton("Cloudmade");
-               radioGroup.add(_typeRadios[1]);
-               radioPanel.add(_typeRadios[1]);
-               _typeRadios[0].setSelected(true);
+               _sourceTypeRadios = new JRadioButton[2];
+               _sourceTypeRadios[0] = new JRadioButton("Openstreetmap");
+               radioGroup.add(_sourceTypeRadios[0]);
+               radioPanel.add(_sourceTypeRadios[0]);
+               _sourceTypeRadios[1] = new JRadioButton("Cloudmade");
+               radioGroup.add(_sourceTypeRadios[1]);
+               radioPanel.add(_sourceTypeRadios[1]);
+               _sourceTypeRadios[0].setSelected(true);
                // listener for clicks on type radios
                ActionListener typeListener = new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
-                               CardLayout cl = (CardLayout) _cards.getLayout();
-                               if (_typeRadios[0].isSelected()) {cl.first(_cards);}
-                               else {cl.last(_cards);}
-                               enableOK();
+                               onRadioClicked();
                        }
                };
-               _typeRadios[0].addActionListener(typeListener);
-               _typeRadios[1].addActionListener(typeListener);
+               _sourceTypeRadios[0].addActionListener(typeListener);
+               _sourceTypeRadios[1].addActionListener(typeListener);
                radioPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                dialogPanel.add(radioPanel, BorderLayout.NORTH);
 
@@ -105,48 +110,92 @@ public class AddMapSourceDialog
                };
                // openstreetmap panel
                JPanel osmPanel = new JPanel();
-               osmPanel.setLayout(new GridLayout(0, 2, 5, 5));
-               osmPanel.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2));
-               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")));
+               osmPanel.setLayout(new BorderLayout());
+               osmPanel.setBorder(BorderFactory.createEmptyBorder(6, 3, 4, 3));
+               JPanel gbPanel = new JPanel();
+               GridBagLayout gridbag = new GridBagLayout();
+               GridBagConstraints c = new GridBagConstraints();
+               gbPanel.setLayout(gridbag);
+               c.gridx = 0; c.gridy = 0;
+               c.gridheight = 1; c.gridwidth = 1;
+               c.weightx = 0.0; c.weighty = 0.0;
+               c.ipadx = 3; c.ipady = 5;
+               c.insets = new Insets(0, 0, 5, 0);
+               c.anchor = GridBagConstraints.FIRST_LINE_START;
+               gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")), c);
                _oNameField = new JTextField(18);
                _oNameField.addKeyListener(keyListener);
-               osmPanel.add(_oNameField);
+               c.gridx = 1; c.weightx = 1.0;
+               gbPanel.add(_oNameField, c);
                // Base layer
-               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer1url")));
+               c.gridx = 0; c.gridy = 1;
+               c.weightx = 0.0;
+               c.insets = new Insets(0, 0, 0, 0);
+               gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer1url")), c);
                _baseUrlField = new JTextField(18);
                _baseUrlField.addKeyListener(keyListener);
-               osmPanel.add(_baseUrlField);
+               c.gridx = 1; c.weightx = 1.0;
+               gbPanel.add(_baseUrlField, c);
+               _baseTypeRadios = new JRadioButton[3];
+               radioGroup = new ButtonGroup();
+               for (int i=0; i<3; i++)
+               {
+                       _baseTypeRadios[i] = new JRadioButton(FILE_TYPES[i]);
+                       radioGroup.add(_baseTypeRadios[i]);
+                       c.gridx = 2+i; c.weightx = 0.0;
+                       gbPanel.add(_baseTypeRadios[i], c);
+               }
+
                // Top layer
-               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer2url")));
+               c.gridx = 0; c.gridy = 2;
+               gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer2url")), c);
                _topUrlField = new JTextField(18);
                _topUrlField.addKeyListener(keyListener);
-               osmPanel.add(_topUrlField);
+               c.gridx = 1; c.weightx = 1.0;
+               gbPanel.add(_topUrlField, c);
+               _topTypeRadios = new JRadioButton[3];
+               radioGroup = new ButtonGroup();
+               for (int i=0; i<3; i++)
+               {
+                       _topTypeRadios[i] = new JRadioButton(FILE_TYPES[i]);
+                       radioGroup.add(_topTypeRadios[i]);
+                       c.gridx = 2+i; c.weightx = 0.0;
+                       gbPanel.add(_topTypeRadios[i], c);
+               }
                // Max zoom
-               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")));
+               c.gridx = 0; c.gridy = 3;
+               gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")), c);
                _oZoomCombo = new JComboBox();
                for (int i=10; i<=20; i++) {
                        _oZoomCombo.addItem("" + i);
                }
-               osmPanel.add(_oZoomCombo);
+               c.gridx = 1;
+               gbPanel.add(_oZoomCombo, c);
+               osmPanel.add(gbPanel, BorderLayout.NORTH);
                _cards.add(osmPanel, "card1");
+
                // Panel for cloudmade source
                JPanel cloudPanel = new JPanel();
-               cloudPanel.setLayout(new GridLayout(0, 2, 5, 5));
-               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")));
+               cloudPanel.setBorder(BorderFactory.createEmptyBorder(6, 3, 4, 3));
+               // Use a gridlayout inside a borderlayout to avoid stretching
+               cloudPanel.setLayout(new BorderLayout());
+               JPanel cloudGridPanel = new JPanel();
+               cloudGridPanel.setLayout(new GridLayout(0, 2, 5, 5));
+               cloudGridPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")));
                _cNameField = new JTextField(18);
                _cNameField.addKeyListener(keyListener);
-               cloudPanel.add(_cNameField);
-               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.cloudstyle")));
+               cloudGridPanel.add(_cNameField);
+               cloudGridPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.cloudstyle")));
                _cStyleField = new JTextField(18);
                _cStyleField.addKeyListener(keyListener);
-               cloudPanel.add(_cStyleField);
-               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")));
+               cloudGridPanel.add(_cStyleField);
+               cloudGridPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")));
                _cZoomCombo = new JComboBox();
                for (int i=10; i<=20; i++) {
                        _cZoomCombo.addItem("" + i);
                }
-               cloudPanel.add(_cZoomCombo);
-               cloudPanel.add(new JLabel(" ")); // force four rows to space text boxes properly
+               cloudGridPanel.add(_cZoomCombo);
+               cloudPanel.add(cloudGridPanel, BorderLayout.NORTH);
                _cards.add(cloudPanel, "card2");
                // cards
                JPanel holderPanel = new JPanel();
@@ -181,20 +230,96 @@ public class AddMapSourceDialog
 
        /**
         * Init and show the dialog
+        * @param inSource source object before edit, or null to add
         */
-       public void showDialog()
+       public void showDialog(MapSource inSource)
+       {
+               _originalSource = inSource;
+               populateFields();
+       }
+
+       /**
+        * Clear all the dialog fields to prepare for an add
+        */
+       private void clearAllFields()
        {
                _oNameField.setText("");
                _baseUrlField.setText("");
+               _baseTypeRadios[0].setSelected(true);
                _topUrlField.setText("");
+               _topTypeRadios[0].setSelected(true);
                _oZoomCombo.setSelectedIndex(8);
                _cNameField.setText("");
                _cStyleField.setText("");
                _cZoomCombo.setSelectedIndex(8);
                _okButton.setEnabled(false);
+               for (int i=0; i<2; i++) {
+                       _sourceTypeRadios[i].setEnabled(true);
+               }
                _addDialog.setVisible(true);
        }
 
+       /**
+        * Init the dialog fields from the given source object
+        */
+       private void populateFields()
+       {
+               if (_originalSource == null)
+               {
+                       clearAllFields();
+                       return;
+               }
+               boolean sourceFound = false;
+               // See if it's a cloudmade source
+               try
+               {
+                       CloudmadeMapSource cloudSource = (CloudmadeMapSource) _originalSource;
+                       sourceFound = true;
+                       _cNameField.setText(cloudSource.getName());
+                       _cStyleField.setText(cloudSource.getStyle());
+                       _cZoomCombo.setSelectedIndex(getZoomIndex(cloudSource.getMaxZoomLevel()));
+                       _sourceTypeRadios[1].setSelected(true);
+               }
+               catch (ClassCastException cce) {} // ignore, sourceFound flag stays false
+
+               // See if it's an osm source
+               if (!sourceFound)
+               {
+                       try
+                       {
+                               OsmMapSource osmSource = (OsmMapSource) _originalSource;
+                               sourceFound = true;
+                               _oNameField.setText(osmSource.getName());
+                               _baseUrlField.setText(osmSource.getBaseUrl(0));
+                               int baseType = getBaseType(osmSource.getFileExtension(0));
+                               _baseTypeRadios[baseType].setSelected(true);
+                               _topUrlField.setText(osmSource.getNumLayers()==0?"":osmSource.getBaseUrl(1));
+                               int topType = getBaseType(osmSource.getFileExtension(1));
+                               _topTypeRadios[topType].setSelected(true);
+                               _oZoomCombo.setSelectedIndex(getZoomIndex(osmSource.getMaxZoomLevel()));
+                               _sourceTypeRadios[0].setSelected(true);
+                       }
+                       catch (ClassCastException cce) {} // ignore, sourceFound flag stays false
+               }
+               for (int i=0; i<2; i++) {
+                       _sourceTypeRadios[i].setEnabled(false);
+               }
+               onRadioClicked();
+               _okButton.setEnabled(false);
+               _addDialog.setVisible(true);
+       }
+
+
+       /**
+        * React to one of the type radio buttons being clicked
+        */
+       private void onRadioClicked()
+       {
+               CardLayout cl = (CardLayout) _cards.getLayout();
+               if (_sourceTypeRadios[0].isSelected()) {cl.first(_cards);}
+               else {cl.last(_cards);}
+               enableOK();
+       }
 
        /**
         * Check the currently entered details and enable the OK button if it looks OK
@@ -202,8 +327,8 @@ public class AddMapSourceDialog
        private void enableOK()
        {
                boolean ok = false;
-               if (_typeRadios[0].isSelected()) {ok = isOsmPanelOk();}
-               if (_typeRadios[1].isSelected()) {ok = isCloudPanelOk();}
+               if (_sourceTypeRadios[0].isSelected()) {ok = isOsmPanelOk();}
+               if (_sourceTypeRadios[1].isSelected()) {ok = isCloudPanelOk();}
                _okButton.setEnabled(ok);
        }
 
@@ -248,24 +373,32 @@ public class AddMapSourceDialog
        private void finish()
        {
                MapSource newSource = null;
-               if (_typeRadios[0].isSelected())
+               String origName = (_originalSource == null ? null : _originalSource.getName());
+               if (_sourceTypeRadios[0].isSelected())
                {
                        // Openstreetmap source
-                       String sourceName = getUniqueSourcename(_oNameField.getText());
+                       String sourceName = getValidSourcename(_oNameField.getText(), origName);
                        String url1 = _baseUrlField.getText().trim();
+                       String ext1 = getFileExtension(_baseTypeRadios);
                        String url2 = _topUrlField.getText().trim();
-                       newSource = new OsmMapSource(sourceName, url1, url2, _oZoomCombo.getSelectedIndex()+10);
+                       String ext2 = getFileExtension(_topTypeRadios);
+                       newSource = new OsmMapSource(sourceName, url1, ext1, url2, ext2, _oZoomCombo.getSelectedIndex()+10);
                }
-               else if (_typeRadios[1].isSelected())
+               else if (_sourceTypeRadios[1].isSelected())
                {
-                       String sourceName = getUniqueSourcename(_cNameField.getText());
+                       String sourceName = getValidSourcename(_cNameField.getText(), origName);
                        newSource = new CloudmadeMapSource(sourceName, _cStyleField.getText(),
                                _cZoomCombo.getSelectedIndex()+10);
                }
                // Add new source if ok
                if (newSource != null)
                {
-                       MapSourceLibrary.addSource(newSource);
+                       if (_originalSource == null) {
+                               MapSourceLibrary.addSource(newSource);
+                       }
+                       else {
+                               MapSourceLibrary.editSource(_originalSource, newSource);
+                       }
                        // inform setmapbg dialog
                        _parent.updateList();
                        _addDialog.setVisible(false);
@@ -273,11 +406,12 @@ public class AddMapSourceDialog
        }
 
        /**
-        * Check the given source name if it exists in library already
+        * Check the given source name is valid and whether it exists in library already
         * @param inName name to check
-        * @return unique name not yet in library
+        * @param inOriginalName name of source before edit (or null for new source)
+        * @return valid name for the new source
         */
-       private static String getUniqueSourcename(String inName)
+       private static String getValidSourcename(String inName, String inOriginalName)
        {
                String name = inName;
                if (name == null) {name = "";}
@@ -286,14 +420,61 @@ public class AddMapSourceDialog
                        name = I18nManager.getText("dialog.addmapsource.noname");
                }
                // Check there isn't already a map source with this name
-               if (MapSourceLibrary.hasSourceName(name))
+               if (inOriginalName == null || !inOriginalName.equals(name))
                {
-                       int suffix = 1;
-                       while (MapSourceLibrary.hasSourceName(name + suffix)) {
-                               suffix++;
+                       if (MapSourceLibrary.hasSourceName(name))
+                       {
+                               int suffix = 1;
+                               while (MapSourceLibrary.hasSourceName(name + suffix)) {
+                                       suffix++;
+                               }
+                               name += suffix;
                        }
-                       name += suffix;
                }
                return name;
        }
+
+       /**
+        * Get the selected file extension
+        * @param inRadios array of radio buttons for selection
+        * @return selected file extension
+        */
+       private String getFileExtension(JRadioButton[] inRadios)
+       {
+               if (inRadios != null)
+               {
+                       for (int i=0; i<inRadios.length; i++) {
+                               if (inRadios[i] != null && inRadios[i].isSelected()) {
+                                       return FILE_TYPES[i];
+                               }
+                       }
+               }
+               return FILE_TYPES[0];
+       }
+
+       /**
+        * Get the index of the given image extension
+        * @param inExt file extension, such as "png"
+        * @return index from 0 to 2
+        */
+       private static int getBaseType(String inExt)
+       {
+               for (int i=0; i<FILE_TYPES.length; i++) {
+                       if (FILE_TYPES[i].equals(inExt)) {
+                               return i;
+                       }
+               }
+               // Not found so default to png
+               return 0;
+       }
+
+       /**
+        * Get the dropdown index of the given zoom level
+        * @param inZoomLevel zoom level, eg 18
+        * @return index of dropdown to select
+        */
+       private static int getZoomIndex(int inZoomLevel)
+       {
+               return Math.max(0, inZoomLevel - 10);
+       }
 }
index 0365125b6e9e5133487e63790eb5948069683bf3..f8a505aad164aeb85af3a9ca64f48cd6c6920428 100644 (file)
@@ -29,6 +29,8 @@ implements Runnable, Cancellable
        private String[] _linkArray = null;
        /** Track to use for connecting */
        private Track _track = null;
+       /** Source file */
+       private File _sourceFile = null;
        /** Cancelled flag */
        private boolean _cancelled = false;
 
@@ -38,13 +40,15 @@ implements Runnable, Cancellable
         * @param inApp App object
         * @param inLinkArray array of links
         * @param inTrack Track object for connecting points
+        * @param inSourceFile file from which data was loaded, if any
         */
-       public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack)
+       public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack, File inSourceFile)
        {
                super(inApp);
                _zipFile = inZipFile;
                _linkArray = inLinkArray;
                _track = inTrack;
+               _sourceFile = inSourceFile;
        }
 
        /**
@@ -84,6 +88,7 @@ implements Runnable, Cancellable
                if (numLinks <= 0) return;
                // Make progress dialog
                MediaLoadProgressDialog progressDialog = new MediaLoadProgressDialog(_app.getFrame(), this);
+
                // Make array to store results
                MediaObject[] media = new MediaObject[numLinks];
                int currLink = 0;
@@ -91,7 +96,7 @@ implements Runnable, Cancellable
                {
                        if (_linkArray[i] != null)
                        {
-                               MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i]);
+                               MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i], _sourceFile);
                                if (mf != null)
                                {
                                        // attach media to point and set status
index 98a6405d7bc7f79633abb9ff1055ea63d0156639..1a4fdb19f1c7310b1613d45377abcf4d92c55f79 100644 (file)
@@ -106,6 +106,7 @@ public class DiskCacheConfig extends GenericFunction
                        public void actionPerformed(ActionEvent e)
                        {
                                finish();
+                               _dialog.dispose();
                        }
                });
                buttonPanelr.add(_okButton);
@@ -234,10 +235,10 @@ public class DiskCacheConfig extends GenericFunction
                                        I18nManager.getText(getNameKey()), JOptionPane.WARNING_MESSAGE);
                                return;
                        }
+                       // TODO: Check path is writeable too, and give warning if not
                }
                Config.setConfigString(Config.KEY_DISK_CACHE, cachePath);
                // inform subscribers so that tiles are wiped from memory and refetched
                UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED);
-               _dialog.dispose();
        }
 }
index 10ce804c5e46ac9790c2af9cd60b4e6ae6af900c..44078084ef4af0d7510f476d01f07086bf97f91d 100644 (file)
@@ -41,15 +41,15 @@ public class SetLanguage extends GenericFunction
        private int _startIndex = 0;
 
        /** Names of languages for display in dropdown (not translated) */
-       private static final String[] LANGUAGE_NAMES = {"\u010de\u0161tina", "deutsch", "english",
+       private static final String[] LANGUAGE_NAMES = {"\u010de\u0161tina", "deutsch", "english", "american english",
                "espa\u00F1ol", "fran\u00E7ais", "italiano", "magyar", "nederlands", "polski",
-               "portugu\u00EAs", "\u4e2d\u6587 (chinese)", "\u65E5\u672C\u8A9E (japanese)",
+               "portugu\u00EAs", "\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian)", "\u4e2d\u6587 (chinese)", "\u65E5\u672C\u8A9E (japanese)",
                "\uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean)", "schwiizerd\u00FC\u00FCtsch", "t\u00FCrk\u00E7e",
                "rom\u00E2n\u0103", "afrikaans", "bahasa indonesia"
        };
        /** Associated language codes (must be in same order as names!) */
-       private static final String[] LANGUAGE_CODES = {"cz", "de", "en", "es", "fr", "it", "hu",
-               "nl", "pl", "pt", "zh", "ja", "ko", "de_ch", "tr", "ro", "af", "in"
+       private static final String[] LANGUAGE_CODES = {"cz", "de", "en", "en_us", "es", "fr", "it", "hu",
+               "nl", "pl", "pt", "ru", "zh", "ja", "ko", "de_ch", "tr", "ro", "af", "in"
        };
 
 
index fb715b03b0b51f0f3d450bf4d4fa3ed91243b4cf..a42b789ef2661cfe9ec716b8cb0a96343dc6a584 100644 (file)
@@ -2,7 +2,6 @@ package tim.prune.function;
 
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -10,6 +9,7 @@ import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 
 import javax.swing.BorderFactory;
+import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -27,10 +27,12 @@ import tim.prune.GenericFunction;
 import tim.prune.I18nManager;
 import tim.prune.UpdateMessageBroker;
 import tim.prune.config.Config;
+import tim.prune.gui.map.MapSource;
 import tim.prune.gui.map.MapSourceLibrary;
 
 /**
  * Function to set the tile server for the map backgrounds
+ * Also allows call to add/edit/delete functions
  */
 public class SetMapBgFunction extends GenericFunction
 {
@@ -38,10 +40,12 @@ public class SetMapBgFunction extends GenericFunction
        private JList _list = null;
        private MapSourceListModel _listModel = null;
        private String _initialSource = null;
-       private JButton _okButton = null;
-       private JButton _deleteButton = null;
+       private JButton _okButton = null, _cancelButton = null;
+       private JButton _deleteButton = null, _editButton = null;
        // Add dialog
        private AddMapSourceDialog _addDialog = null;
+       // Flags for what has been edited
+       private boolean _sourcesEdited = false;
 
 
        /**
@@ -108,7 +112,6 @@ public class SetMapBgFunction extends GenericFunction
                                }
                        }
                });
-               _list.setPreferredSize(new Dimension(200, 200));
                // button panel on right
                JPanel rightPanel = new JPanel();
                rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
@@ -119,10 +122,21 @@ public class SetMapBgFunction extends GenericFunction
                        }
                });
                rightPanel.add(addButton);
+               rightPanel.add(Box.createVerticalStrut(5));
+               // edit
+               _editButton = new JButton(I18nManager.getText("button.edit"));
+               _editButton.addActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e) {
+                               editMapSource();
+                       }
+               });
+               rightPanel.add(_editButton);
+               rightPanel.add(Box.createVerticalStrut(5));
+               // delete
                _deleteButton = new JButton(I18nManager.getText("button.delete"));
                _deleteButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
-                               deleteMapSource(_list.getSelectedIndex());
+                               deleteMapSource();
                        }
                });
                rightPanel.add(_deleteButton);
@@ -140,14 +154,14 @@ public class SetMapBgFunction extends GenericFunction
                };
                _okButton.addActionListener(okListener);
                buttonPanel.add(_okButton);
-               JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
-               cancelButton.addActionListener(new ActionListener() {
+               _cancelButton = new JButton(I18nManager.getText("button.cancel"));
+               _cancelButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e)
                        {
                                _dialog.dispose();
                        }
                });
-               buttonPanel.add(cancelButton);
+               buttonPanel.add(_cancelButton);
                dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
                return dialogPanel;
        }
@@ -166,6 +180,9 @@ public class SetMapBgFunction extends GenericFunction
                }
                _initialSource = _listModel.getSource(currSource).getSiteStrings();
                _list.setSelectedIndex(currSource);
+               // Scroll down to see selected index
+               _list.ensureIndexIsVisible(currSource);
+               _sourcesEdited = false;
        }
 
        /**
@@ -183,40 +200,62 @@ public class SetMapBgFunction extends GenericFunction
        {
                int serverNum = getSelectedServer();
                _okButton.setEnabled(serverNum >= 0 && serverNum < _listModel.getSize()
-                       && !_listModel.getSource(serverNum).getSiteStrings().equals(_initialSource));
-               _deleteButton.setEnabled(serverNum >= MapSourceLibrary.getNumFixedSources()
-                       && serverNum < _listModel.getSize());
+                       && (_sourcesEdited || !_listModel.getSource(serverNum).getSiteStrings().equals(_initialSource)));
+               boolean hasCustomSource = serverNum >= MapSourceLibrary.getNumFixedSources()
+                       && serverNum < _listModel.getSize();
+               _editButton.setEnabled(hasCustomSource);
+               _deleteButton.setEnabled(hasCustomSource);
+               _cancelButton.setEnabled(!_sourcesEdited);
        }
 
        /**
         * Start the dialog to add a new map source to the list
         */
        private void addNewSource()
+       {
+               addSource(null);
+       }
+
+       /**
+        * Start the dialog to either add or edit a map source
+        * @param inSource a current source to edit, or null to add a new one
+        */
+       private void addSource(MapSource inSource)
        {
                if (_addDialog == null) {
                        _addDialog = new AddMapSourceDialog(_dialog, this);
                }
-               _addDialog.showDialog();
+               _addDialog.showDialog(inSource);
        }
 
        /**
         * Delete the selected map source so it is no longer available
-        * @param inIndex index within list
         */
-       private void deleteMapSource(int inIndex)
+       private void deleteMapSource()
        {
-               MapSourceLibrary.deleteSource(inIndex);
+               int serverNum = getSelectedServer();
+               MapSourceLibrary.deleteSource(serverNum);
                updateList();
                enableButtons();
        }
 
        /**
-        * use the library to update the current list, after add or delete
+        * Open the dialog to edit the selected map source
+        */
+       private void editMapSource()
+       {
+               addSource(_listModel.getSource(getSelectedServer()));
+       }
+
+       /**
+        * use the library to update the current list, after add or edit or delete
         */
        public void updateList()
        {
                _listModel.fireChanged();
+               _sourcesEdited = true;
                Config.setConfigString(Config.KEY_MAPSOURCE_LIST, MapSourceLibrary.getConfigString());
+               enableButtons();
        }
 
        /**
index 551eb350ef74da51d5d17a22a52c333bd51dfdcb..65565987529d3885d72a38d12a7b545317e22ed9 100644 (file)
@@ -203,11 +203,11 @@ public class ManageCacheFunction extends GenericFunction implements Runnable
                c.gridheight = 1; c.gridwidth = 2;
                c.weightx = 0.0; c.weighty = 0.0;
                c.anchor = GridBagConstraints.FIRST_LINE_START;
-               _tileSetLabel = new JLabel("tileset label");
+               _tileSetLabel = new JLabel("dummy text to be replaced");
                mainPanel.add(_tileSetLabel, c);
                c.gridx = 0; c.gridy = 1;
                c.ipady = 20;
-               _zoomLabel = new JLabel("zoom label");
+               _zoomLabel = new JLabel("dummy text to be replaced");
                mainPanel.add(_zoomLabel, c);
 
                JRadioButton deleteOldRadio = new JRadioButton(I18nManager.getText("dialog.diskcache.deleteold"));
@@ -227,7 +227,7 @@ public class ManageCacheFunction extends GenericFunction implements Runnable
                c.gridwidth = 1;
                c.gridx = 0; c.gridy = 3;
                c.insets = new Insets(0, 40, 0, 0);
-               _ageLabel = new JLabel("Maximum age (days)");
+               _ageLabel = new JLabel(I18nManager.getText("dialog.diskcache.maximumage"));
                mainPanel.add(_ageLabel, c);
                _daysField = new WholeNumberField(2);
                _daysField.setMinimumSize(new Dimension(20, 1));
@@ -281,6 +281,7 @@ public class ManageCacheFunction extends GenericFunction implements Runnable
                if (_model.getNumTileSets() <= 0)
                {
                        _app.showErrorMessage(getNameKey(), "error.cache.empty");
+                       _dialog.dispose();
                        return;
                }
 
@@ -394,13 +395,18 @@ public class ManageCacheFunction extends GenericFunction implements Runnable
                                if (subdir.isDirectory()) {
                                        numDeleted += deleteFilesFrom(subdir, inMaxDays);
                                }
-                               else if (subdir.isFile() && subdir.exists() && _TILEFILTER.accept(subdir))
+                               else if (subdir.isFile() && subdir.exists())
                                {
-                                       long fileAge = (now - subdir.lastModified()) / 1000 / 60 / 60 / 24;
-                                       if (inMaxDays < 0 || fileAge > inMaxDays)
+                                       boolean isTileFile = _TILEFILTER.accept(subdir);
+                                       boolean isBadFile = !isTileFile && subdir.getName().toLowerCase().endsWith("png");
+                                       if (isTileFile || isBadFile)
                                        {
-                                               if (subdir.delete()) {
-                                                       numDeleted++;
+                                               long fileAge = (now - subdir.lastModified()) / 1000 / 60 / 60 / 24;
+                                               if (inMaxDays < 0 || fileAge > inMaxDays || isBadFile)
+                                               {
+                                                       if (subdir.delete()) {
+                                                               numDeleted++;
+                                                       }
                                                }
                                        }
                                }
index 743becfcca16f8a62a823a65d9517b8341494b73..e9049a82b9a89705472601eefb0179c4a599729a 100644 (file)
@@ -18,6 +18,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JSplitPane;
 import javax.swing.JTable;
 import javax.swing.JTextArea;
+import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
@@ -125,6 +126,7 @@ public abstract class GenericDownloaderFunction extends GenericFunction implemen
                                }
                        }
                });
+               _trackTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // only allow one to be selected
                _trackTable.getColumnModel().getColumn(0).setPreferredWidth(300);
                if (_trackListModel.getColumnCount() > 1) {
                        _trackTable.getColumnModel().getColumn(1).setPreferredWidth(70);
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 2e627a86351618afac46cecefe83e5a7d4b387f9..99aa809654c810be01d9ba7d80d4e5054593f0c3 100644 (file)
@@ -50,4 +50,12 @@ public class CloudmadeMapSource extends OsmMapSource
                }
                return source;
        }
+
+       /**
+        * @return style as string, only required to populate edit dialog
+        */
+       public String getStyle()
+       {
+               return _style;
+       }
 }
index 84f54def64ec34b4a004c75dae4342f1db083cb0..40216f8c1fe532ea1a5f49a3ae3f49c8061019b8 100644 (file)
@@ -72,6 +72,7 @@ public class DiskTileCacher implements Runnable
         */
        public static boolean saveTile(URL inUrl, String inBasePath, String inTilePath, ImageObserver inObserver)
        {
+               // TODO: Check that these are getting blocked properly
                if (inBasePath == null || inTilePath == null) {return false;}
                // save file if possible
                File basePath = new File(inBasePath);
index 82cf434f7387adcfe56b5ff5c9d48710844d4d66..7fc5c489dd06f4f3ad1cf0860b0f969deab9b6a4 100644 (file)
@@ -165,9 +165,8 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
                                UpdateMessageBroker.informSubscribers(); // to let menu know
                        }
                };
-               _topPanel = new JPanel();
+               _topPanel = new OverlayPanel();
                _topPanel.setLayout(new FlowLayout());
-               _topPanel.setOpaque(false);
                // Make slider for transparency
                _transparencySlider = new JSlider(-6, 6, 0);
                _transparencySlider.setPreferredSize(new Dimension(100, 20));
@@ -227,11 +226,10 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
                _topPanel.add(_connectCheckBox);
 
                // Add zoom in, zoom out buttons
-               _sidePanel = new JPanel();
+               _sidePanel = new OverlayPanel();
                _sidePanel.setLayout(new BoxLayout(_sidePanel, BoxLayout.Y_AXIS));
-               _sidePanel.setOpaque(false);
                JButton zoomInButton = new JButton(IconManager.getImageIcon(IconManager.ZOOM_IN_BUTTON));
-               zoomInButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
+               zoomInButton.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                zoomInButton.setContentAreaFilled(false);
                zoomInButton.setToolTipText(I18nManager.getText("menu.map.zoomin"));
                zoomInButton.addActionListener(new ActionListener() {
@@ -243,7 +241,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
                zoomInButton.setFocusable(false); // stop button from stealing keyboard focus
                _sidePanel.add(zoomInButton);
                JButton zoomOutButton = new JButton(IconManager.getImageIcon(IconManager.ZOOM_OUT_BUTTON));
-               zoomOutButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
+               zoomOutButton.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                zoomOutButton.setContentAreaFilled(false);
                zoomOutButton.setToolTipText(I18nManager.getText("menu.map.zoomout"));
                zoomOutButton.addActionListener(new ActionListener() {
index 35590a6e9a44964179050986d7ce6dc7c8475386..e3ac2ed2227a1825d01526c87800c3abdd9819d4 100644 (file)
@@ -11,6 +11,10 @@ import java.net.URL;
  */
 public abstract class MapSource
 {
+       /** File extensions */
+       protected String[] _extensions = null;
+
+
        /**
         * @return the number of layers used in this source
         */
@@ -34,7 +38,9 @@ public abstract class MapSource
        /**
         * @return the file extension for the specified layer
         */
-       public abstract String getFileExtension(int inLayerNum);
+       public final String getFileExtension(int inLayerNum) {
+               return _extensions[inLayerNum];
+       }
 
        /**
         * Make the URL to get the specified tile
@@ -61,7 +67,7 @@ public abstract class MapSource
         */
        public String makeFilePath(int inLayerNum, int inZoom, int inX, int inY)
        {
-               return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + getFileExtension(inLayerNum);
+               return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
        }
 
        /**
@@ -121,16 +127,20 @@ public abstract class MapSource
        public abstract String getConfigString();
 
        /**
-        * @return semicolon-separated list of base urls in order
+        * @return semicolon-separated list of base urls and extensions in order
         */
        public String getSiteStrings()
        {
                StringBuilder sb = new StringBuilder();
-               for (int i=0; i<getNumLayers(); i++) {
+               for (int i=0; i<getNumLayers(); i++)
+               {
                        String url = getBaseUrl(i);
-                       if (url != null) {
+                       if (url != null)
+                       {
                                sb.append(url);
                                sb.append(';');
+                               sb.append(getFileExtension(i));
+                               sb.append(';');
                        }
                }
                return sb.toString();
index 24833ce3e7be4ce8f7f288068768d155cf394ed6..eae105515fe7960c1024badaed908fea8777a970 100644 (file)
@@ -39,12 +39,15 @@ public abstract class MapSourceLibrary
        private static void addFixedSources()
        {
                _sourceList.add(new OsmMapSource("Mapnik", "http://tile.openstreetmap.org/"));
-               _sourceList.add(new OsmMapSource("Osma", "http://tah.openstreetmap.org/Tiles/tile/"));
-               _sourceList.add(new OsmMapSource("Cyclemap", "http://andy.sandbox.cloudmade.com/tiles/cycle/"));
+               _sourceList.add(new OsmMapSource("Cyclemap", "http://tile.opencyclemap.org/cycle/"));
                _sourceList.add(new OsmMapSource("Reitkarte", "http://wanderreitkarte.de/hills/",
                        "http://topo2.wanderreitkarte.de/topo/", 18));
-               _sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", ".jpg",
-                       "http://maps-for-free.com/layer/water/", ".gif", 11));
+               _sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
+                       "http://maps-for-free.com/layer/water/", "gif", 11));
+               _sourceList.add(new OsmMapSource("Hikebikemap", "http://toolserver.org/tiles/hikebike/",
+                       "http://toolserver.org/~cmarqu/hill/", 18));
+               _sourceList.add(new OsmMapSource("Openseamap", "http://tile.openstreetmap.org/",
+                       "http://tiles.openseamap.org/seamark/", 18));
                _sourceList.add(new CloudmadeMapSource("Pale Dawn", "998", 18));
        }
 
@@ -88,6 +91,23 @@ public abstract class MapSourceLibrary
                _sourceList.add(inSource);
        }
 
+       /**
+        * Edit the given MapSource object by replacing with a new one
+        * @param inOriginal existing MapSource object
+        * @param inNewSource new MapSource object
+        */
+       public static void editSource(MapSource inOriginal, MapSource inNewSource)
+       {
+               // Check whether original source is still there
+               int origPos = _sourceList.indexOf(inOriginal);
+               if (origPos < 0) {
+                       addSource(inNewSource);
+               }
+               else {
+                       _sourceList.set(origPos, inNewSource);
+               }
+       }
+
        /**
         * @param inIndex source index number
         * @return corresponding map source object
index f7a281b1022ca8059a02e4fe9aef004431b464fc..829f824ffa09d06f6e37e2d3bd64e5bd7121725c 100644 (file)
@@ -24,6 +24,10 @@ public class MapTileManager implements ImageObserver
        private int _numLayers = -1;
        /** Current zoom level */
        private int _zoom = 0;
+       /** Currently blocked zoom level, to prevent looping for non-existent images */
+       private int _blockedZoom = 0;
+       /** Number of tiles in each direction for this zoom level */
+       private int _numTileIndices = 1;
 
 
        /**
@@ -33,6 +37,8 @@ public class MapTileManager implements ImageObserver
        public MapTileManager(MapCanvas inParent)
        {
                _parent = inParent;
+               // Adjust the index of the selected map source
+               adjustSelectedMap();
                resetConfig();
        }
 
@@ -45,6 +51,8 @@ public class MapTileManager implements ImageObserver
        public void centreMap(int inZoom, int inTileX, int inTileY)
        {
                _zoom = inZoom;
+               // Calculate number of tiles = 2^^zoom
+               _numTileIndices = 1 << _zoom;
                // Pass params onto all memory cachers
                if (_tempCaches != null) {
                        for (int i=0; i<_tempCaches.length; i++) {
@@ -69,8 +77,9 @@ public class MapTileManager implements ImageObserver
        public void clearMemoryCaches()
        {
                int numLayers = _mapSource.getNumLayers();
-               if (_tempCaches == null || _tempCaches.length != numLayers) {
-                       // Ccahers don't match, so need to create the right number of them
+               if (_tempCaches == null || _tempCaches.length != numLayers)
+               {
+                       // Cachers don't match, so need to create the right number of them
                        _tempCaches = new MemTileCacher[numLayers];
                        for (int i=0; i<numLayers; i++) {
                                _tempCaches[i] = new MemTileCacher();
@@ -96,6 +105,26 @@ public class MapTileManager implements ImageObserver
                _numLayers = _mapSource.getNumLayers();
        }
 
+       /**
+        * Adjust the index of the selected map
+        * (only required if config was loaded from a previous version of GpsPrune)
+        */
+       private void adjustSelectedMap()
+       {
+               int sourceNum = Config.getConfigInt(Config.KEY_MAPSOURCE_INDEX);
+               int prevNumFixed = Config.getConfigInt(Config.KEY_NUM_FIXED_MAPS);
+               // Number of fixed maps not specified in version <=13, default to 6
+               if (prevNumFixed == 0) prevNumFixed = 6;
+               int currNumFixed = MapSourceLibrary.getNumFixedSources();
+               // Only need to do something if the number has changed
+               if (currNumFixed != prevNumFixed && (sourceNum >= prevNumFixed || sourceNum >= currNumFixed))
+               {
+                       sourceNum += (currNumFixed - prevNumFixed);
+                       Config.setConfigInt(Config.KEY_MAPSOURCE_INDEX, sourceNum);
+               }
+               Config.setConfigInt(Config.KEY_NUM_FIXED_MAPS, currNumFixed);
+       }
+
        /**
         * @return the number of layers in the map
         */
@@ -112,6 +141,9 @@ public class MapTileManager implements ImageObserver
         */
        public Image getTile(int inLayer, int inX, int inY)
        {
+               // Check tile boundaries
+               if (inX < 0 || inX >= _numTileIndices || inY < 0 || inY >= _numTileIndices) return null;
+
                // Check first in memory cache for tile
                MemTileCacher tempCache = _tempCaches[inLayer]; // Should probably guard against nulls and array indexes here
                Image tile = tempCache.getTile(inX, inY);
@@ -135,8 +167,9 @@ public class MapTileManager implements ImageObserver
                        }
                }
                // Tile wasn't in memory or on disk, so if online let's get it
-               if (onlineMode)
+               if (onlineMode && _blockedZoom != _zoom)
                {
+                       _blockedZoom = 0; // reset to try again
                        try
                        {
                                URL tileUrl = new URL(_mapSource.makeURL(inLayer, _zoom, inX, inY));
@@ -173,6 +206,9 @@ public class MapTileManager implements ImageObserver
        {
                boolean loaded = (infoflags & ImageObserver.ALLBITS) > 0;
                boolean error = (infoflags & ImageObserver.ERROR) > 0;
+               if (error) {
+                       _blockedZoom = _zoom;
+               }
                if (loaded || error) {
                        _parent.tilesUpdated(loaded);
                }
index 772d8e92b96002fa37d8efefbd2ed12ab4ad1f49..42806fc75e7e104c8fa2c3140fc9ad9d0deec459 100644 (file)
@@ -14,8 +14,6 @@ public class MffMapSource extends MapSource
        private String[] _baseUrls = null;
        /** Site names */
        private String[] _siteNames = null;
-       /** File extensions */
-       private String[] _extensions = null;
        /** Maximum zoom level */
        private int _maxZoom = 0;
 
@@ -69,12 +67,7 @@ public class MffMapSource extends MapSource
         */
        public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
        {
-               return _baseUrls[inLayerNum] + "z" + inZoom + "/row" + inY + "/" + inZoom + "_" + inX + "-" + inY + getFileExtension(inLayerNum);
-       }
-
-       /** Get right file extension for this layer */
-       public final String getFileExtension(int inLayerNum) {
-               return _extensions[inLayerNum];
+               return _baseUrls[inLayerNum] + "z" + inZoom + "/row" + inY + "/" + inZoom + "_" + inX + "-" + inY + "." + getFileExtension(inLayerNum);
        }
 
        /**
index 768630731fd68e49fe4faeae4e1b26c6ce1d57cc..09def4597eb72977357930b9ea492c1c9d198a45 100644 (file)
@@ -5,7 +5,8 @@ import tim.prune.I18nManager;
 /**
  * Class to provide a map source for all OSM-like sources
  * (eg mapnik, opencyclemap, openpistemap etc).
- * These can be single-layer or double-layer sources with png tiles
+ * These can be single-layer or double-layer sources with tiles
+ * in various formats (default png)
  */
 public class OsmMapSource extends MapSource
 {
@@ -25,23 +26,59 @@ public class OsmMapSource extends MapSource
         */
        public OsmMapSource(String inName, String inUrl)
        {
-               this(inName, inUrl, null, 18);
+               this(inName, inUrl, "png", null, null, 18);
        }
 
        /**
-        * Constructor giving name, urls and maximum zoom
+        * Constructor giving name, two strings and maximum zoom
+        * @param inName source name
+        * @param inStr1 base layer url
+        * @param inStr2 either base layer extension or upper layer url
+        * @param inMaxZoom maximum zoom level
+        */
+       public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
+       {
+               if (inStr2 != null && inStr2.length() == 3)
+                       init(inName, inStr1, inStr2, null, null, 18);
+               else
+                       init(inName, inStr1, "png", inStr2, "png", 18);
+       }
+
+       /**
+        * Constructor giving name, urls, extensions and maximum zoom
         * @param inName source name
         * @param inUrl1 base layer url
+        * @param inExt1 extension for base layer
         * @param inUrl2 upper layer url
+        * @param inExt2 extension for top layer
         * @param inMaxZoom maximum zoom level
         */
-       public OsmMapSource(String inName, String inUrl1, String inUrl2, int inMaxZoom)
+       public OsmMapSource(String inName, String inUrl1, String inExt1,
+               String inUrl2, String inExt2, int inMaxZoom)
+       {
+               init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
+       }
+
+       /**
+        * Initialisation giving name, urls, extensions and maximum zoom
+        * @param inName source name
+        * @param inUrl1 base layer url
+        * @param inExt1 extension for base layer
+        * @param inUrl2 upper layer url
+        * @param inExt2 extension for top layer
+        * @param inMaxZoom maximum zoom level
+        */
+       private void init(String inName, String inUrl1, String inExt1,
+               String inUrl2, String inExt2, int inMaxZoom)
        {
                _name = inName;
                if (_name == null || _name.trim().equals("")) {_name = I18nManager.getText("mapsource.unknown");}
                _baseUrls = new String[2];
                _baseUrls[0] = fixBaseUrl(inUrl1);
                _baseUrls[1] = fixBaseUrl(inUrl2);
+               _extensions = new String[2];
+               _extensions[0] = inExt1;
+               _extensions[1] = inExt2;
                _siteNames = new String[2];
                _siteNames[0] = fixSiteName(_baseUrls[0]);
                _siteNames[1] = fixSiteName(_baseUrls[1]);
@@ -67,12 +104,15 @@ public class OsmMapSource extends MapSource
                {
                        String[] items = inConfigString.substring(2).split(";");
                        try {
-                               if (items.length == 3) {
+                               if (items.length == 3) { // single source url
                                        source = new OsmMapSource(items[0], items[1], null, Integer.parseInt(items[2]));
                                }
-                               else if (items.length == 4) {
+                               else if (items.length == 4) { // two urls or one url plus extension
                                        source = new OsmMapSource(items[0], items[1], items[2], Integer.parseInt(items[3]));
                                }
+                               else if (items.length == 6) { // two urls and two extensions
+                                       source = new OsmMapSource(items[0], items[1], items[2], items[3], items[4], Integer.parseInt(items[5]));
+                               }
                        } catch (NumberFormatException nfe) {}
                }
                return source;
@@ -105,12 +145,7 @@ public class OsmMapSource extends MapSource
         */
        public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
        {
-               return _baseUrls[inLayerNum] + inZoom + "/" + inX + "/" + inY + getFileExtension(inLayerNum);
-       }
-
-       /** file extension is always png */
-       public final String getFileExtension(int inLayerNum) {
-               return ".png";
+               return _baseUrls[inLayerNum] + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
        }
 
        /**
diff --git a/tim/prune/gui/map/OverlayPanel.java b/tim/prune/gui/map/OverlayPanel.java
new file mode 100644 (file)
index 0000000..e917e5a
--- /dev/null
@@ -0,0 +1,69 @@
+package tim.prune.gui.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+
+import javax.swing.JPanel;
+
+/**
+ * Semi-transparent panel to go on top of the map
+ * to contain a set of controls
+ */
+public class OverlayPanel extends JPanel
+{
+       // Previous dimensions to see if calculations necessary
+       private int _prevWidth = -1, _prevHeight = -1;
+       // Previously calculated border limits
+       private int _minX, _minY, _width, _height;
+
+       /**
+        * Constructor
+        */
+       public OverlayPanel()
+       {
+               setOpaque(false);
+       }
+
+       /**
+        * Paint the contents
+        */
+       public void paint(Graphics g)
+       {
+               int panelWidth = getWidth();
+               int panelHeight = getHeight();
+               if (panelWidth != _prevWidth || panelHeight != _prevHeight)
+               {
+                       calculateBorder();
+                       _prevWidth = panelWidth;
+                       _prevHeight = panelHeight;
+               }
+               // Draw white background
+               final Color BG = new Color(255, 255, 255, 200);
+               g.setColor(BG);
+               g.fillRect(_minX, _minY, _width, _height);
+               // Draw black border
+               g.setColor(Color.BLACK);
+               g.drawRect(_minX, _minY, _width, _height);
+               // Paint everything else
+               super.paint(g);
+       }
+
+       /**
+        * Calculate the boundaries to paint over
+        */
+       private void calculateBorder()
+       {
+               final int PADDING = 2;
+               // Calculate where the border should be drawn
+               final Component firstComp = getComponent(0);
+               final Component lastComp = getComponent(getComponentCount()-1);
+               _minX = Math.max(firstComp.getX() - PADDING, 0);
+               final int maxX = Math.min(lastComp.getX() + lastComp.getWidth() + PADDING, getWidth()-1);
+               _width = maxX - _minX;
+               _minY = Math.max(Math.min(firstComp.getY(), lastComp.getY()) - PADDING, 0);
+               final int maxY = Math.max(firstComp.getY()+firstComp.getHeight(), lastComp.getY()+lastComp.getHeight()) + PADDING;
+               _height = maxY - _minY;
+               //System.out.println("x from " + minx + " to " + maxx + ", y from " + miny + " to " + maxy);
+       }
+}
index f92046a798c1509aa1a049cb72c4cd78ea1170da..e3bfbea327dea79a2558a09fbe13cdb1976d0a77 100644 (file)
@@ -50,7 +50,7 @@ public class AltitudeData extends ProfileData
                                                _pointValues[i] = value;
                                                if (value < _minValue) {_minValue = value;}
                                                if (value > _maxValue) {_maxValue = value;}
-       
+
                                                _hasData = true;
                                                _pointHasData[i] = true;
                                        }
index 08f30128035a8c2f2b7a483ba3e69daeeacf30d9..4c90cabc687a6d7b0417632c36802cfba68134b6 100644 (file)
@@ -78,7 +78,7 @@ public class ExifReader
        /** "Original" Exif timestamp */\r
        public static final int TAG_DATETIME_ORIGINAL = 0x9003;\r
        /** "Creation" or "Digitized" timestamp */\r
-    public static final int TAG_DATETIME_DIGITIZED = 0x9004;\r
+       public static final int TAG_DATETIME_DIGITIZED = 0x9004;\r
        /** Thumbnail offset */\r
        private static final int TAG_THUMBNAIL_OFFSET = 0x0201;\r
        /** Thumbnail length */\r
index ae344cae8fb501d255bbef50f7d1cae16f26895a..248dfb75b51a74bf0c0bb7a08ecc8e5ad21155d3 100644 (file)
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megabyt\u016f
 dialog.diskcache.tileset=Mapov\u00fd podklad
 dialog.diskcache.tileset.multiple=v\u00edce sad
 dialog.diskcache.deleteold=Smazat star\u00e9 soubory
+dialog.diskcache.maximumage=Ponechat maxim\u00e1ln\u011b dn\u00ed
 dialog.diskcache.deleteall=Smazat v\u0161echny soubory
 dialog.diskcache.deleted1=Smaz\u00e1no
 dialog.diskcache.deleted2=soubor\u016f z cache
index 6e102d4468f56ff1f0f3eddd739faf7b68bd182d..745331a6c9a8f09e780b41f559559be00d85ba4d 100644 (file)
@@ -450,6 +450,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Ordner
 dialog.diskcache.tileset.multiple=mehrere
 dialog.diskcache.deleteold=Veraltete Kacheln l\u00f6schen
+dialog.diskcache.maximumage=Maximales Alter (Tage)
 dialog.diskcache.deleteall=Alle Kacheln l\u00f6schen
 dialog.diskcache.deleted1=Es wurden
 dialog.diskcache.deleted2=Dateien aus dem Ordner gel\u00f6scht
index 4e6f73ff5f40b54d9cbf8356b080cb3ddfe61cd0..38f0538b5599cc58b37b35a6ec830946fbcfc466 100644 (file)
@@ -450,6 +450,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Ordner
 dialog.diskcache.tileset.multiple=mehreri
 dialog.diskcache.deleteold=Uualti Kachle l\u00f6sche
+dialog.diskcache.maximumage=Maximali Alter (Tag)
 dialog.diskcache.deleteall=Alli Kachle l\u00f6sche
 dialog.diskcache.deleted1=Es sin
 dialog.diskcache.deleted2=Files uusem Ordner gl\u00f6scht worde
index d105404dea21a37978839aa934451b44aacfcdc9..003593b58a1700e52024f28c72651110294d095f 100644 (file)
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Tileset
 dialog.diskcache.tileset.multiple=multiple
 dialog.diskcache.deleteold=Delete old tiles
+dialog.diskcache.maximumage=Maximum age (days)
 dialog.diskcache.deleteall=Delete all tiles
 dialog.diskcache.deleted1=Deleted
 dialog.diskcache.deleted2=files from the cache
diff --git a/tim/prune/lang/prune-texts_en_US.properties b/tim/prune/lang/prune-texts_en_US.properties
new file mode 100644 (file)
index 0000000..b2b2fc2
--- /dev/null
@@ -0,0 +1,17 @@
+# Text entries for the GpsPrune application
+# American English entries (just the ones which are different from EN)
+
+# Functions
+function.setcolours=Set colors
+
+# Dialogs
+dialog.exportkml.trackcolour=Track color
+dialog.saveconfig.prune.languagecode=Language code (EN_US)
+dialog.setcolours.intro=Click on a color patch to change the color
+
+# Measurement units
+units.metres=Meters
+units.kilometres=Kilometers
+
+# External urls
+url.googlemaps=maps.google.com
index 6cd6654fe5507fd01aa74acd67d5a6c26302783e..49bc392e06a2fae6168b18d9f8b4d0b4e38441f9 100644 (file)
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Conjunto de recuadros
 dialog.diskcache.tileset.multiple=varios
 dialog.diskcache.deleteold=Borrar recuadros antiguos
+dialog.diskcache.maximumage=Edad m\u00e1xima (dias)
 dialog.diskcache.deleteall=Borrar todos los recuadros
 dialog.diskcache.deleted1=Borrado
 dialog.diskcache.deleted2=Archivos del cache
@@ -716,6 +717,6 @@ error.lookupsrtm.nonerequired=Todos los puntos tienen altitudes, as\u00ed que no
 error.gpsies.uploadnotok=El servidor de gpsies ha devuelto el mensaje
 error.gpsies.uploadfailed=La carga ha fallado con el error
 error.playaudiofailed=Fallo reproduciendo archivo de audio
-error.cache.notthere=No se encontr\u00f3 la carpeta del cache de recuadros 
+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
index 1336c010701931f6879dd3cd973eafae6efd582e..da5b1b6e5a554af35f1fba17e6911ea691f862cd 100644 (file)
@@ -42,7 +42,7 @@ menu.view.browser.yahoo=Yahoo! Maps
 menu.view.browser.bing=Bing Maps
 menu.settings=Be\u00e1ll\u00edt\u00e1sok
 menu.settings.onlinemode=T\u00e9rk\u00e9pek bet\u00f6lt\u00e9se az internetr\u0151l
-menu.settings.autosave=Be\u00e1ll\u00edt\u00e1sok automatikus ment\u00e9se a programb\u00f3l t\u00f6rt\u00e9n\u0151 kil\u00e9p\u00e9skor
+menu.settings.autosave=Be\u00e1ll\u00edt\u00e1sok automatikus ment\u00e9se kil\u00e9p\u00e9skor
 menu.help=S\u00fag\u00f3
 # Popup menu for map
 menu.map.zoomin=Nagy\u00edt\u00e1s
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megab\u00e1jt
 dialog.diskcache.tileset=Csempecsoport
 dialog.diskcache.tileset.multiple=t\u00f6bb
 dialog.diskcache.deleteold=R\u00e9gi csemp\u00e9k t\u00f6rl\u00e9se
+dialog.diskcache.maximumage=Maxim\u00e1lis kor (nap)
 dialog.diskcache.deleteall=Az \u00f6sszes csempe t\u00f6rl\u00e9se
 dialog.diskcache.deleted1=
 dialog.diskcache.deleted2=f\u00e1jl t\u00f6r\u00f6lve a gyors\u00edt\u00f3t\u00e1rb\u00f3l
index eb4d1ff0b46f4d982646afff44ff44d9e7e9025c..a15ceb19fb7289cb5390fa8eb13c94a4d39d4497 100644 (file)
@@ -1,10 +1,10 @@
 # Text entries for the GpsPrune application
-# Italian entries thanks to josatoc
+# Italian entries thanks to josatoc and others
 
 # Menu entries
 menu.file=File
 menu.file.addphotos=Aggiungi foto
-menu.file.recentfiles=File recenti
+menu.file.recentfiles=Files recenti
 menu.file.save=Salva
 menu.file.exit=Esci
 menu.track=Traccia
@@ -42,6 +42,7 @@ menu.view.browser.yahoo=mappe Yahoo
 menu.view.browser.bing=mappe Bing
 menu.settings=Preferenze
 menu.settings.onlinemode=Carica mappa da internet
+menu.settings.autosave=Salva settaggi con chiusura del programma
 menu.help=Aiuto
 # Popup menu for map
 menu.map.zoomin=Zoom +
@@ -76,6 +77,7 @@ shortcut.menu.help.help=H
 
 # Functions
 function.open=Apri file
+function.importwithgpsbabel=Importa file con GPSBabel
 function.loadfromgps=Carica dati da GPS
 function.sendtogps=Invia dati al GPS
 function.exportkml=Esporta in KML
@@ -127,6 +129,7 @@ function.about=Informazioni su GpsPrune
 function.checkversion=Controlla gli aggiornamenti
 function.saveconfig=Salva configurazione
 function.diskcache=Salva mappe su disco
+function.managetilecache=Gestione del cache di tasselli
 
 # Dialogs
 dialog.exit.confirm.title=Esci da GpsPrune
@@ -190,7 +193,8 @@ dialog.exportgpx.name=Nome
 dialog.exportgpx.desc=Descrizione
 dialog.exportgpx.includetimestamps=Includi dati temporali
 dialog.exportgpx.copysource=Copia xml sorgente
-dialog.exportgpx.encoding.system=Sistema
+dialog.exportgpx.encoding=Codifica caratteri
+dialog.exportgpx.encoding.system=Impostazione di diffetto
 dialog.exportgpx.encoding.utf8=UTF-8
 dialog.exportpov.text=Per favore inserisci i parametri per l'esportazione in POV
 dialog.exportpov.font=Font
@@ -344,6 +348,7 @@ dialog.compress.wackypoints.paramdesc=Fattore distanza
 dialog.compress.singletons.title=Cancella solitari
 dialog.compress.singletons.paramdesc=Fattore distanza
 dialog.compress.duplicates.title=Cancella duplicati
+dialog.compress.douglaspeucker.title=Compressione con algoritmo Douglas-Peucker
 dialog.compress.summarylabel=Punti da cancellare
 dialog.pastecoordinates.desc=Inserisci o incolla qui le coordinate
 dialog.pastecoordinates.coords=Coordinate
@@ -412,6 +417,7 @@ dialog.saveconfig.prune.kmzimageheight=altezza immagine KMZ
 dialog.saveconfig.prune.colourscheme=Schema colori
 dialog.saveconfig.prune.linewidth=Spessore linea
 dialog.saveconfig.prune.kmltrackcolour=Colore della traccia KML
+dialog.saveconfig.prune.autosavesettings=Salvare settaggi automaticamente
 dialog.setpaths.intro=Se necessario, puoi indicare il percorso delle applicazioni esterne:
 dialog.setpaths.found=trovato?
 dialog.addaltitude.noaltitudes=L'intervallo selezionato non contiene altitudini
@@ -435,10 +441,23 @@ dialog.setlanguage.secondintro=Devi salvare le impostazioni e<p> riavviare GpsPr
 dialog.setlanguage.language=Lingua
 dialog.setlanguage.languagefile=File della lingua
 dialog.setlanguage.endmessage=Ora salva le tue preferenze e riavvia GpsPrune\n per rendere effettivo il cambio di lingua
+dialog.setlanguage.endmessagewithautosave=Riavviare il programma per rendere attivo il cambio di lingua
 dialog.diskcache.save=Salva la mappa sul disco
 dialog.diskcache.dir=Cartella della cache
 dialog.diskcache.createdir=Crea cartella
 dialog.diskcache.nocreate=Cartella della cache non creata
+dialog.diskcache.table.path=Percorso (Path)
+dialog.diskcache.table.usedby=Utilizzato da
+dialog.diskcache.table.zoom=Zoom
+dialog.diskcache.table.tiles=Tasselli
+dialog.diskcache.table.megabytes=Megabytes
+dialog.diskcache.tileset=Insieme di tasselli
+dialog.diskcache.tileset.multiple=molteplici
+dialog.diskcache.deleteold=Cancellare tasselli vecchi
+dialog.diskcache.maximumage=Et\u00e0 massima (giorni)
+dialog.diskcache.deleteall=Cancellare tutti tasselli
+dialog.diskcache.deleted1=Cancellati
+dialog.diskcache.deleted2=files dal cache
 dialog.deletefieldvalues.intro=Selezione il campo da cancellare dall'intervallo corrente
 dialog.setlinewidth.text=Specifica il tratteggio delle linee per disegnare la traccia (1-4)
 dialog.downloadosm.desc=Conferma lo scarico dei dati raw OSM per l'area specificata:
@@ -519,6 +538,7 @@ button.resettodefaults=Ripristina predefinito
 button.browse=Sfoglia...
 button.addnew=Aggiungi nuovo
 button.delete=Cancella
+button.manage=Gestici
 
 # File types
 filetype.txt=File TXT
@@ -570,6 +590,7 @@ details.lists.audio=Ripresa audio
 details.photodetails=Dettagli foto
 details.nophoto=Nessuna foto selezionata
 details.photo.loading=Caricamento
+details.photo.bearing=Direzione
 details.media.connected=Collegata
 details.audiodetails=Dettagli ripresa audio
 details.noaudio=Nessuna ripresa audio selezionata
@@ -593,6 +614,7 @@ fieldname.movingdistance=Distanza in movimento
 fieldname.duration=Durata
 fieldname.speed=Velocit\u00e0
 fieldname.verticalspeed=Velocit\u00e0 verticale
+fieldname.description=Descrizione
 
 # Measurement units
 units.original=Originale
@@ -694,3 +716,6 @@ error.lookupsrtm.nonerequired=Tutti i punti hanno gi\u00e0 una quota, non c'\u00
 error.gpsies.uploadnotok=Il server Gpsies ha riportato il messaggio
 error.gpsies.uploadfailed=Il caricamento \u00e8 fallito con l'errore
 error.playaudiofailed=Ripresa audio non riprodotta
+error.cache.notthere=Directory del cache di tasselli non trovato
+error.cache.empty=Directory del cache di tasselli \u00e8 vuoto
+error.cache.cannotdelete=Impossibile cancellare tasselli
index ec9efa520c711a84237999e2cbd509197a8dd9d8..6b92a569691076d2ee9de0f2e85ab31cbc16be7f 100644 (file)
@@ -1,5 +1,5 @@
 # Text entries for the GpsPrune application
-# Dutch entries as extra
+# Dutch entries
 
 # Menu entries
 menu.file=Bestand
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Tegelset
 dialog.diskcache.tileset.multiple=meerdere
 dialog.diskcache.deleteold=Verwijder oude tegels
+dialog.diskcache.maximumage=Maximum leeftijd (dagen)
 dialog.diskcache.deleteall=Verwijder alle tegels
 dialog.diskcache.deleted1=
 dialog.diskcache.deleted2=bestanden uit de cache verwijderd
index c0f9982bc7518fbdc738a28867d56ba057b41f91..f76d7af6164373b02400b82a4b2aa0159d451081 100644 (file)
@@ -1,5 +1,5 @@
 # Text entries for the GpsPrune application
-# Polish entries as extra
+# Polish entries
 
 # Menu entries
 menu.file=Plik
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=megabajt\u00f3w
 dialog.diskcache.tileset=zestaw p\u0142ytek
 dialog.diskcache.tileset.multiple=wiele
 dialog.diskcache.deleteold=Usu\u0144 stare p\u0142ytki
+dialog.diskcache.maximumage=Maksymalny wiek (w dniach)
 dialog.diskcache.deleteall=Usu\u0144 wszystkie p\u0142ytki
 dialog.diskcache.deleted1=Usuni\u0119to
 dialog.diskcache.deleted2=plik\u00f3w z kesza
index 8d09afebe951cea13c9a4e85cbf24a450e6e86b4..6266d43dc350e7915ea22959cc3bf5adbb9de86b 100644 (file)
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Conjunto de fundos
 dialog.diskcache.tileset.multiple=m\u00faltiplos
 dialog.diskcache.deleteold=Apagar fundos antigos
+dialog.diskcache.maximumage=Idade m\u00e1xima (dias)
 dialog.diskcache.deleteall=Apagar todos os fundos
 dialog.diskcache.deleted1=Removidos
 dialog.diskcache.deleted2=arquivos do cache
index cfb6a1794f794b74dd0976ddf4b0555768441fd7..4df01434bf170e53c2eb207a18a41452c515bd69 100644 (file)
@@ -1,5 +1,5 @@
 # Text entries for the GpsPrune application
-# Romanian entries as extra
+# Romanian entries
 
 # Menu entries
 menu.file=Fi\u015fier
@@ -51,8 +51,8 @@ menu.map.showmap=Arata harta
 
 # Alt keys for menus
 altkey.menu.file=F
-altkey.menu.edit=E
-altkey.menu.select=S
+altkey.menu.track=T
+altkey.menu.point=P
 altkey.menu.view=V
 altkey.menu.photo=O
 altkey.menu.help=A
@@ -70,13 +70,14 @@ function.sendtogps=Trimite date spre GPS
 function.exportkml=Export\u0103 \u00eentr-un fi\u015fier KML
 function.exportgpx=Export\u0103 \u00eentr-un fi\u015fier GPX
 function.exportpov=Export\u0103 \u00eentr-un fi\u015fier POV
+function.exportsvg=Export\u0103 \u00eentr-un fi\u015fier SVG
 function.editwaypointname=Editare nume waypoint
 function.compress=Comprima traseu
 function.charts=Grafice
 function.show3d=Vizualizare arborescenta
 function.distances=Distan\u0163e
 function.setmapbg=Fundal
-function.correlatephotos=Corela fotografii
+function.correlatephotos=Corelare fotografii
 function.setcolours=Selectare culorile
 function.setlanguage=Selectare limba
 function.help=Ajutor
@@ -102,9 +103,19 @@ dialog.delimiter.comma=Virgula ,
 dialog.delimiter.tab=Tab
 dialog.delimiter.space=Spatiu
 dialog.delimiter.semicolon=Punct si virgula :
-dialog.delimiter.other=Altul
+dialog.delimiter.other=Alte
+dialog.openoptions.deliminfo.records=inregistrari, cu
 dialog.openoptions.deliminfo.fields=cimpuri
 dialog.openoptions.deliminfo.norecords=Nu sunt inregistrari
+dialog.jpegload.subdirectories=Include subdirectori
+dialog.jpegload.loadjpegswithoutcoords=Include fotografii fara coordonate
+dialog.jpegload.loadjpegsoutsidearea=Include fotografii din afara zonei curente
+dialog.jpegload.progress.title=Incarcare fotografii
+dialog.jpegload.progress=Va rog sa asteptati, caut fotografiile
+dialog.gpsload.nogpsbabel=Nu gasesc programul gpsbabel. Continui ?
+dialog.gpsload.device=Nume dispozitiv
+dialog.gpsload.format=Format
+dialog.gpsload.getwaypoints=Incarcare waypoints
 dialog.save.overwrite.text=Fi\u015fierul exist\u0103. \u00cel suprascriu?
 dialog.pointedit.text=V\u0103 rog selecta\u0163i r\u00e2ndul care va fi editat
 dialog.pointedit.table.field=Cimp
@@ -136,7 +147,7 @@ dialog.about.readme=Cite\u015fte-m\u0103
 dialog.checkversion.releasedate1=Aceasta versiune noua a fost lansapa pe
 dialog.checkversion.releasedate2=.
 
-# Confirm messages || These are displayed as confirmation in the status bar
+# Confirm messages
 confirm.loadfile=Date incarcate din fisier
 confirm.save.ok1=Salvat cu succes
 
diff --git a/tim/prune/lang/prune-texts_ru.properties b/tim/prune/lang/prune-texts_ru.properties
new file mode 100644 (file)
index 0000000..14caca8
--- /dev/null
@@ -0,0 +1,724 @@
+# Text entries for the GpsPrune application
+# Russian entries thanks to Sergey
+
+# Menu entries
+menu.file=\u0424\u0430\u0439\u043b
+menu.file.addphotos=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+menu.file.recentfiles=\u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0444\u0430\u0439\u043b\u044b
+menu.file.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442
+menu.file.exit=\u0412\u044b\u0445\u043e\u0434
+menu.track=\u0422\u0440\u0435\u043a
+menu.track.undo=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+menu.track.clearundo=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439
+menu.track.deletemarked=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+menu.track.rearrange=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b
+menu.track.rearrange.start=\u0412\u0441\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430
+menu.track.rearrange.end=\u0412\u0441\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430
+menu.track.rearrange.nearest=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439
+menu.range=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+menu.range.all=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+menu.range.none=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443
+menu.range.start=\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+menu.range.end=\u041a\u043e\u043d\u0435\u0446 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+menu.range.deleterange=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+menu.range.interpolate=\u0422\u043e\u0447\u043a\u0430 \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438
+menu.range.average=\u0422\u043e\u0447\u043a\u0430 \u043f\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u0443
+menu.range.reverse=\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+menu.range.mergetracksegments=\u0421\u043b\u0438\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0442\u0440\u0435\u043a\u0430
+menu.range.cutandmove=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443
+menu.point=\u0422\u043e\u0447\u043a\u0430
+menu.point.editpoint=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+menu.point.deletepoint=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+menu.photo=\u0424\u043e\u0442\u043e
+menu.photo.saveexif=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 Exif
+menu.audio=\u0417\u0432\u0443\u043a
+menu.view=\u0412\u0438\u0434
+menu.view.showsidebars=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c
+menu.view.browser=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435
+menu.view.browser.google=Google maps
+menu.view.browser.openstreetmap=Openstreetmap
+menu.view.browser.mapquest=Mapquest
+menu.view.browser.yahoo=Yahoo maps
+menu.view.browser.bing=Bing maps
+menu.settings=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438
+menu.settings.onlinemode=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442
+menu.settings.autosave=\u0410\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435
+menu.help=\u041f\u043e\u043c\u043e\u0449\u044c
+# Popup menu for map
+menu.map.zoomin=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c
+menu.map.zoomout=\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c
+menu.map.zoomfull=\u0423\u0432\u0435\u043b\u0447\u0438\u0442\u044c \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u0448\u043a\u0430\u043b\u044b
+menu.map.newpoint=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443
+menu.map.drawpoints=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a
+menu.map.connect=\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0442\u0440\u0435\u043a\u0430 \u0441 \u043b\u0438\u043d\u0438\u0435\u0439
+menu.map.autopan=\u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+menu.map.showmap=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u041e\u0421\u041c-\u043a\u0430\u0440\u0442\u0443
+menu.map.showscalebar=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043a\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430
+
+# Alt keys for menus
+altkey.menu.file=F
+altkey.menu.track=T
+altkey.menu.range=R
+altkey.menu.point=P
+altkey.menu.view=V
+altkey.menu.photo=O
+altkey.menu.audio=A
+altkey.menu.settings=S
+altkey.menu.help=H
+
+# Ctrl shortcuts for menu items
+shortcut.menu.file.open=O
+shortcut.menu.file.load=L
+shortcut.menu.file.save=S
+shortcut.menu.track.undo=Z
+shortcut.menu.edit.compress=C
+shortcut.menu.range.all=A
+shortcut.menu.help.help=H
+
+# Functions
+function.open=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b
+function.importwithgpsbabel=\u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u0430\u0439\u043b\u0430 \u0441 GPSBabel
+function.loadfromgps=\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 GPS
+function.sendtogps=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 GPS
+function.exportkml=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 KML
+function.exportgpx=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 GPX
+function.exportpov=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 POV
+function.exportsvg=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 SVG
+function.editwaypointname=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438
+function.compress=\u0421\u0436\u0430\u0442\u044c \u0442\u0440\u0435\u043a
+function.addtimeoffset=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+function.addaltitudeoffset=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0432\u044b\u0441\u043e\u0442\u044b
+function.convertnamestotimes=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f
+function.deletefieldvalues=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f
+function.findwaypoint=\u041d\u0430\u0439\u0442\u0438 \u043f\u0443\u0442\u0435\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443
+function.pastecoordinates=\u0412\u0432\u043e\u0434 \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442
+function.charts=\u0413\u0440\u0430\u0444\u0438\u043a\u0438
+function.show3d=3D-\u0432\u0438\u0434
+function.distances=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f
+function.fullrangedetails=\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443
+function.setmapbg=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443-\u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0443
+function.setkmzimagesize=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 KMZ-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f
+function.setpaths=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0443\u0442\u0438 \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c
+function.getgpsies=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0440\u0435\u043a\u0438
+function.uploadgpsies=\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0440\u0435\u043a \u043d\u0430 gpsies.com
+function.lookupsrtm=\u0412\u044b\u0441\u043e\u0442\u044b \u0432 SRTM
+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.downloadosm=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c OSM \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044e
+function.duplicatepoint=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0442\u0440\u0435\u043a\u0430
+function.setcolours=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430
+function.setlinewidth=\u0417\u0430\u0434\u0430\u0442\u044c \u0448\u0438\u0440\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438
+function.setlanguage=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a
+function.connecttopoint=\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043a \u0442\u043e\u0447\u043a\u0435
+function.disconnectfrompoint=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043e\u0442 \u0442\u043e\u0447\u043a\u0438
+function.removephoto=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+function.correlatephotos=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0444\u043e\u0442\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+function.rearrangephotos=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u043f\u043e \u0442\u0440\u0435\u043a\u0443
+function.rotatephotoleft=\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0444\u043e\u0442\u043e \u043d\u0430 90 \u0432\u043b\u0435\u0432\u043e
+function.rotatephotoright=\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0444\u043e\u0442\u043e \u043d\u0430 90 \u0432\u043f\u0440\u0430\u0432\u043e
+function.photopopup=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u043e\u0442\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435
+function.ignoreexifthumb=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u0444\u043e\u0442\u043e
+function.loadaudio=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+function.removeaudio=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+function.correlateaudios=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+function.playaudio=\u041f\u0440\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+function.stopaudio=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+function.help=\u041f\u043e\u043c\u043e\u0449\u044c
+function.showkeys=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+function.about=\u041e GpsPrune
+function.checkversion=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f
+function.saveconfig=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438
+function.diskcache=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a
+function.managetilecache=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0435\u0448\u0435\u043c
+
+# Dialogs
+dialog.exit.confirm.title=\u0412\u044b\u0445\u043e\u0434
+dialog.exit.confirm.text=\u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b! \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+dialog.openappend.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445.
+dialog.openappend.text=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c?
+dialog.deletepoint.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+dialog.deletepoint.deletephoto=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u0443 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438?
+dialog.deletephoto.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+dialog.deletephoto.deletepoint=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0443 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0442\u043e?
+dialog.openoptions.title=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043e\u043f\u0446\u0438\u0438
+dialog.openoptions.filesnippet=\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0444\u0430\u0439\u043b\u0430
+dialog.load.table.field=\u041f\u043e\u043b\u0435
+dialog.load.table.datatype=\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445
+dialog.load.table.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+dialog.delimiter.label=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0435\u0439
+dialog.delimiter.comma=\u0417\u0430\u043f\u044f\u0442\u0430\u044f ,
+dialog.delimiter.tab=Tab
+dialog.delimiter.space=\u041f\u0440\u043e\u0431\u0435\u043b
+dialog.delimiter.semicolon=\u0422\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 ;
+dialog.delimiter.other=\u0414\u0440\u0443\u0433\u043e\u0435
+dialog.openoptions.deliminfo.records=\u0437\u0430\u043f\u0438\u0441\u044c, \u0441
+dialog.openoptions.deliminfo.fields=\u043f\u043e\u043b\u0435
+dialog.openoptions.deliminfo.norecords=\u041d\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439
+dialog.openoptions.altitudeunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0432\u044b\u0441\u043e\u0442
+dialog.open.contentsdoubled=\u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0435,\n\u043e\u0434\u043d\u0430 \u043a\u0430\u043a \u043f\u0443\u0442\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438 \u043e\u0434\u043d\u0430 \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0430 \u0442\u0440\u0435\u043a\u0430
+dialog.selecttracks.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0440\u0435\u043a(-\u0438) \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f
+dialog.selecttracks.noname=\u0411\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439
+dialog.jpegload.subdirectories=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438
+dialog.jpegload.loadjpegswithoutcoords=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u0431\u0435\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442
+dialog.jpegload.loadjpegsoutsidearea=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438
+dialog.jpegload.progress.title=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e
+dialog.jpegload.progress=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u0438\u0434\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0444\u043e\u0442\u043e
+dialog.gpsload.nogpsbabel=Gpsbabel \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+dialog.gpsload.device=\u0418\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430
+dialog.gpsload.format=\u0424\u043e\u0440\u043c\u0430\u0442
+dialog.gpsload.getwaypoints=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0443\u0442\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+dialog.gpsload.gettracks=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0440\u0435\u043a\u0438
+dialog.gpsload.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b
+dialog.gpssend.sendwaypoints=\u041f\u043e\u0441\u043b\u0430\u0442\u044c \u043f\u0443\u0442\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+dialog.gpssend.sendtracks=\u041f\u043e\u0441\u043b\u0430\u0442\u044c \u0442\u0440\u0435\u043a\u0438
+dialog.gpssend.trackname=\u0418\u043c\u044f \u0442\u0440\u0435\u043a\u0430
+dialog.saveoptions.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b
+dialog.save.fieldstosave=\u041f\u043e\u043b\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435
+dialog.save.table.field=\u041f\u043e\u043b\u0435
+dialog.save.table.hasdata=\u0418\u043c\u0435\u0435\u0442 \u0434\u0430\u0442\u0443
+dialog.save.table.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+dialog.save.headerrow=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u043e\u043a\u0438
+dialog.save.coordinateunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442
+dialog.save.altitudeunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0432\u044b\u0441\u043e\u0442\u044b
+dialog.save.timestampformat=\u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.save.overwrite.title=\u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442
+dialog.save.overwrite.text=\u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c?
+dialog.save.notypesselected=\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d \u0442\u0438\u043f \u0442\u043e\u0447\u0435\u043a
+dialog.exportkml.text=\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a \u0434\u0430\u043d\u043d\u044b\u043c
+dialog.exportkml.altitude=\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u0432\u044b\u0441\u043e\u0442\u044b (\u0434\u043b\u044f \u0430\u0432\u0438\u0430\u0446\u0438\u0438)
+dialog.exportkml.kmz=\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u043b\u044f kmz-\u0444\u0430\u0439\u043b\u0430
+dialog.exportkml.exportimages=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u044d\u0441\u043a\u0438\u0437\u0430 \u0432 kmz
+dialog.exportkml.trackcolour=\u0426\u0432\u0435\u0442 \u0442\u0440\u0435\u043a\u0430
+dialog.exportgpx.name=\u0418\u043c\u044f
+dialog.exportgpx.desc=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+dialog.exportgpx.includetimestamps=\u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.exportgpx.copysource=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a xml
+dialog.exportgpx.encoding=\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430
+dialog.exportgpx.encoding.system=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f
+dialog.exportgpx.encoding.utf8=UTF-8
+dialog.exportpov.text=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 POV
+dialog.exportpov.font=\u0428\u0440\u0438\u0444\u0442
+dialog.exportpov.camerax=\u041a\u0430\u043c\u0435\u0440\u0430 X
+dialog.exportpov.cameray=\u041a\u0430\u043c\u0435\u0440\u0430 Y
+dialog.exportpov.cameraz=\u041a\u0430\u043c\u0435\u0440\u0430 Z
+dialog.exportpov.modelstyle=\u0421\u0442\u0438\u043b\u044c \u043c\u043e\u0434\u0435\u043b\u0438
+dialog.exportpov.ballsandsticks=\u041c\u044f\u0447\u0438 \u0438 \u043f\u0430\u043b\u043e\u0447\u043a\u0438
+dialog.exportpov.tubesandwalls=\u0422\u0440\u0443\u0431\u044b \u0438 \u0441\u0442\u0435\u043d\u044b
+dialog.exportpov.warningtracksize=\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0432 \u0442\u0440\u0435\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a - Java3D \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c!\n\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+dialog.exportsvg.text=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 SVG
+dialog.exportsvg.phi=\u0410\u0437\u0438\u043c\u0443\u0442 \u03d5
+dialog.exportsvg.theta=\u0423\u0433\u043e\u043b \u03b8
+dialog.exportsvg.gradients=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f
+dialog.pointtype.desc=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0442\u043e\u0447\u0435\u043a:
+dialog.pointtype.track=\u0422\u043e\u0447\u043a\u0438 \u0442\u0440\u0435\u043a\u043e\u0432
+dialog.pointtype.waypoint=\u041f\u0443\u0442\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+dialog.pointtype.photo=\u0422\u043e\u0447\u043a\u0438 \u0441 \u0444\u043e\u0442\u043e
+dialog.pointtype.audio=\u0422\u043e\u0447\u043a\u0438 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c
+dialog.pointtype.selection=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+dialog.confirmreversetrack.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442
+dialog.confirmreversetrack.text=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430.\n\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435?
+dialog.confirmcutandmove.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 "\u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438"
+dialog.confirmcutandmove.text=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f.\n\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435?
+dialog.interpolate.title=\u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0442\u043e\u0447\u0435\u043a
+dialog.interpolate.parameter.text=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438
+dialog.undo.title=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435(\u044f)
+dialog.undo.pretext=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435(\u044f)
+dialog.undo.none.title=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+dialog.undo.none.text=\u041d\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b
+dialog.clearundo.title=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b
+dialog.clearundo.text=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b?\ n\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0438\u0449\u0435\u043d \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430!
+dialog.pointedit.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+dialog.pointedit.text=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 Â«\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c» \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
+dialog.pointedit.table.field=\u041f\u043e\u043b\u0435
+dialog.pointedit.table.value=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435
+dialog.pointedit.table.changed=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e
+dialog.pointedit.changevalue.text=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f
+dialog.pointedit.changevalue.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435
+dialog.pointnameedit.name=\u0418\u043c\u044f \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438
+dialog.pointnameedit.uppercase=\u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440
+dialog.pointnameedit.lowercase=\u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440
+dialog.pointnameedit.sentencecase=\u041a\u0430\u0436\u0434\u043e\u0435 \u0421\u043b\u043e\u0432\u043e \u0441 \u0417\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439
+dialog.addtimeoffset.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435
+dialog.addtimeoffset.subtract=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043e
+dialog.addtimeoffset.days=\u0414\u043d\u0438
+dialog.addtimeoffset.hours=\u0427\u0430\u0441\u044b
+dialog.addtimeoffset.minutes=\u041c\u0438\u043d\u0443\u0442\u044b
+dialog.addtimeoffset.notimestamps=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438
+dialog.findwaypoint.intro=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438\u043b\u0438 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c
+dialog.findwaypoint.search=\u041f\u043e\u0438\u0441\u043a
+dialog.saveexif.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c Exif
+dialog.saveexif.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u043b\u0430\u0436\u043a\u0438
+dialog.saveexif.nothingtosave=\u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c!
+dialog.saveexif.noexiftool=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 ExifTool. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+dialog.saveexif.table.photoname=\u0418\u043c\u044f \u0444\u043e\u0442\u043e
+dialog.saveexif.table.status=\u0421\u0442\u0430\u0442\u0443\u0441
+dialog.saveexif.table.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+dialog.saveexif.photostatus.connected=\u0424\u043e\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u043e\u0439
+dialog.saveexif.photostatus.disconnected=\u0424\u043e\u0442\u043e \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043e\u0442 \u0442\u043e\u0447\u043a\u0438
+dialog.saveexif.photostatus.modified=\u0422\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u0444\u043e\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430
+dialog.saveexif.overwrite=\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b
+dialog.saveexif.force=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438
+dialog.charts.xaxis=\u043e\u0441\u044c \u0425
+dialog.charts.yaxis=\u043e\u0441\u044c Y
+dialog.charts.output=\u0412\u044b\u0432\u043e\u0434
+dialog.charts.screen=\u0412\u044b\u0432\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d
+dialog.charts.svg=\u0412\u044b\u0432\u043e\u0434 \u0432 SVG-\u0444\u0430\u0439\u043b
+dialog.charts.svgwidth=\u0448\u0438\u0440\u0438\u043d\u0430 SVG
+dialog.charts.svgheight=\u0432\u044b\u0441\u043e\u0442\u0430 SVG
+dialog.charts.needaltitudeortimes=\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0442\u0440\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0435
+dialog.charts.gnuplotnotfound=\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 gnuplot \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430
+dialog.distances.intro=\u041a\u0440\u043e\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438
+dialog.distances.column.from=\u041e\u0442 \u0442\u043e\u0447\u043a\u0438
+dialog.distances.column.to=\u0414\u043e \u0442\u043e\u0447\u043a\u0438
+dialog.distances.currentpoint=\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430
+dialog.distances.toofewpoints=\u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0434\u0432\u0443\u0445 \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
+dialog.fullrangedetails.intro=\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+dialog.setmapbg.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0444\u043e\u043d\u0430 \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043d\u043e\u0432\u044b\u0439
+dialog.addmapsource.title=\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0444\u043e\u043d\u0430
+dialog.addmapsource.sourcename=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430
+dialog.addmapsource.layer1url=URL \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f
+dialog.addmapsource.layer2url=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 URL \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043b\u043e\u044f
+dialog.addmapsource.maxzoom=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
+dialog.addmapsource.cloudstyle=\u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0438\u043b\u044f
+dialog.addmapsource.noname=\u0411\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439
+dialog.gpsies.column.name=\u0418\u043c\u044f \u0442\u0440\u0435\u043a\u0430
+dialog.gpsies.column.length=\u0414\u043b\u0438\u043d\u0430
+dialog.gpsies.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+dialog.gpsies.nodescription=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
+dialog.gpsies.nonefound=\u0422\u0440\u0435\u043a\u043e\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
+dialog.gpsies.username=\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432 Gpsies
+dialog.gpsies.password=\u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Gpsies
+dialog.gpsies.keepprivate=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0442\u0440\u0435\u043a
+dialog.gpsies.confirmopenpage=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0442\u0440\u0435\u043a\u0430 \u043d\u0430 \u0441\u0430\u0439\u0442 gpsies.com?
+dialog.gpsies.activities=\u0422\u0438\u043f\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438
+dialog.gpsies.activity.trekking=\u041f\u0435\u0448\u0438\u0439 \u0442\u0443\u0440\u0438\u0437\u043c
+dialog.gpsies.activity.walking=\u0425\u043e\u0434\u044c\u0431\u0430
+dialog.gpsies.activity.jogging=\u0411\u0435\u0433
+dialog.gpsies.activity.biking=\u041d\u0430 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0435
+dialog.gpsies.activity.motorbiking=\u041d\u0430 \u043c\u043e\u0442\u043e\u0446\u0438\u043a\u043b\u0435
+dialog.gpsies.activity.snowshoe=\u041d\u0430 \u0441\u043d\u0435\u0433\u043e\u0441\u0442\u0443\u043f\u0430\u0445
+dialog.gpsies.activity.sailing=\u041f\u0430\u0440\u0443\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0440\u0442
+dialog.gpsies.activity.skating=\u041d\u0430 \u043a\u043e\u043d\u044c\u043a\u0430\u0445
+dialog.wikipedia.column.name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438
+dialog.wikipedia.column.distance=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
+dialog.correlate.notimestamps=\u041d\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0441 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u043c\u0438!
+dialog.correlate.nouncorrelatedphotos=\u041d\u0435\u0442 \u043d\u0435\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439.\n\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+dialog.correlate.photoselect.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0451 \u043a\u0430\u043a \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.correlate.select.photoname=\u0418\u043c\u044f \u0444\u043e\u0442\u043e
+dialog.correlate.select.timediff=\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.correlate.select.photolater=\u0424\u043e\u0442\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435
+dialog.correlate.options.tip=\u0421\u043e\u0432\u0435\u0442: \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.
+dialog.correlate.options.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f
+dialog.correlate.options.offsetpanel=\u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.correlate.options.offset=\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435
+dialog.correlate.options.offset.hours=\u0447\u0430\u0441\u044b,
+dialog.correlate.options.offset.minutes=\u043c\u0438\u043d\u0443\u0442\u044b \u0438
+dialog.correlate.options.offset.seconds=\u0441\u0435\u043a\u0443\u043d\u0434\u044b
+dialog.correlate.options.photolater=\u0424\u043e\u0442\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0442\u043e\u0447\u043a\u0438
+dialog.correlate.options.pointlaterphoto=\u0422\u043e\u0447\u043a\u0430 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0444\u043e\u0442\u043e
+dialog.correlate.options.audiolater=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0442\u043e\u0447\u043a\u0438
+dialog.correlate.options.pointlateraudio=\u0422\u043e\u0447\u043a\u0430 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
+dialog.correlate.options.limitspanel=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f
+dialog.correlate.options.notimelimit=\u041d\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.correlate.options.timelimit=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.correlate.options.nodistancelimit=\u041d\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e
+dialog.correlate.options.distancelimit=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e
+dialog.correlate.options.correlate=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+dialog.correlate.alloutsiderange=\u0412\u0441\u0435 \u0444\u043e\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0442\u0440\u0435\u043a\u0430 \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b.\n\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u0444\u043e\u0442\u043e.
+dialog.correlate.filetimes=\u041c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442:
+dialog.correlate.filetimes2=\u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
+dialog.correlate.correltimes=\u0414\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435:
+dialog.correlate.timestamp.beginning=\u041d\u0430\u0447\u0430\u043b\u043e
+dialog.correlate.timestamp.middle=\u0421\u0435\u0440\u0435\u0434\u0438\u043d\u0443
+dialog.correlate.timestamp.end=\u041a\u043e\u043d\u0435\u0446
+dialog.correlate.audioselect.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
+dialog.correlate.select.audioname=\u0418\u043c\u044f \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
+dialog.correlate.select.audiolater=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435
+dialog.rearrangephotos.desc=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u043e\u0442\u043e
+dialog.rearrangephotos.tostart=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e
+dialog.rearrangephotos.toend=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0435\u0446
+dialog.rearrangephotos.nosort=\u041d\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+dialog.rearrangephotos.sortbyfilename=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430
+dialog.rearrangephotos.sortbytime=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.compress.nonefound=\u041d\u0435\u0442 \u0442\u043e\u0447\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u044b
+dialog.compress.closepoints.title=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
+dialog.compress.closepoints.paramdesc=\u0420\u0430\u0437\u043c\u0430\u0445
+dialog.compress.wackypoints.title=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 "\u0448\u0430\u043b\u044c\u043d\u044b\u0445"(\u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0445) \u0442\u043e\u0447\u0435\u043a
+dialog.compress.wackypoints.paramdesc=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
+dialog.compress.singletons.title=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 Singleton-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432
+dialog.compress.singletons.paramdesc=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
+dialog.compress.duplicates.title=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432
+dialog.compress.douglaspeucker.title=\u0421\u0436\u0430\u0442\u0438\u0435 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 Douglas-Peucker
+dialog.compress.douglaspeucker.paramdesc=\u0420\u0430\u0437\u043c\u0430\u0445
+dialog.compress.summarylabel=\u0422\u043e\u0447\u043a\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f
+dialog.pastecoordinates.desc=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0437\u0434\u0435\u0441\u044c
+dialog.pastecoordinates.coords=\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b
+dialog.pastecoordinates.nothingfound=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\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.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\nhttp://activityworkshop.net/software/gpsprune/
+dialog.about.version=\u0412\u0435\u0440\u0441\u0438\u044f
+dialog.about.build=\u0420\u0435\u0432\u0438\u0437\u0438\u044f
+dialog.about.summarytext1=GpsPrune \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 GPS \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u043e\u0432.
+dialog.about.summarytext2=\u042d\u0442\u043e \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043e \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 Gnu GPL \u0434\u043b\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e, \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e, \u0432\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f.<br> \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043e\u0449\u0440\u044f\u0435\u0442\u0441\u044f <br> \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438, \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435<code> license.txt</code>.
+dialog.about.summarytext3=\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 <code style="font-weight:bold">http://activityworkshop.net/</code>
+dialog.about.languages=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438
+dialog.about.translatedby=\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439: \u0421\u0435\u0440\u0433\u0435\u0439 \u0428\u0438\u043b\u043e\u0432
+dialog.about.systeminfo=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435
+dialog.about.systeminfo.os=\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430
+dialog.about.systeminfo.java=Java Runtime
+dialog.about.systeminfo.java3d=Java3D \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d
+dialog.about.systeminfo.povray=Povray \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d
+dialog.about.systeminfo.exiftool=ExifTool \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d
+dialog.about.systeminfo.gpsbabel=GPSBabel \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d
+dialog.about.systeminfo.gnuplot=Gnuplot \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d
+dialog.about.systeminfo.exiflib=Exif \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438
+dialog.about.systeminfo.exiflib.internal=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439
+dialog.about.systeminfo.exiflib.internal.failed=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 (\u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d)
+dialog.about.systeminfo.exiflib.external=\u0412\u043d\u0435\u0448\u043d\u0438\u0439
+dialog.about.systeminfo.exiflib.external.failed=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 (\u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d)
+dialog.about.yes=\u0414\u0430
+dialog.about.no=\u041d\u0435\u0442
+dialog.about.credits=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438
+dialog.about.credits.code=\u041a\u043e\u0434 GpsPrune \u043d\u0430\u043f\u0438\u0441\u0430\u043d
+dialog.about.credits.exifcode=\u041a\u043e\u0434 Exif \u043e\u0442
+dialog.about.credits.icons=\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0432\u0437\u044f\u0442\u044b \u0438\u0437
+dialog.about.credits.translators=\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0438
+dialog.about.credits.translations=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430
+dialog.about.credits.devtools=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438
+dialog.about.credits.othertools=\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430
+dialog.about.credits.thanks=\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c
+dialog.about.readme=\u041f\u0440\u043e\u0447\u0442\u0438 \u043c\u0435\u043d\u044f
+dialog.checkversion.error=\u041d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d.\n\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.
+dialog.checkversion.uptodate=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e GpsPrune.
+dialog.checkversion.newversion1=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f GpsPrune!
+dialog.checkversion.newversion2=
+dialog.checkversion.releasedate1=\u042d\u0442\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u0430
+dialog.checkversion.releasedate2=
+dialog.checkversion.download=\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 http://activityworkshop.net/software/gpsprune/download.html
+dialog.keys.intro=\u0412\u043c\u0435\u0441\u0442\u043e \u043c\u044b\u0448\u0438 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+dialog.keys.keylist=<table><tr><td></td><td>\u0421\u0434\u0432\u0438\u0433 \u043a\u0430\u0440\u0442\u044b \u0432\u043b\u0435\u0432\u043e, \u0432\u043f\u0440\u0430\u0432\u043e, \u0432\u0432\u0435\u0440\u0445, \u0432\u043d\u0438\u0437</td><td><tr><td>Ctrl + \u043b\u0435\u0432\u0430\u044f, \u043f\u0440\u0430\u0432\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430</td><td>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443</td></tr><tr><td>Ctrl + \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0432\u0432\u0435\u0440\u0445, \u0432\u043d\u0438\u0437 </td><td> \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430</td></tr><tr><td>Ctrl + PgUp, PgDown</td><td>\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442</td></tr><tr><td>Ctrl + Home, End</td><td>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u0443\u044e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0442\u043e\u0447\u043a\u0443</td></tr><tr><td>Del</td><td>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443</td></tr></table>
+dialog.keys.normalmodifier=Ctrl
+dialog.keys.macmodifier=Command
+dialog.saveconfig.desc=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0444\u0430\u0439\u043b:
+dialog.saveconfig.prune.trackdirectory=\u041f\u0430\u043f\u043a\u0430 \u0441 \u0442\u0440\u0435\u043a\u0430\u043c\u0438
+dialog.saveconfig.prune.photodirectory=\u041f\u0430\u043f\u043a\u0430 \u0441 \u0444\u043e\u0442\u043e
+dialog.saveconfig.prune.languagecode=\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430 (RU)
+dialog.saveconfig.prune.languagefile=\u042f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b
+dialog.saveconfig.prune.gpsdevice=GPS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e
+dialog.saveconfig.prune.gpsformat=GPS \u0444\u043e\u0440\u043c\u0430\u0442
+dialog.saveconfig.prune.povrayfont=Povray \u0448\u0440\u0438\u0444\u0442
+dialog.saveconfig.prune.metricunits=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b?
+dialog.saveconfig.prune.gnuplotpath=\u041f\u0443\u0442\u044c \u043a GNUPLOT
+dialog.saveconfig.prune.gpsbabelpath=\u041f\u0443\u0442\u044c \u043a GPSBabel
+dialog.saveconfig.prune.exiftoolpath=\u041f\u0443\u0442\u044c \u043a ExifTool
+dialog.saveconfig.prune.mapsource=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043a\u0430\u0440\u0442\u044b
+dialog.saveconfig.prune.mapsourcelist=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043a\u0430\u0440\u0442
+dialog.saveconfig.prune.diskcache=\u041a\u0435\u0448 \u043a\u0430\u0440\u0442\u044b
+dialog.saveconfig.prune.kmzimagewidth=\u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f KMZ
+dialog.saveconfig.prune.kmzimageheight=\u0432\u044b\u0441\u043e\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f KMZ
+dialog.saveconfig.prune.colourscheme=\u0426\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430
+dialog.saveconfig.prune.linewidth=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438
+dialog.saveconfig.prune.kmltrackcolour=\u0446\u0432\u0435\u0442 \u0442\u0440\u0435\u043a\u0430 KML
+dialog.saveconfig.prune.autosavesettings=\u0410\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a
+dialog.setpaths.intro=\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c:
+dialog.setpaths.found=\u041f\u0443\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d?
+dialog.addaltitude.noaltitudes=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u044b\u0441\u043e\u0442
+dialog.addaltitude.desc=\u0412\u044b\u0441\u043e\u0442\u043d\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f
+dialog.lookupsrtm.overwritezeros=\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0432\u044b\u0441\u043e\u0442 \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438?
+dialog.setcolours.intro=\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430
+dialog.setcolours.background=\u0424\u043e\u043d
+dialog.setcolours.borders=\u0413\u0440\u0430\u043d\u0438\u0446\u044b
+dialog.setcolours.lines=\u041b\u0438\u043d\u0438\u0438
+dialog.setcolours.primary=\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439
+dialog.setcolours.secondary=\u0412\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439
+dialog.setcolours.point=\u0422\u043e\u0447\u043a\u0438
+dialog.setcolours.selection=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+dialog.setcolours.text=\u0422\u0435\u043a\u0441\u0442
+dialog.colourchooser.title=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442
+dialog.colourchooser.red=\u041a\u0440\u0430\u0441\u043d\u044b\u0439
+dialog.colourchooser.green=\u0417\u0435\u043b\u0435\u043d\u044b\u0439
+dialog.colourchooser.blue=\u0421\u0438\u043d\u0438\u0439
+dialog.setlanguage.firstintro=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, <p> \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b.
+dialog.setlanguage.secondintro=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 <p> \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0432 GpsPrune.
+dialog.setlanguage.language=\u042f\u0437\u044b\u043a
+dialog.setlanguage.languagefile=\u042f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b
+dialog.setlanguage.endmessage=\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 GpsPrune,\n\u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0432 \u0441\u0438\u043b\u0443.
+dialog.setlanguage.endmessagewithautosave=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 GpsPrune,\n\u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0432 \u0441\u0438\u043b\u0443.
+dialog.diskcache.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a
+dialog.diskcache.dir=\u041f\u0430\u043f\u043a\u0430 \u043a\u0435\u0448\u0430
+dialog.diskcache.createdir=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443
+dialog.diskcache.nocreate=\u041f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043a\u0435\u0448\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430
+dialog.diskcache.table.path=\u041f\u0443\u0442\u044c
+dialog.diskcache.table.usedby=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f
+dialog.diskcache.table.zoom=\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+dialog.diskcache.table.tiles=\u0422\u0430\u0439\u043b\u044b
+dialog.diskcache.table.megabytes=\u041c\u0435\u0433\u0430\u0431\u0430\u0439\u0442
+dialog.diskcache.tileset=\u041f\u0443\u0442\u044c \u043a \u0442\u0430\u0439\u043b\u0430\u043c
+dialog.diskcache.tileset.multiple=\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439
+dialog.diskcache.deleteold=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u0442\u0430\u0439\u043b\u043e\u0432
+dialog.diskcache.maximumage=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442 (\u0432 \u0434\u043d\u044f\u0445)
+dialog.diskcache.deleteall=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b
+dialog.diskcache.deleted1=\u0423\u0434\u0430\u043b\u0435\u043d\u043e
+dialog.diskcache.deleted2=\u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043a\u044d\u0448\u0430
+dialog.deletefieldvalues.intro=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+dialog.setlinewidth.text=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0439 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u043e\u0432 (1-4)
+dialog.downloadosm.desc=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 OSM \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438:
+dialog.searchwikipedianames.search=\u041f\u043e\u0438\u0441\u043a \u0434\u043b\u044f:
+
+# 3d window
+dialog.3d.title=GpsPrune 3D-\u0432\u0438\u0434
+dialog.3d.altitudefactor=\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435
+dialog.3dlines.title=\u0441\u0435\u0442\u043a\u0430 GpsPrune
+dialog.3dlines.empty=\u043d\u0435\u0442 \u0441\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f!
+dialog.3dlines.intro=\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0435\u0442\u043a\u0438 3D-\u0432\u0438\u0434\u0430
+
+# Confirm messages
+confirm.loadfile=\u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b
+confirm.save.ok1=\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e
+confirm.save.ok2=\u0442\u043e\u0447\u0435\u043a \u0432 \u0444\u0430\u0439\u043b
+confirm.deletepoint.single=\u0442\u043e\u0447\u043a\u0430 \u0431\u044b\u043b\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u044b
+confirm.deletepoint.multi=\u0442\u043e\u0447\u043a\u0438 \u0431\u044b\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b
+confirm.point.edit=\u0442\u043e\u0447\u043a\u0430 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430
+confirm.mergetracksegments=\u0421\u0435\u0433\u043c\u0435\u043d\u0442 \u0442\u0440\u0435\u043a\u0430 \u0441\u043b\u0438\u0442
+confirm.reverserange=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d
+confirm.addtimeoffset=\u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430
+confirm.addaltitudeoffset=\u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430
+confirm.rearrangewaypoints=\u041f\u0443\u0442\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043d\u0430
+confirm.rearrangephotos=\u0424\u043e\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043d\u043e
+confirm.cutandmove=\u041e\u0442\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u043e
+confirm.convertnamestotimes=\u0418\u043c\u044f \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u043e
+confirm.saveexif.ok1=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e
+confirm.saveexif.ok2=\u0444\u0430\u0439\u043b\u044b \u0441 \u0444\u043e\u0442\u043e
+confirm.undo.single=\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u044b
+confirm.undo.multi=\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043c\u0435\u043d\u044b
+confirm.jpegload.single=\u0444\u043e\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e
+confirm.jpegload.multi=\u0444\u043e\u0442\u043e \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b
+confirm.media.connect=\u041c\u0435\u0434\u0438\u0430-\u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d
+confirm.photo.disconnect=\u041c\u0435\u0434\u0438\u0430-\u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d
+confirm.audio.disconnect=\u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0430
+confirm.media.removed=\u0443\u0434\u0430\u043b\u0435\u043d
+confirm.correlatephotos.single=\u0444\u043e\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e
+confirm.correlatephotos.multi=\u0444\u043e\u0442\u043e \u0431\u044b\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b
+confirm.createpoint=\u0442\u043e\u0447\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430
+confirm.rotatephoto=\u0444\u043e\u0442\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e
+confirm.running=\u0420\u0430\u0431\u043e\u0442\u0430\u044e...
+confirm.lookupsrtm1=\u041d\u0430\u0439\u0434\u0435\u043d\u043e
+confirm.lookupsrtm2=\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
+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\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430
+confirm.correlateaudios.multi=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u044b\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b
+
+# Buttons
+button.ok=OK
+button.back=\u041d\u0430\u0437\u0430\u0434
+button.next=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439
+button.finish=\u041a\u043e\u043d\u0435\u0446
+button.cancel=\u041e\u0442\u043c\u0435\u043d\u0430
+button.overwrite=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c
+button.moveup=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0432\u0435\u0440\u0445
+button.movedown=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437
+button.showlines=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438
+button.edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+button.exit=\u0412\u044b\u0445\u043e\u0434
+button.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+button.continue=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c
+button.yes=\u0414\u0430
+button.no=\u041d\u0435\u0442
+button.yestoall=\u0414\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445
+button.notoall=\u041d\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445
+button.select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c
+button.selectall=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+button.selectnone=\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c
+button.preview=\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440
+button.load=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+button.upload=\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+button.guessfields=\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f
+button.showwebpage=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443
+button.check=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430
+button.resettodefaults=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435
+button.browse=\u0423\u043a\u0430\u0437\u0430\u0442\u044c...
+button.addnew=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435
+button.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+button.manage=\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c
+
+# File types
+filetype.txt=TXT \u0444\u0430\u0439\u043b\u044b
+filetype.jpeg=JPG \u0444\u0430\u0439\u043b\u044b
+filetype.kmlkmz=KML, KMZ \u0444\u0430\u0439\u043b\u044b
+filetype.kml=KML \u0444\u0430\u0439\u043b\u044b
+filetype.kmz=KMZ \u0444\u0430\u0439\u043b\u044b
+filetype.gpx=GPX \u0444\u0430\u0439\u043b\u044b
+filetype.pov=POV \u0444\u0430\u0439\u043b\u044b
+filetype.svg=SVG \u0444\u0430\u0439\u043b\u044b
+filetype.audio=MP3, OGG, WAV \u0444\u0430\u0439\u043b\u044b
+
+# Display components
+display.nodata=\u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b
+display.noaltitudes=\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0440\u0435\u043a\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432\u044b\u0441\u043e\u0442\u043d\u044b\u0445 \u043e\u0442\u043c\u0435\u0442\u043e\u043a
+display.notimestamps=\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0440\u0435\u043a\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043e\u0442\u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+details.trackdetails=\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u043a\u0430
+details.notrack=\u0422\u0440\u0435\u043a \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d
+details.track.points=\u0422\u043e\u0447\u043a\u0438(-\u0435\u043a)
+details.track.file=\u0424\u0430\u0439\u043b
+details.track.numfiles=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432
+details.pointdetails=\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u0447\u0435\u043a
+details.index.selected=\u0422\u043e\u0447\u043a\u0430 \u043d\u043e\u043c\u0435\u0440
+details.index.of=\u0432
+details.nopointselection=\u0422\u043e\u0447\u043a\u0430 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u0430
+details.photofile=\u0424\u043e\u0442\u043e \u0444\u0430\u0439\u043b
+details.norangeselection=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d
+details.rangedetails=\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+details.range.selected=\u041e\u0442\u043e\u0431\u0440\u0430\u043d\u043e
+details.range.to=-
+details.altitude.to=-
+details.range.climb=\u041f\u043e\u0434\u044a\u0435\u043c
+details.range.descent=\u0421\u043f\u0443\u0441\u043a
+details.coordformat=\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442
+details.distanceunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439
+display.range.time.secs=s
+display.range.time.mins=m
+display.range.time.hours=h
+display.range.time.days=d
+details.range.avespeed=\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+details.range.avemovingspeed=\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430
+details.range.maxspeed=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+details.range.numsegments=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432
+details.range.pace=\u0422\u0435\u043c\u043f
+details.range.gradient=\u0413\u0440\u0430\u0434\u0438\u0435\u043d\u0442
+details.lists.waypoints=\u041f\u0443\u0442\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+details.lists.photos=\u0424\u043e\u0442\u043e
+details.lists.audio=\u0417\u0432\u0443\u043a
+details.photodetails=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0444\u043e\u0442\u043e
+details.nophoto=\u0424\u043e\u0442\u043e \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e
+details.photo.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430
+details.photo.bearing=\u0410\u0437\u0438\u043c\u0443\u0442 \u0441\u044a\u0435\u043c\u043a\u0438
+details.media.connected=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e
+details.audiodetails=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
+details.noaudio=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u0430
+details.audio.file=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+details.audio.playing=\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u2026
+map.overzoom=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430
+
+# Field names
+fieldname.latitude=\u0428\u0438\u0440\u043e\u0442\u0430
+fieldname.longitude=\u0414\u043e\u043b\u0433\u043e\u0442\u0430
+fieldname.altitude=\u0412\u044b\u0441\u043e\u0442\u0430
+fieldname.timestamp=\u0412\u0440\u0435\u043c\u044f
+fieldname.time=\u0412\u0440\u0435\u043c\u044f
+fieldname.waypointname=\u0418\u043c\u044f
+fieldname.waypointtype=\u0422\u0438\u043f
+fieldname.newsegment=\u0421\u0435\u0433\u043c\u0435\u043d\u0442
+fieldname.custom=\u041e\u0431\u044b\u0447\u043d\u043e
+fieldname.prefix=\u041f\u043e\u043b\u0435
+fieldname.distance=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
+fieldname.movingdistance=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u043e\u0432
+fieldname.duration=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c
+fieldname.speed=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+fieldname.verticalspeed=\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+fieldname.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+
+# Measurement units
+units.original=\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439
+units.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+units.metres=\u041c\u0435\u0442\u0440\u044b
+units.metres.short=m
+units.feet=\u0444\u0443\u0442\u044b
+units.feet.short=ft
+units.kilometres=\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u044b
+units.kilometres.short=km
+units.kmh=km/h
+units.kilometresperhour.short=km/h
+units.miles=\u041c\u0438\u043b\u0438
+units.miles.short=mi
+units.mph=mph
+units.milesperhour.short=mph
+units.metrespersec=m/s
+units.feetpersec=ft/s
+units.hours=\u0427\u0430\u0441\u044b
+units.degminsec=\u0413\u0440\u0430\u0434-\u043c\u0438\u043d-\u0441\u0435\u043a
+units.degmin=\u0413\u0440\u0430\u0434-\u043c\u0438\u043d
+units.deg=\u0413\u0440\u0430\u0434\u0443\u0441\u044b
+units.iso8601=ISO 8601
+
+# External urls
+url.googlemaps=maps.google.ru
+wikipedia.lang=ru
+
+# Cardinals for 3d plots
+cardinal.n=\u0421
+cardinal.s=\u042e
+cardinal.e=\u0412
+cardinal.w=\u0417
+
+# Undo operations
+undo.load=\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445
+undo.loadphotos=\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e
+undo.loadaudios=\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0435\u0439
+undo.editpoint=\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+undo.deletepoint=\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+undo.removephoto=\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+undo.removeaudio=\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+undo.deleterange=\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+undo.compress=\u0441\u0436\u0430\u0442\u044c \u0442\u0440\u0435\u043a
+undo.insert=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438
+undo.reverse=\u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+undo.mergetracksegments=\u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0440\u0435\u043a\u0430
+undo.addtimeoffset=\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+undo.addaltitudeoffset=\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0432\u044b\u0441\u043e\u0442\u044b
+undo.rearrangewaypoints=\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0443\u0442\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
+undo.cutandmove=\u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+undo.connect=\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f
+undo.disconnect=\u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f
+undo.correlatephotos=\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+undo.rearrangephotos=\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e
+undo.createpoint=\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443
+undo.rotatephoto=\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0444\u043e\u0442\u043e
+undo.convertnamestotimes=\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f
+undo.lookupsrtm=\u043f\u043e\u0438\u0441\u043a \u0432\u044b\u0441\u043e\u0442 \u0432 SRTM
+undo.deletefieldvalues=\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439
+undo.correlateaudios=\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c
+
+# Error messages
+error.save.dialogtitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445
+error.save.nodata=\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f
+error.save.failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b
+error.saveexif.filenotfound=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b \u0441 \u0444\u043e\u0442\u043e
+error.saveexif.cannotoverwrite1=\u0444\u0430\u0439\u043b \u0441 \u0444\u043e\u0442\u043e
+error.saveexif.cannotoverwrite2=\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d! \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043f\u0438\u044e?
+error.saveexif.failed1=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+error.saveexif.failed2=\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435(-\u0438\u0439)
+error.saveexif.forced1=
+error.saveexif.forced2=\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435(-\u0438\u0439) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e
+error.load.dialogtitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445
+error.load.noread=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b
+error.load.nopoints=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445
+error.load.unknownxml=\u041d\u0435\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 XML- \u0444\u043e\u0440\u043c\u0430\u0442:
+error.load.noxmlinzip=\u0412 zip-\u0430\u0440\u0445\u0438\u0432\u0435 \u043d\u0435\u0442 XML-\u0444\u0430\u0439\u043b\u0430
+error.load.othererror=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430:
+error.jpegload.dialogtitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0444\u043e\u0442\u043e
+error.jpegload.nofilesfound=\u0424\u0430\u0439\u043b\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
+error.jpegload.nojpegsfound=JEPG-\u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
+error.jpegload.nogpsfound=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 GPS-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f
+error.jpegload.exifreadfailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c EXIF-\u200b\u200b\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041d\u0435\u0442 EXIF-\u200b\u200b\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u200b\u200b\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c\n\u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.
+error.audioload.nofilesfound=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
+error.gpsload.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430
+error.undofailed.title=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c
+error.undofailed.text=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e
+error.function.noop.title=\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u043b\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430
+error.rearrange.noop=\u041f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u043d\u0435 \u0438\u043c\u0435\u043b\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430
+error.function.notavailable.title=\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430
+error.function.nojava3d=\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Java3D,\n\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 Sun.com.
+error.3d=\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 3D-\u0432\u0438\u0434\u0430
+error.readme.notfound=Readme \u0444\u0430\u0439\u043b\u043d\u0435\u043d\u0430\u0439\u0434\u0435\u043d
+error.osmimage.dialogtitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u0440\u0442\u044b
+error.osmimage.failed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.
+error.language.wrongfile=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f GpsPrune
+error.convertnamestotimes.nonames=\u041d\u0435\u0442 \u0438\u043c\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f
+error.lookupsrtm.nonefound=\u041d\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442\u043c\u0435\u0442\u043e\u043a \u0432\u044b\u0441\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a.
+error.lookupsrtm.nonerequired=\u0412\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442, \u043d\u0435\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c
+error.gpsies.uploadnotok=Gpsies \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
+error.gpsies.uploadfailed=\u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439
+error.playaudiofailed=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0438
+error.cache.notthere=\u041f\u0430\u043f\u043a\u0430 \u043a\u044d\u0448\u0430 \u0441 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430
+error.cache.empty=\u041f\u0430\u043f\u043a\u0430 \u043a\u044d\u0448\u0430 \u0441 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u0443\u0441\u0442\u0430
+error.cache.cannotdelete=\u041d\u0435\u0442 \u0442\u0430\u0439\u043b\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f
index 290c1fe9b4dd1c8a79840e9c813e0813f220c36e..bce879697023babcbf6ad2e9f7e828bbcdb3b4b3 100644 (file)
@@ -11,7 +11,7 @@ menu.track=\u8f68\u8ff9
 menu.track.undo=\u64a4\u9500
 menu.track.clearundo=\u6e05\u9664\u64a4\u9500\u6e05\u5355
 menu.track.deletemarked=\u5220\u9664\u5df2\u6807\u793a\u8f68\u8ff9\u70b9
-menu.track.rearrange=\u822a\u70b9\u91cd\u7f6e
+menu.track.rearrange=\u91cd\u65b0\u6392\u5217\u822a\u70b9
 menu.track.rearrange.start=\u81f3\u8d77\u59cb\u4f4d\u7f6e
 menu.track.rearrange.end=\u81f3\u672b\u4f4d\u7f6e
 menu.track.rearrange.nearest=\u81f3\u6700\u8fd1\u8f68\u8ff9\u70b9
@@ -19,7 +19,7 @@ menu.range=\u822a\u6bb5
 menu.range.all=\u5168\u9009
 menu.range.none=\u64a4\u9500\u9009\u62e9
 menu.range.start=\u8bbe\u7f6e\u8d77\u70b9
-menu.range.end=\u8bbe\u7f6e\u672b\u70b9
+menu.range.end=\u8bbe\u7f6e\u7ec8\u70b9
 menu.range.deleterange=\u5220\u9664\u8f68\u8ff9\u70b9\u6bb5
 menu.range.interpolate=\u63d2\u5165\u8f68\u8ff9\u70b9
 menu.range.average=\u8bbe\u7f6e\u5e73\u5747\u8f68\u8ff9\u70b9
@@ -93,7 +93,7 @@ function.deletefieldvalues=\u5220\u9664\u533a\u57df\u6570\u503c
 function.findwaypoint=\u67e5\u627e\u822a\u70b9
 function.pastecoordinates=\u8f93\u5165\u65b0\u5750\u6807
 function.charts=\u9ad8\u5ea6\u901f\u5ea6\u56fe\u8868
-function.show3d=3-D\u89c6\u56fe
+function.show3d=3D\u89c6\u56fe
 function.distances=\u8ddd\u79bb
 function.fullrangedetails=\u5168\u822a\u6bb5\u8be6\u7ec6\u4fe1\u606f
 function.setmapbg=\u80cc\u666f\u5730\u56fe
@@ -141,7 +141,7 @@ dialog.deletepoint.deletephoto=\u5220\u9664\u8f68\u8ff9\u70b9\u94fe\u63a5\u7684\
 dialog.deletephoto.title=\u5220\u9664\u76f8\u7247
 dialog.deletephoto.deletepoint=\u5220\u9664\u76f8\u7247\u94fe\u63a5\u7684\u8f68\u8ff9\u70b9\uff1f
 dialog.openoptions.title=\u6253\u5f00\u9009\u9879
-dialog.openoptions.filesnippet=\u6587\u4ef6\u683c\u5f0f
+dialog.openoptions.filesnippet=\u63d0\u53d6\u6587\u4ef6\u7247\u6bb5
 dialog.load.table.field=\u6570\u636e\u6bb5
 dialog.load.table.datatype=\u6570\u636e\u7c7b\u578b
 dialog.load.table.description=\u63cf\u8ff0
@@ -163,8 +163,8 @@ dialog.jpegload.loadjpegswithoutcoords=\u542b\u65e0\u5750\u6807\u70b9\u76f8\u724
 dialog.jpegload.loadjpegsoutsidearea=\u542b\u533a\u57df\u5916\u76f8\u7247
 dialog.jpegload.progress.title=\u5bfc\u5165\u76f8\u7247
 dialog.jpegload.progress=\u8bf7\u7b49\u5f85\uff0c\u6b63\u641c\u7d22\u76f8\u7247
-dialog.gpsload.nogpsbabel=\u627e\u4e0d\u5230Gpsbabel,\u7ee7\u7eed\uff1f
-dialog.gpsload.device=GPS\u7aef\u53e3\u540d\u79f0
+dialog.gpsload.nogpsbabel=\u627e\u4e0d\u5230Gpsbabel\uff0c\u7ee7\u7eed\uff1f
+dialog.gpsload.device=GPS\u8bbe\u5907\u540d\u79f0
 dialog.gpsload.format=GPS\u6587\u4ef6\u683c\u5f0f
 dialog.gpsload.getwaypoints=\u5bfc\u5165\u822a\u70b9
 dialog.gpsload.gettracks=\u5bfc\u5165\u8f68\u8ff9
@@ -187,7 +187,7 @@ dialog.save.notypesselected=\u70b9\u7c7b\u578b\u672a\u9009\u5b9a
 dialog.exportkml.text=\u6570\u636e\u540d\u79f0
 dialog.exportkml.altitude=\u7edd\u5bf9\u9ad8\u5ea6\uff08\u822a\u7a7a\u7528\uff09
 dialog.exportkml.kmz=\u538b\u7f29\u6210KMZ\u6587\u4ef6
-dialog.exportkml.exportimages=\u8f93\u51fa\u76f8\u7247\u7d22\u5f15\u56fe\u81f3KMZ
+dialog.exportkml.exportimages=\u8f93\u51fa\u76f8\u7247\u7f29\u7565\u56fe\u81f3KMZ
 dialog.exportkml.trackcolour=\u8f68\u8ff9\u989c\u8272
 dialog.exportgpx.name=\u540d\u79f0
 dialog.exportgpx.desc=\u63cf\u8ff0
@@ -195,19 +195,19 @@ dialog.exportgpx.includetimestamps=\u5305\u542b\u65f6\u95f4
 dialog.exportgpx.copysource=\u4ece\u6e90XML\u6587\u4ef6\u590d\u5236
 dialog.exportgpx.encoding=\u7f16\u7801
 dialog.exportgpx.encoding.system=\u9ed8\u8ba4\u7cfb\u7edf\u7f16\u7801
-dialog.exportgpx.encoding.utf8=\u4f7f\u7528UTF-8
+dialog.exportgpx.encoding.utf8=UTF-8
 dialog.exportpov.text=\u8bf7\u8f93\u5165POV\u53c2\u6570
 dialog.exportpov.font=\u5b57\u4f53
-dialog.exportpov.camerax=X\u76f8\u673a
-dialog.exportpov.cameray=Y\u76f8\u673a
-dialog.exportpov.cameraz=Z\u76f8\u673a
+dialog.exportpov.camerax=\u76f8\u673aX\u5750\u6807
+dialog.exportpov.cameray=\u76f8\u673aY\u5750\u6807
+dialog.exportpov.cameraz=\u76f8\u673aZ\u5750\u6807
 dialog.exportpov.modelstyle=\u6a21\u578b\u7c7b\u578b
 dialog.exportpov.ballsandsticks=\u7403\u548c\u6746
 dialog.exportpov.tubesandwalls=\u7ba1\u548c\u5899
-dialog.exportpov.warningtracksize=\u8f68\u8ff9\u542b\u6709\u592a\u591a\u822a\u70b9\uff0cJAVA3D\u53ef\u80fd\u65e0\u6cd5\u663e\u793a\n\u662f\u5426\u7ee7\u7eed\uff1f
+dialog.exportpov.warningtracksize=\u8f68\u8ff9\u542b\u6709\u592a\u591a\u822a\u70b9\uff0cJAVA3D\u53ef\u80fd\u65e0\u6cd5\u663e\u793a\u3002\n\u662f\u5426\u7ee7\u7eed\uff1f
 dialog.exportsvg.text=\u9009\u62e9\u8f93\u51faSVG\u6587\u4ef6\u7684\u53c2\u6570
-dialog.exportsvg.phi=\u963f\u6cfd\u8def\u89d2\u5ea6
-dialog.exportsvg.theta=\u9ad8\u7a0b\u89d2\u5ea6
+dialog.exportsvg.phi=\u65b9\u4f4d\u89d2
+dialog.exportsvg.theta=\u4ef0\u89d2
 dialog.exportsvg.gradients=\u4f7f\u7528\u6e10\u53d8\u8272
 dialog.pointtype.desc=\u4fdd\u5b58\u4e0b\u5217\u70b9\uff1a
 dialog.pointtype.track=\u8f68\u8ff9\u70b9
@@ -216,9 +216,9 @@ dialog.pointtype.photo=\u76f8\u7247\u70b9
 dialog.pointtype.audio=\u5e26\u58f0\u97f3\u7684\u822a\u70b9
 dialog.pointtype.selection=\u4ec5\u5df2\u9009\u62e9\u822a\u6bb5
 dialog.confirmreversetrack.title=\u786e\u8ba4\u53cd\u5411
-dialog.confirmreversetrack.text=\u8f68\u8ff9\u5305\u542b\u65f6\u95f4\u4fe1\u606f\uff0c\u53cd\u5411\u540e\u53ef\u80fd\u4e22\u5931\n\u662f\u5426\u7ee7\u7eed\uff1f
+dialog.confirmreversetrack.text=\u8f68\u8ff9\u5305\u542b\u65f6\u95f4\u4fe1\u606f\uff0c\u53cd\u5411\u540e\u53ef\u80fd\u4e22\u5931\u3002\n\u662f\u5426\u7ee7\u7eed\uff1f
 dialog.confirmcutandmove.title=\u786e\u8ba4\u526a\u5207\u548c\u79fb\u52a8
-dialog.confirmcutandmove.text=\u8f68\u8ff9\u5305\u542b\u65f6\u95f4\u4fe1\u606f\uff0c\u79fb\u52a8\u540e\u53ef\u80fd\u4e22\u5931\n\u662f\u5426\u7ee7\u7eed\uff1f
+dialog.confirmcutandmove.text=\u8f68\u8ff9\u5305\u542b\u65f6\u95f4\u4fe1\u606f\uff0c\u79fb\u52a8\u540e\u53ef\u80fd\u4e22\u5931\u3002\n\u662f\u5426\u7ee7\u7eed\uff1f
 dialog.interpolate.title=\u91cd\u53e0\u8f68\u8ff9\u70b9
 dialog.interpolate.parameter.text=\u6240\u9009\u4e24\u70b9\u4e2d\u63d2\u5165\u70b9\u7684\u4e2a\u6570
 dialog.undo.title=\u64a4\u9500\u52a8\u4f5c
@@ -226,7 +226,7 @@ dialog.undo.pretext=\u8bf7\u9009\u62e9\u8981\u64a4\u9500\u7684\u52a8\u4f5c
 dialog.undo.none.title=\u4e0d\u80fd\u64a4\u9500
 dialog.undo.none.text=\u65e0\u52a8\u4f5c\u53ef\u64a4\u9500
 dialog.clearundo.title=\u6e05\u9664\u64a4\u9500\u6e05\u5355
-dialog.clearundo.text=\u662f\u5426\u786e\u5b9e\u8981\u6e05\u9664\u64a4\u9500\u6e05\u5355\uff1f\n\u64a4\u9500\u4fe1\u606f\u4f1a\u4e22\u5931
+dialog.clearundo.text=\u662f\u5426\u786e\u5b9e\u8981\u6e05\u9664\u64a4\u9500\u6e05\u5355\uff1f\n\u64a4\u9500\u4fe1\u606f\u4f1a\u4e22\u5931\uff01
 dialog.pointedit.title=\u7f16\u8f91\u8f68\u8ff9\u70b9
 dialog.pointedit.text=\u9009\u62e9\u8981\u7f16\u8f91\u7684\u533a\u57df\u5e76\u7528\u201c\u7f16\u8f91\u201d\u952e\u6539\u53d8\u6570\u503c
 dialog.pointedit.table.field=\u6570\u636e\u6bb5
@@ -288,7 +288,7 @@ dialog.gpsies.nodescription=\u65e0\u63cf\u8ff0
 dialog.gpsies.nonefound=\u672a\u627e\u5230\u8f68\u8ff9
 dialog.gpsies.username=Gpsies\u7f51\u7ad9\u7528\u6237\u540d
 dialog.gpsies.password=Gpsies\u7f51\u7ad9\u5bc6\u7801
-dialog.gpsies.keepprivate=\u8f68\u8ff9\u4fdd\u5bc6\uff08\u975e\u516c\u5f00\uff09
+dialog.gpsies.keepprivate=\u8f68\u8ff9\u4fdd\u5bc6\uff08\u4e0d\u516c\u5f00\uff09
 dialog.gpsies.confirmopenpage=\u6253\u5f00\u4e0a\u4f20\u8f68\u8ff9\u7684\u7f51\u7ad9\uff1f
 dialog.gpsies.activities=\u6d3b\u52a8\u7c7b\u578b
 dialog.gpsies.activity.trekking=\u5f92\u6b65
@@ -302,7 +302,7 @@ dialog.gpsies.activity.skating=\u6ed1\u51b0
 dialog.wikipedia.column.name=\u6587\u7ae0\u9898\u76ee
 dialog.wikipedia.column.distance=\u8ddd\u79bb
 dialog.correlate.notimestamps=\u6570\u636e\u70b9\u4e2d\u65e0\u65f6\u95f4\u4fe1\u606f\uff0c\u76f8\u7247\u65e0\u6cd5\u94fe\u63a5
-dialog.correlate.nouncorrelatedphotos=\u6240\u6709\u76f8\u7247\u5df2\u94fe\u63a5\n\u7ee7\u7eed\uff1f
+dialog.correlate.nouncorrelatedphotos=\u6240\u6709\u76f8\u7247\u5df2\u94fe\u63a5\u3002\u7ee7\u7eed\uff1f
 dialog.correlate.photoselect.intro=\u9009\u62e9\u5df2\u94fe\u63a5\u76f8\u7247\u4f5c\u4e3a\u65f6\u95f4\u504f\u79fb
 dialog.correlate.select.photoname=\u76f8\u7247\u540d
 dialog.correlate.select.timediff=\u65f6\u95f4\u5dee
@@ -316,17 +316,17 @@ dialog.correlate.options.offset.minutes=\u5206\u949f
 dialog.correlate.options.offset.seconds=\u79d2
 dialog.correlate.options.photolater=\u76f8\u7247\u6ede\u540e\u4e8e\u8f68\u8ff9\u70b9
 dialog.correlate.options.pointlaterphoto=\u8f68\u8ff9\u70b9\u6ede\u540e\u4e8e\u76f8\u7247
-dialog.correlate.options.audiolater=\u58f0\u97f3\u6bd4\u822a\u70b9\u6ede\u540e
-dialog.correlate.options.pointlateraudio=\u58f0\u97f3\u6bd4\u822a\u70b9\u8d85\u524d
-dialog.correlate.options.limitspanel=\u94fe\u63a5\u9650\u5236
+dialog.correlate.options.audiolater=\u58f0\u97f3\u6ede\u540e\u4e8e\u822a\u70b9
+dialog.correlate.options.pointlateraudio=\u822a\u70b9\u6ede\u540e\u4e8e\u58f0\u97f3
+dialog.correlate.options.limitspanel=\u5173\u8054\u9650\u5236
 dialog.correlate.options.notimelimit=\u65e0\u65f6\u95f4\u9650\u5236
 dialog.correlate.options.timelimit=\u65f6\u95f4\u9650\u5236
 dialog.correlate.options.nodistancelimit=\u65e0\u8ddd\u79bb\u9650\u5236
 dialog.correlate.options.distancelimit=\u8ddd\u79bb\u9650\u5236
-dialog.correlate.options.correlate=\u94fe\u63a5
-dialog.correlate.alloutsiderange=\u65e0\u6cd5\u94fe\u63a5\uff0c\u6240\u6709\u76f8\u7247\u8d85\u51fa\u8f68\u8ff9\u65f6\u95f4\u8303\u56f4\n\u8bf7\u6539\u53d8\u65f6\u95f4\u504f\u79fb\u6216\u624b\u52a8\u94fe\u63a5\u81f3\u5c11\u4e00\u5f20\u76f8\u7247
+dialog.correlate.options.correlate=\u5173\u8054
+dialog.correlate.alloutsiderange=\u65e0\u6cd5\u94fe\u63a5\uff0c\u6240\u6709\u76f8\u7247\u8d85\u51fa\u8f68\u8ff9\u65f6\u95f4\u8303\u56f4\u3002\n\u8bf7\u6539\u53d8\u65f6\u95f4\u504f\u79fb\u6216\u624b\u52a8\u94fe\u63a5\u81f3\u5c11\u4e00\u5f20\u76f8\u7247\u3002
 dialog.correlate.filetimes=\u6587\u4ef6\u65f6\u95f4\u8868\u793a\u58f0\u97f3\u7684\uff1a
-dialog.correlate.filetimes2=
+dialog.correlate.filetimes2=\u90e8\u5206
 dialog.correlate.correltimes=\u5982\u8981\u5173\u8054\uff0c\u8bf7\u4f7f\u7528\uff1a
 dialog.correlate.timestamp.beginning=\u5f00\u59cb
 dialog.correlate.timestamp.middle=\u4e2d\u95f4
@@ -455,6 +455,7 @@ dialog.diskcache.table.megabytes=MB
 dialog.diskcache.tileset=\u5730\u56fe\u533a\u57df\u6570\u5b58\u653e\u8def\u5f84
 dialog.diskcache.tileset.multiple=\u6570\u76ee
 dialog.diskcache.deleteold=\u5220\u9664\u65e7\u533a\u57df\u6570\u636e
+dialog.diskcache.maximumage=\u6700\u957f\u65f6\u95f4(\u5929)
 dialog.diskcache.deleteall=\u5220\u9664\u6240\u6709\u533a\u57df\u6570\u636e
 dialog.diskcache.deleted1=\u5df2\u5220\u9664
 dialog.diskcache.deleted2=\u7f13\u5b58\u5185\u6587\u4ef6
@@ -493,7 +494,7 @@ confirm.jpegload.single=\u5df2\u52a0\u5165\u76f8\u7247
 confirm.jpegload.multi=\u5df2\u52a0\u5165\u76f8\u7247
 confirm.media.connect=\u5a92\u4f53\u5df2\u5173\u8054
 confirm.photo.disconnect=\u76f8\u7247\u672a\u94fe\u63a5
-confirm.audio.disconnect=\u58f0\u97f3\u65ad\u5f00
+confirm.audio.disconnect=\u58f0\u97f3\u672a\u94fe\u63a5
 confirm.media.removed=\u5df2\u5220\u9664
 confirm.correlatephotos.single=\u76f8\u7247\u5df2\u94fe\u63a5
 confirm.correlatephotos.multi=\u76f8\u7247\u5df2\u94fe\u63a5
@@ -531,7 +532,7 @@ button.selectnone=\u5168\u4e0d\u9009
 button.preview=\u9884\u89c8
 button.load=\u5bfc\u5165
 button.upload=\u4e0a\u8f7d
-button.guessfields=\u731c\u4f30\u533a\u57df\u5185\u5bb9
+button.guessfields=\u4f30\u6d4b\u6570\u636e\u6bb5
 button.showwebpage=\u663e\u793a\u7f51\u9875
 button.check=\u68c0\u67e5
 button.resettodefaults=\u6062\u590d\u9ed8\u8ba4
@@ -618,7 +619,7 @@ fieldname.description=\u63cf\u8ff0
 
 # Measurement units
 units.original=\u539f\u59cb
-units.default=\u7f3a\u7701
+units.default=\u9ed8\u8ba4
 units.metres=\u7c73
 units.metres.short=\u7c73
 units.feet=\u82f1\u5c3a
@@ -629,8 +630,6 @@ units.kmh=\u5343\u7c73/\u65f6
 units.miles=\u82f1\u91cc
 units.miles.short=\u82f1\u91cc
 units.mph=\u82f1\u91cc/\u65f6
-units.metrespersec=\u7c73/\u79d2
-units.feetpersec=\u82f1\u5c3a/\u79d2
 units.hours=\u5c0f\u65f6
 units.degminsec=\u5ea6-\u5206-\u79d2
 units.degmin=\u5ea6-\u5206
@@ -681,7 +680,7 @@ error.save.nodata=\u65e0\u6570\u636e\u4fdd\u5b58
 error.save.failed=\u5411\u6587\u4ef6\u4fdd\u5b58\u6570\u636e\u5931\u8d25
 error.saveexif.filenotfound=\u627e\u4e0d\u5230\u76f8\u7247\u6587\u4ef6
 error.saveexif.cannotoverwrite1=\u76f8\u7247\u6587\u4ef6
-error.saveexif.cannotoverwrite2=\u53ea\u8bfb\u6587\u4ef6\uff0c\u4fdd\u5b58\u526f\u672c\uff1f
+error.saveexif.cannotoverwrite2=\u53ea\u8bfb\u6587\u4ef6\u3002\u4fdd\u5b58\u526f\u672c\uff1f
 error.saveexif.failed1=\u56fe\u7247
 error.saveexif.failed2=\u4fdd\u5b58\u5931\u8d25
 error.saveexif.forced1=
@@ -696,7 +695,7 @@ error.jpegload.dialogtitle=\u5bfc\u5165\u76f8\u7247\u9519\u8bef
 error.jpegload.nofilesfound=\u627e\u4e0d\u5230\u6587\u4ef6
 error.jpegload.nojpegsfound=\u627e\u4e0d\u5230Jpeg\u6587\u4ef6
 error.jpegload.nogpsfound=\u627e\u4e0d\u5230GPS\u4fe1\u606f
-error.jpegload.exifreadfailed=Exif\u8bfb\u53d6\u9519\u8bef\u3002\u9700\u8981\u5185\u90e8\n\u6216\u8005\u5916\u90e8\u5e93\u624d\u80fd\u8bfb\u53d6
+error.jpegload.exifreadfailed=Exif\u8bfb\u53d6\u9519\u8bef\u3002\u9700\u8981\u5185\u90e8\u6216\u8005\u5916\u90e8\u5e93\u624d\u80fd\u8bfb\u53d6
 error.audioload.nofilesfound=\u672a\u627e\u5230\u58f0\u97f3\u6587\u4ef6
 error.gpsload.unknown=\u672a\u77e5\u9519\u8bef
 error.undofailed.title=\u64a4\u9500\u5931\u8d25
@@ -704,17 +703,17 @@ error.undofailed.text=\u64a4\u9500\u64cd\u4f5c\u5931\u8d25
 error.function.noop.title=\u529f\u80fd\u65e0\u6548
 error.rearrange.noop=\u91cd\u65b0\u914d\u7f6e\u822a\u70b9\u65e0\u6548
 error.function.notavailable.title=\u65e0\u6b64\u529f\u80fd
-error.function.nojava3d=\u6b64\u529f\u80fd\u9700\u8981 Java 3D\n\u53ef\u4eceSun.com\u83b7\u5f97
-error.3d=3D \u663e\u793a\u65f6\u51fa\u73b0\u4e00\u4e2a\u9519\u8bef
+error.function.nojava3d=\u6b64\u529f\u80fd\u9700\u8981 Java 3D\uff0c\u53ef\u4eceSun.com\u83b7\u5f97
+error.3d=3D \u663e\u793a\u9519\u8bef
 error.readme.notfound=\u627e\u4e0d\u5230\u7248\u672c\u4fe1\u606f\u6587\u4ef6
 error.osmimage.dialogtitle=\u5bfc\u5165\u5730\u56fe\u65f6\u9519\u8bef
-error.osmimage.failed=\u5bfc\u5165\u5730\u56fe\u9519\u8bef\uff0c\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5
+error.osmimage.failed=\u65e0\u6cd5\u5bfc\u5165\u5730\u56fe\uff0c\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5
 error.language.wrongfile=\u6240\u9009\u8bed\u8a00\u5305\u6587\u4ef6\u683c\u5f0f\u9519\u8bef
 error.convertnamestotimes.nonames=\u540d\u79f0\u65e0\u6cd5\u8f6c\u6362\u6210\u65f6\u95f4
 error.lookupsrtm.nonefound=\u65e0\u9ad8\u5ea6\u4fe1\u606f
 error.lookupsrtm.nonerequired=\u6240\u6709\u70b9\u5747\u542b\u9ad8\u5ea6\u4fe1\u606f
 error.gpsies.uploadnotok=gpsies\u670d\u52a1\u5668\u8fd4\u56de\u4fe1\u606f\uff1a
-error.gpsies.uploadfailed=\u4e0a\u4f20\u51fa\u9519\u5931\u8d25
+error.gpsies.uploadfailed=\u4e0a\u4f20\u5931\u8d25
 error.playaudiofailed=\u65e0\u6cd5\u64ad\u653e\u58f0\u97f3\u6587\u4ef6
 error.cache.notthere=\u672a\u627e\u5230\u533a\u57df\u6570\u636e\u7f13\u5b58\u6587\u4ef6\u5939
 error.cache.empty=\u533a\u57df\u6570\u636e\u6587\u4ef6\u5939\u7a7a
index eb40756b5ede82fbd2eae1ef1902d201e260063b..9b2bdc787a9c9a0833d7d5efd08380535b5dcc21 100644 (file)
@@ -211,6 +211,7 @@ public abstract class FieldGuesser
                        String upperValue = inValue.toUpperCase();
                        return (upperValue.equals("ALTITUDE")
                                || upperValue.equals("ALT")
+                               || upperValue.equals("HMSL") // height above mean sea level
                                || upperValue.equals(I18nManager.getText("fieldname.altitude").toUpperCase()));
                }
                else
index d14798270740a0525b0f56f8a7414bb82028dada..c55fc557ec6ee7bc5b58df0e19879b35935362ba 100644 (file)
@@ -24,9 +24,10 @@ public abstract class MediaHelper
         * Construct a MediaObject for the given path
         * @param inZipFile path to archive file (if any)
         * @param inPath path to media file
+        * @param inSourceFile file from which data was loaded
         * @return either Photo or AudioClip object as appropriate, or null
         */
-       public static MediaObject createMediaObject(File inZipFile, String inPath)
+       public static MediaObject createMediaObject(File inZipFile, String inPath, File inSourceFile)
        {
                if (inPath == null || inPath.length() < 5) return null;
                InputStream is = null;
@@ -85,29 +86,29 @@ public abstract class MediaHelper
                        }
                        return null;
                }
-               else
-                       // If we haven't got a result by now, try to just load plain file
-                       return createMediaObject(inPath);
+
+               // If we haven't got a result by now, try to load plain file
+               File file = (inSourceFile == null ? new File(inPath) : new File(inSourceFile.getParent(), inPath));
+               return createMediaObject(file);
        }
 
        /**
-        * Construct a MediaObject for the given path
-        * @param inPath path to file
+        * Construct a MediaObject for the given file
+        * @param inFile file to load
         * @return either Photo or AudioClip object as appropriate, or null
         */
-       private static MediaObject createMediaObject(String inPath)
+       private static MediaObject createMediaObject(File inFile)
        {
-               if (inPath == null) {return null;}
-               File file = new File(inPath);
-               if (!file.exists() || !file.canRead() || !file.isFile()) {return null;}
+               if (inFile == null) {return null;}
+               if (!inFile.exists() || !inFile.canRead() || !inFile.isFile()) {return null;}
                initFilters();
                // Check if filename looks like a jpeg
-               if (_jpegFilter.acceptFilename(file.getName())) {
-                       return JpegLoader.createPhoto(file);
+               if (_jpegFilter.acceptFilename(inFile.getName())) {
+                       return JpegLoader.createPhoto(inFile);
                }
                // Check if filename looks like an audio clip
-               if (_audioFilter.acceptFilename(file.getName())) {
-                       return new AudioClip(file);
+               if (_audioFilter.acceptFilename(inFile.getName())) {
+                       return new AudioClip(inFile);
                }
                // Neither photo nor audio
                return null;
index 440a56f7411a177beaa31e2b63353146d5a09c5a..512b7e55fac5d9a72f58b8bd1aa1e0c870a8363c 100644 (file)
@@ -350,11 +350,9 @@ public class TextFileLoader
                                        }
                                }
                        });
-               JPanel tablePanel = new JPanel();
-               tablePanel.setLayout(new BorderLayout());
-               tablePanel.add(_fieldTable.getTableHeader(), BorderLayout.NORTH);
-               tablePanel.add(_fieldTable, BorderLayout.CENTER);
-               innerPanel2.add(tablePanel, BorderLayout.CENTER);
+               JScrollPane lowerTablePane = new JScrollPane(_fieldTable);
+               lowerTablePane.setPreferredSize(new Dimension(300, 100));
+               innerPanel2.add(lowerTablePane, BorderLayout.CENTER);
 
                JPanel innerPanel3 = new JPanel();
                innerPanel3.setLayout(new BoxLayout(innerPanel3, BoxLayout.Y_AXIS));
index 47fc7213adb1d447a57e639edbb9e2aaa7c530f9..2ddd1cdb4aeb402c4b263d9cb2c14c2d90d20de1 100644 (file)
@@ -17,6 +17,7 @@ public class KmlHandler extends XmlHandler
        private String _name = null, _desc = null;
        private String _imgLink = null;
        private StringBuffer _coordinates = null;
+       private ArrayList<String> _coordinateList = null;
        private ArrayList<String[]> _pointList = new ArrayList<String[]>();
        private ArrayList<String> _linkList = new ArrayList<String>();
        // variables for gx extensions
@@ -33,7 +34,13 @@ public class KmlHandler extends XmlHandler
        {
                String tagName = localName;
                if (tagName == null || tagName.equals("")) {tagName = qName;}
-               if (tagName.equalsIgnoreCase("coordinates")) {_insideCoordinates = true; _coordinates = null;}
+               if (tagName.equalsIgnoreCase("Placemark")) {
+                       _coordinateList = new ArrayList<String>();
+               }
+               else if (tagName.equalsIgnoreCase("coordinates")) {
+                       _insideCoordinates = true;
+                       _coordinates = null;
+               }
                _value = null;
                super.startElement(uri, localName, qName, attributes);
        }
@@ -53,7 +60,10 @@ public class KmlHandler extends XmlHandler
                        processPlacemark();
                        _name = _desc = _imgLink = null;
                }
-               else if (tagName.equalsIgnoreCase("coordinates")) _insideCoordinates = false;
+               else if (tagName.equalsIgnoreCase("coordinates")) {
+                       _insideCoordinates = false;
+                       if (_coordinates != null) _coordinateList.add(_coordinates.toString().trim());
+               }
                else if (tagName.equalsIgnoreCase("name")) _name = _value;
                else if (tagName.equalsIgnoreCase("description")) {
                        _desc = _value;
@@ -102,30 +112,35 @@ public class KmlHandler extends XmlHandler
         */
        private void processPlacemark()
        {
-               if (_coordinates == null) return;
-               String allCoords = _coordinates.toString().trim();
-               String[] coordArray = allCoords.split("[ \n]");
-               int numPoints = coordArray.length;
-               if (numPoints == 1)
-               {
-                       // Add single waypoint to list
-                       _pointList.add(makeStringArray(allCoords, _name, _desc));
-                       _linkList.add(_imgLink);
-               }
-               else if (numPoints > 1)
+               if (_coordinateList == null || _coordinateList.isEmpty()) return;
+               final boolean isSingleSelection = (_coordinateList.size() == 1);
+               // Loop over coordinate sets in list (may have multiple <coordinates> tags within single placemark)
+               for (String coords : _coordinateList)
                {
-                       // Add each of the unnamed track points to list
-                       boolean firstPoint = true;
-                       for (int p=0; p<numPoints; p++)
+                       String[] coordArray = coords.split("[ \n]");
+                       int numPoints = coordArray.length;
+                       if (numPoints == 1)
                        {
-                               if (coordArray[p] != null && coordArray[p].trim().length()>3)
+                               // Add single point to list
+                               final String name = (isSingleSelection ? _name : null);
+                               _pointList.add(makeStringArray(coords, name, _desc));
+                               _linkList.add(_imgLink);
+                       }
+                       else if (numPoints > 1)
+                       {
+                               // Add each of the unnamed track points to list
+                               boolean firstPoint = true;
+                               for (int p=0; p<numPoints; p++)
                                {
-                                       String[] pointArray = makeStringArray(coordArray[p], null, null);
-                                       if (firstPoint) {pointArray[5] = "1";} // start of segment flag
-                                       firstPoint = false;
-                                       _pointList.add(pointArray);
+                                       if (coordArray[p] != null && coordArray[p].trim().length()>3)
+                                       {
+                                               String[] pointArray = makeStringArray(coordArray[p], null, null);
+                                               if (firstPoint) {pointArray[5] = "1";} // start of segment flag
+                                               firstPoint = false;
+                                               _pointList.add(pointArray);
+                                       }
+                                       _linkList.add(null);
                                }
-                               _linkList.add(null);
                        }
                }
        }
index 88a3d87706943ad1a5ad17b8d3fbe913e35d3ba9..fff0d92aa67f1587aa6e311411bc1f43caecd293 100644 (file)
@@ -83,7 +83,7 @@ public class ZipFileLoader
                        }
                }
                catch (Exception e) {
-                       System.err.println("ZipFile Error: " + e.getClass().getName() + " -message= " + e.getMessage());
+                       _app.showErrorMessageNoLookup("error.load.dialogtitle", e.getClass().getName() + "\n - " + e.getMessage());
                }
        }
 
index 22c8d81bb40ff29f5062815106ef1d05edd3bb83..a66883fa2fbd202203cfd10e0230968d94a6cf0d 100644 (file)
@@ -1,23 +1,23 @@
-GpsPrune version 13
-===================
+GpsPrune version 13.4
+=====================
 
 GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
 including format conversion, charting and photo correlation.
 Full details can be found at http://activityworkshop.net/software/gpsprune/
 
-GpsPrune is copyright 2006-2011 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
+GpsPrune is copyright 2006-2012 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
 You may freely use the software, and may help others to freely use it too.  For further information
 on your rights and how they are protected, see the included license.txt file.
 
-GpsPrune comes without warranty and without guarantee - the authors cannot be held responsible for
-losses incurred through use of the program, however caused.
+GpsPrune comes without warranty and without guarantee - the authors cannot be held responsible
+for losses incurred through use of the program, however caused.
 
 
 Running
 =======
 
 To run GpsPrune from the jar file, simply call it from a command prompt or shell:
-   java -jar gpsprune_13.jar
+   java -jar gpsprune_13.4.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,8 +25,41 @@ 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_13.jar --lang=DE
+   java -jar gpsprune_13.4.jar --lang=DE
+
+
+New with version 13.4
+=====================
+The following features were added since version 13.3:
+  - Fix for empty settings
+  - Fix for file suffixes of cached tiles
+  - Removed Osma source as tiles@home has been discontinued
 
+New with version 13.3
+=====================
+The following features were added since version 13.2:
+  - Completion of Italian translations
+  - Fix for exporting track names to version 1.1 gpx files
+  - Changed OpenCycleMap url
+  - Added diagnostics if unrecognised command-line parameter wasn't a valid file
+  - Improve error handling when tile downloading fails
+  - Fix for editing a cloudmade source
+
+New with version 13.2
+=====================
+The following features were added since version 13.1:
+  - Russian translation
+  - Fix for loading kml with placemarks with multiple coordinate lists
+  - Fix for exporting descriptions to version 1.1 gpx files
+
+New with version 13.1
+=====================
+The following features were added since version 13:
+  - Allow loading of photos and audio using relative paths from the gpx/kml file
+  - Cosmetic fixes to make the map controls more visible
+  - Allow osm-style map sources to use gifs or jpgs as well as pngs
+  - Allow edit of custom map sources
+  - Addition of a few more built-in map sources, such as hikebikemap and openseamap
 
 New with version 13
 ===================
index a7f2823c42a2d5dfbd6b5766a4ec5fd619ed3262..d35c35a8696be7e9863fca94fcb6c4c91dcf49ad 100644 (file)
@@ -343,20 +343,12 @@ public class GpxExporter extends GenericFunction implements Runnable
                if (inUseCopy) gpxCachers = new GpxCacherList(inInfo.getFileInfo());
                // Write or copy headers
                inWriter.write(getXmlHeaderString(inWriter));
-               inWriter.write(getGpxHeaderString(gpxCachers));
+               final String gpxHeader = getGpxHeaderString(gpxCachers);
+               final boolean isVersion1_1 = (gpxHeader.toUpperCase().indexOf("GPX/1/1") > 0);
+               inWriter.write(gpxHeader);
                // Name field
-               String trackName = "GpsPruneTrack";
-               if (inName != null && !inName.equals(""))
-               {
-                       trackName = inName;
-                       inWriter.write("\t<name>");
-                       inWriter.write(trackName);
-                       inWriter.write("</name>\n");
-               }
-               // Description field
-               inWriter.write("\t<desc>");
-               inWriter.write((inDesc != null && !inDesc.equals(""))?inDesc:"Export from GpsPrune");
-               inWriter.write("</desc>\n");
+               String trackName = (inName != null && !inName.equals("")) ? inName : "GpsPruneTrack";
+               writeNameAndDescription(inWriter, inName, inDesc, isVersion1_1);
 
                int i = 0;
                DataPoint point = null;
@@ -414,6 +406,38 @@ public class GpxExporter extends GenericFunction implements Runnable
        }
 
 
+       /**
+        * Write the name and description according to the GPX version number
+        * @param inWriter writer object
+        * @param inName name, or null if none supplied
+        * @param inDesc description, or null if none supplied
+        * @param inIsVersion1_1 true if gpx version 1.1, false for version 1.0
+        */
+       private static void writeNameAndDescription(OutputStreamWriter inWriter,
+               String inName, String inDesc, boolean inIsVersion1_1) throws IOException
+       {
+               String desc = (inDesc != null && !inDesc.equals("")) ? inDesc : "Export from GpsPrune";
+               // Position of name and description fields needs to be different for GPX1.0 and GPX1.1
+               if (inIsVersion1_1)
+               {
+                       // GPX 1.1 has the name and description inside a metadata tag
+                       inWriter.write("\t<metadata>\n");
+               }
+               if (inName != null && !inName.equals(""))
+               {
+                       inWriter.write("\t\t<name>");
+                       inWriter.write(inName);
+                       inWriter.write("</name>\n");
+               }
+               inWriter.write("\t\t<desc>");
+               inWriter.write(desc);
+               inWriter.write("</desc>\n");
+               if (inIsVersion1_1)
+               {
+                       inWriter.write("\t</metadata>\n");
+               }
+       }
+
        /**
         * Loop through the track outputting the relevant track points
         * @param inWriter writer object for output
index 69f51683cfdbd2e508c8bbede28cca83362b45e8..4a86c5b5472c27f0b1b7e201ba658194b793b1f6 100644 (file)
@@ -332,7 +332,7 @@ public class SvgExporter extends Export3dFunction
                                "<stop offset=\"100%\" stop-color=\"#008000\"/>" +
                                "</radialGradient>" +
                                "</defs>";
-                   inWriter.write(defs);
+                       inWriter.write(defs);
                        inWriter.write(inLineSeparator);
                }
                inWriter.write("<g inkscape:label=\"Layer 1\" inkscape:groupmode=\"layer\" id=\"layer1\">");