From f1b92378a792131ac8fb33a869405851d5b2d1f7 Mon Sep 17 00:00:00 2001 From: activityworkshop Date: Sun, 15 Feb 2015 11:04:35 +0100 Subject: [PATCH] Version 13.4, May 2012 --- tim/prune/App.java | 2 +- tim/prune/GpsPrune.java | 36 +- tim/prune/config/Config.java | 10 +- tim/prune/correlate/Correlator.java | 1 + tim/prune/data/Coordinate.java | 17 +- tim/prune/data/Track.java | 2 +- tim/prune/function/AboutScreen.java | 25 +- tim/prune/function/AddMapSourceDialog.java | 281 +++++-- tim/prune/function/AsyncMediaLoader.java | 9 +- tim/prune/function/DiskCacheConfig.java | 3 +- tim/prune/function/SetLanguage.java | 8 +- tim/prune/function/SetMapBgFunction.java | 71 +- .../function/cache/ManageCacheFunction.java | 22 +- .../gpsies/GenericDownloaderFunction.java | 2 + tim/prune/gui/images/add_photo_icon.png | Bin tim/prune/gui/images/add_textfile_icon.png | Bin tim/prune/gui/map/CloudmadeMapSource.java | 8 + tim/prune/gui/map/DiskTileCacher.java | 1 + tim/prune/gui/map/MapCanvas.java | 10 +- tim/prune/gui/map/MapSource.java | 20 +- tim/prune/gui/map/MapSourceLibrary.java | 28 +- tim/prune/gui/map/MapTileManager.java | 42 +- tim/prune/gui/map/MffMapSource.java | 9 +- tim/prune/gui/map/OsmMapSource.java | 59 +- tim/prune/gui/map/OverlayPanel.java | 69 ++ tim/prune/gui/profile/AltitudeData.java | 2 +- tim/prune/jpeg/drew/ExifReader.java | 2 +- tim/prune/lang/prune-texts_cz.properties | 1 + tim/prune/lang/prune-texts_de.properties | 1 + tim/prune/lang/prune-texts_de_CH.properties | 1 + tim/prune/lang/prune-texts_en.properties | 1 + tim/prune/lang/prune-texts_en_US.properties | 17 + tim/prune/lang/prune-texts_es.properties | 3 +- tim/prune/lang/prune-texts_hu.properties | 3 +- tim/prune/lang/prune-texts_it.properties | 31 +- tim/prune/lang/prune-texts_nl.properties | 3 +- tim/prune/lang/prune-texts_pl.properties | 3 +- tim/prune/lang/prune-texts_pt.properties | 1 + tim/prune/lang/prune-texts_ro.properties | 23 +- tim/prune/lang/prune-texts_ru.properties | 724 ++++++++++++++++++ tim/prune/lang/prune-texts_zh.properties | 71 +- tim/prune/load/FieldGuesser.java | 1 + tim/prune/load/MediaHelper.java | 29 +- tim/prune/load/TextFileLoader.java | 8 +- tim/prune/load/xml/KmlHandler.java | 59 +- tim/prune/load/xml/ZipFileLoader.java | 2 +- tim/prune/readme.txt | 47 +- tim/prune/save/GpxExporter.java | 50 +- tim/prune/save/SvgExporter.java | 2 +- 49 files changed, 1564 insertions(+), 256 deletions(-) mode change 100644 => 100755 tim/prune/gui/images/add_photo_icon.png mode change 100644 => 100755 tim/prune/gui/images/add_textfile_icon.png create mode 100644 tim/prune/gui/map/OverlayPanel.java create mode 100644 tim/prune/lang/prune-texts_en_US.properties create mode 100644 tim/prune/lang/prune-texts_ru.properties diff --git a/tim/prune/App.java b/tim/prune/App.java index 8189ffb..770fd20 100644 --- a/tim/prune/App.java +++ b/tim/prune/App.java @@ -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 diff --git a/tim/prune/GpsPrune.java b/tim/prune/GpsPrune.java index 41dac2b..a444a02 100644 --- a/tim/prune/GpsPrune.java +++ b/tim/prune/GpsPrune.java @@ -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 + "'"; + } } diff --git a/tim/prune/config/Config.java b/tim/prune/config/Config.java index 412f408..a286d7f 100644 --- a/tim/prune/config/Config.java +++ b/tim/prune/config/Config.java @@ -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 */ diff --git a/tim/prune/correlate/Correlator.java b/tim/prune/correlate/Correlator.java index 7ac2da7..2a4b49f 100644 --- a/tim/prune/correlate/Correlator.java +++ b/tim/prune/correlate/Correlator.java @@ -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); } diff --git a/tim/prune/data/Coordinate.java b/tim/prune/data/Coordinate.java index 40853eb..a230e77 100644 --- a/tim/prune/data/Coordinate.java +++ b/tim/prune/data/Coordinate.java @@ -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: diff --git a/tim/prune/data/Track.java b/tim/prune/data/Track.java index fc65959..63cd01f 100644 --- a/tim/prune/data/Track.java +++ b/tim/prune/data/Track.java @@ -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 diff --git a/tim/prune/function/AboutScreen.java b/tim/prune/function/AboutScreen.java index c2dc3fe..0ec7ae6 100644 --- a/tim/prune/function/AboutScreen.java +++ b/tim/prune/function/AboutScreen.java @@ -98,8 +98,8 @@ public class AboutScreen extends GenericFunction descBuffer.append("

").append(I18nManager.getText("dialog.about.summarytext3")).append("

"); descBuffer.append("

").append(I18nManager.getText("dialog.about.languages")).append(" : ") .append("\u010de\u0161tina, deutsch, english, espa\u00F1ol, fran\u00E7ais, italiano, magyar,
" + - " nederlands, polski, portugu\u00EAs, \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

"); + " nederlands, polski, 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

"); descBuffer.append("

").append(I18nManager.getText("dialog.about.translatedby")).append("

"); 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 diff --git a/tim/prune/function/AddMapSourceDialog.java b/tim/prune/function/AddMapSourceDialog.java index ec13bb1..da1f15e 100644 --- a/tim/prune/function/AddMapSourceDialog.java +++ b/tim/prune/function/AddMapSourceDialog.java @@ -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= 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(); } /** diff --git a/tim/prune/function/cache/ManageCacheFunction.java b/tim/prune/function/cache/ManageCacheFunction.java index 551eb35..6556598 100644 --- a/tim/prune/function/cache/ManageCacheFunction.java +++ b/tim/prune/function/cache/ManageCacheFunction.java @@ -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++; + } } } } diff --git a/tim/prune/function/gpsies/GenericDownloaderFunction.java b/tim/prune/function/gpsies/GenericDownloaderFunction.java index 743becf..e9049a8 100644 --- a/tim/prune/function/gpsies/GenericDownloaderFunction.java +++ b/tim/prune/function/gpsies/GenericDownloaderFunction.java @@ -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); diff --git a/tim/prune/gui/images/add_photo_icon.png b/tim/prune/gui/images/add_photo_icon.png old mode 100644 new mode 100755 diff --git a/tim/prune/gui/images/add_textfile_icon.png b/tim/prune/gui/images/add_textfile_icon.png old mode 100644 new mode 100755 diff --git a/tim/prune/gui/map/CloudmadeMapSource.java b/tim/prune/gui/map/CloudmadeMapSource.java index 2e627a8..99aa809 100644 --- a/tim/prune/gui/map/CloudmadeMapSource.java +++ b/tim/prune/gui/map/CloudmadeMapSource.java @@ -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; + } } diff --git a/tim/prune/gui/map/DiskTileCacher.java b/tim/prune/gui/map/DiskTileCacher.java index 84f54de..40216f8 100644 --- a/tim/prune/gui/map/DiskTileCacher.java +++ b/tim/prune/gui/map/DiskTileCacher.java @@ -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); diff --git a/tim/prune/gui/map/MapCanvas.java b/tim/prune/gui/map/MapCanvas.java index 82cf434..7fc5c48 100644 --- a/tim/prune/gui/map/MapCanvas.java +++ b/tim/prune/gui/map/MapCanvas.java @@ -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() { diff --git a/tim/prune/gui/map/MapSource.java b/tim/prune/gui/map/MapSource.java index 35590a6..e3ac2ed 100644 --- a/tim/prune/gui/map/MapSource.java +++ b/tim/prune/gui/map/MapSource.java @@ -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= 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); } diff --git a/tim/prune/gui/map/MffMapSource.java b/tim/prune/gui/map/MffMapSource.java index 772d8e9..42806fc 100644 --- a/tim/prune/gui/map/MffMapSource.java +++ b/tim/prune/gui/map/MffMapSource.java @@ -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); } /** diff --git a/tim/prune/gui/map/OsmMapSource.java b/tim/prune/gui/map/OsmMapSource.java index 7686307..09def45 100644 --- a/tim/prune/gui/map/OsmMapSource.java +++ b/tim/prune/gui/map/OsmMapSource.java @@ -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 index 0000000..e917e5a --- /dev/null +++ b/tim/prune/gui/map/OverlayPanel.java @@ -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); + } +} diff --git a/tim/prune/gui/profile/AltitudeData.java b/tim/prune/gui/profile/AltitudeData.java index f92046a..e3bfbea 100644 --- a/tim/prune/gui/profile/AltitudeData.java +++ b/tim/prune/gui/profile/AltitudeData.java @@ -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; } diff --git a/tim/prune/jpeg/drew/ExifReader.java b/tim/prune/jpeg/drew/ExifReader.java index 08f3012..4c90cab 100644 --- a/tim/prune/jpeg/drew/ExifReader.java +++ b/tim/prune/jpeg/drew/ExifReader.java @@ -78,7 +78,7 @@ public class ExifReader /** "Original" Exif timestamp */ public static final int TAG_DATETIME_ORIGINAL = 0x9003; /** "Creation" or "Digitized" timestamp */ - public static final int TAG_DATETIME_DIGITIZED = 0x9004; + public static final int TAG_DATETIME_DIGITIZED = 0x9004; /** Thumbnail offset */ private static final int TAG_THUMBNAIL_OFFSET = 0x0201; /** Thumbnail length */ diff --git a/tim/prune/lang/prune-texts_cz.properties b/tim/prune/lang/prune-texts_cz.properties index ae344ca..248dfb7 100644 --- a/tim/prune/lang/prune-texts_cz.properties +++ b/tim/prune/lang/prune-texts_cz.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_de.properties b/tim/prune/lang/prune-texts_de.properties index 6e102d4..745331a 100644 --- a/tim/prune/lang/prune-texts_de.properties +++ b/tim/prune/lang/prune-texts_de.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_de_CH.properties b/tim/prune/lang/prune-texts_de_CH.properties index 4e6f73f..38f0538 100644 --- a/tim/prune/lang/prune-texts_de_CH.properties +++ b/tim/prune/lang/prune-texts_de_CH.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_en.properties b/tim/prune/lang/prune-texts_en.properties index d105404..003593b 100644 --- a/tim/prune/lang/prune-texts_en.properties +++ b/tim/prune/lang/prune-texts_en.properties @@ -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 index 0000000..b2b2fc2 --- /dev/null +++ b/tim/prune/lang/prune-texts_en_US.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_es.properties b/tim/prune/lang/prune-texts_es.properties index 6cd6654..49bc392 100644 --- a/tim/prune/lang/prune-texts_es.properties +++ b/tim/prune/lang/prune-texts_es.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_hu.properties b/tim/prune/lang/prune-texts_hu.properties index 1336c01..da5b1b6 100644 --- a/tim/prune/lang/prune-texts_hu.properties +++ b/tim/prune/lang/prune-texts_hu.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_it.properties b/tim/prune/lang/prune-texts_it.properties index eb4d1ff..a15ceb1 100644 --- a/tim/prune/lang/prune-texts_it.properties +++ b/tim/prune/lang/prune-texts_it.properties @@ -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

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 diff --git a/tim/prune/lang/prune-texts_nl.properties b/tim/prune/lang/prune-texts_nl.properties index ec9efa5..6b92a56 100644 --- a/tim/prune/lang/prune-texts_nl.properties +++ b/tim/prune/lang/prune-texts_nl.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_pl.properties b/tim/prune/lang/prune-texts_pl.properties index c0f9982..f76d7af 100644 --- a/tim/prune/lang/prune-texts_pl.properties +++ b/tim/prune/lang/prune-texts_pl.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_pt.properties b/tim/prune/lang/prune-texts_pt.properties index 8d09afe..6266d43 100644 --- a/tim/prune/lang/prune-texts_pt.properties +++ b/tim/prune/lang/prune-texts_pt.properties @@ -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 diff --git a/tim/prune/lang/prune-texts_ro.properties b/tim/prune/lang/prune-texts_ro.properties index cfb6a17..4df0143 100644 --- a/tim/prune/lang/prune-texts_ro.properties +++ b/tim/prune/lang/prune-texts_ro.properties @@ -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 index 0000000..14caca8 --- /dev/null +++ b/tim/prune/lang/prune-texts_ru.properties @@ -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.
\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
\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 license.txt. +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 http://activityworkshop.net/ +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=
\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
Ctrl + \u043b\u0435\u0432\u0430\u044f, \u043f\u0440\u0430\u0432\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430\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
Ctrl + \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0432\u0432\u0435\u0440\u0445, \u0432\u043d\u0438\u0437 \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
Ctrl + PgUp, PgDown\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
Ctrl + Home, End\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
Del\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443
+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,

\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

\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 diff --git a/tim/prune/lang/prune-texts_zh.properties b/tim/prune/lang/prune-texts_zh.properties index 290c1fe..bce8796 100644 --- a/tim/prune/lang/prune-texts_zh.properties +++ b/tim/prune/lang/prune-texts_zh.properties @@ -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 diff --git a/tim/prune/load/FieldGuesser.java b/tim/prune/load/FieldGuesser.java index eb40756..9b2bdc7 100644 --- a/tim/prune/load/FieldGuesser.java +++ b/tim/prune/load/FieldGuesser.java @@ -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 diff --git a/tim/prune/load/MediaHelper.java b/tim/prune/load/MediaHelper.java index d147982..c55fc55 100644 --- a/tim/prune/load/MediaHelper.java +++ b/tim/prune/load/MediaHelper.java @@ -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; diff --git a/tim/prune/load/TextFileLoader.java b/tim/prune/load/TextFileLoader.java index 440a56f..512b7e5 100644 --- a/tim/prune/load/TextFileLoader.java +++ b/tim/prune/load/TextFileLoader.java @@ -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)); diff --git a/tim/prune/load/xml/KmlHandler.java b/tim/prune/load/xml/KmlHandler.java index 47fc721..2ddd1cd 100644 --- a/tim/prune/load/xml/KmlHandler.java +++ b/tim/prune/load/xml/KmlHandler.java @@ -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 _coordinateList = null; private ArrayList _pointList = new ArrayList(); private ArrayList _linkList = new ArrayList(); // 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(); + } + 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 tags within single placemark) + for (String coords : _coordinateList) { - // Add each of the unnamed track points to list - boolean firstPoint = true; - for (int p=0; p3) + // 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; p3) + { + 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); } } } diff --git a/tim/prune/load/xml/ZipFileLoader.java b/tim/prune/load/xml/ZipFileLoader.java index 88a3d87..fff0d92 100644 --- a/tim/prune/load/xml/ZipFileLoader.java +++ b/tim/prune/load/xml/ZipFileLoader.java @@ -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()); } } diff --git a/tim/prune/readme.txt b/tim/prune/readme.txt index 22c8d81..a66883f 100644 --- a/tim/prune/readme.txt +++ b/tim/prune/readme.txt @@ -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 =================== diff --git a/tim/prune/save/GpxExporter.java b/tim/prune/save/GpxExporter.java index a7f2823..d35c35a 100644 --- a/tim/prune/save/GpxExporter.java +++ b/tim/prune/save/GpxExporter.java @@ -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"); - inWriter.write(trackName); - inWriter.write("\n"); - } - // Description field - inWriter.write("\t"); - inWriter.write((inDesc != null && !inDesc.equals(""))?inDesc:"Export from GpsPrune"); - inWriter.write("\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\n"); + } + if (inName != null && !inName.equals("")) + { + inWriter.write("\t\t"); + inWriter.write(inName); + inWriter.write("\n"); + } + inWriter.write("\t\t"); + inWriter.write(desc); + inWriter.write("\n"); + if (inIsVersion1_1) + { + inWriter.write("\t\n"); + } + } + /** * Loop through the track outputting the relevant track points * @param inWriter writer object for output diff --git a/tim/prune/save/SvgExporter.java b/tim/prune/save/SvgExporter.java index 69f5168..4a86c5b 100644 --- a/tim/prune/save/SvgExporter.java +++ b/tim/prune/save/SvgExporter.java @@ -332,7 +332,7 @@ public class SvgExporter extends Export3dFunction "" + "" + ""; - inWriter.write(defs); + inWriter.write(defs); inWriter.write(inLineSeparator); } inWriter.write(""); -- 2.43.0