vMLE|;-3UiF@GEaHKdEe(e|CduMio$=+WYxwr
z$?It1J;dy~5+F_T8dkAW4mWU#;ea&BXR%!l&fpX0I1MrD^ndo&es_>2c>|l+#R>}C
z;1pLOW?zFIs})5dP4WXAp^hhAeECB$s0l0l!%
zE#B}v=zb(1O(*gx%;RA!02Xw={MdlSvJM3N0P(F`fql;7tN;K207*qoM6N<$g1@JV
Awg3PC
diff --git a/tim/prune/gui/images/wpicon_default_m.png b/tim/prune/gui/images/wpicon_default_m.png
new file mode 100644
index 0000000000000000000000000000000000000000..95fffb4899fc1dbe079cf48731244bae5c7f894d
GIT binary patch
literal 138
zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!Jgu?6^qxNfs>0W#lQF6{zRj3q&S
z!3+-1Zlr-YN#5=*3>~bp9zYIffk$L90|U1(2s1LwngcRTz|+MsgyVX0f&$x>hX-01
Z8Tu5Mz6P8)vjZr{;OXk;vd$@?2><|CA#eZy
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_pin_l.png b/tim/prune/gui/images/wpicon_pin_l.png
new file mode 100644
index 0000000000000000000000000000000000000000..66354c16bac787f32503b46c72c0ed1b203d9915
GIT binary patch
literal 554
zcmV+_0@eMAP))YsS7-QC^d
z;^O4wFMd}>gx6N_4fAm_xJbs`1tzz`uqF){QUg={r&&{{{n`w<^TWy0d!JM
zQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L00E!?00E!@`peoN00007bV*G`2jB=2
z69y)V$6BQT007!aL_t(2&wY~FR>D9KL{mMi64}v!%D#huD4>EM^Zy@3CYcjL(nG!8
z?&{UDZbf971msgjit1rq1b9YYQvSX`@UA`SYLF&Ab*1QMiLnNn($oGmZjIVWYK@{@
zi-)ZYRJesCrW(vXWH($DZo#%@yIi6X-jo2~oPGBH1VV_BJzv(pbz&3E}xi!EqAoMIODv4F;+~mGxhim^}9k1gBpHXG(qu
saqYnPbS{JWA#v|p#T{nOQ-?O_0z0cDR5t8(qyPW_07*qoM6N<$f}o}G*#H0l
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_pin_m.png b/tim/prune/gui/images/wpicon_pin_m.png
new file mode 100644
index 0000000000000000000000000000000000000000..86c6c3d1a01c047559a75ae77c63a25373d0c9dc
GIT binary patch
literal 492
zcmVI1qKEN2L}fT2nZ1o5f>L18X6iM9UUMbAS5ItB_$;(DJeNQ
zIXpZ(Jv}`?KR--NOi)lzRaI46TU%peV`XJ!YHDh0Yio6Nb$EDqdwY9;fPjdIh?0_$
znVFfJo134XpP-uz*?Ck9F
z^78ZZ^Y-@k`uh6&`}_R-{Qdp?{{H^||No?u$%y~}00DGTPE!Ct=GbNc0004EOGiWi
zhy@);00009a7bBm0004A0004A0bguxdH?_bzDYzuR4C7NQpXmja4e5
zi1I@UbS!u}?6D4YO==PvoFks3>ffWKw9xu@hJP}W8T4?Omtv@`?&0Z^IcqWg2em2dPI0=V_0V7ZO*
i3idz1L9jm+Hu41~To|27bM^`V0000
zuV24@|Ni~w&!2z){{8pw-+%x9{r~?zzb@9~z{A?i
zdL}OFVdQ&MBb@0N6m6*8l(j
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_plectrum_l.png b/tim/prune/gui/images/wpicon_plectrum_l.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1088838166f10e61988cffcdfed1cd9a182d31d
GIT binary patch
literal 348
zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{UQ0X`wFqDw9Unas@05)u+hN=jN<
zT6%hV2?+@q85u=IMdjt?H8nN0wY3cm4O6F1U9x1!%9ShEuV4S+!-p?lzWn<2>-X>9
z|NsA=d^y+@XbNLVkY6x^!?PP{AWo9Ey9+}HtE>l*!&%@FSqv1L1Hz2I8d5lcg6t)p
zzOL*KID~}Rt=jLJuLcTD@N{tu(Kz3FDU$E70uM`owe-#J1^*XM+o9?ZyX^DP4=O4=
zE`c{%>)PfsTskx7`ggy~XEKEuDRL*PCbDOSgTSY<6{bNc-`{K{sxy$MzJR5i00B
zKlQ6rLFf(kH=@^;Z{HktqWQR@Z1a?)U3t5fIo-d!RC0T6&Xtmx2cIY&Qa{|^J8{B6
m{%`D@Gs73{5qfI6Qh%-v=ktB$2TXu&WAJqKb6Mw<&;$UbppC}>
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_plectrum_m.png b/tim/prune/gui/images/wpicon_plectrum_m.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b79ac2ee50d4524b8ab9db80fb4efdfbc4d7611
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAIR*HHxV|~84P>&jvkM3ah>3|w
zNl6(S8(UdfSzBA%+S+<}c!Y(8rKhK7W@hH+=T}!(U%Ytn?%lheKY#xA?c49)zyJUL
z-)yD_G=YJ!B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%5$*C4w;Hr+FXkfPyWaE{-7@
z=X)pK7HUx7U|l%-?&&H2|6g5VbU0~Q?V-(9$_xUIY;g%LoyMhXq0vv<{Lgy1WGl1C
zTlx3ApQkpZb*XT)%E59TSD&gwS4+A*yZ(vo6?t0rG+L9jZ@R?%xiVkhIK4?bvrl?O
zd+LhK*94~~u5_Ba&ftT8hO`gcl(oz?(m&juSkFplw`w@?R}ttQ22WQ%mvv4FO#q7^
BbBX`}
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_plectrum_s.png b/tim/prune/gui/images/wpicon_plectrum_s.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0c4bab638ec0f2506439979ddd8fb7c7146fad8
GIT binary patch
literal 271
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU1=2vk$jHdT!Xh9b;N#;H
z92^`P8d_alJ!Q(2y?ghbJ9qBt)vMR8UHkRx*Z=?jr(GAG2+~jzECyCqR(5uFO-;?l
z#>O*e&Ro5E_2($o)N;8%O`2{mLJiCzw;v{*yyD)UH%6b4foCO|{#S9G0
zK*O137`<2M-USM>mw5WRvOnMu66TP&s+!dR6e{p^aSV~ToSdM*BLTEbz{b(QVG=VV
zqlo7W6XhOlhUp?fEuPIPzQ(tj7G82#=kfH+%*(P5V?NJx2;h0hB~bp9zYIffk$L9P;5O2Gxo5SSOEpu
zOFVsD*&lES35uwn{UR6#+gWt}UyV1DTABj7&^S%*@QJ
ztgJjdJiNTTe0+RjVq$V~a=N;@hK7blMn=ZQ#%5+_mX?+wAt9NWnc3OdIXOAS#l@wi
zrIRL2TC`}<;lqcI9656I=+X1%&tJZL`RdiHH*VaxdGqG$*RS8cef#t0&tJcO{r&s*
z-@kwV|Nno#L8KdGaY>M0FoVOh8)+a;lDE4HLkFv@2av;A;1O926#E0hjMF9Xgwq@;K1&u4)l^)E{
z40a3D4;EbWV%Ohv70y#9j=5YEl5TB1WP0E>N7sCJ#zN^tQpG7&i8L!`S?%R
z_U*RU&P|@5`~CUhJiC3yF85oj;+X;)PL{J6^nPGxng4U*S0?2(;@nF@Z^Z%~%;4$j
K=d#Wzp$P!en62;t
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/images/wpicon_ringpt_m.png b/tim/prune/gui/images/wpicon_ringpt_m.png
new file mode 100644
index 0000000000000000000000000000000000000000..fabfe84356014ed4f23d65ab6d0524fe9421035a
GIT binary patch
literal 309
zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAIR*HHxGq;I1TvYJm^e8(MMXt5
zG&Hodv^+gMi;IiP%gZY(E32!kySuyBu3fus-MYPd_Z~fZ^xU~~KYsl9`Sa)R-@pI=
z{~vV9ryFPlV@Z%-FoVOh8)+a;lDE4HLkFv@2av;A;1O926k7wrjEZ|g!-0bJo-U3d
z8t3Ouv=nPl;9+H6#L=OB=l`l>%Y_ytJPbKGUya+rN#TQ&N|vR$`~ArGxyO0UF69W`
z>^Z}G%`EPQPr}W0+asclB6iLw@aa);Q&STX7G~~j^?{C4SPRb
xU|O75pX#heQfdElU>%{Y%E?yFvm2iAd{JynS+Calao_Y
zQc_u2xvHwFuC8wKhZ8~t^z@bBj&YU@O>C&Zl@7{g=`t|?+|DV_0n*h|tSQ6wH
z%;50sMjD8dsIl8_h}y(9LBYL0kWT&s`2Ur}vik)`!lIi_QMYoA|O*zxbExw(}nb9&ZNWss*C
NJYD@<);T3K0RV!1T|EE*
literal 0
HcmV?d00001
diff --git a/tim/prune/gui/map/MapCanvas.java b/tim/prune/gui/map/MapCanvas.java
index 5711951..801adbb 100644
--- a/tim/prune/gui/map/MapCanvas.java
+++ b/tim/prune/gui/map/MapCanvas.java
@@ -1,39 +1,10 @@
package tim.prune.gui.map;
-import java.awt.AlphaComposite;
-import java.awt.BasicStroke;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.RenderingHints;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
+import java.awt.*;
+import java.awt.event.*;
import java.awt.image.BufferedImage;
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JSlider;
-import javax.swing.SwingUtilities;
+import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -44,23 +15,12 @@ import tim.prune.I18nManager;
import tim.prune.UpdateMessageBroker;
import tim.prune.config.ColourScheme;
import tim.prune.config.Config;
-import tim.prune.data.Checker;
-import tim.prune.data.Coordinate;
-import tim.prune.data.DataPoint;
-import tim.prune.data.DoubleRange;
-import tim.prune.data.Field;
-import tim.prune.data.FieldList;
-import tim.prune.data.Latitude;
-import tim.prune.data.Longitude;
-import tim.prune.data.MidpointData;
-import tim.prune.data.Selection;
-import tim.prune.data.Track;
-import tim.prune.data.TrackInfo;
+import tim.prune.data.*;
import tim.prune.function.compress.MarkPointsInRectangleFunction;
import tim.prune.function.edit.FieldEdit;
import tim.prune.function.edit.FieldEditList;
import tim.prune.gui.IconManager;
-import tim.prune.gui.TripleStateCheckBox;
+import tim.prune.gui.MultiStateCheckBox;
import tim.prune.gui.colour.PointColourer;
import tim.prune.tips.TipManager;
@@ -99,7 +59,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
/** Checkbox for autopan */
private JCheckBox _autopanCheckBox = null;
/** Checkbox for connecting track points */
- private TripleStateCheckBox _connectCheckBox = null;
+ private MultiStateCheckBox _connectCheckBox = null;
/** Checkbox for enable edit mode */
private JCheckBox _editmodeCheckBox = null;
/** Right-click popup menu */
@@ -128,6 +88,8 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
private boolean _shownOsmErrorAlready = false;
/** Current drawing mode */
private int _drawMode = MODE_DEFAULT;
+ /** Current waypoint icon definition */
+ WpIconDefinition _waypointIconDefinition = null;
/** Constant for click sensitivity when selecting nearest point */
private static final int CLICK_SENSITIVITY = 10;
@@ -243,10 +205,11 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
_autopanCheckBox.setFocusable(false); // stop button from stealing keyboard focus
_topPanel.add(_autopanCheckBox);
// Add checkbox button for connecting points or not
- _connectCheckBox = new TripleStateCheckBox();
- _connectCheckBox.setIcon(0, IconManager.getImageIcon(IconManager.POINTS_CONNECTED_BUTTON));
- _connectCheckBox.setIcon(1, IconManager.getImageIcon(IconManager.POINTS_DISCONNECTED_BUTTON));
- _connectCheckBox.setIcon(2, IconManager.getImageIcon(IconManager.POINTS_HIDDEN_BUTTON));
+ _connectCheckBox = new MultiStateCheckBox(4);
+ _connectCheckBox.setIcon(0, IconManager.getImageIcon(IconManager.POINTS_WITH_ARROWS_BUTTON));
+ _connectCheckBox.setIcon(1, IconManager.getImageIcon(IconManager.POINTS_HIDDEN_BUTTON));
+ _connectCheckBox.setIcon(2, IconManager.getImageIcon(IconManager.POINTS_CONNECTED_BUTTON));
+ _connectCheckBox.setIcon(3, IconManager.getImageIcon(IconManager.POINTS_DISCONNECTED_BUTTON));
_connectCheckBox.setCurrentState(0);
_connectCheckBox.setOpaque(false);
_connectCheckBox.setToolTipText(I18nManager.getText("menu.map.connect"));
@@ -305,6 +268,8 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
makePopup();
// Get currently selected map from Config, pass to MapTileManager
_tileManager.setMapSource(Config.getConfigInt(Config.KEY_MAPSOURCE_INDEX));
+ // Update display settings
+ dataUpdated(MAPSERVER_CHANGED);
}
@@ -409,7 +374,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
}
// Draw the map contents if necessary
- if ((_mapImage == null || _recalculate))
+ if (_mapImage == null || _recalculate)
{
paintMapContents();
_scaleBar.updateScale(_mapPosition.getZoom(), _mapPosition.getYFromPixels(0, 0));
@@ -601,7 +566,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
if (trackOpacity > 0.0f)
{
// Paint the track points on top
- int pointsPainted = 1;
+ boolean pointsPainted = true;
try
{
if (trackOpacity > 0.9f)
@@ -632,7 +597,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
catch (ArrayIndexOutOfBoundsException obe) {} // also ignore
// Zoom to fit if no points found
- if (pointsPainted <= 0 && _checkBounds)
+ if (!pointsPainted && _checkBounds)
{
zoomToFit();
_recalculate = true;
@@ -652,9 +617,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
/**
* Paint the points using the given graphics object
* @param inG Graphics object to use for painting
- * @return number of points painted, if any
+ * @return true if any points or lines painted
*/
- private int paintPoints(Graphics inG)
+ private boolean paintPoints(Graphics inG)
{
// Set up colours
final ColourScheme cs = Config.getColourScheme();
@@ -674,6 +639,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
final int[] xPixels = new int[numPoints];
final int[] yPixels = new int[numPoints];
+ final int pointSeparationForArrowsSqd = 350;
+ final int pointSeparation1dForArrows = (int) (Math.sqrt(pointSeparationForArrowsSqd) * 0.7);
+
// try to set line width for painting
if (inG instanceof Graphics2D)
{
@@ -681,16 +649,20 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
if (lineWidth < 1 || lineWidth > 4) {lineWidth = 2;}
((Graphics2D) inG).setStroke(new BasicStroke(lineWidth));
}
- int pointsPainted = 0;
+
+ boolean pointsPainted = false;
// draw track points
inG.setColor(pointColour);
int prevX = -1, prevY = -1;
final int connectState = _connectCheckBox.getCurrentState();
- final boolean drawLines = (connectState % 2) == 0; // 0 or 2
- final boolean drawPoints = (connectState <= 1); // 0 or 1
+ final boolean drawLines = (connectState != 3); // 0, 1 or 2
+ final boolean drawPoints = (connectState != 1); // 0, 2 or 3
+ final boolean drawArrows = (connectState == 0); // 0
+
boolean prevPointVisible = false, currPointVisible = false;
boolean anyWaypoints = false;
boolean isWaypoint = false;
+ boolean drawnLastArrow = false; // avoid painting arrows on adjacent lines, looks too busy
for (int i=0; i pointSeparation1dForArrows || Math.abs(prevY-py) > pointSeparation1dForArrows))
+ {
+ final double pointSeparationSqd = (prevX-px) * (prevX-px) + (prevY-py) * (prevY-py);
+ if (pointSeparationSqd > pointSeparationForArrowsSqd)
+ {
+ final double midX = (prevX + px) / 2;
+ final double midY = (prevY + py) / 2;
+ final boolean midPointVisible = midX >= 0 && midX < winWidth && midY >= 0 && midY < winHeight;
+ if (midPointVisible)
+ {
+ final double alpha = Math.atan2(py - prevY, px - prevX);
+ //System.out.println("Draw arrow from (" + prevX + "," + prevY + ") to (" + px + "," + py
+ // + ") with angle" + (int) (alpha * 180/Math.PI));
+ final double MID_TO_VERTEX = 3.0;
+ final double arrowX = MID_TO_VERTEX * Math.cos(alpha);
+ final double arrowY = MID_TO_VERTEX * Math.sin(alpha);
+ final double vertexX = midX + arrowX;
+ final double vertexY = midY + arrowY;
+ inG.drawLine((int)(midX-arrowX-2*arrowY), (int)(midY-arrowY+2*arrowX), (int)vertexX, (int)vertexY);
+ inG.drawLine((int)(midX-arrowX+2*arrowY), (int)(midY-arrowY-2*arrowX), (int)vertexX, (int)vertexY);
+ }
+ drawnLastArrow = midPointVisible;
+ }
+ }
+ else
+ {
+ drawnLastArrow = false;
+ }
}
prevX = px; prevY = py;
}
@@ -755,8 +764,20 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
int py = yPixels[i];
if (px >= 0 && px < winWidth && py >= 0 && py < winHeight)
{
- inG.fillRect(px-3, py-3, 6, 6);
- pointsPainted++;
+ if (_waypointIconDefinition == null)
+ {
+ inG.fillRect(px-3, py-3, 6, 6);
+ }
+ else
+ {
+ ImageIcon icon = _waypointIconDefinition.getImageIcon();
+ if (icon != null)
+ {
+ inG.drawImage(icon.getImage(), px-_waypointIconDefinition.getXOffset(),
+ py-_waypointIconDefinition.getYOffset(), null);
+ }
+ }
+ pointsPainted = true;
numWaypoints++;
}
}
@@ -820,7 +841,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
{
inG.drawRect(px-1, py-1, 2, 2);
inG.drawRect(px-2, py-2, 4, 4);
- pointsPainted++;
+ pointsPainted = true;
}
}
}
@@ -1354,9 +1375,20 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
if ((inUpdateType & DataSubscriber.DATA_ADDED_OR_REMOVED) > 0) {
_checkBounds = true;
}
- if ((inUpdateType & DataSubscriber.MAPSERVER_CHANGED) > 0) {
+ if ((inUpdateType & DataSubscriber.MAPSERVER_CHANGED) > 0)
+ {
// Get the selected map source index and pass to tile manager
_tileManager.setMapSource(Config.getConfigInt(Config.KEY_MAPSOURCE_INDEX));
+ final int wpType = Config.getConfigInt(Config.KEY_WAYPOINT_ICONS);
+ if (wpType == WpIconLibrary.WAYPT_DEFAULT)
+ {
+ _waypointIconDefinition = null;
+ }
+ else
+ {
+ final int wpSize = Config.getConfigInt(Config.KEY_WAYPOINT_ICON_SIZE);
+ _waypointIconDefinition = WpIconLibrary.getIconDefinition(wpType, wpSize);
+ }
}
if ((inUpdateType & (DataSubscriber.DATA_ADDED_OR_REMOVED + DataSubscriber.DATA_EDITED)) > 0) {
_midpoints.updateData(_track);
diff --git a/tim/prune/gui/map/MapSourceLibrary.java b/tim/prune/gui/map/MapSourceLibrary.java
index e324af1..5f44d5e 100644
--- a/tim/prune/gui/map/MapSourceLibrary.java
+++ b/tim/prune/gui/map/MapSourceLibrary.java
@@ -38,14 +38,20 @@ public abstract class MapSourceLibrary
*/
private static void addFixedSources()
{
+ final String THUNDERFOREST_APIKEY = "c32212f10b13496786b98dc6c42e5c3c";
_sourceList.add(new OsmMapSource("Mapnik", "http://[abc].tile.openstreetmap.org/"));
- _sourceList.add(new OsmMapSource("Cyclemap", "http://[abc].tile.opencyclemap.org/cycle/"));
+ OsmMapSource cycleSource = new OsmMapSource("OpenCycleMap", "http://[abc].tile.thunderforest.com/cycle/");
+ cycleSource.setApiKey(THUNDERFOREST_APIKEY);
+ _sourceList.add(cycleSource);
+ OsmMapSource outdoorsSource = new OsmMapSource("Outdoors", "http://[abc].tile.thunderforest.com/outdoors/");
+ outdoorsSource.setApiKey(THUNDERFOREST_APIKEY);
+ _sourceList.add(outdoorsSource);
_sourceList.add(new OsmMapSource("Reitkarte", "http://topo[234].wanderreitkarte.de/topo/"));
_sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
"http://maps-for-free.com/layer/water/", "gif", 11));
_sourceList.add(new OsmMapSource("Hikebikemap", "http://[abc].tiles.wmflabs.org/hikebike/",
"http://[abc].tiles.wmflabs.org/hillshading/", 18));
- _sourceList.add(new OsmMapSource("Openseamap", "http://tile.openstreetmap.org/",
+ _sourceList.add(new OsmMapSource("OpenSeaMap", "http://tile.openstreetmap.org/",
"http://tiles.openseamap.org/seamark/", 18));
}
diff --git a/tim/prune/gui/map/OsmMapSource.java b/tim/prune/gui/map/OsmMapSource.java
index 070bb25..925fcf6 100644
--- a/tim/prune/gui/map/OsmMapSource.java
+++ b/tim/prune/gui/map/OsmMapSource.java
@@ -19,6 +19,9 @@ public class OsmMapSource extends MapSource
private String[] _siteNames = null;
/** Maximum zoom level */
private int _maxZoom = 0;
+ /** API key, usually remains empty */
+ private String _apiKey = null;
+
/**
* Constructor giving single name and url
@@ -93,6 +96,12 @@ public class OsmMapSource extends MapSource
_maxZoom = inMaxZoom;
}
+ /** Set the API key (if required) */
+ public void setApiKey(String inKey)
+ {
+ _apiKey = inKey;
+ }
+
/**
* Construct a new map source from its config string
* @param inConfigString string from Config, separated by semicolons
@@ -147,8 +156,15 @@ public class OsmMapSource extends MapSource
public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
{
// Check if the base url has a [1234], if so replace at random
- return pickServerUrl(_baseUrls[inLayerNum])
- + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
+ StringBuffer url = new StringBuffer();
+ url.append(pickServerUrl(_baseUrls[inLayerNum]));
+ url.append(inZoom).append('/').append(inX).append('/').append(inY);
+ url.append('.').append(getFileExtension(inLayerNum));
+ if (_apiKey != null)
+ {
+ url.append("?apikey=").append(_apiKey);
+ }
+ return url.toString();
}
/**
diff --git a/tim/prune/gui/map/WpIconDefinition.java b/tim/prune/gui/map/WpIconDefinition.java
new file mode 100644
index 0000000..36e06f1
--- /dev/null
+++ b/tim/prune/gui/map/WpIconDefinition.java
@@ -0,0 +1,48 @@
+package tim.prune.gui.map;
+
+import javax.swing.ImageIcon;
+
+/**
+ * Definition of a waypoint icon including name and offsets
+ */
+public class WpIconDefinition
+{
+ /** Name of icon, used for finding image file */
+ private final String _name;
+ /** X offset of marker point in image */
+ private final int _xOffset;
+ /** Y offset of marker point in image */
+ private final int _yOffset;
+ /** icon */
+ private ImageIcon _icon = null;
+
+
+ /**
+ * Constructor
+ * @param inName name of icon
+ * @param inX x offset
+ * @param inY y offset
+ */
+ public WpIconDefinition(String inName, int inX, int inY)
+ {
+ _name = inName;
+ _xOffset = inX;
+ _yOffset = inY;
+ }
+
+ /** @return name of icon */
+ public String getName() {return _name;}
+ /** @return x offset */
+ public int getXOffset() {return _xOffset;}
+ /** @return y offset */
+ public int getYOffset() {return _yOffset;}
+
+ /** @param inIcon icon to set */
+ public void setIcon(ImageIcon inIcon) {_icon = inIcon;}
+
+ /** @return image icon to display */
+ public ImageIcon getImageIcon()
+ {
+ return _icon;
+ }
+}
diff --git a/tim/prune/gui/map/WpIconLibrary.java b/tim/prune/gui/map/WpIconLibrary.java
new file mode 100644
index 0000000..e391d91
--- /dev/null
+++ b/tim/prune/gui/map/WpIconLibrary.java
@@ -0,0 +1,92 @@
+package tim.prune.gui.map;
+
+import javax.swing.ImageIcon;
+
+import tim.prune.gui.IconManager;
+
+/**
+ * Class to provide a library of waypoint icon definitions
+ */
+public abstract class WpIconLibrary
+{
+ /** Types of waypoint */
+ public static final int WAYPT_DEFAULT = 0;
+ public static final int WAYPT_RING_POINT = 1;
+ public static final int WAYPT_PLECTRUM = 2;
+ public static final int WAYPT_CIRCLE = 3;
+ public static final int WAYPT_PIN = 4;
+ public static final int WAYPT_NUMBER_OF_ICONS = WAYPT_PIN + 1;
+
+ /** Sizes of icon */
+ public static final int SIZE_SMALL = 0;
+ public static final int SIZE_MEDIUM = 1;
+ public static final int SIZE_LARGE = 2;
+
+ /** Array of x and y offsets for the icons */
+ private static int[] _PIXEL_OFFSETS = null;
+
+ /** Static block to initialise offsets */
+ static
+ {
+ _PIXEL_OFFSETS = new int[] {0, 0, 0, 0, 0, 0, // default
+ 8, 13, 12, 22, 14, 26, // ringpt
+ 7, 15, 12, 24, 14, 27, // plectrum
+ 8, 8, 12, 12, 14, 14, // ring
+ 2, 15, 4, 23, 4, 27 // pin
+ };
+ }
+
+ /** @return array of Integers representing waypoint types */
+ public static Integer[] getWaypointTypes()
+ {
+ return new Integer[] {WAYPT_DEFAULT, WAYPT_RING_POINT, WAYPT_PLECTRUM, WAYPT_CIRCLE, WAYPT_PIN};
+ }
+
+ /**
+ * @param inType icon type
+ * @return the name of the specified icon, used for settings dialog
+ */
+ public static String getIconName(int inType)
+ {
+ switch (inType)
+ {
+ case WAYPT_RING_POINT: return "ringpt";
+ case WAYPT_PLECTRUM: return "plectrum";
+ case WAYPT_CIRCLE: return "ring";
+ case WAYPT_PIN: return "pin";
+ case WAYPT_DEFAULT:
+ default: return "default";
+ }
+ }
+
+ /**
+ * @param inType icon type
+ * @param inSize icon size (small/medium/large)
+ * @return icon definition for the specified icon
+ */
+ public static WpIconDefinition getIconDefinition(int inType, int inSize)
+ {
+ String iconName = getIconName(inType);
+ String sizeSuffix = null;
+ switch (inSize)
+ {
+ case SIZE_SMALL: sizeSuffix = "_s"; break;
+ case SIZE_MEDIUM: sizeSuffix = "_m"; break;
+ case SIZE_LARGE: sizeSuffix = "_l"; break;
+ default: sizeSuffix = "_m"; inSize = SIZE_MEDIUM; break;
+ }
+ // Look up offsets in the static array
+ int xOffset = 0, yOffset = 0;
+ try {
+ xOffset = _PIXEL_OFFSETS[inType * 6 + inSize * 2];
+ yOffset = _PIXEL_OFFSETS[inType * 6 + inSize * 2 + 1];
+ }
+ catch (ArrayIndexOutOfBoundsException obe) {} // ignore, leave offsets at 0
+ WpIconDefinition iconDef = new WpIconDefinition(iconName, xOffset, yOffset);
+ // Get icon
+ ImageIcon icon = IconManager.getImageIcon(IconManager.WAYPOINT_ICON_PREFIX
+ + iconDef.getName() + sizeSuffix + IconManager.WAYPOINT_ICON_SUFFIX);
+ iconDef.setIcon(icon);
+ return iconDef;
+ }
+}
diff --git a/tim/prune/jpeg/ExifGateway.java b/tim/prune/jpeg/ExifGateway.java
deleted file mode 100644
index c11ba2e..0000000
--- a/tim/prune/jpeg/ExifGateway.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package tim.prune.jpeg;
-
-import java.io.File;
-import javax.swing.JOptionPane;
-import tim.prune.I18nManager;
-
-/**
- * Skeleton gateway to the Exif functions.
- * This is required by Debian to divert Exif handling
- * to the external libmetadata-extractor-java library
- * instead of the included modified routines.
- *
- * Switching between internal and external libraries is
- * handled by the ExifLibrarySwitch
- */
-public abstract class ExifGateway
-{
- /** Library object to call */
- private static ExifLibrary _exifLibrary = null;
- /** Flag to set whether failure warning has already been shown */
- private static boolean _exifFailWarned = false;
-
- /** Static block to initialise library */
- static
- {
- String libraryClass = ExifLibrarySwitch.USE_INTERNAL_LIBRARY?"InternalExifLibrary":"ExternalExifLibrary";
- try
- {
- _exifLibrary = (ExifLibrary) Class.forName("tim.prune.jpeg." + libraryClass).newInstance();
- }
- catch (Throwable nolib) {_exifLibrary = null;}
- }
-
-
- /**
- * Get the Jpeg data from the given file
- * @param inFile file to read
- * @return jpeg data, or null if none found
- */
- public static JpegData getJpegData(File inFile)
- {
- try
- {
- // Call library (if found)
- if (_exifLibrary != null) {
- JpegData data = _exifLibrary.getJpegData(inFile);
- return data;
- }
- }
- catch (LinkageError nolib) {
- System.err.println("Link: " + nolib.getMessage());
- nolib.printStackTrace();
- }
- // Not successful - warn if necessary
- if (!_exifFailWarned)
- {
- JOptionPane.showMessageDialog(null, I18nManager.getText("error.jpegload.exifreadfailed"),
- I18nManager.getText("error.jpegload.dialogtitle"), JOptionPane.WARNING_MESSAGE);
- _exifFailWarned = true;
- }
- return null;
- }
-
- /**
- * @return key to use to describe library, matching key for about dialog
- */
- public static String getDescriptionKey()
- {
- String key = ExifLibrarySwitch.USE_INTERNAL_LIBRARY?"internal":"external";
- if (_exifLibrary == null || !_exifLibrary.looksOK()) {key = key + ".failed";}
- return key;
- }
-
-
- /**
- * @param inNumerator numerator from Rational
- * @param inDenominator denominator from Rational
- * @return the value of the specified number as a positive double
.
- * Prevents interpretation of 32 bit numbers as negative, and forces a positive answer
- */
- public static final double convertToPositiveValue(int inNumerator, int inDenominator)
- {
- if (inDenominator == 0) return 0.0;
- double numeratorDbl = inNumerator;
- double denomDbl = inDenominator;
- if (inNumerator >= 0)
- return numeratorDbl / denomDbl;
- final double correction = Math.pow(2.0, 32);
- numeratorDbl += correction;
- if (inDenominator < 0) denomDbl += correction;
- return numeratorDbl / denomDbl;
- }
-
-
- /**
- * @param inNumerator numerator from Rational
- * @param inDenominator denominator from Rational
- * @return the value of the specified number as a positive double
.
- * Forces a positive answer
- */
- public static final double convertToPositiveValue(long inNumerator, long inDenominator)
- {
- if (inDenominator == 0L) return 0.0;
- final double numeratorDbl = inNumerator;
- final double denomDbl = inDenominator;
- return numeratorDbl / denomDbl;
- }
-}
diff --git a/tim/prune/jpeg/ExifLibrary.java b/tim/prune/jpeg/ExifLibrary.java
deleted file mode 100644
index 8d00617..0000000
--- a/tim/prune/jpeg/ExifLibrary.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package tim.prune.jpeg;
-
-import java.io.File;
-
-/**
- * Interface satisfied by both internal and external Exif implementations
- */
-public interface ExifLibrary
-{
- /** Get the Jpeg data from the given file */
- public JpegData getJpegData(File inFile);
-
- /** Check that dependencies are resolved */
- public boolean looksOK();
-}
diff --git a/tim/prune/jpeg/ExifLibrarySwitch.java b/tim/prune/jpeg/ExifLibrarySwitch.java
deleted file mode 100644
index 01adce1..0000000
--- a/tim/prune/jpeg/ExifLibrarySwitch.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package tim.prune.jpeg;
-
-/**
- * Empty class just to provide a switch between internal and external libraries
- */
-public abstract class ExifLibrarySwitch
-{
- /** Flag to specify internal or external library */
- static final boolean USE_INTERNAL_LIBRARY = true;
-}
diff --git a/tim/prune/jpeg/ExternalExifLibrary.java b/tim/prune/jpeg/ExternalExifLibrary.java
deleted file mode 100644
index 4d06a27..0000000
--- a/tim/prune/jpeg/ExternalExifLibrary.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package tim.prune.jpeg;
-
-import java.io.File;
-
-import com.drew.imaging.ImageMetadataReader;
-import com.drew.lang.Rational;
-import com.drew.metadata.Directory;
-import com.drew.metadata.Metadata;
-import com.drew.metadata.exif.ExifSubIFDDirectory;
-import com.drew.metadata.exif.ExifIFD0Directory;
-import com.drew.metadata.exif.ExifReader;
-import com.drew.metadata.exif.ExifThumbnailDirectory;
-import com.drew.metadata.exif.GpsDirectory;
-
-/**
- * Class to act as a gateway into the external exif library functions.
- * This should be the only class with dependence on the lib-metadata-extractor-java
- * classes (which are NOT delivered with GpsPrune).
- * This class will not compile without this extra dependency (but is not required if
- * the ExifGateway uses the InternalExifLibrary instead).
- * Should not be included if the internal library will be used (from jpeg.drew package).
- */
-public class ExternalExifLibrary implements ExifLibrary
-{
- /**
- * Use the _external_ exif library to get the data from the given file
- * @param inFile file to access
- * @return Jpeg data if available, otherwise null
- */
- public JpegData getJpegData(File inFile)
- {
- JpegData data = new JpegData();
- // Read exif data from picture
- try
- {
- Metadata metadata = ImageMetadataReader.readMetadata(inFile);
- if (metadata.containsDirectory(GpsDirectory.class))
- {
- Directory gpsdir = metadata.getDirectory(GpsDirectory.class);
- if (gpsdir.containsTag(GpsDirectory.TAG_LATITUDE)
- && gpsdir.containsTag(GpsDirectory.TAG_LONGITUDE)
- && gpsdir.containsTag(GpsDirectory.TAG_LATITUDE_REF)
- && gpsdir.containsTag(GpsDirectory.TAG_LONGITUDE_REF))
- {
- data.setLatitudeRef(gpsdir.getString(GpsDirectory.TAG_LATITUDE_REF));
- Rational[] latRats = gpsdir.getRationalArray(GpsDirectory.TAG_LATITUDE);
- double seconds = ExifGateway.convertToPositiveValue(latRats[2].getNumerator(), latRats[2].getDenominator());
- data.setLatitude(new double[] {latRats[0].doubleValue(),
- latRats[1].doubleValue(), seconds});
- data.setLongitudeRef(gpsdir.getString(GpsDirectory.TAG_LONGITUDE_REF));
- Rational[] lonRats = gpsdir.getRationalArray(GpsDirectory.TAG_LONGITUDE);
- seconds = ExifGateway.convertToPositiveValue(lonRats[2].getNumerator(), lonRats[2].getDenominator());
- data.setLongitude(new double[] {lonRats[0].doubleValue(),
- lonRats[1].doubleValue(), seconds});
- }
-
- // Altitude (if present)
- if (gpsdir.containsTag(GpsDirectory.TAG_ALTITUDE) && gpsdir.containsTag(GpsDirectory.TAG_ALTITUDE_REF))
- {
- data.setAltitude(gpsdir.getRational(GpsDirectory.TAG_ALTITUDE).intValue());
- byte altRef = (byte) gpsdir.getInt(GpsDirectory.TAG_ALTITUDE_REF);
- data.setAltitudeRef(altRef);
- }
-
- // Timestamp and datestamp (if present)
- final int TAG_DATESTAMP = 0x001d;
- if (gpsdir.containsTag(GpsDirectory.TAG_TIME_STAMP) && gpsdir.containsTag(TAG_DATESTAMP))
- {
- Rational[] times = gpsdir.getRationalArray(GpsDirectory.TAG_TIME_STAMP);
- data.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(),
- times[2].intValue()});
- Rational[] dates = gpsdir.getRationalArray(TAG_DATESTAMP);
- if (dates != null) {
- data.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});
- }
- }
-
- // Image bearing (if present)
- if (gpsdir.containsTag(GpsDirectory.TAG_IMG_DIRECTION) && gpsdir.containsTag(GpsDirectory.TAG_IMG_DIRECTION_REF))
- {
- Rational bearing = gpsdir.getRational(GpsDirectory.TAG_IMG_DIRECTION);
- if (bearing != null) {
- data.setBearing(bearing.doubleValue());
- }
- }
- }
-
- // Tags from Exif directory
- if (metadata.containsDirectory(ExifSubIFDDirectory.class))
- {
- Directory exifdir = metadata.getDirectory(ExifSubIFDDirectory.class);
-
- // Take time and date from exif tags
- if (exifdir.containsTag(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL)) {
- data.setOriginalTimestamp(exifdir.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL));
- }
- // Also take "digitized" timestamp
- if (exifdir.containsTag(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED)) {
- data.setDigitizedTimestamp(exifdir.getString(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED));
- }
- }
- if (metadata.containsDirectory(ExifIFD0Directory.class))
- {
- Directory exifdir = metadata.getDirectory(ExifIFD0Directory.class);
-
- // Photo rotation code
- if (exifdir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
- data.setOrientationCode(exifdir.getInt(ExifIFD0Directory.TAG_ORIENTATION));
- // NOTE: this presumably takes the _last_ orientation value found, not the first.
- }
- }
-
- if (metadata.containsDirectory(ExifThumbnailDirectory.class))
- {
- ExifThumbnailDirectory exifdir = metadata.getDirectory(ExifThumbnailDirectory.class);
-
- // TODO: Check this thumbnail stuff
- if (exifdir.hasThumbnailData())
- {
- // Make a copy of the byte data
- byte[] tdata = exifdir.getThumbnailData();
- byte[] thumb = new byte[tdata.length];
- System.arraycopy(tdata, 0, thumb, 0, tdata.length);
- data.setThumbnailImage(thumb);
- }
- }
-
- }
- catch (Exception e) {
- // Exception reading metadata, just ignore it
- //System.err.println("Error: " + e.getClass().getName() + " - " + e.getMessage());
- }
- return data;
- }
-
-
- /**
- * Check whether the exifreader class can be correctly resolved
- * @return true if it looks ok
- */
- public boolean looksOK()
- {
- try {
- String test = ExifReader.class.getName();
- if (test != null) return true;
- }
- catch (LinkageError le) {}
- return false;
- }
-}
diff --git a/tim/prune/jpeg/InternalExifLibrary.java b/tim/prune/jpeg/InternalExifLibrary.java
index c8b1708..377155f 100644
--- a/tim/prune/jpeg/InternalExifLibrary.java
+++ b/tim/prune/jpeg/InternalExifLibrary.java
@@ -1,15 +1,15 @@
package tim.prune.jpeg;
import java.io.File;
+
import tim.prune.jpeg.drew.ExifReader;
-import tim.prune.jpeg.drew.JpegException;
+import tim.prune.jpeg.drew.ExifException;
/**
- * Class to act as a gateway into the internal exif library functions.
+ * Class to act as an entry point to the internal exif library functions.
* This should be the only class with dependence on the jpeg.drew package.
- * Should not be included if external library will be used (eg Debian).
*/
-public class InternalExifLibrary implements ExifLibrary
+public class InternalExifLibrary
{
/**
* Use the _internal_ exif library to get the data from the given file
@@ -20,23 +20,9 @@ public class InternalExifLibrary implements ExifLibrary
{
JpegData data = null;
try {
- data = new ExifReader(inFile).extract();
+ data = ExifReader.readMetadata(inFile);
}
- catch (JpegException jpe) {} // data remains null
+ catch (ExifException jpe) {} // data remains null
return data;
}
-
- /**
- * Check whether the exifreader class can be correctly resolved
- * @return true if it looks ok
- */
- public boolean looksOK()
- {
- try {
- String test = ExifReader.class.getName();
- if (test != null) return true;
- }
- catch (LinkageError le) {}
- return false;
- }
}
diff --git a/tim/prune/jpeg/drew/ByteArrayReader.java b/tim/prune/jpeg/drew/ByteArrayReader.java
new file mode 100644
index 0000000..3b3d010
--- /dev/null
+++ b/tim/prune/jpeg/drew/ByteArrayReader.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2002-2015 Drew Noakes
+ *
+ * More information about this project is available at:
+ *
+ * https://drewnoakes.com/code/exif/
+ * https://github.com/drewnoakes/metadata-extractor
+ */
+
+package tim.prune.jpeg.drew;
+
+import java.io.IOException;
+
+
+/**
+ * Provides methods to read specific values from a byte array,
+ * with a consistent, checked exception structure for issues.
+ *
+ * @author Drew Noakes https://drewnoakes.com
+ */
+public class ByteArrayReader
+{
+ private final byte[] _buffer;
+ private boolean _isMotorolaByteOrder = true;
+
+ public ByteArrayReader(byte[] buffer)
+ {
+ if (buffer == null)
+ throw new NullPointerException();
+
+ _buffer = buffer;
+ }
+
+ public void setMotorolaByteOrder(boolean motorolaByteOrder)
+ {
+ _isMotorolaByteOrder = motorolaByteOrder;
+ }
+
+ public long getLength()
+ {
+ return _buffer.length;
+ }
+
+ protected byte getByte(int index)
+ {
+ return _buffer[index];
+ }
+
+ protected void validateIndex(int index, int bytesRequested) throws ExifException
+ {
+ if (!isValidIndex(index, bytesRequested))
+ throw new ExifException("Invalid index " + index);
+ }
+
+ private boolean isValidIndex(int index, int bytesRequested)
+ {
+ return bytesRequested >= 0
+ && index >= 0
+ && ((long)index + (long)bytesRequested) <= (long)_buffer.length;
+ }
+
+ public byte[] getBytes(int index, int count) throws ExifException
+ {
+ validateIndex(index, count);
+
+ byte[] bytes = new byte[count];
+ System.arraycopy(_buffer, index, bytes, 0, count);
+ return bytes;
+ }
+
+ /**
+ * Returns an unsigned 8-bit int calculated from one byte of data at the specified index.
+ *
+ * @param index position within the data buffer to read byte
+ * @return the 8 bit int value, between 0 and 255
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public short getUInt8(int index) throws ExifException
+ {
+ validateIndex(index, 1);
+
+ return (short) (getByte(index) & 0xFF);
+ }
+
+ /**
+ * Returns a signed 8-bit int calculated from one byte of data at the specified index.
+ *
+ * @param index position within the data buffer to read byte
+ * @return the 8 bit int value, between 0x00 and 0xFF
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public byte getInt8(int index) throws ExifException
+ {
+ validateIndex(index, 1);
+
+ return getByte(index);
+ }
+
+ /**
+ * Returns an unsigned 16-bit int calculated from two bytes of data at the specified index.
+ *
+ * @param index position within the data buffer to read first byte
+ * @return the 16 bit int value, between 0x0000 and 0xFFFF
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public int getUInt16(int index) throws ExifException
+ {
+ validateIndex(index, 2);
+
+ if (_isMotorolaByteOrder) {
+ // Motorola - MSB first
+ return (getByte(index ) << 8 & 0xFF00) |
+ (getByte(index + 1) & 0xFF);
+ } else {
+ // Intel ordering - LSB first
+ return (getByte(index + 1) << 8 & 0xFF00) |
+ (getByte(index ) & 0xFF);
+ }
+ }
+
+ /**
+ * Returns a signed 16-bit int calculated from two bytes of data at the specified index (MSB, LSB).
+ *
+ * @param index position within the data buffer to read first byte
+ * @return the 16 bit int value, between 0x0000 and 0xFFFF
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public short getInt16(int index) throws ExifException
+ {
+ validateIndex(index, 2);
+
+ if (_isMotorolaByteOrder) {
+ // Motorola - MSB first
+ return (short) (((short)getByte(index ) << 8 & (short)0xFF00) |
+ ((short)getByte(index + 1) & (short)0xFF));
+ } else {
+ // Intel ordering - LSB first
+ return (short) (((short)getByte(index + 1) << 8 & (short)0xFF00) |
+ ((short)getByte(index ) & (short)0xFF));
+ }
+ }
+
+ /**
+ * Get a 32-bit unsigned integer from the buffer, returning it as a long.
+ *
+ * @param index position within the data buffer to read first byte
+ * @return the unsigned 32-bit int value as a long, between 0x00000000 and 0xFFFFFFFF
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public long getUInt32(int index) throws ExifException
+ {
+ validateIndex(index, 4);
+
+ if (_isMotorolaByteOrder) {
+ // Motorola - MSB first (big endian)
+ return (((long)getByte(index )) << 24 & 0xFF000000L) |
+ (((long)getByte(index + 1)) << 16 & 0xFF0000L) |
+ (((long)getByte(index + 2)) << 8 & 0xFF00L) |
+ (((long)getByte(index + 3)) & 0xFFL);
+ } else {
+ // Intel ordering - LSB first (little endian)
+ return (((long)getByte(index + 3)) << 24 & 0xFF000000L) |
+ (((long)getByte(index + 2)) << 16 & 0xFF0000L) |
+ (((long)getByte(index + 1)) << 8 & 0xFF00L) |
+ (((long)getByte(index )) & 0xFFL);
+ }
+ }
+
+ /**
+ * Returns a signed 32-bit integer from four bytes of data at the specified index the buffer.
+ *
+ * @param index position within the data buffer to read first byte
+ * @return the signed 32 bit int value, between 0x00000000 and 0xFFFFFFFF
+ * @throws IOException the buffer does not contain enough bytes to service the request, or index is negative
+ */
+ public int getInt32(int index) throws ExifException
+ {
+ validateIndex(index, 4);
+
+ if (_isMotorolaByteOrder) {
+ // Motorola - MSB first (big endian)
+ return (getByte(index ) << 24 & 0xFF000000) |
+ (getByte(index + 1) << 16 & 0xFF0000) |
+ (getByte(index + 2) << 8 & 0xFF00) |
+ (getByte(index + 3) & 0xFF);
+ } else {
+ // Intel ordering - LSB first (little endian)
+ return (getByte(index + 3) << 24 & 0xFF000000) |
+ (getByte(index + 2) << 16 & 0xFF0000) |
+ (getByte(index + 1) << 8 & 0xFF00) |
+ (getByte(index ) & 0xFF);
+ }
+ }
+
+ /**
+ * Creates a String from the _data buffer starting at the specified index,
+ * and ending where byte=='\0'
or where length==maxLength
.
+ *
+ * @param index The index within the buffer at which to start reading the string.
+ * @param maxLengthBytes The maximum number of bytes to read. If a zero-byte is not reached within this limit,
+ * reading will stop and the string will be truncated to this length.
+ * @return The read string.
+ * @throws IOException The buffer does not contain enough bytes to satisfy this request.
+ */
+ public String getNullTerminatedString(int index, int maxLengthBytes) throws ExifException
+ {
+ // NOTE currently only really suited to single-byte character strings
+
+ byte[] bytes = getBytes(index, maxLengthBytes);
+
+ // Count the number of non-null bytes
+ int length = 0;
+ while (length < bytes.length && bytes[length] != '\0')
+ length++;
+
+ return new String(bytes, 0, length);
+ }
+
+ public String getString(int index, int bytesRequested) throws ExifException
+ {
+ // TODO: validate index
+ return new String(getBytes(index, bytesRequested));
+ }
+}
diff --git a/tim/prune/jpeg/drew/ExifException.java b/tim/prune/jpeg/drew/ExifException.java
new file mode 100644
index 0000000..6d26ba3
--- /dev/null
+++ b/tim/prune/jpeg/drew/ExifException.java
@@ -0,0 +1,12 @@
+package tim.prune.jpeg.drew;
+
+public class ExifException extends Exception
+{
+ public ExifException(String message) {
+ super(message);
+ }
+
+ public ExifException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/tim/prune/jpeg/drew/ExifReader.java b/tim/prune/jpeg/drew/ExifReader.java
index 4c90cab..c8c1b7c 100644
--- a/tim/prune/jpeg/drew/ExifReader.java
+++ b/tim/prune/jpeg/drew/ExifReader.java
@@ -1,590 +1,183 @@
-package tim.prune.jpeg.drew;
-
-import java.io.File;
-import java.util.HashMap;
-
-import tim.prune.jpeg.ExifGateway;
-import tim.prune.jpeg.JpegData;
-
-/**
- * Extracts Exif data from a JPEG header segment
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com
- * which in turn is based on code from Jhead http://www.sentex.net/~mwandel/jhead/
- */
-public class ExifReader
-{
- /** The JPEG segment as an array of bytes */
- private final byte[] _data;
-
- /**
- * Represents the native byte ordering used in the JPEG segment. If true,
- * then we're using Motorola ordering (Big endian), else we're using Intel
- * ordering (Little endian).
- */
- private boolean _isMotorolaByteOrder;
-
- /** Thumbnail offset */
- private int _thumbnailOffset = -1;
- /** Thumbnail length */
- private int _thumbnailLength = -1;
-
- /** The number of bytes used per format descriptor */
- private static final int[] BYTES_PER_FORMAT = {0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8};
-
- /** The number of formats known */
- private static final int MAX_FORMAT_CODE = 12;
-
- // Format types
- // Note: Cannot use the DataFormat enumeration in the case statement that uses these tags.
- // Is there a better way?
- //private static final int FMT_BYTE = 1;
- private static final int FMT_STRING = 2;
- //private static final int FMT_USHORT = 3;
- //private static final int FMT_ULONG = 4;
- private static final int FMT_URATIONAL = 5;
- //private static final int FMT_SBYTE = 6;
- //private static final int FMT_UNDEFINED = 7;
- //private static final int FMT_SSHORT = 8;
- //private static final int FMT_SLONG = 9;
- private static final int FMT_SRATIONAL = 10;
- //private static final int FMT_SINGLE = 11;
- //private static final int FMT_DOUBLE = 12;
-
- public static final int TAG_EXIF_OFFSET = 0x8769;
- public static final int TAG_INTEROP_OFFSET = 0xA005;
- public static final int TAG_GPS_INFO_OFFSET = 0x8825;
- public static final int TAG_MAKER_NOTE = 0x927C;
-
- public static final int TIFF_HEADER_START_OFFSET = 6;
-
- /** GPS tag version GPSVersionID 0 0 BYTE 4 */
- public static final int TAG_GPS_VERSION_ID = 0x0000;
- /** North or South Latitude GPSLatitudeRef 1 1 ASCII 2 */
- public static final int TAG_GPS_LATITUDE_REF = 0x0001;
- /** Latitude GPSLatitude 2 2 RATIONAL 3 */
- public static final int TAG_GPS_LATITUDE = 0x0002;
- /** East or West Longitude GPSLongitudeRef 3 3 ASCII 2 */
- public static final int TAG_GPS_LONGITUDE_REF = 0x0003;
- /** Longitude GPSLongitude 4 4 RATIONAL 3 */
- public static final int TAG_GPS_LONGITUDE = 0x0004;
- /** Altitude reference GPSAltitudeRef 5 5 BYTE 1 */
- public static final int TAG_GPS_ALTITUDE_REF = 0x0005;
- /** Altitude GPSAltitude 6 6 RATIONAL 1 */
- public static final int TAG_GPS_ALTITUDE = 0x0006;
- /** GPS time (atomic clock) GPSTimeStamp 7 7 RATIONAL 3 */
- public static final int TAG_GPS_TIMESTAMP = 0x0007;
- /** GPS date (atomic clock) GPSDateStamp 23 1d RATIONAL 3 */
- public static final int TAG_GPS_DATESTAMP = 0x001d;
- /** "Original" Exif timestamp */
- public static final int TAG_DATETIME_ORIGINAL = 0x9003;
- /** "Creation" or "Digitized" timestamp */
- public static final int TAG_DATETIME_DIGITIZED = 0x9004;
- /** Thumbnail offset */
- private static final int TAG_THUMBNAIL_OFFSET = 0x0201;
- /** Thumbnail length */
- private static final int TAG_THUMBNAIL_LENGTH = 0x0202;
- /** Orientation of image */
- private static final int TAG_ORIENTATION = 0x0112;
- /** Bearing direction of image */
- private static final int TAG_BEARING = 0x0011;
-
-
- /**
- * Creates an ExifReader for a Jpeg file
- * @param inFile File object to attempt to read from
- * @throws JpegException on failure
- */
- public ExifReader(File inFile) throws JpegException
- {
- _data = JpegSegmentReader.readExifSegment(inFile);
- }
-
- /**
- * Performs the Exif data extraction
- * @return the GPS data found in the file
- */
- public JpegData extract()
- {
- JpegData metadata = new JpegData();
- if (_data==null)
- return metadata;
-
- // check for the header length
- if (_data.length<=14)
- {
- metadata.addError("Exif data segment must contain at least 14 bytes");
- return metadata;
- }
-
- // check for the header preamble
- if (!"Exif\0\0".equals(new String(_data, 0, 6)))
- {
- metadata.addError("Exif data segment doesn't begin with 'Exif'");
- return metadata;
- }
-
- // this should be either "MM" or "II"
- String byteOrderIdentifier = new String(_data, 6, 2);
- if (!setByteOrder(byteOrderIdentifier))
- {
- metadata.addError("Unclear distinction between Motorola/Intel byte ordering: " + byteOrderIdentifier);
- return metadata;
- }
-
- // Check the next two values are 0x2A as expected
- if (get16Bits(8)!=0x2a)
- {
- metadata.addError("Invalid Exif start - should have 0x2A at offset 8 in Exif header");
- return metadata;
- }
-
- int firstDirectoryOffset = get32Bits(10) + TIFF_HEADER_START_OFFSET;
-
- // Check that offset is within range
- if (firstDirectoryOffset>=_data.length - 1)
- {
- metadata.addError("First exif directory offset is beyond end of Exif data segment");
- // First directory normally starts 14 bytes in -- try it here and catch another error in the worst case
- firstDirectoryOffset = 14;
- }
-
- HashMap processedDirectoryOffsets = new HashMap();
-
- // 0th IFD (we merge with Exif IFD)
- processDirectory(metadata, false, processedDirectoryOffsets, firstDirectoryOffset, TIFF_HEADER_START_OFFSET);
-
- return metadata;
- }
-
-
- /**
- * Set the byte order identifier
- * @param byteOrderIdentifier String from exif
- * @return true if recognised, false otherwise
- */
- private boolean setByteOrder(String byteOrderIdentifier)
- {
- if ("MM".equals(byteOrderIdentifier)) {
- _isMotorolaByteOrder = true;
- } else if ("II".equals(byteOrderIdentifier)) {
- _isMotorolaByteOrder = false;
- } else {
- return false;
- }
- return true;
- }
-
-
- /**
- * Recursive call to process one of the nested Tiff IFD directories.
- * 2 bytes: number of tags
- * for each tag
- * 2 bytes: tag type
- * 2 bytes: format code
- * 4 bytes: component count
- */
- private void processDirectory(JpegData inMetadata, boolean inIsGPS, HashMap inDirectoryOffsets,
- int inDirOffset, int inTiffHeaderOffset)
- {
- // check for directories we've already visited to avoid stack overflows when recursive/cyclic directory structures exist
- if (inDirectoryOffsets.containsKey(Integer.valueOf(inDirOffset)))
- return;
-
- // remember that we've visited this directory so that we don't visit it again later
- inDirectoryOffsets.put(Integer.valueOf(inDirOffset), "processed");
-
- if (inDirOffset >= _data.length || inDirOffset < 0)
- {
- inMetadata.addError("Ignored directory marked to start outside data segment");
- return;
- }
-
- // First two bytes in the IFD are the number of tags in this directory
- int dirTagCount = get16Bits(inDirOffset);
- // If no tags, exit without complaint
- if (dirTagCount == 0) return;
-
- if (!isDirectoryLengthValid(inDirOffset, inTiffHeaderOffset))
- {
- inMetadata.addError("Directory length is not valid");
- return;
- }
-
- inMetadata.setExifDataPresent();
- // Handle each tag in this directory
- for (int tagNumber = 0; tagNumber MAX_FORMAT_CODE)
- {
- inMetadata.addError("Invalid format code: " + formatCode);
- continue;
- }
-
- // 4 bytes dictate the number of components in this tag's data
- final int componentCount = get32Bits(tagOffset + 4);
- if (componentCount < 0)
- {
- inMetadata.addError("Negative component count in EXIF");
- continue;
- }
- // each component may have more than one byte... calculate the total number of bytes
- final int byteCount = componentCount * BYTES_PER_FORMAT[formatCode];
- final int tagValueOffset = calculateTagValueOffset(byteCount, tagOffset, inTiffHeaderOffset);
- if (tagValueOffset < 0 || tagValueOffset > _data.length)
- {
- inMetadata.addError("Illegal pointer offset value in EXIF");
- continue;
- }
-
- // Check that this tag isn't going to allocate outside the bounds of the data array.
- // This addresses an uncommon OutOfMemoryError.
- if (byteCount < 0 || tagValueOffset + byteCount > _data.length)
- {
- inMetadata.addError("Illegal number of bytes: " + byteCount);
- continue;
- }
-
- // Calculate the value as an offset for cases where the tag represents a directory
- final int subdirOffset = inTiffHeaderOffset + get32Bits(tagValueOffset);
-
- // Look in both basic Exif tags (for timestamp, thumbnail) and Gps tags (for lat, long, altitude, timestamp)
- switch (tagType)
- {
- case TAG_EXIF_OFFSET:
- processDirectory(inMetadata, false, inDirectoryOffsets, subdirOffset, inTiffHeaderOffset);
- continue;
- case TAG_INTEROP_OFFSET:
- // ignore
- continue;
- case TAG_GPS_INFO_OFFSET:
- processDirectory(inMetadata, true, inDirectoryOffsets, subdirOffset, inTiffHeaderOffset);
- continue;
- case TAG_MAKER_NOTE:
- // ignore
- continue;
- default:
- // not a known directory, so must just be a normal tag
- if (inIsGPS)
- {
- processGpsTag(inMetadata, tagType, tagValueOffset, componentCount, formatCode);
- }
- else
- {
- processExifTag(inMetadata, tagType, tagValueOffset, componentCount, formatCode);
- }
- break;
- }
- }
-
- // at the end of each IFD is an optional link to the next IFD
- final int finalTagOffset = calculateTagOffset(inDirOffset, dirTagCount);
- int nextDirectoryOffset = get32Bits(finalTagOffset);
- if (nextDirectoryOffset != 0)
- {
- nextDirectoryOffset += inTiffHeaderOffset;
- if (nextDirectoryOffset>=_data.length)
- {
- // Last 4 bytes of IFD reference another IFD with an address that is out of bounds
- return;
- }
- else if (nextDirectoryOffset < inDirOffset)
- {
- // Last 4 bytes of IFD reference another IFD with an address before the start of this directory
- return;
- }
- // the next directory is of same type as this one
- processDirectory(inMetadata, false, inDirectoryOffsets, nextDirectoryOffset, inTiffHeaderOffset);
- }
- }
-
-
- /**
- * Check if the directory length is valid
- * @param dirStartOffset start offset for directory
- * @param tiffHeaderOffset Tiff header offeset
- * @return true if length is valid
- */
- private boolean isDirectoryLengthValid(int inDirStartOffset, int inTiffHeaderOffset)
- {
- int dirTagCount = get16Bits(inDirStartOffset);
- int dirLength = (2 + (12 * dirTagCount) + 4);
- if (dirLength + inDirStartOffset + inTiffHeaderOffset >= _data.length)
- {
- // Note: Files that had thumbnails trimmed with jhead 1.3 or earlier might trigger this
- return false;
- }
- return true;
- }
-
-
- /**
- * Process a GPS tag and put the contents in the given metadata
- * @param inMetadata metadata holding extracted values
- * @param inTagType tag type (eg latitude)
- * @param inTagValueOffset start offset in data array
- * @param inComponentCount component count for tag
- * @param inFormatCode format code, eg byte
- */
- private void processGpsTag(JpegData inMetadata, int inTagType, int inTagValueOffset,
- int inComponentCount, int inFormatCode)
- {
- try
- {
- // Only interested in tags latref, lat, longref, lon, altref, alt and gps timestamp
- switch (inTagType)
- {
- case TAG_GPS_LATITUDE_REF:
- inMetadata.setLatitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));
- break;
- case TAG_GPS_LATITUDE:
- Rational[] latitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);
- inMetadata.setLatitude(new double[] {latitudes[0].doubleValue(), latitudes[1].doubleValue(),
- ExifGateway.convertToPositiveValue(latitudes[2].getNumerator(), latitudes[2].getDenominator())});
- break;
- case TAG_GPS_LONGITUDE_REF:
- inMetadata.setLongitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));
- break;
- case TAG_GPS_LONGITUDE:
- Rational[] longitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);
- inMetadata.setLongitude(new double[] {longitudes[0].doubleValue(), longitudes[1].doubleValue(),
- ExifGateway.convertToPositiveValue(longitudes[2].getNumerator(), longitudes[2].getDenominator())});
- break;
- case TAG_GPS_ALTITUDE_REF:
- inMetadata.setAltitudeRef(_data[inTagValueOffset]);
- break;
- case TAG_GPS_ALTITUDE:
- inMetadata.setAltitude(readRational(inTagValueOffset, inFormatCode, inComponentCount).intValue());
- break;
- case TAG_GPS_TIMESTAMP:
- Rational[] times = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);
- inMetadata.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(), times[2].intValue()});
- break;
- case TAG_GPS_DATESTAMP:
- Rational[] dates = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);
- if (dates != null) {
- inMetadata.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});
- }
- else
- {
- // Not in rational array format, but maybe as String?
- String date = readString(inTagValueOffset, inFormatCode, inComponentCount);
- if (date != null && date.length() == 10) {
- inMetadata.setGpsDatestamp(new int[] {Integer.parseInt(date.substring(0, 4)),
- Integer.parseInt(date.substring(5, 7)), Integer.parseInt(date.substring(8))});
- }
- }
- break;
- case TAG_BEARING:
- Rational val = readRational(inTagValueOffset, inFormatCode, inComponentCount);
- if (val != null) {
- inMetadata.setBearing(val.doubleValue());
- }
- break;
- default: // ignore all other tags
- }
- }
- catch (Exception e) {} // ignore and continue
- }
-
-
- /**
- * Process a general Exif tag
- * @param inMetadata metadata holding extracted values
- * @param inTagType tag type (eg latitude)
- * @param inTagValueOffset start offset in data array
- * @param inComponentCount component count for tag
- * @param inFormatCode format code, eg byte
- */
- private void processExifTag(JpegData inMetadata, int inTagType, int inTagValueOffset,
- int inComponentCount, int inFormatCode)
- {
- // Only interested in original timestamp, thumbnail offset and thumbnail length
- if (inTagType == TAG_DATETIME_ORIGINAL) {
- inMetadata.setOriginalTimestamp(readString(inTagValueOffset, inFormatCode, inComponentCount));
- }
- else if (inTagType == TAG_DATETIME_DIGITIZED) {
- inMetadata.setDigitizedTimestamp(readString(inTagValueOffset, inFormatCode, inComponentCount));
- }
- else if (inTagType == TAG_THUMBNAIL_OFFSET) {
- _thumbnailOffset = TIFF_HEADER_START_OFFSET + get16Bits(inTagValueOffset);
- extractThumbnail(inMetadata);
- }
- else if (inTagType == TAG_THUMBNAIL_LENGTH) {
- _thumbnailLength = get16Bits(inTagValueOffset);
- extractThumbnail(inMetadata);
- }
- else if (inTagType == TAG_ORIENTATION) {
- if (inMetadata.getOrientationCode() < 1) {
- inMetadata.setOrientationCode(get16Bits(inTagValueOffset));
- }
- }
- }
-
- /**
- * Attempt to extract the thumbnail image
- */
- private void extractThumbnail(JpegData inMetadata)
- {
- if (_thumbnailOffset > 0 && _thumbnailLength > 0 && inMetadata.getThumbnailImage() == null)
- {
- byte[] thumbnailBytes = new byte[_thumbnailLength];
- System.arraycopy(_data, _thumbnailOffset, thumbnailBytes, 0, _thumbnailLength);
- inMetadata.setThumbnailImage(thumbnailBytes);
- }
- }
-
-
- /**
- * Calculate the tag value offset
- * @param inByteCount
- * @param inDirEntryOffset
- * @param inTiffHeaderOffset
- * @return new offset
- */
- private int calculateTagValueOffset(int inByteCount, int inDirEntryOffset, int inTiffHeaderOffset)
- {
- if (inByteCount > 4)
- {
- // If it's bigger than 4 bytes, the dir entry contains an offset.
- // dirEntryOffset must be passed, as some makers (e.g. FujiFilm) incorrectly use an
- // offset relative to the start of the makernote itself, not the TIFF segment.
- final int offsetVal = get32Bits(inDirEntryOffset + 8);
- if (offsetVal + inByteCount > _data.length)
- {
- // Bogus pointer offset and / or bytecount value
- return -1; // signal error
- }
- return inTiffHeaderOffset + offsetVal;
- }
- else
- {
- // 4 bytes or less and value is in the dir entry itself
- return inDirEntryOffset + 8;
- }
- }
-
-
- /**
- * Creates a String from the _data buffer starting at the specified offset,
- * and ending where byte=='\0' or where length==maxLength.
- * @param inOffset start offset
- * @param inFormatCode format code - should be string
- * @param inMaxLength max length of string
- * @return contents of tag, or null if format incorrect
- */
- private String readString(int inOffset, int inFormatCode, int inMaxLength)
- {
- if (inFormatCode != FMT_STRING) return null;
- // Calculate length
- int length = 0;
- while ((inOffset + length)<_data.length
- && _data[inOffset + length]!='\0'
- && length < inMaxLength)
- {
- length++;
- }
- return new String(_data, inOffset, length);
- }
-
- /**
- * Creates a Rational from the _data buffer starting at the specified offset
- * @param inOffset start offset
- * @param inFormatCode format code - should be srational or urational
- * @param inCount component count - should be 1
- * @return contents of tag as a Rational object
- */
- private Rational readRational(int inOffset, int inFormatCode, int inCount)
- {
- // Check the format is a single rational as expected
- if (inFormatCode != FMT_SRATIONAL && inFormatCode != FMT_URATIONAL
- || inCount != 1) return null;
- return new Rational(get32Bits(inOffset), get32Bits(inOffset + 4));
- }
-
-
- /**
- * Creates a Rational array from the _data buffer starting at the specified offset
- * @param inOffset start offset
- * @param inFormatCode format code - should be srational or urational
- * @param inCount component count - number of components
- * @return contents of tag as an array of Rational objects
- */
- private Rational[] readRationalArray(int inOffset, int inFormatCode, int inCount)
- {
- // Check the format is rational as expected
- if (inFormatCode != FMT_SRATIONAL && inFormatCode != FMT_URATIONAL)
- return null;
- // Build array of Rationals
- Rational[] answer = new Rational[inCount];
- for (int i=0; i_data.length)
- throw new ArrayIndexOutOfBoundsException("attempt to read data outside of exif segment (index "
- + offset + " where max index is " + (_data.length - 1) + ")");
-
- if (_isMotorolaByteOrder) {
- // Motorola - MSB first
- return (_data[offset] << 8 & 0xFF00) | (_data[offset + 1] & 0xFF);
- } else {
- // Intel ordering - LSB first
- return (_data[offset + 1] << 8 & 0xFF00) | (_data[offset] & 0xFF);
- }
- }
-
-
- /**
- * Get a 32 bit value from file's native byte order.
- */
- private int get32Bits(int offset)
- {
- if (offset < 0 || offset+4 > _data.length)
- throw new ArrayIndexOutOfBoundsException("attempt to read data outside of exif segment (index "
- + offset + " where max index is " + (_data.length - 1) + ")");
-
- if (_isMotorolaByteOrder)
- {
- // Motorola - MSB first
- return (_data[offset] << 24 & 0xFF000000) |
- (_data[offset + 1] << 16 & 0xFF0000) |
- (_data[offset + 2] << 8 & 0xFF00) |
- (_data[offset + 3] & 0xFF);
- }
- else
- {
- // Intel ordering - LSB first
- return (_data[offset + 3] << 24 & 0xFF000000) |
- (_data[offset + 2] << 16 & 0xFF0000) |
- (_data[offset + 1] << 8 & 0xFF00) |
- (_data[offset] & 0xFF);
- }
- }
-}
+package tim.prune.jpeg.drew;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import tim.prune.jpeg.JpegData;
+
+
+/**
+ * Extracts Exif data from a JPEG header segment
+ * Based on Drew Noakes' Metadata extractor at https://drewnoakes.com
+ * which in turn is based on code from Jhead http://www.sentex.net/~mwandel/jhead/
+ */
+public class ExifReader
+{
+ /** Magic numbers to mark the beginning of all Jpegs */
+ private static final int MAGIC_JPEG_BYTE_1 = 0xFF;
+ private static final int MAGIC_JPEG_BYTE_2 = 0xD8;
+
+ /** 6-byte preamble before starting the TIFF data. */
+ private static final String JPEG_EXIF_SEGMENT_PREAMBLE = "Exif\0\0";
+
+ /** Start of segment marker */
+ private static final byte SEGMENT_SOS = (byte) 0xDA;
+
+ /** End of segment marker */
+ private static final byte MARKER_EOI = (byte) 0xD9;
+
+ /**
+ * Processes the provided JPEG data, and extracts the specified JPEG segments into a JpegData object.
+ * @param inFile a {@link File} from which the JPEG data will be read.
+ */
+ public static JpegData readMetadata(File inFile) throws ExifException
+ {
+ JpegData jpegData = new JpegData();
+ BufferedInputStream bStream = null;
+
+ try
+ {
+ bStream = new BufferedInputStream(new FileInputStream(inFile));
+ byte[] segmentBytes = readSegments(bStream);
+ if (segmentBytes != null)
+ {
+ // Got the bytes for the required segment, now extract the data
+ extract(segmentBytes, jpegData);
+ }
+ }
+ catch (IOException ioe) {
+ throw new ExifException("IO Exception: " + ioe.getMessage());
+ }
+ finally
+ {
+ if (bStream != null) {
+ try {
+ bStream.close();
+ } catch (IOException ioe) {}
+ }
+ }
+ return jpegData;
+ }
+
+ /**
+ * Reads the relevant segment and returns the bytes.
+ */
+ private static byte[] readSegments(final BufferedInputStream bStream)
+ throws ExifException, IOException
+ {
+ // first two bytes should be JPEG magic number
+ final int magic1 = bStream.read() & 0xFF;
+ final int magic2 = bStream.read() & 0xFF;
+ if (magic1 != MAGIC_JPEG_BYTE_1 || magic2 != MAGIC_JPEG_BYTE_2) {
+ throw new ExifException("Jpeg file failed Magic check");
+ }
+
+ final Byte segmentTypeByte = (byte)0xE1; // JpegSegmentType.APP1.byteValue;
+
+ do {
+ // Find the segment marker. Markers are zero or more 0xFF bytes, followed
+ // by a 0xFF and then a byte not equal to 0x00 or 0xFF.
+
+ final short segmentIdentifier = (short) bStream.read();
+
+ // We must have at least one 0xFF byte
+ if (segmentIdentifier != 0xFF)
+ throw new ExifException("Expected JPEG segment start identifier 0xFF, not 0x" + Integer.toHexString(segmentIdentifier).toUpperCase());
+
+ // Read until we have a non-0xFF byte. This identifies the segment type.
+ byte currSegmentType = (byte) bStream.read();
+ while (currSegmentType == (byte)0xFF) {
+ currSegmentType = (byte) bStream.read();
+ }
+
+ if (currSegmentType == 0)
+ throw new ExifException("Expected non-zero byte as part of JPEG marker identifier");
+
+ if (currSegmentType == SEGMENT_SOS) {
+ // The 'Start-Of-Scan' segment's length doesn't include the image data, instead would
+ // have to search for the two bytes: 0xFF 0xD9 (EOI).
+ // It comes last so simply return at this point
+ return null;
+ }
+
+ if (currSegmentType == MARKER_EOI) {
+ // the 'End-Of-Image' segment -- this should never be found in this fashion
+ return null;
+ }
+
+ // next 2-bytes are : [high-byte] [low-byte]
+ int segmentLength = (bStream.read() << 8) + bStream.read();
+ // segment length includes size bytes, so subtract two
+ segmentLength -= 2;
+
+ if (segmentLength < 0)
+ throw new ExifException("JPEG segment size would be less than zero");
+
+ byte[] segmentBytes = new byte[segmentLength];
+ int bytesRead = bStream.read(segmentBytes, 0, segmentLength);
+ // Bail if not all bytes read in one go - otherwise following sections will be out of step
+ if (bytesRead != segmentLength) {
+ throw new ExifException("Tried to read " + segmentLength + " bytes but only got " + bytesRead);
+ }
+ // Check whether we are interested in this segment
+ if (segmentTypeByte == currSegmentType)
+ {
+ // Pass the appropriate byte arrays to reader.
+ if (canProcess(segmentBytes)) {
+ return segmentBytes;
+ }
+ }
+
+ } while (true);
+ }
+
+ private static boolean canProcess(final byte[] segmentBytes)
+ {
+ return segmentBytes.length >= JPEG_EXIF_SEGMENT_PREAMBLE.length() && new String(segmentBytes, 0, JPEG_EXIF_SEGMENT_PREAMBLE.length()).equalsIgnoreCase(JPEG_EXIF_SEGMENT_PREAMBLE);
+ }
+
+ /**
+ * Given the bytes, parse them recursively to fill the JpegData
+ * @param segmentBytes bytes out of the file
+ * @param jdata jpeg data to be populated
+ */
+ private static void extract(final byte[] segmentBytes, final JpegData jdata)
+ {
+ if (segmentBytes == null)
+ throw new NullPointerException("segmentBytes cannot be null");
+
+ try
+ {
+ ByteArrayReader reader = new ByteArrayReader(segmentBytes);
+
+ // Check for the header preamble
+ try {
+ if (!reader.getString(0, JPEG_EXIF_SEGMENT_PREAMBLE.length()).equals(JPEG_EXIF_SEGMENT_PREAMBLE)) {
+ // TODO what to do with this error state?
+ System.err.println("Invalid JPEG Exif segment preamble");
+ return;
+ }
+ } catch (ExifException e) {
+ // TODO what to do with this error state?
+ e.printStackTrace(System.err);
+ return;
+ }
+
+ // Read the TIFF-formatted Exif data
+ TiffProcessor.processTiff(
+ reader,
+ jdata,
+ JPEG_EXIF_SEGMENT_PREAMBLE.length()
+ );
+
+ } catch (ExifException e) {
+ // TODO what to do with this error state?
+ e.printStackTrace(System.err);
+ } catch (IOException e) {
+ // TODO what to do with this error state?
+ e.printStackTrace(System.err);
+ }
+ }
+}
diff --git a/tim/prune/jpeg/drew/ExifTiffHandler.java b/tim/prune/jpeg/drew/ExifTiffHandler.java
new file mode 100644
index 0000000..a98e720
--- /dev/null
+++ b/tim/prune/jpeg/drew/ExifTiffHandler.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2002-2015 Drew Noakes
+ *
+ * More information about this project is available at:
+ *
+ * https://drewnoakes.com/code/exif/
+ * https://github.com/drewnoakes/metadata-extractor
+ */
+package tim.prune.jpeg.drew;
+
+import tim.prune.jpeg.JpegData;
+
+/**
+ * Implementation of TiffHandler used for handling TIFF tags according to the Exif standard.
+ *
+ * @author Drew Noakes https://drewnoakes.com
+ */
+public class ExifTiffHandler
+{
+ private JpegData _jpegData = null;
+ private long _thumbnailOffset = -1L, _thumbnailLength = -1L;
+
+ /** This tag is a pointer to the Exif SubIFD. */
+ final int DIR_EXIF_SUB_IFD_OFFSET = 0x8769;
+ /** This tag is a pointer to the Exif GPS IFD. */
+ final int DIR_GPS_INFO_OFFSET = 0x8825;
+
+ private static final int TAG_GPS_LATITUDE_REF = 0x0001;
+ private static final int TAG_GPS_LATITUDE = 0x0002;
+ private static final int TAG_GPS_LONGITUDE_REF = 0x0003;
+ private static final int TAG_GPS_LONGITUDE = 0x0004;
+ private static final int TAG_GPS_ALTITUDE = 0x0006;
+ private static final int TAG_GPS_BEARING = 0x0011;
+
+ private static final int TAG_ORIENTATION = 0x0112;
+ private static final int TAG_THUMBNAIL_OFFSET = 0x0201;
+ private static final int TAG_THUMBNAIL_LENGTH = 0x0202;
+
+ private static final int TAG_SUB_ORITIME = 0x9003;
+ private static final int TAG_SUB_DIGITIME = 0x9004;
+
+
+ /**
+ * Constructor
+ * @param jpegData data object to populate with received results
+ */
+ public ExifTiffHandler(JpegData jpegData)
+ {
+ _jpegData = jpegData;
+ _thumbnailOffset = _thumbnailLength = -1L;
+ }
+
+ public boolean isTagIfdPointer(int tagType)
+ {
+ if (tagType == DIR_EXIF_SUB_IFD_OFFSET) {
+ return true;
+ } else if (tagType == DIR_GPS_INFO_OFFSET) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public void completed(final ByteArrayReader reader, final int tiffHeaderOffset)
+ {
+ // after the extraction process, if we have the correct tags, we may be able to store thumbnail information
+ if (_thumbnailOffset >= 0L && _thumbnailLength > 0L)
+ {
+ try {
+ byte[] thumbData = reader.getBytes(tiffHeaderOffset + (int) _thumbnailOffset, (int) _thumbnailLength);
+ if (thumbData != null)
+ {
+ byte[] thumbCopy = new byte[thumbData.length];
+ System.arraycopy(thumbData, 0, thumbCopy, 0, thumbData.length);
+ _jpegData.setThumbnailImage(thumbCopy);
+ }
+ } catch (ExifException ex) {}
+ }
+ }
+
+ public void setRationalArray(int tagId, Rational[] array)
+ {
+ switch (tagId)
+ {
+ case TAG_GPS_LATITUDE:
+ _jpegData.setLatitude(new double[] {array[0].doubleValue(), array[1].doubleValue(),
+ array[2].convertToPositiveValue()});
+ break;
+ case TAG_GPS_LONGITUDE:
+ _jpegData.setLongitude(new double[] {array[0].doubleValue(), array[1].doubleValue(),
+ array[2].convertToPositiveValue()});
+ break;
+ }
+ }
+
+ public void setRational(int tagId, Rational rational)
+ {
+ switch (tagId)
+ {
+ case TAG_GPS_ALTITUDE:
+ _jpegData.setAltitude(rational.intValue());
+ return;
+ case TAG_GPS_BEARING:
+ _jpegData.setBearing(rational.doubleValue());
+ return;
+ }
+ // maybe it was an integer passed as a rational?
+ if (rational.getDenominator() == 1L) {
+ setIntegerValue(tagId, rational.intValue());
+ }
+ }
+
+ public void setString(int tagId, String string)
+ {
+ switch (tagId)
+ {
+ case TAG_SUB_ORITIME:
+ _jpegData.setOriginalTimestamp(string);
+ break;
+ case TAG_SUB_DIGITIME:
+ _jpegData.setDigitizedTimestamp(string);
+ break;
+ case TAG_GPS_LATITUDE_REF:
+ _jpegData.setLatitudeRef(string);
+ break;
+ case TAG_GPS_LONGITUDE_REF:
+ _jpegData.setLongitudeRef(string);
+ break;
+ }
+ }
+
+ public void setIntegerValue(int tagId, int intVal)
+ {
+ switch (tagId)
+ {
+ case TAG_ORIENTATION:
+ _jpegData.setOrientationCode(intVal);
+ break;
+ case TAG_THUMBNAIL_OFFSET:
+ _thumbnailOffset = intVal;
+ break;
+ case TAG_THUMBNAIL_LENGTH:
+ _thumbnailLength = intVal;
+ break;
+ }
+ }
+
+
+ /**
+ * Decide, based on the directory id and the tag id, if we want to parse and process it
+ * @param inDirectoryId
+ * @param childTagId
+ * @return true if the tag should be parsed
+ */
+ public boolean isInterestingTag(int inDirectoryId, int childTagId)
+ {
+ switch (inDirectoryId)
+ {
+ case DIR_GPS_INFO_OFFSET:
+ return true;
+ case DIR_EXIF_SUB_IFD_OFFSET:
+ return childTagId == TAG_SUB_ORITIME
+ || childTagId == TAG_SUB_DIGITIME;
+ case 0:
+ return childTagId == TAG_THUMBNAIL_OFFSET
+ || childTagId == TAG_THUMBNAIL_LENGTH
+ || childTagId == TAG_ORIENTATION;
+ }
+ return false;
+ }
+}
diff --git a/tim/prune/jpeg/drew/JpegException.java b/tim/prune/jpeg/drew/JpegException.java
deleted file mode 100644
index d85a3b7..0000000
--- a/tim/prune/jpeg/drew/JpegException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package tim.prune.jpeg.drew;
-
-/**
- * Class to indicate a fatal exception processing a jpeg,
- * including IO errors and exif errors
- */
-public class JpegException extends Exception
-{
- /**
- * @param message description of error
- */
- public JpegException(String message)
- {
- super(message);
- }
-
- /**
- * @param message description of error
- * @param cause Throwable which caused the error
- */
- public JpegException(String message, Throwable cause)
- {
- super(message, cause);
- }
-}
diff --git a/tim/prune/jpeg/drew/JpegSegmentData.java b/tim/prune/jpeg/drew/JpegSegmentData.java
deleted file mode 100644
index 4b56cbe..0000000
--- a/tim/prune/jpeg/drew/JpegSegmentData.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package tim.prune.jpeg.drew;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * Class to hold a collection of Jpeg data segments
- * Each marker represents a list of multiple byte arrays
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com
- */
-public class JpegSegmentData
-{
- /** A map of byte[], keyed by the segment marker */
- private final HashMap> _segmentDataMap = new HashMap>(10);
-
-
- /**
- * Add a segment to the collection
- * @param inSegmentMarker marker byte
- * @param inSegmentBytes data of segment
- */
- public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)
- {
- List segmentList = getOrCreateSegmentList(inSegmentMarker);
- segmentList.add(inSegmentBytes);
- }
-
-
- /**
- * Get the first segment with the given marker
- * @param inSegmentMarker marker byte
- * @return first segment with that marker
- */
- public byte[] getSegment(byte inSegmentMarker)
- {
- return getSegment(inSegmentMarker, 0);
- }
-
-
- /**
- * Get the nth segment with the given marker
- * @param inSegmentMarker marker byte
- * @param inOccurrence occurrence to get, starting at 0
- * @return byte array from specified segment
- */
- public byte[] getSegment(byte inSegmentMarker, int inOccurrence)
- {
- final List segmentList = getSegmentList(inSegmentMarker);
-
- if (segmentList==null || segmentList.size()<=inOccurrence)
- return null;
- else
- return segmentList.get(inOccurrence);
- }
-
-
- /**
- * Get the number of segments with the given marker
- * @param inSegmentMarker marker byte
- * @return number of segments
- */
- public int getSegmentCount(byte inSegmentMarker)
- {
- final List segmentList = getSegmentList(inSegmentMarker);
- if (segmentList == null)
- return 0;
- else
- return segmentList.size();
- }
-
-
- /**
- * Get the list of segments with the given marker
- * @param inSegmentMarker marker byte
- * @return list of segments
- */
- private List getSegmentList(byte inSegmentMarker)
- {
- return _segmentDataMap.get(Byte.valueOf(inSegmentMarker));
- }
-
-
- /**
- * Get the specified segment if it exists, otherwise create new one
- * @param inSegmentMarker marker byte
- * @return list of segments
- */
- private List getOrCreateSegmentList(byte inSegmentMarker)
- {
- List segmentList = null;
- Byte key = Byte.valueOf(inSegmentMarker);
- if (_segmentDataMap.containsKey(key))
- {
- // list already exists
- segmentList = _segmentDataMap.get(key);
- }
- else
- {
- // create new list and add it
- segmentList = new ArrayList();
- _segmentDataMap.put(key, segmentList);
- }
- return segmentList;
- }
-}
diff --git a/tim/prune/jpeg/drew/JpegSegmentReader.java b/tim/prune/jpeg/drew/JpegSegmentReader.java
deleted file mode 100644
index 65515a1..0000000
--- a/tim/prune/jpeg/drew/JpegSegmentReader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package tim.prune.jpeg.drew;
-
-import java.io.*;
-
-/**
- * Class to perform read functions of Jpeg files, returning specific file segments
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com
- */
-public class JpegSegmentReader
-{
- /** Start of scan marker */
- private static final byte SEGMENT_SOS = (byte)0xDA;
-
- /** End of image marker */
- private static final byte MARKER_EOI = (byte)0xD9;
-
- /** APP1 Jpeg segment identifier -- where Exif data is kept. */
- private static final byte SEGMENT_APP1 = (byte)0xE1;
-
- /** Magic numbers to mark the beginning of all Jpegs */
- private static final int MAGIC_JPEG_BYTE_1 = 0xFF;
- private static final int MAGIC_JPEG_BYTE_2 = 0xD8;
-
-
- /**
- * Get the Exif data segment for the specified file
- * @param inFile File to read
- * @return Exif data segment as byte array
- * @throws JpegException on file read errors or exif data errors
- */
- public static byte[] readExifSegment(File inFile) throws JpegException
- {
- JpegSegmentData data = readSegments(inFile);
- return data.getSegment(SEGMENT_APP1);
- }
-
-
- /**
- * Obtain the Jpeg segment data from the specified file
- * @param inFile File to read
- * @return Jpeg segment data from file
- * @throws JpegException on file read errors or exif data errors
- */
- private static JpegSegmentData readSegments(File inFile) throws JpegException
- {
- JpegSegmentData segmentData = new JpegSegmentData();
- BufferedInputStream bStream = null;
-
- try
- {
- bStream = new BufferedInputStream(new FileInputStream(inFile));
- // first two bytes should be jpeg magic number
- final int magic1 = bStream.read() & 0xFF;
- final int magic2 = bStream.read() & 0xFF;
- if (magic1 != MAGIC_JPEG_BYTE_1 || magic2 != MAGIC_JPEG_BYTE_2) {
- throw new JpegException("not a jpeg file");
- }
-
- // Loop around segments found
- boolean foundExif = false;
- do
- {
- // next byte is 0xFF
- byte segmentIdentifier = (byte) (bStream.read() & 0xFF);
- if ((segmentIdentifier & 0xFF) != 0xFF)
- {
- throw new JpegException("expected jpeg segment start 0xFF, not 0x"
- + Integer.toHexString(segmentIdentifier & 0xFF));
- }
- // next byte is
- byte thisSegmentMarker = (byte) (bStream.read() & 0xFF);
- // next 2-bytes are : [high-byte] [low-byte]
- byte[] segmentLengthBytes = new byte[2];
- bStream.read(segmentLengthBytes, 0, 2);
- int segmentLength = ((segmentLengthBytes[0] << 8) & 0xFF00) | (segmentLengthBytes[1] & 0xFF);
- // segment length includes size bytes, so subtract two
- segmentLength -= 2;
- if (segmentLength > bStream.available())
- throw new JpegException("segment size would extend beyond file stream length");
- else if (segmentLength < 0)
- throw new JpegException("segment size would be less than zero");
- byte[] segmentBytes = new byte[segmentLength];
- int bytesRead = bStream.read(segmentBytes, 0, segmentLength);
- // Bail if not all bytes read in one go - otherwise following sections will be out of step
- if (bytesRead != segmentLength) {
- throw new JpegException("Tried to read " + segmentLength + " bytes but only got " + bytesRead);
- }
- if ((thisSegmentMarker & 0xFF) == (SEGMENT_SOS & 0xFF))
- {
- // The 'Start-Of-Scan' segment comes last so break out of loop
- break;
- }
- else if ((thisSegmentMarker & 0xFF) == (MARKER_EOI & 0xFF))
- {
- // the 'End-Of-Image' segment - should already have exited by now
- break;
- }
- else
- {
- segmentData.addSegment(thisSegmentMarker, segmentBytes);
- }
- // loop through to the next segment if exif hasn't already been found
- foundExif = (thisSegmentMarker == SEGMENT_APP1);
- }
- while (!foundExif);
- }
- catch (FileNotFoundException fnfe)
- {
- throw new JpegException("Jpeg file not found");
- }
- catch (IOException ioe)
- {
- throw new JpegException("IOException processing Jpeg file: " + ioe.getMessage(), ioe);
- }
- finally
- {
- try
- {
- if (bStream != null) {
- bStream.close();
- }
- }
- catch (IOException ioe) {
- throw new JpegException("IOException processing Jpeg file: " + ioe.getMessage(), ioe);
- }
- }
- // Return the result
- return segmentData;
- }
-}
diff --git a/tim/prune/jpeg/drew/Rational.java b/tim/prune/jpeg/drew/Rational.java
index 3c83b9f..8395898 100644
--- a/tim/prune/jpeg/drew/Rational.java
+++ b/tim/prune/jpeg/drew/Rational.java
@@ -1,95 +1,113 @@
-package tim.prune.jpeg.drew;
-
-/**
- * Immutable class for holding a rational number without loss of precision.
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com
- */
-public class Rational
-{
- /** Holds the numerator */
- private final int _numerator;
-
- /** Holds the denominator */
- private final int _denominator;
-
- /**
- * Constructor
- * @param inNumerator numerator of fraction (upper number)
- * @param inDenominator denominator of fraction (lower number)
- */
- public Rational(int inNumerator, int inDenominator)
- {
- // Could throw exception if denominator is zero
- _numerator = inNumerator;
- _denominator = inDenominator;
- }
-
-
- /**
- * @return the value of the specified number as a double
.
- * This may involve rounding.
- */
- public double doubleValue()
- {
- if (_denominator == 0) return 0.0;
- return (double)_numerator / (double)_denominator;
- }
-
- /**
- * @return the value of the specified number as an int
.
- * This may involve rounding or truncation.
- */
- public final int intValue()
- {
- if (_denominator == 0) return 0;
- return _numerator / _denominator;
- }
-
- /**
- * @return the denominator.
- */
- public final int getDenominator()
- {
- return _denominator;
- }
-
- /**
- * @return the numerator.
- */
- public final int getNumerator()
- {
- return _numerator;
- }
-
- /**
- * Checks if this rational number is an Integer, either positive or negative
- * @return true if an integer
- */
- public boolean isInteger()
- {
- // number is integer if the denominator is 1, or if the remainder is zero
- return (_denominator == 1
- || (_denominator != 0 && (_numerator % _denominator == 0)));
- }
-
-
- /**
- * @return a string representation of the object of form numerator/denominator
.
- */
- public String toString()
- {
- return "" + _numerator + "/" + _denominator;
- }
-
-
- /**
- * Compares two Rational
instances, returning true if they are equal
- * @param inOther the Rational to compare this instance to.
- * @return true if instances are equal, otherwise false.
- */
- public boolean equals(Rational inOther)
- {
- // Could also attempt to simplify fractions to lowest common denominator before compare
- return _numerator == inOther._numerator && _denominator == inOther._denominator;
- }
-}
\ No newline at end of file
+package tim.prune.jpeg.drew;
+
+/**
+ * Immutable class for holding a rational number without loss of precision.
+ * Based on Drew Noakes' Metadata extractor at https://drewnoakes.com
+ */
+public class Rational
+{
+ /** Holds the numerator */
+ private final long _numerator;
+
+ /** Holds the denominator */
+ private final long _denominator;
+
+ /**
+ * Creates a new (immutable) instance of Rational.
+ */
+ public Rational(long numerator, long denominator)
+ {
+ _numerator = numerator;
+ _denominator = denominator;
+ }
+
+ /**
+ * @return the value of the specified number as a double
.
+ * This may involve rounding.
+ */
+ public double doubleValue()
+ {
+ if (_denominator == 0L) return 0.0;
+ return (double)_numerator / (double)_denominator;
+ }
+
+ /**
+ * Returns the value of the specified number as an int
.
+ */
+ public final int intValue()
+ {
+ return (int) longValue();
+ }
+
+ /**
+ * Returns the value of the specified number as a long
.
+ * This may involve rounding or truncation.
+ * If the denominator is 0, returns 0 to avoid dividing by 0.
+ */
+ public final long longValue()
+ {
+ if (_denominator == 0L) return 0L;
+ return _numerator / _denominator;
+ }
+
+ /** Returns the denominator */
+ public final long getDenominator()
+ {
+ return _denominator;
+ }
+
+ /** Returns the numerator */
+ public final long getNumerator()
+ {
+ return _numerator;
+ }
+
+ /**
+ * @return the value of the specified number as a positive double
.
+ * Prevents interpretation of 32 bit numbers as negative, and forces a positive answer.
+ * Needed?
+ */
+ public double convertToPositiveValue()
+ {
+ if (_denominator == 0L) return 0.0;
+ double numeratorDbl = _numerator;
+ double denomDbl = _denominator;
+ if (_numerator >= 0L) {
+ // Numerator is positive (but maybe denominator isn't?)
+ return numeratorDbl / denomDbl;
+ }
+ // Add 2^32 to negative doubles to make them positive
+ final double correction = Math.pow(2.0, 32);
+ numeratorDbl += correction;
+ if (_denominator < 0L) {
+ denomDbl += correction;
+ }
+ return numeratorDbl / denomDbl;
+ }
+
+ /**
+ * Returns a string representation of the object of form numerator/denominator
.
+ */
+ @Override
+ public String toString()
+ {
+ return "" + _numerator + "/" + _denominator;
+ }
+
+ /**
+ * Compares two {@link Rational} instances, returning true if they are mathematically
+ * equivalent.
+ *
+ * @param obj the {@link Rational} to compare this instance to.
+ * @return true if instances are mathematically equivalent, otherwise false. Will also
+ * give false if obj
is not an instance of {@link Rational}.
+ */
+ @Override
+ public boolean equals( Object obj)
+ {
+ if (obj==null || !(obj instanceof Rational))
+ return false;
+ Rational that = (Rational) obj;
+ return this.doubleValue() == that.doubleValue();
+ }
+}
diff --git a/tim/prune/jpeg/drew/TiffDataFormat.java b/tim/prune/jpeg/drew/TiffDataFormat.java
new file mode 100644
index 0000000..6c89fc3
--- /dev/null
+++ b/tim/prune/jpeg/drew/TiffDataFormat.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2002-2015 Drew Noakes
+ *
+ * More information about this project is available at:
+ *
+ * https://drewnoakes.com/code/exif/
+ * https://github.com/drewnoakes/metadata-extractor
+ */
+package tim.prune.jpeg.drew;
+
+/**
+ * An enumeration of data formats used by the TIFF specification.
+ *
+ * @author Drew Noakes https://drewnoakes.com
+ */
+public class TiffDataFormat
+{
+ public static final int CODE_INT8_U = 1;
+ public static final int CODE_STRING = 2;
+ public static final int CODE_INT16_U = 3;
+ public static final int CODE_INT32_U = 4;
+ public static final int CODE_RATIONAL_U = 5;
+ public static final int CODE_INT8_S = 6;
+ public static final int CODE_UNDEFINED = 7;
+ public static final int CODE_INT16_S = 8;
+ public static final int CODE_INT32_S = 9;
+ public static final int CODE_RATIONAL_S = 10;
+ public static final int CODE_SINGLE = 11;
+ public static final int CODE_DOUBLE = 12;
+
+ public static int getComponentSize(int tiffFormatCode)
+ {
+ switch (tiffFormatCode)
+ {
+ case CODE_INT8_U:
+ case CODE_STRING:
+ case CODE_INT8_S:
+ case CODE_UNDEFINED:
+ return 1;
+ case CODE_INT16_U:
+ case CODE_INT16_S:
+ case CODE_INT32_U:
+ case CODE_INT32_S:
+ case CODE_SINGLE:
+ return 4;
+ case CODE_RATIONAL_U:
+ case CODE_RATIONAL_S:
+ case CODE_DOUBLE:
+ return 8;
+ default:
+ return 0;
+ }
+ }
+}
diff --git a/tim/prune/jpeg/drew/TiffProcessor.java b/tim/prune/jpeg/drew/TiffProcessor.java
new file mode 100644
index 0000000..2811a7f
--- /dev/null
+++ b/tim/prune/jpeg/drew/TiffProcessor.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright 2002-2015 Drew Noakes
+ *
+ * More information about this project is available at:
+ *
+ * https://drewnoakes.com/code/exif/
+ * https://github.com/drewnoakes/metadata-extractor
+ */
+package tim.prune.jpeg.drew;
+
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import tim.prune.jpeg.JpegData;
+
+/**
+ * Processes TIFF-formatted data, using an ExifTiffHandler
+ *
+ * @author Drew Noakes https://drewnoakes.com
+ */
+public class TiffProcessor
+{
+ /**
+ * Processes a TIFF data sequence.
+ *
+ * @param reader the {@link RandomAccessReader} from which the data should be read
+ * @param jpegData the data to populate
+ * @param tiffHeaderOffset the offset within reader
at which the TIFF header starts
+ * @throws ExifException if an error occurred during the processing of TIFF data that could
+ * not be ignored or recovered from
+ * @throws IOException an error occurred while accessing the required data
+ */
+ public static void processTiff(final ByteArrayReader reader, JpegData jpegData,
+ final int tiffHeaderOffset) throws ExifException, IOException
+ {
+ // This must be either "MM" or "II".
+ short byteOrderIdentifier = reader.getInt16(tiffHeaderOffset);
+
+ if (byteOrderIdentifier == 0x4d4d) { // "MM"
+ reader.setMotorolaByteOrder(true);
+ } else if (byteOrderIdentifier == 0x4949) { // "II"
+ reader.setMotorolaByteOrder(false);
+ } else {
+ throw new ExifException("Unclear distinction between Motorola/Intel byte ordering: " + byteOrderIdentifier);
+ }
+
+
+ int firstIfdOffset = reader.getInt32(4 + tiffHeaderOffset) + tiffHeaderOffset;
+
+ // David Ekholm sent a digital camera image that has this problem
+ if (firstIfdOffset >= reader.getLength() - 1) {
+ //handler.warn("First IFD offset is beyond the end of the TIFF data segment -- trying default offset");
+ // First directory normally starts immediately after the offset bytes, so try that
+ firstIfdOffset = tiffHeaderOffset + 2 + 2 + 4;
+ }
+
+ // Make a handler object to use for the processing
+ ExifTiffHandler handler = new ExifTiffHandler(jpegData);
+
+ Set processedIfdOffsets = new HashSet();
+ processDirectory(handler, reader, processedIfdOffsets, firstIfdOffset, tiffHeaderOffset, 0);
+
+ handler.completed(reader, tiffHeaderOffset);
+ }
+
+ /**
+ * Processes a TIFF IFD.
+ *
+ * IFD Header:
+ *
+ * - 2 bytes number of tags
+ *
+ * Tag structure:
+ *
+ * - 2 bytes tag type
+ * - 2 bytes format code (values 1 to 12, inclusive)
+ * - 4 bytes component count
+ * - 4 bytes inline value, or offset pointer if too large to fit in four bytes
+ *
+ *
+ * @param handler the {@link ExifTiffHandler} that will coordinate processing and accept read values
+ * @param reader the byte reader from which the data should be read
+ * @param processedIfdOffsets the set of visited IFD offsets, to avoid revisiting the same IFD in an endless loop
+ * @param ifdOffset the offset within reader
at which the IFD data starts
+ * @param tiffHeaderOffset the offset within reader
at which the TIFF header starts
+ * @param inDirectoryId directory id
+ * @throws IOException an error occurred while accessing the required data
+ */
+ private static void processDirectory(final ExifTiffHandler handler,
+ final ByteArrayReader reader, final Set processedIfdOffsets,
+ final int ifdOffset, final int tiffHeaderOffset, int inDirectoryId) throws ExifException
+ {
+ // check for directories we've already visited to avoid stack overflows when recursive/cyclic directory structures exist
+ if (processedIfdOffsets.contains(Integer.valueOf(ifdOffset))) {
+ return;
+ }
+
+ // remember that we've visited this directory so that we don't visit it again later
+ processedIfdOffsets.add(ifdOffset);
+
+ if (ifdOffset >= reader.getLength() || ifdOffset < 0) {
+ //handler.error("Ignored IFD marked to start outside data segment");
+ return;
+ }
+
+ // First two bytes in the IFD are the number of tags in this directory
+ int dirTagCount = reader.getUInt16(ifdOffset);
+
+ int dirLength = (2 + (12 * dirTagCount) + 4);
+ if (dirLength + ifdOffset > reader.getLength()) {
+ //handler.error("Illegally sized IFD");
+ return;
+ }
+
+
+ // Handle each tag in this directory
+ //
+ int invalidTiffFormatCodeCount = 0;
+ for (int tagNumber = 0; tagNumber < dirTagCount; tagNumber++)
+ {
+ final int tagOffset = calculateTagOffset(ifdOffset, tagNumber);
+
+ // 2 bytes for the tag id
+ final int childTagId = reader.getUInt16(tagOffset);
+
+ // 2 bytes for the format code
+ final int formatCode = reader.getUInt16(tagOffset + 2);
+ final int componentSizeInBytes = TiffDataFormat.getComponentSize(formatCode);
+
+ if (componentSizeInBytes == 0)
+ {
+ // This error suggests that we are processing at an incorrect index and will generate
+ // rubbish until we go out of bounds (which may be a while).
+ if (++invalidTiffFormatCodeCount > 5) {
+ //handler.error("Stopping processing as too many errors seen in TIFF IFD");
+ return;
+ }
+ continue;
+ }
+
+ // 4 bytes dictate the number of components in this tag's data
+ final int componentCount = reader.getInt32(tagOffset + 4);
+ if (componentCount < 0) {
+ //handler.error("Negative TIFF tag component count");
+ continue;
+ }
+
+ final int byteCount = componentCount * componentSizeInBytes;
+
+ final int tagValueOffset;
+ if (byteCount > 4)
+ {
+ // If it's bigger than 4 bytes, the dir entry contains an offset.
+ final int offsetVal = reader.getInt32(tagOffset + 8);
+ if (offsetVal + byteCount > reader.getLength()) {
+ // Bogus pointer offset and / or byteCount value
+ //handler.error("Illegal TIFF tag pointer offset");
+ continue;
+ }
+ tagValueOffset = tiffHeaderOffset + offsetVal;
+ }
+ else {
+ // 4 bytes or less and value is in the dir entry itself.
+ tagValueOffset = tagOffset + 8;
+ }
+
+ if (tagValueOffset < 0 || tagValueOffset > reader.getLength()) {
+ //handler.error("Illegal TIFF tag pointer offset");
+ continue;
+ }
+
+ // Check that this tag isn't going to allocate outside the bounds of the data array.
+ // This addresses an uncommon OutOfMemoryError.
+ if (byteCount < 0 || tagValueOffset + byteCount > reader.getLength()) {
+ //handler.error("Illegal number of bytes for TIFF tag data: " + byteCount);
+ continue;
+ }
+
+ // Special handling for tags that point to other IFDs
+ if (byteCount == 4 && handler.isTagIfdPointer(childTagId)) {
+ final int subDirOffset = tiffHeaderOffset + reader.getInt32(tagValueOffset);
+ processDirectory(handler, reader, processedIfdOffsets, subDirOffset, tiffHeaderOffset, childTagId);
+ }
+ else if (handler.isInterestingTag(inDirectoryId, childTagId))
+ {
+ processTag(handler, childTagId, tagValueOffset, componentCount, formatCode, reader);
+ }
+ }
+
+ // at the end of each IFD is an optional link to the next IFD
+ final int finalTagOffset = calculateTagOffset(ifdOffset, dirTagCount);
+ int nextIfdOffset = reader.getInt32(finalTagOffset);
+ if (nextIfdOffset != 0)
+ {
+ nextIfdOffset += tiffHeaderOffset;
+ if (nextIfdOffset >= reader.getLength()) {
+ // Last 4 bytes of IFD reference another IFD with an address that is out of bounds
+ // Note this could have been caused by jhead 1.3 cropping too much
+ return;
+ }
+ else if (nextIfdOffset < ifdOffset) {
+ // Last 4 bytes of IFD reference another IFD with an address that is before the start of this directory
+ return;
+ }
+
+ processDirectory(handler, reader, processedIfdOffsets, nextIfdOffset, tiffHeaderOffset, inDirectoryId);
+ }
+ }
+
+
+ /**
+ * Process a single tag value
+ */
+ private static void processTag(final ExifTiffHandler handler,
+ final int tagId, final int tagValueOffset,
+ final int componentCount, final int formatCode,
+ final ByteArrayReader reader) throws ExifException
+ {
+ switch (formatCode)
+ {
+ case TiffDataFormat.CODE_STRING:
+ handler.setString(tagId, reader.getNullTerminatedString(tagValueOffset, componentCount));
+ break;
+ case TiffDataFormat.CODE_RATIONAL_S:
+ if (componentCount == 1) {
+ handler.setRational(tagId, new Rational(reader.getInt32(tagValueOffset), reader.getInt32(tagValueOffset + 4)));
+ } else if (componentCount > 1) {
+ Rational[] array = new Rational[componentCount];
+ for (int i = 0; i < componentCount; i++)
+ array[i] = new Rational(reader.getInt32(tagValueOffset + (8 * i)), reader.getInt32(tagValueOffset + 4 + (8 * i)));
+ handler.setRationalArray(tagId, array);
+ }
+ break;
+ case TiffDataFormat.CODE_RATIONAL_U:
+ if (componentCount == 1) {
+ handler.setRational(tagId, new Rational(reader.getUInt32(tagValueOffset), reader.getUInt32(tagValueOffset + 4)));
+ } else if (componentCount > 1) {
+ Rational[] array = new Rational[componentCount];
+ for (int i = 0; i < componentCount; i++)
+ array[i] = new Rational(reader.getUInt32(tagValueOffset + (8 * i)), reader.getUInt32(tagValueOffset + 4 + (8 * i)));
+ handler.setRationalArray(tagId, array);
+ }
+ break;
+ case TiffDataFormat.CODE_INT8_S:
+ if (componentCount == 1) {
+ handler.setIntegerValue(tagId, reader.getInt8(tagValueOffset));
+ }
+ break;
+ case TiffDataFormat.CODE_INT8_U:
+ if (componentCount == 1) {
+ handler.setIntegerValue(tagId, reader.getUInt8(tagValueOffset));
+ }
+ break;
+ case TiffDataFormat.CODE_INT16_S:
+ if (componentCount == 1) {
+ handler.setIntegerValue(tagId, reader.getInt16(tagValueOffset));
+ }
+ break;
+ case TiffDataFormat.CODE_INT16_U:
+ if (componentCount == 1) {
+ handler.setIntegerValue(tagId, reader.getUInt16(tagValueOffset));
+ }
+ break;
+ case TiffDataFormat.CODE_INT32_S:
+ // NOTE 'long' in this case means 32 bit, not 64
+ if (componentCount == 1) {
+ handler.setIntegerValue(tagId, reader.getInt32(tagValueOffset));
+ }
+ break;
+ case TiffDataFormat.CODE_INT32_U:
+ // NOTE 'long' in this case means 32 bit, not 64
+ if (componentCount == 1) {
+ handler.setRational(tagId, new Rational(reader.getUInt32(tagValueOffset), 1L));
+ }
+ break;
+ case TiffDataFormat.CODE_SINGLE:
+ case TiffDataFormat.CODE_DOUBLE:
+ case TiffDataFormat.CODE_UNDEFINED:
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Determine the offset of a given tag within the specified IFD.
+ *
+ * @param ifdStartOffset the offset at which the IFD starts
+ * @param entryNumber the zero-based entry number
+ */
+ private static int calculateTagOffset(int ifdStartOffset, int entryNumber)
+ {
+ // Add 2 bytes for the tag count.
+ // Each entry is 12 bytes.
+ return ifdStartOffset + 2 + (12 * entryNumber);
+ }
+}
diff --git a/tim/prune/lang/prune-texts_af.properties b/tim/prune/lang/prune-texts_af.properties
index 063f494..8864d09 100644
--- a/tim/prune/lang/prune-texts_af.properties
+++ b/tim/prune/lang/prune-texts_af.properties
@@ -82,7 +82,6 @@ function.sendtogps=Stuur data na GPS
function.exportkml=Voer uit na KML
function.exportgpx=Voer uit na GPX
function.exportpov=Voer uit na POV
-function.exportsvg=Voer uit na SVG
function.exportimage=Voer uit na beeld
function.editwaypointname=Redigeer baken naam
function.compress=Kompakteer baan
@@ -118,7 +117,6 @@ function.searchopencachingde=Soek OpenCaching.de
function.downloadosm=Laai OSM data vir area af
function.duplicatepoint=Dupliseer punt
function.setcolours=Stel kleure
-function.setlinewidth=Stel lyn dikte
function.setlanguage=Stel tale
function.connecttopoint=Koppel na punt
function.disconnectfrompoint=Ontkoppel van huidige punt
@@ -261,10 +259,6 @@ dialog.baseimage.zoom=Vergrotings vlak
dialog.baseimage.incomplete=Beeld onvolledig
dialog.baseimage.tiles=Te\u00ebls
dialog.baseimage.size=Beeld groote
-dialog.exportsvg.text=Selekteer die parameters vir die SVG uitvoer
-dialog.exportsvg.phi=Azimuth hoek \u03D5
-dialog.exportsvg.theta=Opstandings angle \u03B8
-dialog.exportsvg.gradients=Grbruik gradient vir skakering
dialog.exportimage.noimagepossible=Kaart beelde moet gestoor word na skuif sodat dit gebruik kan word vir uitvoer
dialog.exportimage.drawtrack=Teken baan op kaart
dialog.exportimage.drawtrackpoints=Teken baan punte
@@ -438,12 +432,12 @@ dialog.deletemarked.nonefound=Geen data punte kon verwyder word
dialog.pastecoordinates.desc=Sleutel of plak die koordinate hier
dialog.pastecoordinates.coords=Koordinate
dialog.pastecoordinates.nothingfound=Gaan asseblief koordinate na en probeer weer
-dialog.help.help=Sien asseblief\n http://gpsprune.activityworkshop.net/\n vir meer inligting en gebruikers handleidings.
+dialog.help.help=Sien asseblief\n https://gpsprune.activityworkshop.net/\n vir meer inligting en gebruikers handleidings.
dialog.about.version=Weergawe
dialog.about.build=Bou
dialog.about.summarytext1=GpsPrune is 'n program vir die laai, vertoon en wysiging van data vanaf GPS ontvangers.
dialog.about.summarytext2=Dit is vrygestel onder die Gnu GPL gratif, oop w\u00eareldwye gebruik en verbetering.
Kopi\u00ebring, herverspreiding en veranderings word toegelaat en aangemoedig
volgens die kondisies in the aangegte license.txt
le\u00ear.
-dialog.about.summarytext3=Sien asseblief vir mer inligting en wenke, insluitend
'n nuwe PDF gebruikers gids wat jy kan koop.
+dialog.about.summarytext3=Sien asseblief https://activityworkshop.net/
vir mer inligting en wenke, insluitend
'n nuwe PDF gebruikers gids wat jy kan koop.
dialog.about.languages=Beskikbare tale
dialog.about.translatedby=Afrikaans teks deur ...?
dialog.about.systeminfo=Stelsel informasie
@@ -454,11 +448,6 @@ dialog.about.systeminfo.povray=Povray geinstalleer
dialog.about.systeminfo.exiftool=Exiftool geinstalleer
dialog.about.systeminfo.gpsbabel=Gpsbabel geinstalleer
dialog.about.systeminfo.gnuplot=Gnuplot geinstalleer
-dialog.about.systeminfo.exiflib=Exif biblioteek
-dialog.about.systeminfo.exiflib.internal=Intern
-dialog.about.systeminfo.exiflib.internal.failed=Interne (nie gevind)
-dialog.about.systeminfo.exiflib.external=Ekstern
-dialog.about.systeminfo.exiflib.external.failed=Ekstern (nie gevind)
dialog.about.yes=Ja
dialog.about.no=Nee
dialog.about.credits=Krediete
@@ -477,7 +466,7 @@ dialog.checkversion.newversion1='n nuwe weergawe van GpsPrune is nou beskikbaar!
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Hierdie nuwe weergawe was vrygestel op
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Om die nuwe weergawe aftelaai, gaan na http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Om die nuwe weergawe aftelaai, gaan na https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Jy kan die volgende kortpadsleutels gebruik in plaas van om die muis te gebruik
dialog.keys.keylist=Pylkie sleutels | Skuif kaart links regs, op, af |
Ctrl + links, regs pylkie | Selekteer vorige of volgende punt |
Ctrl + op, af pylkie | Vergroot in of uit |
Ctrl + PgUp, PgDown | Selekteer vorige, volgende segment |
Ctrl + Home, Einde | Selekteer eerste, laaste punt |
Del | Verwyder huidige punt |
dialog.keys.normalmodifier=Ctrl
@@ -552,7 +541,7 @@ dialog.diskcache.deleteall=Verwyder alle te\u00ebls
dialog.diskcache.deleted=%d leers verwyder vanuit datastoor
dialog.deletefieldvalues.intro=Selekteer die veld om te verwyder vanuit die hudige reeks
dialog.deletefieldvalues.nofields=Daar is geen velde om te verwyder vir hierdie reeks nie
-dialog.setlinewidth.text=Sleutel die dikte van die lyne om te teken vir die bane (1-4)
+dialog.displaysettings.linewidth=Dikte van die lyne vir die bane (1-4)
dialog.downloadosm.desc=Bevestig die aflaai van rou OSM data vir die geslekteerde area:
dialog.searchwikipedianames.search=Soek vir:
dialog.weather.location=Plek
@@ -786,7 +775,6 @@ wikipedia.lang=en
openweathermap.lang=en
webservice.peakfinder=Open Peakfinder.org
webservice.geohack=Open Geohack bladsy
-webservice.panoramio=Open Panoramio kaart
## Cardinals for 3d plots
cardinal.n=N
diff --git a/tim/prune/lang/prune-texts_cz.properties b/tim/prune/lang/prune-texts_cz.properties
index c060e88..79627f3 100644
--- a/tim/prune/lang/prune-texts_cz.properties
+++ b/tim/prune/lang/prune-texts_cz.properties
@@ -39,7 +39,7 @@ menu.view.browser.yahoo=Mapy Yahoo
menu.view.browser.bing=Mapy Bing
menu.settings=Nastaven\u00ed
menu.settings.onlinemode=Na\u010d\u00edtat mapy z internetu
-menu.settings.antialias=Pou\u017e\u00edt antialiasing
+dialog.displaysettings.antialias=Pou\u017e\u00edt antialiasing
menu.settings.autosave=P\u0159i ukon\u010den\u00ed automaticky ukl\u00e1dat
menu.help=Pomoc
# Popup menu for map
@@ -83,7 +83,6 @@ function.sendtogps=Poslat data do GPS
function.exportkml=Export KML
function.exportgpx=Export GPX
function.exportpov=Export POV
-function.exportsvg=Export SVG
function.exportimage=Export obrazu mapy
function.editwaypointname=Nastavit n\u00e1zev v\u00fdzna\u010dn\u00e9ho bodu
function.compress=Komprimovat stopu
@@ -117,7 +116,6 @@ function.mapillary=Hledat fotografie v Mapillary
function.downloadosm=St\u00e1hnout data OSM pro oblast
function.duplicatepoint=Zdvojit bod
function.setcolours=Nastavit barvy
-function.setlinewidth=Nastavit tlou\u0161\u0165ku \u010d\u00e1ry
function.setlanguage=Nastavit jazyk
function.connecttopoint=P\u0159ipojit do bodu
function.disconnectfrompoint=Odpojit od bodu
@@ -259,10 +257,6 @@ dialog.baseimage.zoom=Zv\u011bt\u0161en\u00ed
dialog.baseimage.incomplete=Obr\u00e1zek ne\u00fapln\u00fd
dialog.baseimage.tiles=Dla\u017edic
dialog.baseimage.size=Velikost obr\u00e1zku
-dialog.exportsvg.text=Zvolte parametry exportu do SVG
-dialog.exportsvg.phi=Azimut \u03d5
-dialog.exportsvg.theta=V\u00fd\u0161kov\u00fd \u00fahel \u03b8
-dialog.exportsvg.gradients=Vypl\u0148ovat body barevn\u00fdm p\u0159echodem
dialog.exportimage.noimagepossible=Aby bylo mo\u017en\u00e9 mapu ulo\u017eit jako obr\u00e1zek, je t\u0159eba st\u00e1hnout a ulo\u017eit dla\u017edice
dialog.exportimage.drawtrack=Vykreslit linii stopy
dialog.exportimage.drawtrackpoints=Vykreslit body stopy
@@ -377,9 +371,14 @@ dialog.gpsies.activity.motorbiking=Motorka
dialog.gpsies.activity.snowshoe=Sn\u011b\u017enice
dialog.gpsies.activity.sailing=Lo\u010f
dialog.gpsies.activity.skating=Bruslen\u00ed
+dialog.mapillary.nonefound=Nenalezeny \u017e\u00e1dn\u00e9 fotografie
dialog.wikipedia.column.name=N\u00e1zev \u010dl\u00e1nku
dialog.wikipedia.column.distance=Vzd\u00e1lenost
+dialog.wikipedia.nonefound=Nenalezeny \u017e\u00e1dn\u00e9 body
dialog.wikipedia.gallery=Galerie
+dialog.osmpois.column.name=N\u00e1zev
+dialog.osmpois.column.type=Typ
+dialog.osmpois.nonefound=Nenalezeny \u017e\u00e1dn\u00e9 body
dialog.correlate.notimestamps=U bod\u016f nejsou \u010dasov\u00e9 zna\u010dky, tak\u017ee nen\u00ed s \u010d\u00edm fotografie sladit.
dialog.correlate.nouncorrelatedphotos=V\u0161echny fotografie jsou slad\u011bn\u00e9.\nOpravdu chcete pokra\u010dovat?
dialog.correlate.nouncorrelatedaudios=V\u0161echny audionahr\u00e1vky jsou slad\u011bn\u00e9.\nOpravdu chcete pokra\u010dovat?
@@ -437,12 +436,12 @@ dialog.deletemarked.nonefound=Nemohou b\u00fdt odstran\u011bny \u017e\u00e1dn\u0
dialog.pastecoordinates.desc=Zadejte sou\u0159adnice
dialog.pastecoordinates.coords=Sou\u0159adnice
dialog.pastecoordinates.nothingfound=Pros\u00edm ov\u011b\u0159te sou\u0159adnice a zkuste znovu
-dialog.help.help=V\u00edce informac\u00ed a tip\u016f (bohu\u017eel nikoli v \u010de\u0161tin\u011b) naleznete na adrese:\n http://gpsprune.activityworkshop.net/ Je tak\u00e9 mo\u017en\u00e9 zakoupit novou u\u017eivatelskou p\u0159\u00edru\u010dku v PDF.
+dialog.help.help=V\u00edce informac\u00ed a tip\u016f (bohu\u017eel nikoli v \u010de\u0161tin\u011b) naleznete na adrese:\n https://gpsprune.activityworkshop.net/ Je tak\u00e9 mo\u017en\u00e9 zakoupit novou u\u017eivatelskou p\u0159\u00edru\u010dku v PDF.
dialog.about.version=Verze
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune je program k na\u010d\u00edt\u00e1n\u00ed, zobrazov\u00e1n\u00ed a editaci dat z navigac\u00ed GPS.
dialog.about.summarytext2=Je vyd\u00e1n pod licenc\u00ed GNU GPL, tak\u017ee je celosv\u011btov\u011b zdarma a svobodn\u011b k u\u017e\u00edv\u00e1n\u00ed a vylep\u0161ov\u00e1n\u00ed.
Kop\u00edrov\u00e1n\u00ed, redistribuce a \u00fapravy jsou povoleny a podporov\u00e1ny
podle podm\u00ednek popsan\u00fdch v souboru licence.txt
.
-dialog.about.summarytext3=V\u00edce informac\u00ed a tip\u016f (bohu\u017eel nikoli v \u010de\u0161tin\u011b) naleznete
na adrese: http://activityworkshop.net/
. Je tak\u00e9 mo\u017en\u00e9 zakoupit novou u\u017eivatelskou p\u0159\u00edru\u010dku v PDF.
+dialog.about.summarytext3=V\u00edce informac\u00ed a tip\u016f (bohu\u017eel nikoli v \u010de\u0161tin\u011b) naleznete
na adrese: https://activityworkshop.net/
. Je tak\u00e9 mo\u017en\u00e9 zakoupit novou u\u017eivatelskou p\u0159\u00edru\u010dku v PDF.
dialog.about.languages=Dostupn\u00e9 jazyky
dialog.about.translatedby=\u010cesk\u00fd p\u0159eklad od prot_d.
dialog.about.systeminfo=Syst\u00e9mov\u00e9 informace
@@ -453,11 +452,6 @@ dialog.about.systeminfo.povray=Povray nainstalov\u00e1n
dialog.about.systeminfo.exiftool=Exiftool nainstalov\u00e1n
dialog.about.systeminfo.gpsbabel=Gpsbabel nainstalov\u00e1n
dialog.about.systeminfo.gnuplot=Gnuplot nainstalov\u00e1n
-dialog.about.systeminfo.exiflib=Knihovna Exif
-dialog.about.systeminfo.exiflib.internal=Intern\u00ed
-dialog.about.systeminfo.exiflib.internal.failed=Intern\u00ed (nenalezeno)
-dialog.about.systeminfo.exiflib.external=Extern\u00ed
-dialog.about.systeminfo.exiflib.external.failed=Extern\u00ed (nenalezeno)
dialog.about.yes=Ano
dialog.about.no=Ne
dialog.about.credits=Auto\u0159i a spolupracovn\u00edci
@@ -476,7 +470,7 @@ dialog.checkversion.newversion1=Nov\u00e1 verze GpsPrune je u\u017e dostupn\u00e
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Tato verze byla vyd\u00e1na
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Novou verzi m\u016f\u017eete st\u00e1hnout na adrese http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Novou verzi m\u016f\u017eete st\u00e1hnout na adrese https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=M\u00edsto my\u0161i m\u016f\u017eete pou\u017e\u00edvat n\u00e1sleduj\u00edc\u00ed kl\u00e1vesov\u00e9 zkratky
dialog.keys.keylist=\u0160ipky | Posunout mapu vlevo, vpravo, nahoru, dol\u016f |
Ctrl + \u0161ipka vlevo, vpravo | Vybrat p\u0159edchoz\u00ed nebo n\u00e1sleduj\u00edc\u00ed bod |
Ctrl + \u0161ipka nahoru, dol\u016f | P\u0159ibl\u00ed\u017eit, odd\u00e1lit |
Ctrl + PgUp, PgDown | Vybrat p\u0159edchoz\u00ed, n\u00e1sleduj\u00edc\u00ed \u010d\u00e1st stopy |
Ctrl + Home, End | Vybrat prvn\u00ed, posledn\u00ed bod |
Del | Smazat aktu\u00e1ln\u00ed bod |
dialog.keys.normalmodifier=Ctrl
@@ -542,8 +536,10 @@ dialog.diskcache.deleteall=Smazat v\u0161echny soubory
dialog.diskcache.deleted=Smaz\u00e1no %d soubor\u016f z cache
dialog.deletefieldvalues.intro=Vyberte pole, kter\u00e9 se m\u00e1 z aktu\u00e1ln\u00edho rozmez\u00ed odstranit
dialog.deletefieldvalues.nofields=V tomto rozmez\u00ed nelze smazat \u017e\u00e1dn\u00e9 pole
-dialog.setlinewidth.text=Zvolte tlou\u0161\u0165ku \u010d\u00e1ry, kterou se nakresl\u00ed stopa (1-4)
+dialog.displaysettings.linewidth=Zvolte tlou\u0161\u0165ku \u010d\u00e1ry, kterou se nakresl\u00ed stopa (1-4)
dialog.downloadosm.desc=Potvr\u010fte, \u017ee se maj\u00ed k dan\u00e9 oblasti st\u00e1hnout data OSM:
+dialog.displaysettings.wpicon.plectrum=Trs\u00e1tko
+dialog.displaysettings.wpicon.ring=Krou\u017Eek
dialog.searchwikipedianames.search=Vyhledat:
dialog.weather.location=M\u00edsto
dialog.weather.update=Posledn\u00ed aktualizace
@@ -776,7 +772,6 @@ wikipedia.lang=cs
openweathermap.lang=en
webservice.peakfinder=Otev\u0159\u00edt Peakfinder.org
webservice.geohack=Otev\u0159\u00edt Geohack
-webservice.panoramio=Otev\u0159\u00edt Panoramio
# Cardinals for 3d plots
cardinal.n=N
@@ -834,7 +829,6 @@ error.jpegload.dialogtitle=Chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed fotografi
error.jpegload.nofilesfound=Nenalezeny \u017e\u00e1dn\u00e9 soubory
error.jpegload.nojpegsfound=Nenalezeny \u017e\u00e1dn\u00e9 soubory jpeg
error.jpegload.nogpsfound=Nenalezena informace GPS
-error.jpegload.exifreadfailed=Nepoda\u0159ilo se na\u010d\u00edst informaci Exif. Tu nelze na\u010d\u00edst\nbez intern\u00ed nebo extern\u00ed knihovny.
error.audioload.nofilesfound=Nebyly nalezeny \u017e\u00e1dn\u00e9 zvukov\u00e9 soubory.
error.gpsload.unknown=Nezn\u00e1m\u00e1 chyba
error.undofailed.title=Selhalo undo
diff --git a/tim/prune/lang/prune-texts_da.properties b/tim/prune/lang/prune-texts_da.properties
index e1d29ae..e975e29 100644
--- a/tim/prune/lang/prune-texts_da.properties
+++ b/tim/prune/lang/prune-texts_da.properties
@@ -63,7 +63,6 @@ function.sendtogps=Overf\u00f8r data til GPS
function.exportkml=Eksport\u00e9r KML
function.exportgpx=Eksport\u00e9r GPX
function.exportpov=Eksport\u00e9r POV
-function.exportsvg=Eksport\u00e9r SVG
function.editwaypointname=Ret waypoint-navn
function.compress=Komprim\u00e9r spor
function.deleterange=Fjern det valgte omr\u00e5de
diff --git a/tim/prune/lang/prune-texts_de.properties b/tim/prune/lang/prune-texts_de.properties
index 26a3df3..bce51c6 100644
--- a/tim/prune/lang/prune-texts_de.properties
+++ b/tim/prune/lang/prune-texts_de.properties
@@ -12,8 +12,6 @@ menu.track=Track
menu.track.undo=R\u00fcckg\u00e4ngig
menu.track.clearundo=Liste der letzten \u00c4nderungen l\u00f6schen
menu.track.markrectangle=Punkte im Viereck markieren
-function.deletemarked=Markierte Punkte l\u00f6schen
-function.rearrangewaypoints=Wegpunkte neu anordnen
menu.range=Bereich
menu.range.all=Alles markieren
menu.range.none=Nichts markieren
@@ -39,7 +37,6 @@ menu.view.browser.yahoo=Yahoo Maps
menu.view.browser.bing=Bing Maps
menu.settings=Einstellungen
menu.settings.onlinemode=Karten aus dem Internet laden
-menu.settings.antialias=Kantengl\u00e4ttung an
menu.settings.autosave=Einstellungen automatisch speichern
menu.help=Hilfe
# Popup menu for map
@@ -83,11 +80,12 @@ function.sendtogps=Zum GPS schicken
function.exportkml=KML exportieren
function.exportgpx=GPX exportieren
function.exportpov=POV exportieren
-function.exportsvg=SVG exportieren
function.exportimage=Bild exportieren
function.editwaypointname=Namen des Punkts bearbeiten
function.compress=Track komprimieren
function.marklifts=Bergbahnen markieren
+function.deletemarked=Markierte Punkte l\u00f6schen
+function.rearrangewaypoints=Wegpunkte neu anordnen
function.deleterange=Bereich l\u00f6schen
function.croptrack=Track zuschneiden
function.interpolate=Punkte interpolieren
@@ -110,18 +108,20 @@ function.setpaths=Programmpfade setzen
function.selectsegment=Aktuellen Abschnitt markieren
function.splitsegments=In Trackabschnitte schneiden
function.sewsegments=Trackabschnitte zusammenf\u00fcgen
+function.createmarkerwaypoints=Wegpunkte im bestimmten Abstand kreieren
function.getgpsies=Tracks bei GPSies.com herunterladen
function.uploadgpsies=Track zu GPSies.com hochladen
function.lookupsrtm=H\u00f6hendaten von SRTM nachschlagen
function.downloadsrtm=SRTM Dateien herunterladen
function.getwikipedia=Wikipediaartikel in der N\u00e4he nachschlagen
function.searchwikipedianames=Wikipedia nach Namen durchsuchen
+function.searchosmpois=OpenStreetMap nach Punkten durchsuchen
function.searchopencachingde=OpenCaching.de durchsuchen
function.mapillary=Mapillary nach Fotos durchsuchen
function.downloadosm=OSM-Daten f\u00fcr dieses Gebiet herunterladen
function.duplicatepoint=Punkt verdoppeln
function.setcolours=Farben einstellen
-function.setlinewidth=Liniendicke einstellen
+function.setdisplaysettings=Darstellungsoptionen
function.setlanguage=Sprache einstellen
function.connecttopoint=Mit Punkt verkn\u00fcpfen
function.disconnectfrompoint=Vom Punkt trennen
@@ -146,6 +146,7 @@ function.diskcache=Karten auf Festplatte speichern
function.managetilecache=Kartenkacheln verwalten
function.getweatherforecast=Wettervorhersage herunterladen
function.setaltitudetolerance=Altitudtoleranz einstellen
+function.selecttimezone=Zeitzone bestimmen
# Dialogs
dialog.exit.confirm.title=GpsPrune beenden
@@ -264,10 +265,6 @@ dialog.baseimage.zoom=Zoomstufe
dialog.baseimage.incomplete=Bild unvollst\u00e4ndig
dialog.baseimage.tiles=Kacheln
dialog.baseimage.size=Bildgr\u00f6\u00dfe
-dialog.exportsvg.text=W\u00e4hlen Sie die Parameter f\u00fcr den SVG-Export aus
-dialog.exportsvg.phi=Richtungswinkel \u03d5
-dialog.exportsvg.theta=Neigungswinkel \u03b8
-dialog.exportsvg.gradients=Farbverl\u00e4ufe verwenden
dialog.exportimage.noimagepossible=Kartenbilder m\u00fcssen schon gespeichert werden bevor sie in einem Export verwendet werden k\u00f6nnen
dialog.exportimage.drawtrack=Track auf der Karte zeichnen
dialog.exportimage.drawtrackpoints=Trackpunkte zeichnen
@@ -387,6 +384,9 @@ dialog.wikipedia.column.name=Artikelname
dialog.wikipedia.column.distance=Entfernung
dialog.wikipedia.nonefound=Keine Punkte gefunden
dialog.wikipedia.gallery=Bilder
+dialog.osmpois.column.name=Name
+dialog.osmpois.column.type=Punkttyp
+dialog.osmpois.nonefound=Keine Punkte gefunden
dialog.geocaching.nonefound=Keine Punkte gefunden
dialog.correlate.notimestamps=Die Punkte enthalten keine Zeitangaben, deshalb k\u00f6nnen die Fotos nicht zugeordnet werden.
dialog.correlate.nouncorrelatedphotos=Alle Fotos sind schon zugeordnet.\nWollen Sie trotzdem fortfahren?
@@ -446,12 +446,12 @@ dialog.deletemarked.nonefound=Es konnten keine Punkte entfernt werden
dialog.pastecoordinates.desc=Koordinaten eingeben oder einf\u00fcgen
dialog.pastecoordinates.coords=Koordinaten
dialog.pastecoordinates.nothingfound=Bitte pr\u00fcfen Sie die Koordinaten und versuchen Sie es nochmals
-dialog.help.help=Weitere Informationen und Benutzeranleitungen finden Sie unter\n http://gpsprune.activityworkshop.net/
+dialog.help.help=Weitere Informationen und Benutzeranleitungen finden Sie unter\n https://gpsprune.activityworkshop.net/
dialog.about.version=Version
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune ist ein Programm zum Laden, Darstellen und Editieren der Daten von GPS- Ger\u00e4ten.
dialog.about.summarytext2=Es wird unter der Gnu GPL zur Verf\u00fcgung gestellt zum freien, kostenlosen und offenen Gebrauch und zur Weiterentwicklung.
Das Kopieren, Weiterverbreiten und Ver\u00e4ndern ist erlaubt und willkommen
unter den in der Datei license.txt
enthaltenen Bedingungen.
-dialog.about.summarytext3=Auf der Seite http://activityworkshop.net/
finden Sie weitere Informationen und Bedienungsanleitungen.
+dialog.about.summarytext3=Auf der Seite https://activityworkshop.net/
finden Sie weitere Informationen und Bedienungsanleitungen.
dialog.about.languages=Verf\u00fcgbare Sprachen
dialog.about.translatedby=Deutsche \u00dcbersetzung von activityworkshop.
dialog.about.systeminfo=System-Informationen
@@ -462,11 +462,6 @@ dialog.about.systeminfo.povray=Povray installiert
dialog.about.systeminfo.exiftool=ExifTool installiert
dialog.about.systeminfo.gpsbabel=GPSBabel installiert
dialog.about.systeminfo.gnuplot=Gnuplot installiert
-dialog.about.systeminfo.exiflib=Exif-Bibliothek
-dialog.about.systeminfo.exiflib.internal=Intern
-dialog.about.systeminfo.exiflib.internal.failed=Intern (nicht gefunden)
-dialog.about.systeminfo.exiflib.external=Extern
-dialog.about.systeminfo.exiflib.external.failed=Extern (nicht gefunden)
dialog.about.yes=Ja
dialog.about.no=Nein
dialog.about.credits=Danksagung
@@ -485,7 +480,7 @@ dialog.checkversion.newversion1=Eine neue Version von GpsPrune ist jetzt verf\u0
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Diese neue Version ist am
dialog.checkversion.releasedate2=ver\u00f6ffentlicht worden.
-dialog.checkversion.download=Um die neue Version herunterzuladen, gehen Sie zu http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Um die neue Version herunterzuladen, gehen Sie zu https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Anstelle der Maus k\u00f6nnen Sie folgende Tastenkombinationen nutzen
dialog.keys.keylist=Pfeil Tasten | Karte verschieben |
Strg + Links-, Rechts-Pfeil | Vorherigen oder n\u00e4chsten Punkt markieren |
Strg + Auf-, Abw\u00e4rts-Pfeil | Ein- oder Auszoomen |
Strg + Bild auf, ab | Zum vorherigen oder n\u00e4chsten Abschnitt |
Strg + Pos1, Ende | Ersten oder letzten Punkt markieren |
Entf | Aktuellen Punkt entfernen |
dialog.keys.normalmodifier=Strg
@@ -564,7 +559,17 @@ dialog.diskcache.deleteall=Alle Kacheln l\u00f6schen
dialog.diskcache.deleted=Es wurden %d Dateien aus dem Ordner gel\u00f6scht
dialog.deletefieldvalues.intro=W\u00e4hlen Sie das Feld aus, das Sie l\u00f6schen m\u00f6chten
dialog.deletefieldvalues.nofields=Es sind keine Felder zu l\u00f6schen f\u00fcr diesen Bereich
-dialog.setlinewidth.text=Geben Sie die Dicke der Linien ein (1-4)
+dialog.displaysettings.linewidth=Dicke der Linien in Pixeln (1-4)
+dialog.displaysettings.antialias=Kantengl\u00e4ttung an
+dialog.displaysettings.waypointicons=Wegpunkt Ikons
+dialog.displaysettings.wpicon.default=Punkt
+dialog.displaysettings.wpicon.ringpt=Rundes Schild
+dialog.displaysettings.wpicon.plectrum=Plektrum
+dialog.displaysettings.wpicon.ring=Kreis
+dialog.displaysettings.wpicon.pin=Sto\u00dfnadel
+dialog.displaysettings.size.small=Klein
+dialog.displaysettings.size.medium=Mittel
+dialog.displaysettings.size.large=Gro\u00df
dialog.downloadosm.desc=Die OpenStreetMap-Daten f\u00fcr das folgende Gebiet werden heruntergeladen (.osm-Datei):
dialog.searchwikipedianames.search=Suche nach:
dialog.weather.location=Ort
@@ -596,6 +601,12 @@ dialog.deletebydate.column.keep=Behalten
dialog.deletebydate.column.delete=L\u00f6schen
dialog.setaltitudetolerance.text.metres=Mindestabweichung (Meter) f\u00fcr H\u00f6henunterschiede
dialog.setaltitudetolerance.text.feet=Mindestabweichung (Feet) f\u00fcr H\u00f6henunterschiede
+dialog.settimezone.intro=Hier k\u00f6nnen Sie die Zeitzone ausw\u00e4hlen, in der die Punkt Zeitstempeln angezeigt werden
+dialog.settimezone.system=Zeitzone des Systems verweden
+dialog.settimezone.custom=Folgende Zeitzone verwenden:
+dialog.settimezone.list.toomany=Zu viele zum Anzeigen
+dialog.settimezone.selectedzone=Ausgew\u00e4hlte Zeitzone
+dialog.settimezone.offsetfromutc=Unterschied zur UTC
dialog.autoplay.duration=Abspieldauer (Sek)
dialog.autoplay.usetimestamps=Zeitstempeln verwenden
dialog.autoplay.rewind=Zum Anfang
@@ -806,7 +817,6 @@ wikipedia.lang=de
openweathermap.lang=de
webservice.peakfinder=Peakfinder.org \u00f6ffnen
webservice.geohack=Geohack-Seite \u00f6ffnen
-webservice.panoramio=Panoramio Karte \u00f6ffnen
# Cardinals for 3d plots
cardinal.n=N
@@ -864,7 +874,6 @@ error.jpegload.dialogtitle=Fehler beim Laden von Fotos
error.jpegload.nofilesfound=Keine Dateien gefunden
error.jpegload.nojpegsfound=Keine JPG-Dateien gefunden
error.jpegload.nogpsfound=Keine GPS-Information gefunden
-error.jpegload.exifreadfailed=Exif-Aufruf fehlgeschlagen. Exif-Information k\u00f6nnen nicht gelesen werden\nwenn nicht eine interne oder externe Bibliothek vorhanden ist.
error.audioload.nofilesfound=Keine Audiodateien gefunden
error.gpsload.unknown=Unbekannter Fehler
error.undofailed.title=Undo fehlgeschlagen
diff --git a/tim/prune/lang/prune-texts_de_CH.properties b/tim/prune/lang/prune-texts_de_CH.properties
index 9697e39..d7deef6 100644
--- a/tim/prune/lang/prune-texts_de_CH.properties
+++ b/tim/prune/lang/prune-texts_de_CH.properties
@@ -38,7 +38,7 @@ menu.view.showsidebars=Seiteleischten aazeige
menu.view.browser=Karte inem Browser
menu.settings=Iistellige
menu.settings.onlinemode=Karten uusem Internet lade
-menu.settings.antialias=Kantegl\u00e4ttig aa
+dialog.displaysettings.antialias=Kantegl\u00e4ttig aa
menu.settings.autosave=Iistellige automatisch speichere
menu.help=Hilfe
# Popup menu for map
@@ -82,7 +82,6 @@ function.sendtogps=zum GPS schicke
function.exportkml=KML exportier\u00e4
function.exportgpx=GPX exportier\u00e4
function.exportpov=POV exportier\u00e4
-function.exportsvg=SVG exportier\u00e4
function.exportimage=Bild exportier\u00e4
function.editwaypointname=Waypoint Namen editiere
function.compress=Track komprimier\u00e4
@@ -107,14 +106,16 @@ function.setmapbg=Karte Hintegrund setz\u00e4
function.selectsegment=Aktuelli Segm\u00e4nt selektiere
function.splitsegments=In Tracksegm\u00e4nte schniide
function.sewsegments=Tracksegm\u00e4nte z\u00e4mef\u00fcge
+function.createmarkerwaypoints=Waypoints inem bestimmten Abstand kreiere
function.getgpsies=Gpsies Tracks hol\u00e4
function.uploadgpsies=Date zum Gpsies uufalad\u00e4
function.lookupsrtm=H\u00f6hendate vonem SRTM hole
function.downloadsrtm=SRTM Files abalade
function.getwikipedia=Im Wikipedia in dr N\u00f6chi naaluege
function.searchwikipedianames=Wikipedia nachem Namen durasueche
+function.searchosmpois=OpenStreetMap na P\u00fcnkt durasueche
function.searchopencachingde=OpenCaching.de durasueche
-function.mapillary=Mapillary nach F\u00f6telis durasueche
+function.mapillary=Mapillary na F\u00f6telis durasueche
function.downloadosm=OSM-Date f\u00fcr dere Gebiet abalad\u00e4
function.duplicatepoint=Punkt verdoppl\u00e4
function.correlatephotos=F\u00f6telis korrelier\u00e4
@@ -130,17 +131,18 @@ function.playaudio=Audiofile abspiel\u00e4
function.stopaudio=Abspielen abbr\u00e4ch\u00e4
function.setpaths=Programmepfade setz\u00e4
function.setcolours=Farben setz\u00e4
-function.setlinewidth=Liniedicke setz\u00e4
+function.setdisplaysettings=Darstelligsoptione
function.setlanguage=Sproch setz\u00e4
function.help=Hilfe
-function.showkeys=Tastekombinatione aazeige
+function.showkeys=Tastekombinatione aazeig\u00e4
function.about=\u00dcber GpsPrune
function.checkversion=Pruef nach ne noie Version
-function.saveconfig=Iistellige speichere
-function.diskcache=Karten uufem Disk speichere
-function.managetilecache=Kartebildli verwolte
-function.getweatherforecast=W\u00e4tterprognose abalade
-function.setaltitudetolerance=H\u00f6chitoleranz iistelle
+function.saveconfig=Iistellige speicher\u00e4
+function.diskcache=Karten uufem Disk speicher\u00e4
+function.managetilecache=Kartebildli verwolt\u00e4
+function.getweatherforecast=W\u00e4tterprognose abalad\u00e4
+function.setaltitudetolerance=H\u00f6chitoleranz iistell\u00e4
+function.selecttimezone=Ziitzone bstimm\u00e4
# Dialogs
dialog.exit.confirm.title=GpsPrune be\u00e4nde
@@ -237,7 +239,7 @@ dialog.exportgpx.desc=Beschriibig
dialog.exportgpx.includetimestamps=Au Ziitst\u00e4mpel
dialog.exportgpx.copysource=Xml-Qu\u00e4lle kopier\u00e4
dialog.exportgpx.encoding=Enkodierig
-dialog.exportgpx.encoding.system=System
+dialog.exportgpx.encoding.system=Syschtem
dialog.exportgpx.encoding.utf8=UTF-8
dialog.exportpov.text=G\u00e4bet Sie die Parameter ii f\u00fcrs POV Export
dialog.exportpov.font=Font
@@ -259,10 +261,6 @@ dialog.baseimage.zoom=Zoomstufe
dialog.baseimage.incomplete=Bild unvollst\u00e4ndig
dialog.baseimage.tiles=Kachle
dialog.baseimage.size=Bildgr\u00f6ssi
-dialog.exportsvg.text=W\u00e4hlet Sie die Parameter f\u00fcrs SVG Export uus
-dialog.exportsvg.phi=Richtigswinkel \u03D5
-dialog.exportsvg.theta=Neigigswinkel \u03B8
-dialog.exportsvg.gradients=Farbeverl\u00e4ufe verw\u00e4nde
dialog.exportimage.noimagepossible=Kartebilder m\u00fcsset scho gspeicheret werde, bevor sie bim Export verwendet werde k\u00f6nne
dialog.exportimage.drawtrack=Track uf d Karte zeichne
dialog.exportimage.drawtrackpoints=Trackp\u00fcnkte au zeichne
@@ -382,6 +380,9 @@ dialog.wikipedia.column.name=Artikelname
dialog.wikipedia.column.distance=Entf\u00e4rnig
dialog.wikipedia.nonefound=Kei Wiki-Iitr\u00e4ge gfunde
dialog.wikipedia.gallery=Fotis
+dialog.osmpois.column.name=Name
+dialog.osmpois.column.type=Punkttyp
+dialog.osmpois.nonefound=Kei P\u00fcnkt gfunde
dialog.geocaching.nonefound=Kei C\u00e4ches gfunde
dialog.correlate.notimestamps=Es h\u00e4t kei Ziitst\u00e4mpel inem Track inn\u00e4, so s'isch n\u00f6d m\u00f6glech die F\u00f6telis zu korrelier\u00e4.
dialog.correlate.nouncorrelatedphotos=Alle F\u00f6telis sin scho korreliert.\nWend Sie trotzdem fortsetz\u00e4?
@@ -441,27 +442,22 @@ dialog.deletemarked.nonefound=Kei P\u00fcnkte h\u00e4tte gel\u00f6scht werde k\u
dialog.pastecoordinates.desc=G\u00e4bet Sie hier die Koordinaten inn\u00e4
dialog.pastecoordinates.coords=Koordinate
dialog.pastecoordinates.nothingfound=Pr\u00fcefet Sie die Koordinate und versuechet nomal
-dialog.help.help=Lueget Sie na\n http://gpsprune.activityworkshop.net/\nf\u00fcr wiitere Information und Benutzeraaleitige.
+dialog.help.help=Lueget Sie na\n https://gpsprune.activityworkshop.net/\nf\u00fcr wiitere Information und Benutzeraaleitige.
dialog.about.version=Version
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune isch s Programm f\u00fcrs Lade, Darstelle und Editiere vo Date von GPS Ger\u00e4te.
dialog.about.summarytext2=Es isch unter den Gnu GPL zur Verf\u00fcegig gstellt,f\u00fcr frei, gratis und offen Gebruuch und Wiiterentwicklig.
Kopiere, Wiiterverbreitig und Ver\u00e4nderige sin erlaubt und willkomme
unter die Bedingige im enthaltene license.txt
File.
-dialog.about.summarytext3=Bitte lueget Sie na http://activityworkshop.net/
f\u00fcr wiitere Informatione und Benutzeraaleitige.
+dialog.about.summarytext3=Bitte lueget Sie na https://activityworkshop.net/
f\u00fcr wiitere Informatione und Benutzeraaleitige.
dialog.about.languages=Verf\u00fcegbare Sproche
dialog.about.translatedby=Schwiizerd\u00fc\u00fctschi \u00dcbersetzig vo activityworkshop.
dialog.about.systeminfo=Syschtem Info
dialog.about.systeminfo.os=Betriebsyschtem
dialog.about.systeminfo.java=Version vonem Java
-dialog.about.systeminfo.java3d=Java3d inschtalliert
-dialog.about.systeminfo.povray=Povray inschtalliert
-dialog.about.systeminfo.exiftool=Exiftool inschtalliert
-dialog.about.systeminfo.gpsbabel=Gpsbabel inschtalliert
-dialog.about.systeminfo.gnuplot=Gnuplot inschtalliert
-dialog.about.systeminfo.exiflib=Exif Bibliothek
-dialog.about.systeminfo.exiflib.internal=Intern
-dialog.about.systeminfo.exiflib.internal.failed=Intern (n\u00f6d gfunde)
-dialog.about.systeminfo.exiflib.external=Ext\u00e4rn
-dialog.about.systeminfo.exiflib.external.failed=Ext\u00e4rn (n\u00f6d gfunde)
+dialog.about.systeminfo.java3d=Java3d installiert
+dialog.about.systeminfo.povray=Povray installiert
+dialog.about.systeminfo.exiftool=Exiftool installiert
+dialog.about.systeminfo.gpsbabel=Gpsbabel installiert
+dialog.about.systeminfo.gnuplot=Gnuplot installiert
dialog.about.yes=Ja
dialog.about.no=Nei
dialog.about.credits=Credits
@@ -480,7 +476,7 @@ dialog.checkversion.newversion1=Ne noii Version vonem GpsPrune isch jetzt usse!
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Die noii Version isch am
dialog.checkversion.releasedate2=ussecho.
-dialog.checkversion.download=Um die noii Version runterzlade, schauet Sie na http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Um die noii Version runterzlade, schauet Sie na https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Aastatt d'Muus k\u00f6nnet Sie diese Tastekombinationen nutze
dialog.keys.keylist=Pfiil Taste | Karte verschiebe |
Strg + links, r\u00e4chts Pfiil | Vorherigi oder n\u00f6chsti Punkt markiere |
Strg + uuf, aba Pfiil | Ii- oder Uusezoome |
Strg + Bild uuf, ab | Vorherigi oder n\u00f6chsti Segm\u00e4nt markiere |
Strg + Pos1, \u00c4nde | Erschti oder letschti Punkt markiere |
Entf | Aktuelli Punkt l\u00f6sche |
dialog.keys.normalmodifier=Strg
@@ -559,7 +555,16 @@ dialog.diskcache.deleteall=Alli Kachle l\u00f6sche
dialog.diskcache.deleted=Es sin %d Files uusem Ordner gl\u00f6scht worde
dialog.deletefieldvalues.intro=W\u00e4hlet Sie s F\u00e4ld uus zum l\u00f6sche
dialog.deletefieldvalues.nofields=Es sin kei F\u00e4lder z'l\u00f6sche f\u00fcr dere Beriich
-dialog.setlinewidth.text=G\u00e4bet Sie die Dicke vonen Linien ii (1-4)
+dialog.displaysettings.linewidth=Dicke vonen Linien in Pixeln (1-4)
+dialog.displaysettings.waypointicons=Waypoint Ikons
+dialog.displaysettings.wpicon.default=P\u00fcnktli
+dialog.displaysettings.wpicon.ringpt=Rundes Schild
+dialog.displaysettings.wpicon.plectrum=Plektrum
+dialog.displaysettings.wpicon.ring=Chreis
+dialog.displaysettings.wpicon.pin=Sto\u00dfnadel
+dialog.displaysettings.size.small=Chli
+dialog.displaysettings.size.medium=Mittel
+dialog.displaysettings.size.large=Gross
dialog.downloadosm.desc=Best\u00e4tige um rohi OSM Date f\u00fcrn Gebiet aba zlade:
dialog.searchwikipedianames.search=Sueche na:
dialog.weather.location=Ort
@@ -591,6 +596,12 @@ dialog.deletebydate.column.keep=Behalte
dialog.deletebydate.column.delete=L\u00f6sche
dialog.setaltitudetolerance.text.metres=Mindeschtabweichig (Meter) f\u00fcr H\u00f6chiunterschied
dialog.setaltitudetolerance.text.feet=Mindeschtabweichig (Feet) f\u00fcr H\u00f6chiunterschied
+dialog.settimezone.intro=Do k\u00f6nnet Sie d Ziitzone uusw\u00e4hle, f\u00fcr d'aazeig vo P\u00fcnkt Ziitst\u00e4mple
+dialog.settimezone.system=Ziitzone vonem Syschtem
+dialog.settimezone.custom=Folgendi Ziitzone:
+dialog.settimezone.list.toomany=Viu z'viu
+dialog.settimezone.selectedzone=Uusgw\u00e4hlti Ziitzone
+dialog.settimezone.offsetfromutc=Unterschied vo UTC
dialog.autoplay.duration=Abspieldauer (Sek)
dialog.autoplay.usetimestamps=Ziitst\u00e4mple verw\u00e4nde
dialog.autoplay.rewind=Zum Aafang
@@ -801,7 +812,6 @@ wikipedia.lang=als
openweathermap.lang=de
webservice.peakfinder=Peakfinder.org \u00f6ffne
webservice.geohack=Geohack-Siite \u00f6ffne
-webservice.panoramio=Panoramio Karte \u00f6ffne
# Cardinals for 3d plots
cardinal.n=N
@@ -859,7 +869,6 @@ error.jpegload.dialogtitle=F\u00e4hle bim Lade von F\u00f6telis
error.jpegload.nofilesfound=Kei Files gfunde
error.jpegload.nojpegsfound=Kei Jpegs gfunde
error.jpegload.nogpsfound=Kei GPS Information gfunde
-error.jpegload.exifreadfailed=Exif Uufruef isch fehlgschlage. Kei Exif Infos k\u00f6nnet gl\u00e4se werde\nohni nen interni oder ext\u00e4rni Bibliothek.
error.audioload.nofilesfound=Kei Audiofiles gfunde
error.gpsload.unknown=Unbekannts F\u00e4hler
error.undofailed.title=Undo isch fehlgschlage worde
diff --git a/tim/prune/lang/prune-texts_en.properties b/tim/prune/lang/prune-texts_en.properties
index 489b5c6..9e3b7cd 100644
--- a/tim/prune/lang/prune-texts_en.properties
+++ b/tim/prune/lang/prune-texts_en.properties
@@ -12,7 +12,6 @@ menu.track=Track
menu.track.undo=Undo
menu.track.clearundo=Clear undo list
menu.track.markrectangle=Mark points in rectangle
-function.deletemarked=Delete marked points
menu.range=Range
menu.range.all=Select all
menu.range.none=Select none
@@ -38,7 +37,6 @@ menu.view.browser.yahoo=Yahoo maps
menu.view.browser.bing=Bing maps
menu.settings=Settings
menu.settings.onlinemode=Load maps from internet
-menu.settings.antialias=Use antialiasing
menu.settings.autosave=Autosave settings on exit
menu.help=Help
# Popup menu for map
@@ -82,12 +80,12 @@ function.sendtogps=Send data to GPS
function.exportkml=Export KML
function.exportgpx=Export GPX
function.exportpov=Export POV
-function.exportsvg=Export SVG
function.exportimage=Export image
function.editwaypointname=Edit waypoint name
function.compress=Compress track
function.marklifts=Mark uphill lifts
function.deleterange=Delete range
+function.deletemarked=Delete marked points
function.croptrack=Crop track
function.interpolate=Interpolate points
function.deletebydate=Delete points by date
@@ -108,12 +106,14 @@ function.autoplay=Autoplay track
function.selectsegment=Select current segment
function.splitsegments=Split track into segments
function.sewsegments=Sew track segments together
+function.createmarkerwaypoints=Create marker waypoints
function.getgpsies=Get Gpsies tracks
function.uploadgpsies=Upload track to Gpsies
function.lookupsrtm=Get altitudes from SRTM
function.downloadsrtm=Download SRTM tiles
function.getwikipedia=Get nearby Wikipedia articles
function.searchwikipedianames=Search Wikipedia by name
+function.searchosmpois=Get nearby OSM points
function.searchopencachingde=Search OpenCaching.de
function.mapillary=Search for photos in Mapillary
function.downloadosm=Download OSM data for area
@@ -135,7 +135,7 @@ function.stopaudio=Stop audio clip
function.setmapbg=Set map background
function.setpaths=Set program paths
function.setcolours=Set colours
-function.setlinewidth=Set line width
+function.setdisplaysettings=Set display options
function.setlanguage=Set language
function.help=Help
function.showkeys=Show shortcut keys
@@ -146,6 +146,7 @@ function.diskcache=Save maps to disk
function.managetilecache=Manage tile cache
function.getweatherforecast=Get weather forecast
function.setaltitudetolerance=Set altitude tolerance
+function.selecttimezone=Set timezone
# Dialogs
dialog.exit.confirm.title=Exit GpsPrune
@@ -174,6 +175,7 @@ dialog.openoptions.deliminfo.norecords=No records
dialog.openoptions.altitudeunits=Altitude units
dialog.openoptions.speedunits=Speed units
dialog.openoptions.vertspeedunits=Vertical speed units
+dialog.openoptions.vspeed.intro=
dialog.openoptions.vspeed.positiveup=Positive speeds upwards
dialog.openoptions.vspeed.positivedown=Positive speeds downwards
dialog.open.contentsdoubled=This file contains two copies of each point,\nonce as waypoints and once as track points.
@@ -264,10 +266,6 @@ dialog.baseimage.zoom=Zoom level
dialog.baseimage.incomplete=Image incomplete
dialog.baseimage.tiles=Tiles
dialog.baseimage.size=Image size
-dialog.exportsvg.text=Select the parameters for the SVG export
-dialog.exportsvg.phi=Azimuth angle \u03D5
-dialog.exportsvg.theta=Elevation angle \u03B8
-dialog.exportsvg.gradients=Use gradients for shading
dialog.exportimage.noimagepossible=Map images need to be cached to disk in order to use them for an export.
dialog.exportimage.drawtrack=Draw track on map
dialog.exportimage.drawtrackpoints=Draw track points
@@ -387,6 +385,9 @@ dialog.wikipedia.column.name=Article name
dialog.wikipedia.column.distance=Distance
dialog.wikipedia.nonefound=No wikipedia entries found
dialog.wikipedia.gallery=Gallery
+dialog.osmpois.column.name=Name
+dialog.osmpois.column.type=Type
+dialog.osmpois.nonefound=No points found
dialog.geocaching.nonefound=No geocaches found
dialog.correlate.notimestamps=There are no timestamps in the data points, so there is nothing to correlate with the photos.
dialog.correlate.nouncorrelatedphotos=There are no uncorrelated photos.\nAre you sure you want to continue?
@@ -446,12 +447,12 @@ dialog.deletemarked.nonefound=No data points could be removed
dialog.pastecoordinates.desc=Enter or paste the coordinates here
dialog.pastecoordinates.coords=Coordinates
dialog.pastecoordinates.nothingfound=Please check the coordinates and try again
-dialog.help.help=Please see\n http://gpsprune.activityworkshop.net/\nfor more information and tips,\nincluding a PDF user guide you can buy.
+dialog.help.help=Please see\n https://gpsprune.activityworkshop.net/\nfor more information and tips,\nincluding a PDF user guide you can buy.
dialog.about.version=Version
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune is a program for loading, displaying and editing data from GPS receivers.
dialog.about.summarytext2=It is released under the Gnu GPL for free, open, worldwide use and enhancement.
Copying, redistribution and modification are permitted and encouraged
according to the conditions in the included license.txt
file.
-dialog.about.summarytext3=Please see http://activityworkshop.net/
for more information and tips, including
a PDF user guide you can buy.
+dialog.about.summarytext3=Please see https://activityworkshop.net/
for more information and tips, including
a PDF user guide you can buy.
dialog.about.languages=Available languages
dialog.about.translatedby=English text by activityworkshop.
dialog.about.systeminfo=System info
@@ -462,11 +463,6 @@ dialog.about.systeminfo.povray=Povray installed
dialog.about.systeminfo.exiftool=Exiftool installed
dialog.about.systeminfo.gpsbabel=Gpsbabel installed
dialog.about.systeminfo.gnuplot=Gnuplot installed
-dialog.about.systeminfo.exiflib=Exif library
-dialog.about.systeminfo.exiflib.internal=Internal
-dialog.about.systeminfo.exiflib.internal.failed=Internal (not found)
-dialog.about.systeminfo.exiflib.external=External
-dialog.about.systeminfo.exiflib.external.failed=External (not found)
dialog.about.yes=Yes
dialog.about.no=No
dialog.about.credits=Credits
@@ -485,7 +481,7 @@ dialog.checkversion.newversion1=A new version of GpsPrune is now available! The
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=This new version was released on
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=To download the new version, go to http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=To download the new version, go to https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=You can use the following shortcut keys instead of using the mouse
dialog.keys.keylist=Arrow keys | Pan map left right, up, down |
Ctrl + left, right arrow | Select previous or next point |
Ctrl + up, down arrow | Zoom in or out |
Ctrl + PgUp, PgDown | Select previous, next segment |
Ctrl + Home, End | Select first, last point |
Del | Delete current point |
dialog.keys.normalmodifier=Ctrl
@@ -564,7 +560,17 @@ dialog.diskcache.deleteall=Delete all tiles
dialog.diskcache.deleted=Deleted %d files from the cache
dialog.deletefieldvalues.intro=Select the field to delete for the current range
dialog.deletefieldvalues.nofields=There are no fields to delete for this range
-dialog.setlinewidth.text=Enter the thickness of lines to draw for the tracks (1-4)
+dialog.displaysettings.linewidth=Thickness of lines for the tracks (1-4)
+dialog.displaysettings.antialias=Use antialiasing
+dialog.displaysettings.waypointicons=Waypoint icons
+dialog.displaysettings.wpicon.default=Default
+dialog.displaysettings.wpicon.ringpt=Round marker
+dialog.displaysettings.wpicon.plectrum=Plectrum
+dialog.displaysettings.wpicon.ring=Ring
+dialog.displaysettings.wpicon.pin=Board pin
+dialog.displaysettings.size.small=Small
+dialog.displaysettings.size.medium=Medium
+dialog.displaysettings.size.large=Large
dialog.downloadosm.desc=Confirm to download the raw OSM data for the specified area:
dialog.searchwikipedianames.search=Search for:
dialog.weather.location=Location
@@ -596,6 +602,12 @@ dialog.deletebydate.column.keep=Keep
dialog.deletebydate.column.delete=Delete
dialog.setaltitudetolerance.text.metres=Limit (in metres) below which small climbs and descents will be ignored
dialog.setaltitudetolerance.text.feet=Limit (in feet) below which small climbs and descents will be ignored
+dialog.settimezone.intro=Here you can select the timezone in which to display point timestamps
+dialog.settimezone.system=Use system timezone
+dialog.settimezone.custom=Use the following timezone:
+dialog.settimezone.list.toomany=Too many to choose
+dialog.settimezone.selectedzone=Selected timezone
+dialog.settimezone.offsetfromutc=Offset from UTC
dialog.autoplay.duration=Duration (secs)
dialog.autoplay.usetimestamps=Use point timestamps
dialog.autoplay.rewind=Back to beginning
@@ -812,7 +824,6 @@ wikipedia.lang=en
openweathermap.lang=en
webservice.peakfinder=Open Peakfinder.org
webservice.geohack=Open Geohack page
-webservice.panoramio=Open Panoramio map
# Cardinals for 3d plots
cardinal.n=N
@@ -870,7 +881,6 @@ error.jpegload.dialogtitle=Error loading photos
error.jpegload.nofilesfound=No files found
error.jpegload.nojpegsfound=No jpeg files found
error.jpegload.nogpsfound=No GPS information found
-error.jpegload.exifreadfailed=Failed to read Exif information. No Exif information can be read\nwithout either an internal or external library.
error.audioload.nofilesfound=No audio clips found
error.gpsload.unknown=Unknown error
error.undofailed.title=Undo failed
diff --git a/tim/prune/lang/prune-texts_es.properties b/tim/prune/lang/prune-texts_es.properties
index 53554dd..df1bc28 100644
--- a/tim/prune/lang/prune-texts_es.properties
+++ b/tim/prune/lang/prune-texts_es.properties
@@ -38,7 +38,7 @@ menu.view.browser.yahoo=Mapas Yahoo
menu.view.browser.bing=Mapas Bing
menu.settings=Preferencias
menu.settings.onlinemode=Cargar mapas de Internet
-menu.settings.antialias=Usar antialiasing
+dialog.displaysettings.antialias=Usar antialiasing
menu.settings.autosave=Auto Guardar
menu.help=Ayuda
@@ -83,7 +83,6 @@ function.sendtogps=Enviar datos al GPS
function.exportkml=Exportar KML
function.exportgpx=Exportar GPX
function.exportpov=Exportar POV
-function.exportsvg=Exportar SVG
function.exportimage=Exportar imagen
function.editwaypointname=Editar nombre de waypoint
function.compress=Comprimir track
@@ -122,7 +121,6 @@ function.mapillary=Buscar en Mapillary
function.downloadosm=Descargar datos OSM del \u00e1rea
function.duplicatepoint=Duplicar punto
function.setcolours=Establecer color
-function.setlinewidth=Establecer ancho de l\u00ednea
function.setlanguage=Establecer lenguaje
function.connecttopoint=Conectar con punto
function.disconnectfrompoint=Desconectar de punto
@@ -175,8 +173,9 @@ dialog.openoptions.deliminfo.norecords=Ningun dato
dialog.openoptions.altitudeunits=Unidades altitud
dialog.openoptions.speedunits=Unidades velocidad
dialog.openoptions.vertspeedunits=Unidades velocidad vertical
-dialog.openoptions.vspeed.positiveup=Velocidades positivos significan hacia arriba
-dialog.openoptions.vspeed.positivedown=Velocidades positivos significan hacia abajo
+dialog.openoptions.vspeed.intro=Velocidades positivos significan:
+dialog.openoptions.vspeed.positiveup=hacia arriba
+dialog.openoptions.vspeed.positivedown=hacia abajo
dialog.open.contentsdoubled=Este archivo contiene dos copias de cada punto,\nuna como "waypoints" y otra como puntos de recorrido.
dialog.selecttracks.intro=Seleccionar recorrido/s a cargar
dialog.selecttracks.noname=Innominados
@@ -269,10 +268,6 @@ dialog.baseimage.zoom=Zoom
dialog.baseimage.incomplete=Imagen incompleta
dialog.baseimage.tiles=Recuadros
dialog.baseimage.size=Tama\u00f1o de la imagen
-dialog.exportsvg.text=Seleccione los par\u00e1metros para exportar a SVG
-dialog.exportsvg.phi=\u00c1ngulo de azimuth \u03d5
-dialog.exportsvg.theta=\u00c1ngulo de elevaci\u00f3n
-dialog.exportsvg.gradients=Usar degradado para sombras
dialog.exportimage.drawtrack=Dibujar track
dialog.exportimage.drawtrackpoints=Dibujar puntos del track
dialog.exportimage.textscalepercent=Agrandamiento del texto (%)
@@ -388,6 +383,9 @@ dialog.wikipedia.column.name=Nombre del art\u00edculo
dialog.wikipedia.column.distance=Distancia
dialog.wikipedia.nonefound=No se encontraron puntos
dialog.wikipedia.gallery=Galeria
+dialog.osmpois.column.name=Nombre
+dialog.osmpois.column.type=Tipo
+dialog.osmpois.nonefound=No se encontraron puntos
dialog.geocaching.nonefound=No se encontraron tesoros
dialog.correlate.notimestamps=No hay informaci\u00f3n de tiempo para los puntos, as\u00ed que no hay nada que correlacionar con las fotos.
dialog.correlate.nouncorrelatedphotos=No hay fotos no correlacionadas.\n\u00bfEst\u00e1 seguro de que desea continuar?
@@ -447,12 +445,12 @@ dialog.deletemarked.nonefound=Ning\u00fan punto eliminado
dialog.pastecoordinates.desc=Ingresar o pegar las coordenadas aqu\u00ed
dialog.pastecoordinates.coords=Coordenadas
dialog.pastecoordinates.nothingfound=Por favor verificar las coordenadas e intentar nuevamente
-dialog.help.help=Por favor, ver\n http://gpsprune.activityworkshop.net/\npara m\u00e1s informaci\u00f3n y gu\u00edas del usuario.
+dialog.help.help=Por favor, ver\n https://gpsprune.activityworkshop.net/\npara m\u00e1s informaci\u00f3n y gu\u00edas del usuario.
dialog.about.version=Versi\u00f3n
dialog.about.build=Construcci\u00f3n
dialog.about.summarytext1=GpsPrune es un programa para cargar, mostrar y editar datos de receptores GPS.
dialog.about.summarytext2=Distribuido bajo el GNU GPL para uso libre y gratuito.
Se permite (y se anima) la copia, redistribuci\u00f3n y modificaci\u00f3n de acuerdo
a las condiciones incluidas en el archivo licence.txt
.
-dialog.about.summarytext3=Por favor, ver http://activityworkshop.net/
para m\u00e1s informaci\u00f3n y gu\u00edas del usuario.
+dialog.about.summarytext3=Por favor, ver https://activityworkshop.net/
para m\u00e1s informaci\u00f3n y gu\u00edas del usuario.
dialog.about.languages=Idiomas disponibles
dialog.about.translatedby=Traducci\u00f3n al espa\u00f1ol realizada por Miguel, In\u00e9s, josatoc y Javier
dialog.about.systeminfo=Informacion del sistema
@@ -463,11 +461,6 @@ dialog.about.systeminfo.povray=Povray instalado
dialog.about.systeminfo.exiftool=Exiftool instalado
dialog.about.systeminfo.gpsbabel=Gpsbabel instalado
dialog.about.systeminfo.gnuplot=Gnuplot instalado
-dialog.about.systeminfo.exiflib=Biblioteca exif
-dialog.about.systeminfo.exiflib.internal=Interna
-dialog.about.systeminfo.exiflib.internal.failed=Interna (no encontrada)
-dialog.about.systeminfo.exiflib.external=Externa
-dialog.about.systeminfo.exiflib.external.failed=Externa (no encontrada)
dialog.about.yes=Si
dialog.about.no=No
dialog.about.credits=Cr\u00e9ditos
@@ -486,7 +479,7 @@ dialog.checkversion.newversion1=\u00a1Una nueva versi\u00f3n de GpsPrune est\u00
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=La nueva versi\u00f3n fue lanzada en
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Para descargar la nueva versi\u00f3n visite http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Para descargar la nueva versi\u00f3n visite https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Usted puede usar el siguiente atajo en lugar de usar el rat\u00f3n
dialog.keys.keylist=Teclas de cursor | Desplazar a la izquierde, derecha, arriba, abajo |
Ctrl + cursor izquierda, derecha | Seleccionar punto siguiente o anterior |
Ctrl + cursor arriba, abajo | Ampliar o reducir zoom |
Ctrl + Av Pag, Re Pag | Seleccionar segmento siguiente, anterior |
Ctrl + Inicio, Fin | Seleccionar primer, \u00faltimo punto |
Supr | Eliminar punto actual |
dialog.keys.normalmodifier=Ctrl
@@ -565,7 +558,13 @@ dialog.diskcache.deleteall=Borrar todos los recuadros
dialog.diskcache.deleted=Borrado %d archivos del cache
dialog.deletefieldvalues.intro=Seleccionar el campo a eliminar para el rango actual
dialog.deletefieldvalues.nofields=No hay campos a eliminar para el rango actual
-dialog.setlinewidth.text=Introduzca la anchura de las l\u00edneas a dibujar para los recorridos (1-4)
+dialog.displaysettings.linewidth=Anchura de las l\u00edneas para los recorridos (1-4)
+dialog.displaysettings.waypointicons=Iconos de los waypoints
+dialog.displaysettings.wpicon.plectrum=Plectro
+dialog.displaysettings.wpicon.ring=Anillo
+dialog.displaysettings.size.small=Peque\u00f1o
+dialog.displaysettings.size.medium=Mediano
+dialog.displaysettings.size.large=Grande
dialog.downloadosm.desc=Confirmar la descarga de datos en bruto de OSM para el \u00e1rea especificada.
dialog.searchwikipedianames.search=Buscar:
dialog.weather.location=Localidad
@@ -594,6 +593,7 @@ dialog.deletebydate.column.keep=Mantener
dialog.deletebydate.column.delete=Eliminar
dialog.setaltitudetolerance.text.metres=Limite (en metros) por debajo de cual peque\u00f1as subidas o bajadas ser\u00e1n ignoradas
dialog.setaltitudetolerance.text.feet=Limite (en pies) por debajo de cual peque\u00f1as subidas o bajadas ser\u00e1n ignoradas
+dialog.settimezone.system=Zona horaria del sistema
dialog.autoplay.duration=Duraci\u00f3n (seg)
dialog.autoplay.usetimestamps=Usar informaci\u00f3n de tiempo
dialog.autoplay.rewind=Rebobinar
@@ -808,7 +808,6 @@ wikipedia.lang=es
openweathermap.lang=sp
webservice.peakfinder=Abrir Peakfinder.org
webservice.geohack=Abrir Geohack
-webservice.panoramio=Abrir mapa Panoramio
## Cardinals for 3d plots
cardinal.n=N
@@ -866,7 +865,6 @@ error.jpegload.dialogtitle=Error cargando fotos
error.jpegload.nofilesfound=No se encuentra ning\u00fan archivo
error.jpegload.nojpegsfound=No se encuentra ning\u00fan archivo jpeg
error.jpegload.nogpsfound=No se encuentra informaci\u00f3n GPS
-error.jpegload.exifreadfailed=Fallo al leer la informaci\u00f3n Exif. No se puede leer ninguna informaci\u00f3n Exif\ncon las librer\u00edas internas ni externas.
error.audioload.nofilesfound=No se encontraron archivos de audio
error.gpsload.unknown=Error desconocido
error.undofailed.title=Fallo al deshacer
diff --git a/tim/prune/lang/prune-texts_fi.properties b/tim/prune/lang/prune-texts_fi.properties
new file mode 100644
index 0000000..76cdcde
--- /dev/null
+++ b/tim/prune/lang/prune-texts_fi.properties
@@ -0,0 +1,909 @@
+# Text entries for the GpsPrune application
+# Finnish entries thanks to Erkki Argillander
+
+# Menu entries
+menu.file=Tiedosto
+menu.file.addphotos=Lis\u00e4\u00e4 kuvat...
+menu.file.recentfiles=Avaa viimeaikainen
+menu.file.save=Tallenna tekstin\u00e4...
+menu.file.exit=Lopeta
+menu.online=Online
+menu.track=Reitti
+menu.track.undo=Peru
+menu.track.clearundo=Tyhjenn\u00e4 perumislista
+menu.track.markrectangle=Merkkaa pisteet suunnikkaasta...
+menu.range=Pistealue
+menu.range.all=Valitse kaikki
+menu.range.none=Valitse 'ei mit\u00e4\u00e4n'
+menu.range.start=Aseta alkupiste
+menu.range.end=Aseta loppupiste
+menu.range.average=Keskiarvovalinta
+menu.range.reverse=K\u00e4\u00e4nteinen pistealue
+menu.range.mergetracksegments=Yhdist\u00e4 reittilohkot
+menu.range.cutandmove=Leikkaa ja siirr\u00e4 valitut
+menu.point=Piste
+menu.point.editpoint=Muokkaa pistett\u00e4
+menu.point.deletepoint=Poista piste
+menu.photo=Kuva
+menu.photo.saveexif=Talleta Exif-tietoihin
+menu.audio=\u00c4\u00e4net
+menu.view=N\u00e4kym\u00e4
+menu.view.showsidebars=N\u00e4yt\u00e4 sivupalkit
+menu.view.browser=Selainikkunan karttal\u00e4hde
+menu.view.browser.google=Google
+menu.view.browser.openstreetmap=Openstreetmap
+menu.view.browser.mapquest=Mapquest
+menu.view.browser.yahoo=Yahoo
+menu.view.browser.bing=Bing
+menu.settings=Asetukset
+menu.settings.onlinemode=Lataa kartat Internetist\u00e4
+menu.settings.autosave=Tallenna asetukset automaattisesti lopetettaessa
+menu.help=Ohje
+# Popup menu for map
+menu.map.zoomin=L\u00e4henn\u00e4
+menu.map.zoomout=Loitonna
+menu.map.zoomfull=Sovita selainikkunaan
+menu.map.newpoint=Luo uusi reittipiste
+menu.map.drawpoints=Luo reittipisteiden sarja
+menu.map.connect=Yhdist\u00e4 reittipisteet
+menu.map.autopan=Autopan
+menu.map.showmap=N\u00e4yt\u00e4 kartta
+menu.map.showscalebar=N\u00e4yt\u00e4 mittakaava-asteikko
+menu.map.editmode=Muokkaustila
+
+# Alt keys for menus
+altkey.menu.file=T
+altkey.menu.online=O
+altkey.menu.range=A
+altkey.menu.track=R
+altkey.menu.point=P
+altkey.menu.view=N
+altkey.menu.photo=K
+altkey.menu.audio=E
+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=Avaa...
+function.importwithgpsbabel=Tuo tiedosto GPSBabel'lla...
+function.loadfromgps=Lataa data GPS:st\u00e4...
+function.sendtogps=L\u00e4het\u00e4 data GPS:\u00e4\u00e4n...
+function.exportkml=Vie KML
+function.exportgpx=Vie GPX
+function.exportpov=Vie POV
+function.exportimage=Vie kuva
+function.editwaypointname=Muokkaa kohdepisteen nime\u00e4
+function.compress=Tiivist\u00e4 reitti...
+function.marklifts=Merkkaa yl\u00e4m\u00e4kinousut
+function.deleterange=Poista pistealue
+function.deletemarked=Poista merkityt pisteet
+function.croptrack=Typist\u00e4 reitti alueseen
+function.interpolate=Interpoloi pisteet
+function.deletebydate=Poista pisteet p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n mukaan
+function.addtimeoffset=Lis\u00e4\u00e4 aikapoikkeama
+function.addaltitudeoffset=Lis\u00e4\u00e4 korkeuspoikkeama
+function.findwaypoint=Etsi kohdepiste
+function.rearrangewaypoints=J\u00e4rjest\u00e4 kohdepisteet
+function.convertnamestotimes=Muunna kohdepisteiden nimet ajoiksi
+function.deletefieldvalues=Poista kenttien arvoja...
+function.pastecoordinates=Anna uudet koordinaatit...
+function.charts=Kaaviot
+function.show3d=3D-n\u00e4kym\u00e4
+function.distances=V\u00e4limatkat
+function.fullrangedetails=Koko pistealueen tiedot
+function.estimatetime=Arvioi aika
+function.learnestimationparams=Opi aika-arvion parametrit
+function.autoplay=Animoi reitti
+function.selectsegment=Valitse nykyinen lohko
+function.splitsegments=Pilko reitti lohkoihin
+function.sewsegments=Yhdist\u00e4 reittilohkot
+function.createmarkerwaypoints=Luo merkityt kohdepisteet
+function.getgpsies=Lataa reitit Gpsies.com:sta
+function.uploadgpsies=Vie reitti Gpsies.com:iin...
+function.lookupsrtm=Lue korkeysk\u00e4yr\u00e4t SRTM:st\u00e4
+function.downloadsrtm=Lataa SRTM-palat
+function.getwikipedia=Hae likeiset Wikipedia-artikkelit
+function.searchwikipedianames=Etsi nimell\u00e4 Wikipedia:sta...
+function.searchosmpois=Etsi l\u00e4heiset OSM-pisteet
+function.searchopencachingde=Etsi OpenCaching.de:sta...
+function.mapillary=Etsi kuvia Mapillary:sta...
+function.downloadosm=Lataa alueen OSM-data...
+function.duplicatepoint=Kahdenna piste
+function.connecttopoint=Liit\u00e4 pisteeseen
+function.disconnectfrompoint=Irroita pisteest\u00e4
+function.removephoto=Poista kuva
+function.correlatephotos=Korreloi kuvat
+function.rearrangephotos=J\u00e4rjest\u00e4 kuvat...
+function.rotatephotoleft=Kierr\u00e4 kuvaa vasemmalle
+function.rotatephotoright=Kierr\u00e4 kuvaa oikealle
+function.photopopup=N\u00e4yt\u00e4 kuvaikkunassa
+function.ignoreexifthumb=Ignore exif thumbnail
+function.loadaudio=Lis\u00e4\u00e4 \u00e4\u00e4nileikkeet...
+function.removeaudio=Poista \u00e4\u00e4nileike
+function.correlateaudios=Korreloi \u00e4\u00e4net
+function.playaudio=Toista \u00e4\u00e4nileike
+function.stopaudio=Pys\u00e4yt\u00e4 \u00e4\u00e4nileike
+function.setmapbg=Aseta taustakartan l\u00e4hde...
+function.setpaths=Aseta ohjelmien polut...
+function.setcolours=Aseta v\u00e4rit...
+function.setdisplaysettings=Aseta n\u00e4kym\u00e4n asetukset
+function.setlanguage=Aseta kieli...
+function.help=Ohje
+function.showkeys=N\u00e4yt\u00e4 n\u00e4pp\u00e4inkomennot
+function.about=Tietoja GpsPrune:sta
+function.checkversion=Tarkista uusi versio
+function.saveconfig=Talleta asetukset
+function.diskcache=Talleta kartat hakemistoon...
+function.managetilecache=Hallitse karttapalojen v\u00e4limuistia
+function.getweatherforecast=Hae s\u00e4\u00e4ennuste..
+function.setaltitudetolerance=Aseta korkeuden herkkyys...
+function.selecttimezone=Aseta aikavy\u00f6hyke
+
+# Dialogs
+dialog.exit.confirm.title=Lopeta GpsPrune
+dialog.exit.confirm.text=Muokkaamasi data ei ole tallennettu.\nHaluatko varmasti lopettaa?
+dialog.openappend.title=Lis\u00e4\u00e4 nykyiseen dataan
+dialog.openappend.text=Lis\u00e4t\u00e4\u00e4nk\u00f6 t\u00e4m\u00e4 data jo ladattuun dataan?
+dialog.deletepoint.title=Poista reittipiste
+dialog.deletepoint.deletephoto=Poistetaanko yhteys pisteeseen liitettyyn kuvaan?
+dialog.deletephoto.title=Poista kuva
+dialog.deletephoto.deletepoint=Poistetaanko t\u00e4h\u00e4n kuvaan liitetty piste?
+dialog.deleteaudio.deletepoint=Poistetaanko t\u00e4h\u00e4n \u00e4\u00e4nileikkeeseen liitetty piste?
+dialog.openoptions.title=Avauksen valinnat
+dialog.openoptions.filesnippet=Purettava tiedosto
+dialog.load.table.field=Kentt\u00e4
+dialog.load.table.datatype=Datan tyyppi
+dialog.load.table.description=Kuvaus
+dialog.delimiter.label=Kenttien erotin
+dialog.delimiter.comma=Pilkku ,
+dialog.delimiter.tab=Tabulaattori
+dialog.delimiter.space=V\u00e4lily\u00f6nti
+dialog.delimiter.semicolon=Puolipiste ;
+dialog.delimiter.other=Muu
+dialog.openoptions.deliminfo.records=tietueet, joissa
+dialog.openoptions.deliminfo.fields=kent\u00e4t
+dialog.openoptions.deliminfo.norecords=Ei tietueita
+dialog.openoptions.altitudeunits=Korkeuden yksik\u00f6t
+dialog.openoptions.speedunits=Nopeuden yksik\u00f6t
+dialog.openoptions.vertspeedunits=Pystysuuntaisen nopeuden yksik\u00f6t
+dialog.openoptions.vspeed.positiveup=Positiiviset nopeudet yl\u00f6sp\u00e4in
+dialog.openoptions.vspeed.positivedown=Positiiviset nopeudet alap\u00e4in
+dialog.open.contentsdoubled=T\u00e4ss\u00e4 tiedostossa on kaksi kopioita kustakin pisteest\u00e4,\ntoinen kohde- ja toinen reittipisteen\u00e4.
+dialog.selecttracks.intro=Valitse ladattava reitti tai reitit
+dialog.selecttracks.noname=Nimet\u00f6n
+dialog.jpegload.subdirectories=Sis\u00e4llyt\u00e4 alihakemistot
+dialog.jpegload.loadjpegswithoutcoords=Sis\u00e4llyt\u00e4 koordinaatittomat kuvat
+dialog.jpegload.loadjpegsoutsidearea=Sis\u00e4llyt\u00e4 kuvat nykyisen kartta-alueen ulkopuolelta
+dialog.jpegload.progress.title=Ladataan kuvia
+dialog.jpegload.progress=Odota, kun kuvia etsit\u00e4\u00e4n
+dialog.gpsload.nogpsbabel=gpsbabel-ohjelmaa ei l\u00f6ytynyt. Jatketaanko?
+dialog.gpsload.device=Laittee nimi (esim. usb:)
+dialog.gpsload.format=Muoto
+dialog.gpsload.getwaypoints=Lataa kohdepisteet
+dialog.gpsload.gettracks=Lataa reitit
+dialog.gpsload.save=Tallenna tiedostoon
+dialog.gpssend.sendwaypoints=L\u00e4het\u00e4 kohdepisteet
+dialog.gpssend.sendtracks=L\u00e4het\u00e4 reitit
+dialog.gpssend.trackname=Reitin nimi
+dialog.gpsbabel.filters=Suodattimet
+dialog.addfilter.title=Lis\u00e4\u00e4 suodatin
+dialog.gpsbabel.filter.discard=Hylk\u00e4\u00e4
+dialog.gpsbabel.filter.simplify=Yksinkertaista
+dialog.gpsbabel.filter.distance=V\u00e4limatka
+dialog.gpsbabel.filter.interpolate=Interpoloi
+dialog.gpsbabel.filter.discard.intro=Hylk\u00e4\u00e4 pisteet, jos
+dialog.gpsbabel.filter.discard.hdop=Hdop >
+dialog.gpsbabel.filter.discard.vdop=Vdop >
+dialog.gpsbabel.filter.discard.numsats=Sateliittien lukum\u00e4\u00e4r\u00e4 <
+dialog.gpsbabel.filter.discard.nofix=Point has no fix
+dialog.gpsbabel.filter.discard.unknownfix=Point has unknown fix
+dialog.gpsbabel.filter.simplify.intro=Poista pisteit\u00e4, kunnes
+dialog.gpsbabel.filter.simplify.maxpoints=Pisteiden m\u00e4\u00e4r\u00e4 <
+dialog.gpsbabel.filter.simplify.maxerror=tai virhev\u00e4limatka <
+dialog.gpsbabel.filter.simplify.crosstrack=cross-track
+dialog.gpsbabel.filter.simplify.length=pituusero
+dialog.gpsbabel.filter.simplify.relative=suhteessa hdop:iin
+dialog.gpsbabel.filter.distance.intro=Poista sellaiset pisteet, jotka l\u00e4hell\u00e4 jotain edellist\u00e4 pistett\u00e4
+dialog.gpsbabel.filter.distance.distance=Jos v\u00e4limatka <
+dialog.gpsbabel.filter.distance.time=ja aikaero <
+dialog.gpsbabel.filter.interpolate.intro=Lis\u00e4\u00e4 lis\u00e4pisteit\u00e4 reittipisteiden v\u00e4liin
+dialog.gpsbabel.filter.interpolate.distance=Jos v\u00e4limatka >
+dialog.gpsbabel.filter.interpolate.time=tai aikaero >
+dialog.saveoptions.title=Tallenna tiedosto
+dialog.save.fieldstosave=Tallennettavat kent\u00e4t
+dialog.save.table.field=Kent\u00e4
+dialog.save.table.hasdata=On dataa
+dialog.save.table.save=Tallenna
+dialog.save.headerrow=Tulosta otsikkorivi
+dialog.save.coordinateunits=Koordinaattimuoto
+dialog.save.altitudeunits=Korkeuden yksikk\u00f6
+dialog.save.timestampformat=Aikaleiman muoto
+dialog.save.overwrite.title=Tiedosto jo olemassa
+dialog.save.overwrite.text=T\u00e4m\u00e4 tiedosto on jo olemassa. Haluatko varmasti tallentaa sen p\u00e4\u00e4lle?
+dialog.save.notypesselected=Pistetyyppej\u00e4 ei valittuna
+dialog.exportkml.text=Otsikko datalle
+dialog.exportkml.altitude=Absoluuttiset korkeudet (ilmailulle)
+dialog.exportkml.kmz=Tiivist\u00e4 tehd\u00e4ksesi 'kmz'-tiedosto
+dialog.exportkml.exportimages=Vie esikatselukuvat 'kmz'-tiedostoon
+dialog.exportkml.imagesize=Kuvakoko
+dialog.exportkml.trackcolour=Reitin v\u00e4ri
+dialog.exportkml.standardkml=Vakio KML
+dialog.exportkml.extendedkml=Laajennettu KML aikaleimoin
+dialog.exportgpx.name=Nimi
+dialog.exportgpx.desc=Kuvaus
+dialog.exportgpx.includetimestamps=Sis\u00e4llyt\u00e4 aikaleimat
+dialog.exportgpx.copysource=Kopioi l\u00e4hde-XML
+dialog.exportgpx.encoding=Koodaus
+dialog.exportgpx.encoding.system=J\u00e4rjestelm\u00e4
+dialog.exportgpx.encoding.utf8=UTF-8
+dialog.exportpov.text=Anna parametrit POV-vientiin
+dialog.exportpov.font=Kirjasintyyppi
+dialog.exportpov.camerax=Kamera X
+dialog.exportpov.cameray=Kamera Y
+dialog.exportpov.cameraz=Kamera Z
+dialog.exportpov.modelstyle=Mallin tyyli
+dialog.exportpov.ballsandsticks=Pallot ja kepit
+dialog.exportpov.tubesandwalls=Putket ja sein\u00e4t
+dialog.3d.warningtracksize=T\u00e4ss\u00e4 reitiss\u00e4 on paljon sellaisia reittipisteit\u00e4, joita Java3D ei mahdollisesti kykene n\u00e4ytt\u00e4m\u00e4\u00e4n.\nHaluatko varmasti jatkaa?
+dialog.3d.useterrain=N\u00e4yt\u00e4 maasto
+dialog.3d.terraingridsize=Ruudukon koko
+dialog.exportpov.baseimage=Peruskuva
+dialog.exportpov.cannotmakebaseimage=Peruskuvaa ei voi kirjoittaa
+dialog.baseimage.title=Karttakuva
+dialog.baseimage.useimage=K\u00e4yt\u00e4 karttakuvaa
+dialog.baseimage.mapsource=Karttal\u00e4hde
+dialog.baseimage.zoom=Suurennostaso
+dialog.baseimage.incomplete=Karttakuva ep\u00e4t\u00e4ydellinen
+dialog.baseimage.tiles=Karttapalat
+dialog.baseimage.size=Kuvan koko
+dialog.exportimage.noimagepossible=Karttakuvat pit\u00e4\u00e4 tallentaa levylle v\u00e4limuistiin, jotta niit\u00e4 voi k\u00e4ytt\u00e4\u00e4 vientiin.
+dialog.exportimage.drawtrack=Piirr\u00e4 reitti kartalle
+dialog.exportimage.drawtrackpoints=Piirr\u00e4 reittipisteit\u00e4
+dialog.exportimage.textscalepercent=Tekstin skaalauskerroin (%)
+dialog.pointtype.desc=Tallenna seuraavan tyyppiset pisteet:
+dialog.pointtype.track=Reittipisteet
+dialog.pointtype.waypoint=Kohdepisteet
+dialog.pointtype.photo=Kuvien pisteet
+dialog.pointtype.audio=\u00c4\u00e4nien pisteet
+dialog.pointtype.selection=Just selection
+dialog.confirmreversetrack.title=Vahvista k\u00e4\u00e4nteisj\u00e4rjest\u00e4minen
+dialog.confirmreversetrack.text=T\u00e4m\u00e4 reitti sis\u00e4lt\u00e4\u00e4 aikaleimoja, joiden aikaj\u00e4rjestys ei ole oikea pisteiden k\u00e4\u00e4teisj\u00e4rjestelyn j\u00e4lkeen.\nHaluatko varmasti k\u00e4\u00e4nteisj\u00e4rjest\u00e4\u00e4 t\u00e4m\u00e4n alueen?
+dialog.confirmcutandmove.title=Vahvista leikkaa ja siirr\u00e4
+dialog.confirmcutandmove.text=T\u00e4ss\u00e4 reitti sis\u00e4lt\u00e4\u00e4 aikaleimoja, jotka eiv\u00e4t ole j\u00e4rjestyksee\u00e4 siirron j\u00e4lkeen.\nHaluatko varmasti siirt\u00e4\u00e4 t\u00e4m\u00e4n pistelohkon?
+dialog.interpolate.parameter.text=Kunkin pisteparin v\u00e4liin luotavien pisteiden m\u00e4\u00e4r\u00e4
+dialog.interpolate.betweenwaypoints=Interpoloi kohdepisteiden v\u00e4linen reitti
+dialog.undo.title=Peruttavat toiminnot
+dialog.undo.pretext=Valitse yksi tai useampi peruttava toiminto
+dialog.undo.none.title=Ei voi perua
+dialog.undo.none.text=Ei peruttavia toimintoja!
+dialog.clearundo.title=Tyhjenn\u00e4 perumislista
+dialog.clearundo.text=Haluatko varmasti tyhjenttiedostottiedostot perumislistan?\nKaikki perumistiedot menetet\u00e4\u00e4n lopullisesti!
+dialog.pointedit.title=Muokkaa pistett\u00e4
+dialog.pointedit.intro=Valitse kukin kentt\u00e4 vuorollaan\nn\u00e4hd\u00e4ksesi ja muuttaaksesi sen arvoa
+dialog.pointedit.table.field=Kentt\u00e4
+dialog.pointedit.nofield=Kentt\u00e4\u00e4 ei valittuna
+dialog.pointedit.table.value=Arvo
+dialog.pointnameedit.name=Kohdepisteen nimi
+dialog.pointnameedit.uppercase=Suuraakkoset
+dialog.pointnameedit.lowercase=Pienaakkoset
+dialog.pointnameedit.titlecase=Iso alkukirjain
+dialog.addtimeoffset.add=Lis\u00e4tt\u00e4v\u00e4 aika
+dialog.addtimeoffset.subtract=V\u00e4hennett\u00e4v\u00e4 aika
+dialog.addtimeoffset.days=P\u00e4iv\u00e4t
+dialog.addtimeoffset.hours=Tunnit
+dialog.addtimeoffset.minutes=Minuutit
+dialog.addtimeoffset.notimestamps=Aikapoikkeamaa ei voi lis\u00e4t\u00e4 t\u00e4st\u00e4 valinnasta puuttuvan aikaleiman vuoksi
+dialog.findwaypoint.intro=Anna kohdepisteen nimen osa
+dialog.findwaypoint.search=Etsi
+dialog.saveexif.title=Tallenna Exif
+dialog.saveexif.intro=Valitse tallennettavat kuvat ruksaamalla valintaruutuihin
+dialog.saveexif.nothingtosave=Koordinaattitieto muuttumaton - ei uutta tallennettavaa
+dialog.saveexif.noexiftool='exiftool'-ohjelmaa ei l\u00f6ytynyt. Jatketaanko?
+dialog.saveexif.table.photoname=Kuvan nimi
+dialog.saveexif.table.status=Tila
+dialog.saveexif.table.save=Tallenna
+dialog.saveexif.photostatus.connected=Liitetty
+dialog.saveexif.photostatus.disconnected=Liitt\u00e4m\u00e4t\u00f6n
+dialog.saveexif.photostatus.modified=Muutettu
+dialog.saveexif.overwrite=Korvaa tiedostot
+dialog.saveexif.force=Pakota huomioimatta pikkuvirheit\u00e4
+dialog.charts.xaxis=X-akseli
+dialog.charts.yaxis=Y-akseli
+dialog.charts.output=Tulostus
+dialog.charts.screen=N\u00e4yt\u00f6lle
+dialog.charts.svg=SVG-tiedostoon
+dialog.charts.svgwidth=SVG:n leveys kuvapistein\u00e4
+dialog.charts.svgheight=SVG:n korkeus kuvapistein\u00e4
+dialog.charts.needaltitudeortimes=Reitiss\u00e4 pit\u00e4\u00e4 olla joko korkeustiedot tai aikaleimat kaaviokuvien luomiseksi
+dialog.charts.gnuplotnotfound='gnuplot'-ohjelmaa ei l\u00f6ytynyt annetusta hakemistopolusta
+dialog.distances.intro=Pisteiden v\u00e4limatkat linnuntiet\u00e4
+dialog.distances.column.from=Pisteest\u00e4
+dialog.distances.column.to=Pisteeseen
+dialog.distances.currentpoint=Nykypiste
+dialog.distances.toofewpoints=T\u00e4m\u00e4 toiminto edellytt\u00e4\u00e4 kohdepisteit\u00e4 niiden v\u00e4limatkojen laskemiseksi
+dialog.fullrangedetails.intro=T\u00e4ss\u00e4 tiedot valitulle alueelle
+dialog.fullrangedetails.coltotal=Reitti aukkoineen
+dialog.fullrangedetails.colsegments=Reitti aukoitta
+dialog.estimatetime.details=Tiedot
+dialog.estimatetime.gentle=Loiva
+dialog.estimatetime.steep=Jyrkk\u00e4
+dialog.estimatetime.climb=Nousu
+dialog.estimatetime.descent=Lasku
+dialog.estimatetime.parameters=Parametrit
+dialog.estimatetime.parameters.timefor=Aika matkalle
+dialog.estimatetime.results=Tulokset
+dialog.estimatetime.results.estimatedtime=Arvioitu aika
+dialog.estimatetime.results.actualtime=Todellinen aika
+dialog.estimatetime.error.nodistance=Aika-arviointi tarvitsee yhdistettyj\u00e4 reittipisteit\u00e4 v\u00e4limatkan laskemiseksi.
+dialog.estimatetime.error.noaltitudes=Valinta ei sis\u00e4ll\u00e4 yht\u00e4\u00e4n korkeustietoa
+dialog.learnestimationparams.intro=N\u00e4m\u00e4 ovat t\u00e4lle reitille lasketut parametrit
+dialog.learnestimationparams.averageerror=Keskim\u00e4\u00e4r\u00e4inen virhe
+dialog.learnestimationparams.combine=N\u00e4m\u00e4 parametrit voidaan yhdist\u00e4\u00e4 nykyisiin arvoihin
+dialog.learnestimationparams.combinedresults=Yhdistetyt tulokset
+dialog.learnestimationparams.weight.100pccurrent=Pid\u00e4 nykyiset arvot
+dialog.learnestimationparams.weight.current=nykyinen
+dialog.learnestimationparams.weight.calculated=laskettu
+dialog.learnestimationparams.weight.50pc=Nykyisten ja lasketttujen arvojen keskiarvo
+dialog.learnestimationparams.weight.100pccalculated=K\u00e4yt\u00e4 laskettuja arvoja
+dialog.setmapbg.intro=Valitse jokin annetuista karttal\u00e4hteist\u00e4\ntai lis\u00e4\u00e4 uusi
+dialog.addmapsource.title=Lis\u00e4\u00e4 uusi karttal\u00e4hde
+dialog.addmapsource.sourcename=L\u00e4hteen nimi
+dialog.addmapsource.layer1url=Ensim\u00e4isen tason URL
+dialog.addmapsource.layer2url=Toisen tason valinnainen URL
+dialog.addmapsource.maxzoom=Maksimisuurennus
+dialog.addmapsource.noname=Nimet\u00f6n
+dialog.gpsies.column.name=Reitin nimi
+dialog.gpsies.column.length=Pituus
+dialog.gpsies.description=Kuvaus
+dialog.gpsies.nodescription=Ei kuvausta
+dialog.gpsies.nonefound=Reittej\u00e4 ei l\u00f6ytynyt
+dialog.gpsies.username=Gpsies.com:n k\u00e4ytt\u00e4j\u00e4nimi
+dialog.gpsies.password=Gpsies.com:n salasana
+dialog.gpsies.keepprivate=Pid\u00e4 reitti yksityisen\u00e4
+dialog.gpsies.confirmopenpage=Open the web page for the uploaded track?
+dialog.gpsies.activities=Aktiviteettityypit
+dialog.gpsies.activity.trekking=Patikointi
+dialog.gpsies.activity.walking=K\u00e4vely
+dialog.gpsies.activity.jogging=Juoksu
+dialog.gpsies.activity.biking=Polkupy\u00f6r\u00e4ily
+dialog.gpsies.activity.motorbiking=Moottoripy\u00f6r\u00e4ily
+dialog.gpsies.activity.snowshoe=Lumikenk\u00e4ily
+dialog.gpsies.activity.sailing=Purjehdus
+dialog.gpsies.activity.skating=Luistelu
+dialog.mapillary.nonefound=Kuvia ei l\u00f6ytynyt
+dialog.wikipedia.column.name=Artikkelin nimi
+dialog.wikipedia.column.distance=V\u00e4limatka
+dialog.wikipedia.nonefound=Wikipedia-artikkeleita ei l\u00f6ytynyt
+dialog.wikipedia.gallery=Gallery
+dialog.osmpois.column.name=Nimi
+dialog.osmpois.column.type=Tyyppi
+dialog.osmpois.nonefound=Pisteit\u00e4 ei l\u00f6ytynyt
+dialog.geocaching.nonefound=Geok\u00e4tk\u00f6j\u00e4 ei l\u00f6ytynyt
+dialog.correlate.notimestamps=Reittipisteiss\u00e4 ei ole aikaleimoja, joten yht\u00e4\u00e4n pistett\u00e4 ei voi aikakorreloida kuvien kanssa.
+dialog.correlate.nouncorrelatedphotos=Ei korreloimattomia kuvia.\nHaluatko varmasti jatkaa?
+dialog.correlate.nouncorrelatedaudios=Ei korreloimattomia \u00e4\u00e4hileikkeit\u00e4.\nHaluatko varmasti jatkaa?
+dialog.correlate.photoselect.intro=Valitse yksi n\u00e4ist\u00e4 korreloiduista kuvista aikapoikkeaman m\u00e4\u00e4ritt\u00e4miseksi
+dialog.correlate.select.photoname=Kuvan nimi
+dialog.correlate.select.timediff=Aikaero
+dialog.correlate.select.photolater=Kuva my\u00f6hemmin
+dialog.correlate.options.intro=Valitse vaihtoehtoiset arvot automaattiseen korrelointiin
+dialog.correlate.options.offsetpanel=Aikapoikkeama
+dialog.correlate.options.offset=Poikkeama
+dialog.correlate.options.offset.hours=tunnit,
+dialog.correlate.options.offset.minutes=minuutit ja
+dialog.correlate.options.offset.seconds=sekunnit
+dialog.correlate.options.photolater=Kuva pistett\u00e4 my\u00f6hemmin
+dialog.correlate.options.pointlaterphoto=Piste kuvaa my\u00f6hemmin
+dialog.correlate.options.audiolater=\u00c4\u00e4nileike pistett\u00e4 my\u00f6hemmin
+dialog.correlate.options.pointlateraudio=Piste \u00e4\u00e4nileikett\u00e4 my\u00f6hemmin
+dialog.correlate.options.limitspanel=Korreloinnin raja-arvot
+dialog.correlate.options.notimelimit=Ei aikarajoja
+dialog.correlate.options.timelimit=Aikarajat
+dialog.correlate.options.nodistancelimit=Ei et\u00e4isyysrajoja
+dialog.correlate.options.distancelimit=Eta\u00e4isyysrajat
+dialog.correlate.options.correlate=Korreloi
+dialog.correlate.alloutsiderange=Kaikki kohteet reitin aikarajojen ulkopuolella, joten mit\u00e4\u00e4n ei voi korreloida.\nKoita muuttaa poikkeamaa tai korreloida manuaalisesti ainakin yksi kohde.
+dialog.correlate.filetimes=Tiedoston aikaleimat osoittavat:
+dialog.correlate.filetimes2=\u00e4\u00e4nileikeen (?)
+dialog.correlate.correltimes=Korrelointiin k\u00e4yt\u00e4:
+dialog.correlate.timestamp.beginning=Aloitusaika
+dialog.correlate.timestamp.middle=Keskiaika
+dialog.correlate.timestamp.end=Lopetusaika
+dialog.correlate.audioselect.intro=Valitse yksi n\u00e4ist\u00e4 korreloiduista \u00e4\u00e4nileikkeist\u00e4 aikapoikkeaman m\u00e4\u00e4ritt\u00e4miseksi
+dialog.correlate.select.audioname=\u00c4\u00e4nileikkeen nimi
+dialog.correlate.select.audiolater=\u00c4\u00e4nileikke my\u00f6hemmin
+dialog.rearrangewaypoints.desc=Valitse kohde ja kohdepisteiden lajittelus\u00e4\u00e4nt\u00f6
+dialog.rearrangephotos.desc=Valitse kohde ja kuvapisteiden lajittelus\u00e4\u00e4nt\u00f6
+dialog.rearrange.tostart=Siirry alkuun
+dialog.rearrange.toend=Siirry loppuun
+dialog.rearrange.tonearest=Kukin l\u00e4heisimp\u00e4\u00e4n reittipisteeseen
+dialog.rearrange.nosort=\u00c4l\u00e4 lajittele
+dialog.rearrange.sortbyfilename=Lajittele tiedostonimen suhteen
+dialog.rearrange.sortbyname=Lajittele nimen suhteen
+dialog.rearrange.sortbytime=Lajittele ajan suhteen
+dialog.compress.duplicates.title=Kahdennosten poisto
+dialog.compress.closepoints.title=Likipisteen poisto
+dialog.compress.closepoints.paramdesc=Aikaj\u00e4nten kerroin
+dialog.compress.wackypoints.title=Omituisten pisteiden poisto
+dialog.compress.wackypoints.paramdesc=V\u00e4limatkakerroin
+dialog.compress.singletons.title=Irtopisteiden poisto
+dialog.compress.singletons.paramdesc=V\u00e4limatkakerroin
+dialog.compress.douglaspeucker.title=Douglas-Peucker-tiivistys
+dialog.compress.douglaspeucker.paramdesc=Aikaj\u00e4nnekerroin
+dialog.compress.summarylabel=Poistettavat pisteet
+dialog.compress.confirm=%d pistett\u00e4 on merkitty.\nPoista merkityt pisteet nyt?
+dialog.compress.confirmnone=yht\u00e4\u00e4n pistett\u00e4 ei ole merkitty
+dialog.deletemarked.nonefound=Yht\u00e4\u00e4n datapistett\u00e4 ei voitu poistaa
+dialog.pastecoordinates.desc=Kirjoita tai liit\u00e4 koordinaatit t\u00e4h\u00e4n
+dialog.pastecoordinates.coords=Koordinaatit
+dialog.pastecoordinates.nothingfound=Tarkista koordinaatit ja yrit\u00e4 uudestaan
+dialog.help.help=Lis\u00e4tietoja ja vihjeit\u00e4 webbisivulta:\nhttps://gpsprune.activityworkshop.net/\n\nMyyt\u00e4v\u00e4n\u00e4 PDF:n\u00e4 k\u00e4ytt\u00f6ohjekirja.
+dialog.about.version=Versio
+dialog.about.build=Build
+dialog.about.summarytext1=GpsPrune on ohjelma, jolla ladataan, tarkastellaan ja muokataan GPS-tallentimista
luettua paikkatietoa.
+dialog.about.summarytext2=Ohjelma on julkaistu GNU GPL-lisenssill\u00e4 vapaana ja avoimena l\u00e4hdekoodina
maailmanlaajuiseen k\u00e4ytt\u00f6\u00f6n ja edelleen kehitt\u00e4miseen.
Kopiointi, jakelu ja muuttelu on sallittua ja kannustettavaa jakelun mukana
tulleen license.txt
-tiedoston ehtojen mukaisesti.
+dialog.about.summarytext3=Webbisivulta https://activityworkshop.net/
saat lis\u00e4\u00e4 tietoja ja vinkkej\u00e4 sek\u00e4
voit ostaa k\u00e4ytt\u00f6oppaan PDF-julkaisuna.
+dialog.about.languages=Kielivaihtoehdot
+dialog.about.translatedby=Suomenkielelle k\u00e4\u00e4nt\u00e4nyt Erkki.
+dialog.about.systeminfo=J\u00e4rjestelm\u00e4tiedot
+dialog.about.systeminfo.os=K\u00e4ytt\u00f6j\u00e4rjestelm\u00e4
+dialog.about.systeminfo.java=Java versio
+dialog.about.systeminfo.java3d=Java3d asennettu
+dialog.about.systeminfo.povray=Povray asennettu
+dialog.about.systeminfo.exiftool=Exiftool asennettu
+dialog.about.systeminfo.gpsbabel=Gpsbabel asennettu
+dialog.about.systeminfo.gnuplot=Gnuplot asennettu
+dialog.about.yes=Kyll\u00e4
+dialog.about.no=Ei
+dialog.about.credits=Tekij\u00e4t
+dialog.about.credits.code=GpsPrune:n ohjelmoinut
+dialog.about.credits.exifcode=Exif:in koodannut
+dialog.about.credits.icons=Jotkut kuvakkeet t\u00e4\u00e4lt\u00e4
+dialog.about.credits.translators=K\u00e4\u00e4nt\u00e4j\u00e4t
+dialog.about.credits.translations=K\u00e4\u00e4nt\u00e4misess\u00e4 avustaneet
+dialog.about.credits.devtools=Kehitysty\u00f6kalut
+dialog.about.credits.othertools=Muut ty\u00f6kalut
+dialog.about.credits.thanks=Kiitokset
+dialog.about.readme=Lueminut
+dialog.checkversion.error=Versionumeroa ei voitu tarkistaa.\nTarkista verkkoyhteys.
+dialog.checkversion.uptodate=K\u00e4yt\u00f6ss\u00e4si on uusin GpsPrune:n versio.
+dialog.checkversion.newversion1=GpsPrune:sta on saatavissa uudempi versio! Uusin versio on nyt
+dialog.checkversion.newversion2=.
+dialog.checkversion.releasedate1=T\u00e4m\u00e4 uusin versio on julkaistu
+dialog.checkversion.releasedate2=.
+dialog.checkversion.download=Uusimman version voit ladata webbisivulta https://gpsprune.activityworkshop.net/download.html.
+dialog.keys.intro=Voit hiiren asemesta k\u00e4ytt\u00e4\u00e4 seuraavia n\u00e4pp\u00e4inkomentoja:
+dialog.keys.keylist=Nuolin\u00e4pp\u00e4imill\u00e4 | voit siirt\u00e4\u00e4 kartaa vasemmalle, oikealle, yl\u00f6s ja alas |
Ctrl + vasen/oikea nuoli\u00e4pp\u00e4in | Valitse edellinen/seuraava reittipiste |
Ctrl + yl\u00f6s/alas nuolin\u00e4pp\u00e4in | L\u00e4henn\u00e4 tai loitonna |
Ctrl + PgUp, PgDown | Valitse edellinen/seuraava pistelohko |
Ctrl + Home, End | Valitse ensimm\u00e4inen/viimeinen reittipiste |
Del | Poista valittu reittipiste |
+dialog.keys.normalmodifier=Ctrl
+dialog.keys.macmodifier=Command
+dialog.saveconfig.desc=Seuraava asetukset voidaan tallentaa asetustiedostoon:
+dialog.saveconfig.prune.trackdirectory=Reittihakemisto
+dialog.saveconfig.prune.photodirectory=Kuvahakemisto
+dialog.saveconfig.prune.languagecode=Kielitunnus (FI)
+dialog.saveconfig.prune.languagefile=Kielitiedosto
+dialog.saveconfig.prune.gpsdevice=GPS-laite
+dialog.saveconfig.prune.gpsformat=GPS-formaatti
+dialog.saveconfig.prune.povrayfont=Povray fontti
+dialog.saveconfig.prune.gnuplotpath=Polku ohjelmaan gnuplot
+dialog.saveconfig.prune.gpsbabelpath=Polku ohjelmaan gpsbabel
+dialog.saveconfig.prune.exiftoolpath=Polku ohjelmaan exiftool
+dialog.saveconfig.prune.mapsource=Valittu karttal\u00e4hde
+dialog.saveconfig.prune.mapsourcelist=Karttal\u00e4hteet
+dialog.saveconfig.prune.diskcache=Karttojen v\u00e4limuisti
+dialog.saveconfig.prune.kmzimagewidth=KMZ:in kuvan leveys
+dialog.saveconfig.prune.colourscheme=V\u00e4rij\u00e4rjestelm\u00e4
+dialog.saveconfig.prune.linewidth=Viivan leveys
+dialog.saveconfig.prune.kmltrackcolour=KML:n reitin v\u00e4ri
+dialog.saveconfig.prune.autosavesettings=Tallenna asetukset automaattisesti
+dialog.setpaths.intro=Halutessasi voit valita hakemistopolut ulkoisiin sovelluksiin:
+dialog.setpaths.found=Polku l\u00f6ydetty?
+dialog.addaltitude.noaltitudes=Valittu alue ei sis\u00e4ll\u00e4 korkeustietoja
+dialog.addaltitude.desc=Lis\u00e4tt\u00e4v\u00e4 korkeuspoikkeama
+dialog.lookupsrtm.overwritezeros=Korvataanko nolla-arvoiset korkeusarvot?
+dialog.setcolours.intro=Klikkaa v\u00e4rilaikua alla vaihtaaksesi kohteen v\u00e4ri\u00e4
+dialog.setcolours.background=Tausta
+dialog.setcolours.borders=Reunat
+dialog.setcolours.lines=Viivat
+dialog.setcolours.primary=Ensisijainen
+dialog.setcolours.secondary=Toissijainen
+dialog.setcolours.point=Reittipisteet
+dialog.setcolours.selection=Valinta
+dialog.setcolours.text=Teksti
+dialog.colourchooser.title=Valitse v\u00e4ri
+dialog.colourchooser.red=Punainen (R)
+dialog.colourchooser.green=Vihre\u00e4 (G)
+dialog.colourchooser.blue=Sininen (B)
+dialog.colourer.intro=Pisteen v\u00e4ritt\u00e4j\u00e4 voi tuottaa reittipisteille eri v\u00e4rej\u00e4
+dialog.colourer.type=V\u00e4ritt\u00e4j\u00e4n tyyppi
+dialog.colourer.type.none=Ei mit\u00e4\u00e4n
+dialog.colourer.type.byfile=Tiedosto
+dialog.colourer.type.bysegment=Lohko
+dialog.colourer.type.byaltitude=Korkeus
+dialog.colourer.type.byspeed=Nopeus
+dialog.colourer.type.byvertspeed=Pystysuuntainen nopeus
+dialog.colourer.type.bygradient=Kaltevuus
+dialog.colourer.type.bydate=P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4
+dialog.colourer.start=Alkuv\u00e4ri
+dialog.colourer.end=P\u00e4\u00e4tev\u00e4ri
+dialog.colourer.maxcolours=V\u00e4rien enimm\u00e4ism\u00e4\u00e4r\u00e4
+dialog.setlanguage.firstintro=Voi valita jonkin julkaisun mukana toimitetuista kieliversioista,tai valita jonkin k\u00e4\u00e4nn\u00f6kset sis\u00e4lt\u00e4v\u00e4n tekstitiedoston.
+dialog.setlanguage.secondintro=
Kielen vaihtaaksesi sinun pit\u00e4\u00e4 ensiksi tallentaa asetukset ja sitten
k\u00e4ynnist\u00e4\u00e4 GpsPrune uudestaan.
+dialog.setlanguage.language=Kieli
+dialog.setlanguage.languagefile=Kielitiedosto
+dialog.setlanguage.endmessage=Tallenna nyt asetukset ja k\u00e4ynnist\u00e4 GpsPrune uudelleen\nsaadaksesi vaihtamasi kielen k\u00e4ytt\u00f6\u00f6n.
+dialog.setlanguage.endmessagewithautosave=K\u00e4ynnist\u00e4 GpsPrune ottaaksesi k\u00e4ytt\u00f6\u00f6n valitsemasi kielen.
+dialog.diskcache.save=Tallenna karttapalat v\u00e4limuistihakemistoon
+dialog.diskcache.dir=V\u00e4limuistin hakemisto
+dialog.diskcache.createdir=Luodaanko hakemisto
+dialog.diskcache.nocreate=V\u00e4limuistin hakemistoa ei luotu
+dialog.diskcache.cannotwrite=Karttapaloja ei voida tallentaa valittuun hakemistoon
+dialog.diskcache.table.path=Hakemistoolku
+dialog.diskcache.table.usedby=Used by
+dialog.diskcache.table.zoom=Zoom
+dialog.diskcache.table.tiles=Tiles
+dialog.diskcache.table.megabytes=Megabytes
+dialog.diskcache.tileset=Tileset
+dialog.diskcache.tileset.multiple=multiple
+dialog.diskcache.deleteold=Poista vanhan karttapalat
+dialog.diskcache.maximumage=Enimm\u00e4isik\u00e4 (p\u00e4ivi\u00e4)
+dialog.diskcache.deleteall=Poista kaikki kartapalat
+dialog.diskcache.deleted=Poistettu %d tiedostoa v\u00e4limuistista
+dialog.deletefieldvalues.intro=Valitse nykyvalinnasta poistettavat kent\u00e4t
+dialog.deletefieldvalues.nofields=Ei kentti\u00e4 poistettavaksi t\u00e4st\u00e4 valinnasta
+dialog.displaysettings.linewidth=Viivanpaksuus reiteille (1-4)
+dialog.displaysettings.antialias=K\u00e4yt\u00e4 antialiasointia
+dialog.displaysettings.waypointicons=Kohdepistekuvakkeet
+dialog.displaysettings.wpicon.default=Oletus
+dialog.displaysettings.wpicon.ringpt=Ympyr\u00e4merkkari
+dialog.displaysettings.wpicon.plectrum=Plektra
+dialog.displaysettings.wpicon.ring=Rengas
+dialog.displaysettings.wpicon.pin=Nuppineula
+dialog.displaysettings.size.small=Pieni
+dialog.displaysettings.size.medium=Keski
+dialog.displaysettings.size.large=Iso
+dialog.downloadosm.desc=Vahvista ladataksesi muokkaamattoman OSM-datan valitsemaltasi alueelta:
+dialog.searchwikipedianames.search=Etsi:
+dialog.weather.location=Sijainti
+dialog.weather.update=Ennuste p\u00e4ivitetty
+dialog.weather.sunrise=Auringonnousu
+dialog.weather.sunset=Auringonlasku
+dialog.weather.temperatureunits=L\u00e4mp\u00f6tilat
+dialog.weather.currentforecast=S\u00e4\u00e4tila nyt
+dialog.weather.dailyforecast=Ennuste p\u00e4iv\u00e4ksi
+dialog.weather.3hourlyforecast=Ennuste kolmeksi tunniksi
+dialog.weather.day.now=S\u00e4\u00e4tila nyt
+dialog.weather.day.today=T\u00e4\u00e4n\u00e4\u00e4n
+dialog.weather.day.tomorrow=Huomenna
+dialog.weather.day.monday=Maanantai
+dialog.weather.day.tuesday=Tiistai
+dialog.weather.day.wednesday=Keskiviikko
+dialog.weather.day.thursday=Torstai
+dialog.weather.day.friday=Perjantai
+dialog.weather.day.saturday=Lauantai
+dialog.weather.day.sunday=Sunnuntai
+dialog.weather.wind=Tuuli
+dialog.weather.temp=L\u00e4mp\u00f6tila
+dialog.weather.humidity=Kosteus
+dialog.weather.creditnotice=T\u00e4m\u00e4 s\u00e4\u00e4tieto on openweathermap.org:n tuottama. Lis\u00e4tietoja heid\u00e4n webbisivuiltaans.
+dialog.deletebydate.onlyonedate=Kaikki pisteet on tallennettu samana p\u00e4iv\u00e4n\u00e4.
+dialog.deletebydate.intro=Reitin kunkin p\u00e4iv\u00e4n osalta voit joko tuhota tai s\u00e4ilytt\u00e4\u00e4 reittipisteet
+dialog.deletebydate.nodate=Ei aikaleimaa
+dialog.deletebydate.column.keep=S\u00e4ilyt\u00e4
+dialog.deletebydate.column.delete=Poista
+dialog.setaltitudetolerance.text.metres=Raja-arvot (metreiss\u00e4), joita pienemm\u00e4t laskeutumisia tai nousuja ei huomioida
+dialog.setaltitudetolerance.text.feet=Raja-arvot (jaloissa), joita pienemm\u00e4t laskeutumisia tai nousuja ei huomioida
+dialog.settimezone.intro=T\u00e4ss\u00e4 voit valita aikavy\u00f6hykeen, jonka mukaan pisteiden aikaleimat n\u00e4ytet\u00e4\u00e4n
+dialog.settimezone.system=K\u00e4yt\u00e4 j\u00e4rjestelm\u00e4n aikavy\u00f6hykett\u00e4
+dialog.settimezone.custom=K\u00e4yt\u00e4 seuraavaa aikavy\u00f6kykett\u00e4:
+dialog.settimezone.list.toomany=Liian monta valittavaksi
+dialog.settimezone.selectedzone=Valittu aikavy\u00f6hyke
+dialog.settimezone.offsetfromutc=Aikaero UTC:n
+dialog.autoplay.duration=Kesto (sekuntia)
+dialog.autoplay.usetimestamps=K\u00e4yt\u00e4 pisteiden aikaleimoja
+dialog.autoplay.rewind=Alkuun
+dialog.autoplay.pause=Pys\u00e4yt\u00e4
+dialog.autoplay.play=Toista
+
+# 3d window
+dialog.3d.title=GpsPrune:n kolmiulotteinen n\u00e4kym\u00e4
+dialog.3d.altitudefactor=Korkeuden liioittelukerroin
+
+# Confirm messages
+confirm.loadfile=Paikkatieto ladattu tiedostosta
+confirm.save.ok1=Successfully saved
+confirm.save.ok2=points to file
+confirm.deletepoint.single=data point was removed
+confirm.deletepoint.multi=data points were removed
+confirm.point.edit=point edited
+confirm.mergetracksegments=Track segments merged
+confirm.reverserange=Range reversed
+confirm.addtimeoffset=Time offset added
+confirm.addaltitudeoffset=Altitude offset added
+confirm.rearrangewaypoints=Kohdepisteet j\u00e4rjestetty uudelleen
+confirm.rearrangephotos=Kuvat j\u00e4rjestetty uudelleen
+confirm.splitsegments=%d segment splits were made
+confirm.sewsegments=%d segment joins were made
+confirm.cutandmove=Selection moved
+confirm.interpolate=Points added
+confirm.convertnamestotimes=V\u00e4lipisteiden nimet muunnettu
+confirm.saveexif.ok=Saved %d photo files
+confirm.undo.single=operation undone
+confirm.undo.multi=operations undone
+confirm.jpegload.single=photo was added
+confirm.jpegload.multi=photos were added
+confirm.media.connect=media liitetty
+confirm.photo.disconnect=kuva liitt\u00e4m\u00e4t\u00e6n
+confirm.audio.disconnect=\u00e4\u00e4ni liitt\u00e4m\u00e4t\u00e6n
+confirm.media.removed=poistettu
+confirm.correlatephotos.single=kuva oli korreloitu
+confirm.correlatephotos.multi=kuvat olivat korreloidut
+confirm.rotatephoto=kuva kierretty
+confirm.createpoint=piste luotu
+confirm.running=Running ...
+confirm.lookupsrtm=L\u00f6ytyi %d korkeusarvoa
+confirm.downloadsrtm=Ladattu %d tiedostoa v\u00e4limuistiin
+confirm.downloadsrtm.1=Ladattu %d tiedosto v\u00e4limuistiin
+confirm.downloadsrtm.none=Tiedostoja ei ladattu, koska ne olivat jo v\u00e4limuistissa
+confirm.deletefieldvalues=Kentt\u00e4arvot poistettu
+confirm.audioload=\u00c4\u00e4nitiedostot lis\u00e4tty
+confirm.correlateaudios.single=\u00e4\u00e4ni oli korreloitu
+confirm.correlateaudios.multi=\u00e4\u00e4net olivat korreloidut
+
+# Tips, shown just once when appropriate
+tip.title=Vihje
+tip.useamapcache=Jos tallennutat karttapalat v\u00e4limuistina toimivaan hakemistoon levylle\n Valikko: Asetukset -> Talleta kartat hakemistoon,\nn\u00e4yt\u00f6n toiminta nopeutuu ja verkkoliikenne v\u00e4hentyy.
+tip.learntimeparams=Tuloset voivat olla tarkempia, jos suoritutat toiminnon\n Valikko: Reitti -> Opi aika-arvion parametrit\ntallentamillesi reiteille.
+tip.downloadsrtm=Voit nopeututtaa t\u00e4t\u00e4 suorituttamalla toiminnon\n Valikko: Online -> Lataa SRTM-palat\nkarttojen v\u00e4limuistihakemistoon.
+tip.usesrtmfor3d=T\u00e4ss\u00e4 reitiss\u00e4 ei ole korkeustietoja.\nVoit k\u00e4ytt\u00e4\u00e4 SRTM-toimintoja saadaksesi likim\u00e4\u00e4r\u00e4iset\nkorkeusarvot 3D-n\u00e4kym\u00e4\u00e4 varten.
+tip.manuallycorrelateone=Jos korjaat v\u00e4hint\u00e4\u00e4n yhden kohteen aikatiedot, ohjelma voi laskea aikapoikkeamat puolestasi.
+
+# Buttons
+button.ok=OK
+button.back=Takaisin
+button.next=Seuraava
+button.finish=Loppuun
+button.cancel=Peru
+button.overwrite=Korvaa
+button.moveup=Siirry yl\u00f6s
+button.movedown=Siirry alas
+button.edit=Muokkaa
+button.exit=Lopeta
+button.close=Sulje
+button.continue=Jatka
+button.yes=Kyll\u00e4
+button.no=Ei
+button.yestoall=Kyll\u00e4 kaikkiin
+button.notoall=Ei kaikkiin
+button.always=Aina
+button.select=Valitse
+button.selectall=Valitse kaikki
+button.selectnone=Valitse 'ei mit\u00e4\u00e4n'
+button.preview=Esikatselu
+button.load=Lataa
+button.upload=Uppaa
+button.guessfields=Arvaa kent\u00e4t
+button.showwebpage=N\u00e4yt\u00e4 webbisivu
+button.check=Tarkista
+button.resettodefaults=Palauta oletusarvot
+button.browse=Selaa...
+button.addnew=Lis\u00e4\u00e4 uusi
+button.delete=Poista
+button.manage=Hallinnoi
+button.combine=Yhdist\u00e4
+
+# File types
+filetype.txt=TXT tiedostot
+filetype.jpeg=JPG tiedostot
+filetype.kmlkmz=KML, KMZ tiedostot
+filetype.kml=KML tiedostot
+filetype.kmz=KMZ tiedostot
+filetype.gpx=GPX tiedostot
+filetype.pov=POV tiedostot
+filetype.svg=SVG tiedostot
+filetype.png=PNG tiedostot
+filetype.audio=MP3, OGG, WAV tiedostot
+
+# Display components
+display.nodata=Reittidataa ei ladattuna
+display.noaltitudes=Reittidata ei sis\u00e4ll\u00e4 korkeustietoja
+display.notimestamps=Reittidata ei sis\u00e4ll\u00e4 aikaleimoja
+display.novalues=Reittidata ei sis\u00e4ll\u00e4 tietoja t\u00e4lle kent\u00e4lle
+details.trackdetails=Reitin tiedot
+details.notrack=Reitti\u00e4 ei ladattuna
+details.track.points=Reittipisteit\u00e4
+details.track.file=Tiedosto
+details.track.numfiles=Tiedostojen m\u00e4\u00e4r\u00e4
+details.pointdetails=Pisteen tiedot
+details.index.selected=Index
+details.index.of=...
+details.nopointselection=Yht\u00e4\u00e4n pistett\u00e4 ei valittuna
+details.photofile=Kuvatiedosto
+details.norangeselection=Pistealuetta ei valittuna
+details.rangedetails=Pistealueen tiedot
+details.range.selected=Valittu
+details.range.to=...
+details.altitude.to=...
+details.range.climb=Nousu
+details.range.descent=Lasku
+details.coordformat=Koordinaatisto
+details.distanceunits=V\u00e4limatkan yksikk\u00f6
+display.range.time.secs=s
+display.range.time.mins=m
+display.range.time.hours=t
+display.range.time.days=pv
+details.range.avespeed=Keskinopeus
+details.range.maxspeed=Enimm\u00e4isnopeus
+details.range.numsegments=Lohkojen m\u00e4\u00e4r\u00e4
+details.range.pace=Vauhti
+details.range.gradient=Kaltevuus
+details.lists.waypoints=Kohdepisteet
+details.lists.photos=Kuvat
+details.lists.audio=\u00d4\u00e4net
+details.photodetails=Kuvan tiedot
+details.nophoto=Kuvaa ei valittuna
+details.photo.loading=Lataan
+details.photo.bearing=Suunta
+details.media.connected=Liitetty
+details.media.fullpath=Tiedostopolku
+details.audiodetails=Audio details
+details.noaudio=\u00c4\u00e4nileikett\u00e4 ei valittuna
+details.audio.file=\u00c4\u00e4nitiedosto
+details.audio.playing=toistetaan...
+map.overzoom=Ei karttoja t\u00e4lle suurennussuhteelle
+
+# Field names
+fieldname.latitude=Leveysaste (Lat.)
+fieldname.longitude=Pituusaste (Long.)
+fieldname.altitude=Korkeus
+fieldname.timestamp=Aikaleima
+fieldname.time=Aika
+fieldname.date=P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4
+fieldname.waypointname=Nimi
+fieldname.waypointtype=Tyyppi
+fieldname.newsegment=Reittilohko
+fieldname.custom=Mukautettu
+fieldname.prefix=Kentt\u00e4
+fieldname.distance=V\u00e4limatka
+fieldname.duration=Kesto
+fieldname.speed=Nopeus
+fieldname.verticalspeed=Pystysuora nopeus
+fieldname.description=Kuvaus
+fieldname.mediafilename=Median tiedostonimi
+
+# Measurement units
+units.original=Alkuper\u00e4inen
+units.default=Oletus
+units.metres=Metrit
+units.metres.short=m
+units.feet=Jalat
+units.feet.short=ft
+units.kilometres=Kilometrit
+units.kilometres.short=km
+units.kilometresperhour=kilometri\u00e4 tunnissa
+units.kilometresperhour.short=km/t
+units.miles=Mailit
+units.miles.short=mi
+units.milesperhour=mailia tunnissa
+units.milesperhour.short=mph
+units.nauticalmiles=Merimailit
+units.nauticalmiles.short=N.m.
+units.nauticalmilesperhour.short=kts
+units.metrespersec=metri\u00e4 sekunnissa
+units.metrespersec.short=m/s
+units.feetpersec=jalkaa sekunnissa
+units.feetpersec.short=ft/s
+units.hours=tunnit
+units.minutes=minuutit
+units.seconds=sekunnit
+units.degminsec=Asteet-minuutit-sekunnit
+units.degmin=Asteet-minuutit
+units.deg=Asteet
+units.iso8601=ISO 8601
+units.degreescelsius=Celsius
+units.degreescelsius.short=\u00b0C
+units.degreesfahrenheit=Fahrenheit
+units.degreesfahrenheit.short=\u00b0F
+
+# How to combine conditions, such as filters
+logic.and=ja
+logic.or=tai
+
+# External urls
+url.googlemaps=maps.google.co.uk
+wikipedia.lang=en
+openweathermap.lang=en
+webservice.peakfinder=Avaa Peakfinder.org
+webservice.geohack=Avaa Geohack-sivu
+
+# Cardinals for 3d plots
+cardinal.n=P
+cardinal.s=E
+cardinal.e=I
+cardinal.w=L
+
+# Undo operations
+undo.load=lataa data
+undo.loadphotos=lataa kuvat
+undo.loadaudios=lataa \u00e4\u00e4nileikkeet
+undo.editpoint=muokkaa reittipistett\u00e4
+undo.deletepoint=tuhoa reittipiste
+undo.removephoto=poista kuva
+undo.removeaudio=poista \u00e4\u00e4nileike
+undo.deleterange=tuhoa pistealue
+undo.croptrack=typist\u00e4 reitti
+undo.deletemarked=tuhoa merkityt reittipisteet
+undo.insert=liit\u00e4 pisteit\u00e4
+undo.reverse=k\u00e4\u00e4nteinen pistealue
+undo.mergetracksegments=yhdist\u00e4 reittilohkot
+undo.splitsegments=pilko reittilohkot
+undo.sewsegments=yhdist\u00e4 reittilohkot
+undo.addtimeoffset=lis\u00e4\u00e4 aikapoikkeama
+undo.addaltitudeoffset=lis\u00e4\u00e4 korkeuspoikkeama
+undo.rearrangewaypoints=j\u00e4rjest\u00e4 kohdepisteet
+undo.cutandmove=siirr\u00e4 section
+undo.connect=yhdist\u00e4
+undo.disconnect=irroita
+undo.correlatephotos=korreloi kuvat
+undo.rearrangephotos=j\u00e4rjest\u00e4 kuvat
+undo.rotatephoto=kierr\u00e4 kuvaa
+undo.createpoint=luo piste
+undo.convertnamestotimes=muunna nimet ajoiksi
+undo.lookupsrtm=lookup altitudes from SRTM
+undo.deletefieldvalues=poista kentt\u00e4arvot
+undo.correlateaudios=korreloi \u00e4\u00e4nileikkeet
+
+# Error messages
+error.save.dialogtitle=Datan tallennuksessa virhe
+error.save.nodata=Ei dataa tallennettavaksi
+error.save.failed=Data tallennus ep\u00e4onnistui tiedostoon
+error.saveexif.filenotfound=Kuvatiedoston etsint\u00e4 ep\u00e4onnistui
+error.saveexif.cannotoverwrite1=Kuvatiedosto
+error.saveexif.cannotoverwrite2=on kirjoitussuojattu ja sit\u00e4 ei voi korvata.\n\nLuodaanko kopio, johon kirjoitetaan EXIF-tiedot?
+error.saveexif.failed=Kuvien %d ei onnistuttu tallentamaan
+error.saveexif.forced=Kuvien %d -tietojen muutos pit\u00e4\u00e4 pakottaa
+error.load.dialogtitle=Virhe ladattaessa dataa
+error.load.noread=En voi lukea tiedostoa
+error.load.nopoints=Koordinaattitietoja ei l\u00f6ytynyt tiedostosta
+error.load.unknownxml=Tunnistamaton xml-muoto:
+error.load.noxmlinzip=ZIP-arkistosta ei l\u00f6ytynyt XML-tiedostoa
+error.load.othererror=Virhe luettaessa tiedostoa:
+error.jpegload.dialogtitle=Virhe ladattaessa kuvia
+error.jpegload.nofilesfound=Tiedostoja ei l\u00f6ytynyt
+error.jpegload.nojpegsfound='jpeg'-tiedostoja ei l\u00f6ytnyt
+error.jpegload.nogpsfound=GPS-tietoja ei l\u00f6ytnyt
+error.audioload.nofilesfound=\u00c4\u00e4nileikkeit\u00e4 ei l\u00f6ytnyt
+error.gpsload.unknown=Tuntematon virhe
+error.undofailed.title=Peruminen ei onnistunut
+error.undofailed.text=Toiminnon peruminen ep\u00e4onnistui
+error.function.noop.title=Toiminnolla ei ole vaikutusta
+error.rearrange.noop=Pisteiden uudelleen j\u00e4rjest\u00e4misell\u00e4 ei ollut vaikutusta
+error.function.notavailable.title=Toiminto ei k\u00e4yt\u00f6ss\u00e4
+error.function.nojava3d=T\u00e4m\u00e4 toiminto vaatii Java3D-kirjaston.\n\nAsenna se tai tarkista Javan hakemistopolkujen m\u00e4\u00e4ritykset.
+error.3d=Virhe 3D-n\u00e4kym\u00e4ss\u00e4
+error.readme.notfound=Lueminut-tiedostoa ei l\u00f6ytynyt
+error.osmimage.dialogtitle=Virhe ladattaessa karttapaloja
+error.osmimage.failed=Karttapalojen lataus ei onnistunut. Tarkista verkkoyhteytesi toimivuus.
+error.language.wrongfile=Valittu tiedosto ei n\u00e4yt\u00e4 olevan GpsPrune:n kielitiedosto tai se sis\u00e4lt\u00e4\u00e4 virheit\u00e4.
+error.convertnamestotimes.nonames=Kohdepisteiden nimi\u00e4 ei voitu muuntaa ajoiksi
+error.lookupsrtm.nonefound=N\u00e4iss\u00e4 pisteiss\u00e4 ei ole korkeustietoja
+error.lookupsrtm.nonerequired=Kaikilla pisteill\u00e4 on jo korkeustieto,\njoten ei ole mit\u00e4\u00e4n haettavaa
+error.gpsies.uploadnotok='gpsies'-palvelin palautti viestin:
+error.gpsies.uploadfailed=Tiedoston uppaus ep\u00e4onnistui virheilmoitukseen:
+error.showphoto.failed=Kuvan lataus ei onnistunut
+error.playaudiofailed=\u00c4\u00e4nileikkeen toisto ei onnistunut
+error.cache.notthere=Karttapalojen v\u00e4limuistihakemistoa ei l\u00f6ytynyt
+error.cache.empty=Karttapalojen v\u00e4limuistihakemisto on tyhj\u00e4
+error.cache.cannotdelete=Yht\u00e4\u00e4n karttapalaa ei voitu poistaa
+error.learnestimationparams.failed=En voi opetella parametrej\u00e4 t\u00e4st\u00e4 reitist\u00e4.\n\nKokeile ladata useampia reittej\u00e4.
+error.tracksplit.nosplit=Reitti\u00e4 ei voitu pilkkoa
+error.downloadsrtm.nocache=SRTP-tiedostoja ei voitu tallentaa.\n\nTarkista karttapalojen v\u00e4limuistihakemisto tai sen asetukset.
+error.sewsegments.nothingdone=Reittilohkoja ei voitu yhdist\u00e4\u00e4.\n\nReitiss\u00e4 on nyt %d lohkoa.
diff --git a/tim/prune/lang/prune-texts_fr.properties b/tim/prune/lang/prune-texts_fr.properties
index 064c6e9..ab79667 100644
--- a/tim/prune/lang/prune-texts_fr.properties
+++ b/tim/prune/lang/prune-texts_fr.properties
@@ -39,7 +39,7 @@ menu.view.browser.yahoo=Cartes Yahoo
menu.view.browser.bing=Cartes Bing
menu.settings=Pr\u00e9f\u00e9rences
menu.settings.onlinemode=Charger cartes depuis internet
-menu.settings.antialias=Anticr\u00e9nelage
+dialog.displaysettings.antialias=Anticr\u00e9nelage
menu.settings.autosave=Sauver automatiquement en quittant
menu.help=Aide
# Popup menu for map
@@ -83,7 +83,6 @@ function.sendtogps=Envoyer donn\u00e9es au GPS
function.exportkml=Exporter en KML
function.exportgpx=Exporter en GPX
function.exportpov=Exporter en POV
-function.exportsvg=Exporter en SVG
function.exportimage=Exporter une image
function.editwaypointname=\u00c9diter le nom du point
function.compress=Compresser la trace
@@ -121,7 +120,6 @@ function.mapillary=Rechercher dans Mapillary
function.downloadosm=T\u00e9l\u00e9charger les donn\u00e9es OSM de la zone
function.duplicatepoint=Dupliquer le point
function.setcolours=Choisir les couleurs
-function.setlinewidth=Choisir la largeur de ligne
function.setlanguage=Choisir la langue
function.connecttopoint=Relier au point
function.disconnectfrompoint=D\u00e9tacher du point
@@ -261,10 +259,6 @@ dialog.baseimage.zoom=Zoom
dialog.baseimage.incomplete=Image incompl\u00e8te
dialog.baseimage.tiles=Dalles
dialog.baseimage.size=Taille de l'image
-dialog.exportsvg.text=S\u00e9lectionner les param\u00e8tres de l'export SVG
-dialog.exportsvg.phi=Angle d'azimuth \u03d5
-dialog.exportsvg.theta=Angle d'\u00e9l\u00e9vation \u03b8
-dialog.exportsvg.gradients=Utiliser des d\u00e9grad\u00e9s pour l'ombrage
dialog.exportimage.drawtrack=Dessiner la trace sur la carte
dialog.exportimage.drawtrackpoints=Dessiner les points de trace
dialog.exportimage.textscalepercent=Facteur d'echelle du texte (%)
@@ -439,12 +433,12 @@ dialog.deletemarked.nonefound=Pas de donn\u00e9es \u00e0 effacer
dialog.pastecoordinates.desc=Entrez ou collez les coordonn\u00e9es ici
dialog.pastecoordinates.coords=Coordonn\u00e9es
dialog.pastecoordinates.nothingfound=V\u00e9rifier les coordonn\u00e9es et essayez \u00e0 nouveau
-dialog.help.help=Consultez la page\n http://gpsprune.activityworkshop.net/\npour plus de d\u00e9tails et des manuels utilisateur.
+dialog.help.help=Consultez la page\n https://gpsprune.activityworkshop.net/\npour plus de d\u00e9tails et des manuels utilisateur.
dialog.about.version=Version
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune est un programme pour charger, afficher et \u00e9diter des donn\u00e9es de r\u00e9cepteurs GPS.
dialog.about.summarytext2=Distribu\u00e9 sous license Gnu GPL pour un usage et une am\u00e9lioration libres, ouverts et mondiaux.
La copie, la redistribution et la modification sont autoris\u00e9es et encourag\u00e9es
selon les conditions d\u00e9taill\u00e9es dans le fichier license.txt
inclus.
-dialog.about.summarytext3=Consultez la page http://activityworkshop.net/
pour plus de d\u00e9tails et des manuels utilisateur.
+dialog.about.summarytext3=Consultez la page https://activityworkshop.net/
pour plus de d\u00e9tails et des manuels utilisateur.
dialog.about.languages=Langues disponibles
dialog.about.translatedby=Texte en fran\u00e7ais par Petrovsk, theYinYeti, R\u00e9mi et jmr.
dialog.about.systeminfo=Info Syst\u00e8me
@@ -455,11 +449,6 @@ dialog.about.systeminfo.povray=Povray install\u00e9
dialog.about.systeminfo.exiftool=Exiftool install\u00e9
dialog.about.systeminfo.gpsbabel=Gpsbabel install\u00e9
dialog.about.systeminfo.gnuplot=Gnuplot install\u00e9
-dialog.about.systeminfo.exiflib=Librairie Exif
-dialog.about.systeminfo.exiflib.internal=Interne
-dialog.about.systeminfo.exiflib.internal.failed=Interne (non-trouv\u00e9)
-dialog.about.systeminfo.exiflib.external=Externe
-dialog.about.systeminfo.exiflib.external.failed=Externe (non-trouv\u00e9)
dialog.about.yes=Oui
dialog.about.no=Non
dialog.about.credits=Cr\u00e9dits
@@ -478,7 +467,7 @@ dialog.checkversion.newversion1=La version actuelle est maintenant la version
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=La nouvelle version est sortie le
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Pour t\u00e9l\u00e9charger la nouvelle version, aller \u00e0 http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Pour t\u00e9l\u00e9charger la nouvelle version, aller \u00e0 https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Vous pouvez utiliser ces raccourcis clavier \u00e0 la place de la souris
dialog.keys.keylist=
Touches-fl\u00e8ches | Faire d\u00e9filer la carte horizontalement et verticalement |
Ctrl + gauche, Ctrl + droite | Choisir le point pr\u00e9c\u00e9dent ou suivant |
Ctrl + haut, Ctrl + bas | Zoomer, s'\u00e9loigner |
Ctrl + PgUp, PgDown | Choisir le segment pr\u00e9c\u00e9dent ou suivant |
Ctrl + Home, End | Choisir le point premier, dernier |
Suppr | Effacer le point courant |
dialog.keys.normalmodifier=Ctrl
@@ -556,7 +545,7 @@ dialog.diskcache.deleteall=Efface toutes les dalles
dialog.diskcache.deleted=Effac\u00e9 %d dalles en cache
dialog.deletefieldvalues.intro=Choisir le champ \u00e0 effacer pour l'\u00e9tendue actuelle
dialog.deletefieldvalues.nofields=L'\u00e9tendue actuelle n'a pas de champs \u00e0 effacer
-dialog.setlinewidth.text=Entrer l'\u00e9paisseur des lignes des traces (1-4)
+dialog.displaysettings.linewidth=L'\u00e9paisseur des lignes des traces (1-4)
dialog.downloadosm.desc=Confirmer le t\u00e9l\u00e9chargement des donn\u00e9es OSM brutes pour la zone indiqu\u00e9e :
dialog.searchwikipedianames.search=Chercher :
dialog.weather.location=Location
@@ -610,8 +599,6 @@ confirm.addtimeoffset=D\u00e9calage ajout\u00e9
confirm.addaltitudeoffset=D\u00e9calage d'altitude ajout\u00e9
confirm.rearrangewaypoints=Waypoints r\u00e9arrang\u00e9s
confirm.rearrangephotos=Photos r\u00e9arrang\u00e9es
-confirm.splitsegments=%d s\u00e9parations ont \u00e9t\u00e9 effectu\u00e9es
-confirm.sewsegments=%d r\u00e9unifications ont \u00e9t\u00e9 effectu\u00e9es
confirm.cutandmove=S\u00e9lection d\u00e9plac\u00e9e
confirm.interpolate=Points ajout\u00e9s
confirm.convertnamestotimes=Noms de waypoints convertis
@@ -802,7 +789,6 @@ wikipedia.lang=fr
openweathermap.lang=fr
webservice.peakfinder=Ouvrir Peakfinder.org
webservice.geohack=Ouvrir la page Geohack
-webservice.panoramio=Ouvrir la carte Panoramio
# Cardinals for 3d plots
cardinal.n=N
@@ -860,7 +846,6 @@ error.jpegload.dialogtitle=Erreur au chargement des photos
error.jpegload.nofilesfound=Aucun fichier trouv\u00e9
error.jpegload.nojpegsfound=Aucun fichier jpeg trouv\u00e9
error.jpegload.nogpsfound=Aucune information GPS trouv\u00e9e
-error.jpegload.exifreadfailed=Information Exif illisible. Aucune information Exif ne peut \u00eatre lue\nsans une librairie interne ou externe.
error.audioload.nofilesfound=Aucun fichier audio trouv\u00e9
error.gpsload.unknown=Erreur inconnue
error.undofailed.title=\u00c9chec de l'annulation
diff --git a/tim/prune/lang/prune-texts_hu.properties b/tim/prune/lang/prune-texts_hu.properties
index b949500..9b61e87 100644
--- a/tim/prune/lang/prune-texts_hu.properties
+++ b/tim/prune/lang/prune-texts_hu.properties
@@ -38,7 +38,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 internetr\u0151l
-menu.settings.antialias=\u00c9lsim\u00edt\u00e1s haszn\u00e1lata
+dialog.displaysettings.antialias=\u00c9lsim\u00edt\u00e1s haszn\u00e1lata
menu.settings.autosave=Be\u00e1ll\u00edt\u00e1sok automatikus ment\u00e9se kil\u00e9p\u00e9skor
menu.help=S\u00fag\u00f3
@@ -83,7 +83,6 @@ function.sendtogps=Adatok felt\u00f6lt\u00e9se GPS-re
function.exportkml=Export\u00e1l\u00e1s KML-be
function.exportgpx=Export\u00e1l\u00e1s GPX-be
function.exportpov=Export\u00e1l\u00e1s POV-ba
-function.exportsvg=Export\u00e1l\u00e1s SVG-be
function.exportimage=Export\u00e1l\u00e1s k\u00e9pbe
function.editwaypointname=\u00datpont nev\u00e9nek szerkeszt\u00e9se
function.compress=Nyomvonal t\u00f6m\u00f6r\u00edt\u00e9se
@@ -122,7 +121,6 @@ function.mapillary=F\u00e9nyk\u00e9pek keres\u00e9se Mapillary-n
function.downloadosm=OSM adatok let\u00f6lt\u00e9se a ter\u00fcletr\u0151l
function.duplicatepoint=Pont kett\u0151z\u00e9se
function.setcolours=Sz\u00ednek be\u00e1ll\u00edt\u00e1sa
-function.setlinewidth=Vonalsz\u00e9less\u00e9g be\u00e1ll\u00edt\u00e1sa
function.setlanguage=Nyelv be\u00e1ll\u00edt\u00e1sa
function.connecttopoint=Kapcsol\u00e1s ponthoz
function.disconnectfrompoint=Lev\u00e1laszt\u00e1s pontr\u00f3l
@@ -265,10 +263,6 @@ dialog.baseimage.zoom=Zoom szint
dialog.baseimage.incomplete=Hi\u00e1nyos k\u00e9p
dialog.baseimage.tiles=Csemp\u00e9k
dialog.baseimage.size=K\u00e9pm\u00e9ret
-dialog.exportsvg.text=Param\u00e9terek kiv\u00e1laszt\u00e1sa az SVG exporthoz
-dialog.exportsvg.phi=Ir\u00e1nysz\u00f6g \u03d5
-dialog.exportsvg.theta=Emel\u00e9s sz\u00f6ge \u03b8
-dialog.exportsvg.gradients=\u00c1tmenetek haszn\u00e1lata az \u00e1rny\u00e9kol\u00e1shoz
dialog.exportimage.noimagepossible=A t\u00e9rk\u00e9p k\u00e9peit az export\u00e1l\u00e1shoz el\u0151bb lemezre kell menteni.
dialog.exportimage.drawtrack=Nyomvonal rajzol\u00e1sa a t\u00e9rk\u00e9pen
dialog.exportimage.drawtrackpoints=A nyomvonal pontjainak kirajzol\u00e1sa
@@ -388,6 +382,7 @@ dialog.wikipedia.column.name=Sz\u00f3cikk neve
dialog.wikipedia.column.distance=T\u00e1vols\u00e1g
dialog.wikipedia.nonefound=Nem tal\u00e1lhat\u00f3 Wikip\u00e9dia sz\u00f3cikk
dialog.wikipedia.gallery=Gal\u00e9ria
+dialog.geocaching.nonefound=Nem tal\u00e1lhat\u00f3 geol\u00e1da
dialog.correlate.notimestamps=Nincsenek id\u0151b\u00e9lyegek az adatpontokon, \u00edgy nem feleltethet\u0151 meg semmi a f\u00e9nyk\u00e9pekkel.
dialog.correlate.nouncorrelatedphotos=Nincsenek megfeleltetlen f\u00e9nyk\u00e9pek.\nBiztos benne, hogy folytatja?
dialog.correlate.nouncorrelatedaudios=Nincsenek megfeleltetlen hangok.\nBiztos benne, hogy folytatja?
@@ -446,12 +441,12 @@ dialog.deletemarked.nonefound=Nem t\u00e1vol\u00edthat\u00f3 el adatpont
dialog.pastecoordinates.desc=Adja meg vagy illessze be a koordin\u00e1t\u00e1kat ide
dialog.pastecoordinates.coords=Koordin\u00e1t\u00e1k
dialog.pastecoordinates.nothingfound=Ellen\u0151rizze a koordin\u00e1t\u00e1kat, \u00e9s pr\u00f3b\u00e1lja \u00fajra
-dialog.help.help=Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt \u00e9s kezel\u00e9si \u00fatmutat\u00f3\u00e9rt l\u00e1sd a \n http://gpsprune.activityworkshop.net/\nwebhelyet.
+dialog.help.help=Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt \u00e9s kezel\u00e9si \u00fatmutat\u00f3\u00e9rt l\u00e1sd a \n https://gpsprune.activityworkshop.net/\nwebhelyet.
dialog.about.version=Verzi\u00f3
dialog.about.build=Build
dialog.about.summarytext1=A GpsPrune egy program GPS vev\u0151kr\u0151l sz\u00e1rmaz\u00f3 adatok bet\u00f6lt\u00e9s\u00e9re, megjelen\u00edt\u00e9s\u00e9re \u00e9s szerkeszt\u00e9s\u00e9re.
dialog.about.summarytext2=Gnu GPL licenc alatt ker\u00fclt kiad\u00e1sra a szabad, ny\u00edlt, vil\u00e1gm\u00e9ret\u0171 haszn\u00e1lathoz \u00e9s fejleszt\u00e9shez.
M\u00e1sol\u00e1sa, terjeszt\u00e9se \u00e9s m\u00f3dos\u00edt\u00e1sa megengedett \u00e9s \u00f6szt\u00f6nz\u00f6tt
a mell\u00e9kelt license.txt
f\u00e1jlban r\u00f6gz\u00edtett felt\u00e9telek szerint
-dialog.about.summarytext3=Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt \u00e9s kezel\u00e9si \u00fatmutat\u00f3\u00e9rt l\u00e1sd a http://activityworkshop.net/
webhelyet.
+dialog.about.summarytext3=Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt \u00e9s kezel\u00e9si \u00fatmutat\u00f3\u00e9rt l\u00e1sd a https://activityworkshop.net/
webhelyet.
dialog.about.languages=El\u00e9rhet\u0151 nyelvek
dialog.about.translatedby=Magyar sz\u00f6veg: Ball\u00f3 Gy\u00f6rgy \u00e9s B\u00e1thory P\u00e9ter
dialog.about.systeminfo=Rendszerinform\u00e1ci\u00f3
@@ -462,11 +457,6 @@ dialog.about.systeminfo.povray=Povray telep\u00edtve
dialog.about.systeminfo.exiftool=Exiftool telep\u00edtve
dialog.about.systeminfo.gpsbabel=Gpsbabel telep\u00edtve
dialog.about.systeminfo.gnuplot=Gnuplot telep\u00edtve
-dialog.about.systeminfo.exiflib=Exif f\u00fcggv\u00e9nyk\u00f6nyvt\u00e1r
-dialog.about.systeminfo.exiflib.internal=Be\u00e9p\u00edtett
-dialog.about.systeminfo.exiflib.internal.failed=Be\u00e9p\u00edtett (nem tal\u00e1lhat\u00f3)
-dialog.about.systeminfo.exiflib.external=K\u00fcls\u0151
-dialog.about.systeminfo.exiflib.external.failed=K\u00fcls\u0151 (nem tal\u00e1lhat\u00f3)
dialog.about.yes=Igen
dialog.about.no=Nem
dialog.about.credits=K\u00e9sz\u00edt\u0151k
@@ -485,7 +475,7 @@ dialog.checkversion.newversion1=El\u00e9rhet\u0151 a GpsPrune \u00faj verzi\u00f
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Az \u00faj verzi\u00f3 ekkor lett kiadva:
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Az \u00faj verzi\u00f3 let\u00f6lt\u00e9s\u00e9hez keresse fel a http://gpsprune.activityworkshop.net/download.html webhelyet.
+dialog.checkversion.download=Az \u00faj verzi\u00f3 let\u00f6lt\u00e9s\u00e9hez keresse fel a https://gpsprune.activityworkshop.net/download.html webhelyet.
dialog.keys.intro=A k\u00f6vetkez\u0151 gyorsbillenty\u0171k haszn\u00e1lhat\u00f3k az eg\u00e9r haszn\u00e1lata helyett
dialog.keys.keylist=Ny\u00edlbillenty\u0171k | T\u00e9rk\u00e9p mozgat\u00e1sa balra, jobbra, fel, le |
Ctrl + bal, jobb ny\u00edl | El\u0151z\u0151 vagy k\u00f6vetkez\u0151 pont kiv\u00e1laszt\u00e1sa |
Ctrl + fel, le ny\u00edl | Nagy\u00edt\u00e1s vagy kicsiny\u00edt\u00e9s |
Ctrl + PgUp, PgDown | El\u0151z\u0151, k\u00f6vetkez\u0151 szakasz kiv\u00e1laszt\u00e1sa |
Ctrl + Home, End | Els\u0151, utols\u00f3 pont kiv\u00e1laszt\u00e1sa |
Del | Jelenlegi pont t\u00f6rl\u00e9se |
dialog.keys.normalmodifier=Ctrl
@@ -564,7 +554,7 @@ dialog.diskcache.deleteall=Az \u00f6sszes csempe t\u00f6rl\u00e9se
dialog.diskcache.deleted=%d f\u00e1jl t\u00f6r\u00f6lve a gyors\u00edt\u00f3t\u00e1rb\u00f3l
dialog.deletefieldvalues.intro=V\u00e1lassza ki a t\u00f6rlend\u0151 mez\u0151t a jelenlegi tartom\u00e1nyban
dialog.deletefieldvalues.nofields=Nincs t\u00f6r\u00f6lhet\u0151 mez\u0151 a tartom\u00e1nyban
-dialog.setlinewidth.text=Adja meg a rajzoland\u00f3 vonalak vastags\u00e1g\u00e1t a nyomvonalak sz\u00e1m\u00e1ra (1-4)
+dialog.displaysettings.linewidth=Adja meg a rajzoland\u00f3 vonalak vastags\u00e1g\u00e1t a nyomvonalak sz\u00e1m\u00e1ra (1-4)
dialog.downloadosm.desc=Nyers OSM adatok let\u00f6lt\u00e9s\u00e9nek meger\u0151s\u00edt\u00e9se a megadott ter\u00fcletre:
dialog.searchwikipedianames.search=Keres\u00e9s erre:
dialog.weather.location=Helysz\u00edn
@@ -812,7 +802,6 @@ wikipedia.lang=hu
openweathermap.lang=en
webservice.peakfinder=Peakfinder.org megnyit\u00e1sa
webservice.geohack=A geohack lap nyit\u00e1sa
-webservice.panoramio=Panoramio t\u00e9rk\u00e9p nyit\u00e1sa
# Cardinals for 3d plots
cardinal.n=\u00c9
@@ -870,7 +859,6 @@ error.jpegload.dialogtitle=Hiba a k\u00e9pek bet\u00f6lt\u00e9sekor
error.jpegload.nofilesfound=Nem tal\u00e1lhat\u00f3 f\u00e1jl
error.jpegload.nojpegsfound=Nem tal\u00e1lhat\u00f3 jpeg f\u00e1jl
error.jpegload.nogpsfound=Nem tal\u00e1lhat\u00f3 GPS inform\u00e1ci\u00f3
-error.jpegload.exifreadfailed=Az Exif inform\u00e1ci\u00f3 olvas\u00e1sa nem siker\u00fclt. Nem olvashat\u00f3 Exif inform\u00e1ci\u00f3\nbe\u00e9p\u00edtett vagy k\u00fcls\u0151 f\u00fcggv\u00e9nyk\u00f6nyvt\u00e1r n\u00e9lk\u00fcl.
error.audioload.nofilesfound=Nem tal\u00e1lhat\u00f3 hangf\u00e1jl
error.gpsload.unknown=Ismeretlen hiba
error.undofailed.title=A visszavon\u00e1s nem siker\u00fclt
diff --git a/tim/prune/lang/prune-texts_it.properties b/tim/prune/lang/prune-texts_it.properties
index d8e6895..892d88d 100644
--- a/tim/prune/lang/prune-texts_it.properties
+++ b/tim/prune/lang/prune-texts_it.properties
@@ -39,7 +39,6 @@ menu.view.browser.yahoo=Mappe Yahoo
menu.view.browser.bing=Mappe Bing
menu.settings=Preferenze
menu.settings.onlinemode=Carica mappa da internet
-menu.settings.antialias=Usa antialiasing
menu.settings.autosave=Salva settaggi con chiusura del programma
menu.help=Aiuto
# Popup menu for map
@@ -83,7 +82,6 @@ function.sendtogps=Invia dati al GPS
function.exportkml=Esporta in KML
function.exportgpx=Esporta in GPX
function.exportpov=Esporta in POV
-function.exportsvg=Esporta in SVG
function.exportimage=Esporta come immagine
function.editwaypointname=Modifica nome waypoint
function.compress=Comprimi la traccia
@@ -110,18 +108,20 @@ function.setpaths=Configura percorsi programmi
function.selectsegment=Seleziona segmento corrente
function.splitsegments=Dividi traccia in segmenti
function.sewsegments=Riorganizza segmenti insieme
+function.createmarkerwaypoints=Crea marcatori
function.getgpsies=Ottieni tracce da Gpsies
function.uploadgpsies=Carica traccia su Gpsies
function.lookupsrtm=Ottieni quote da SRTM
function.downloadsrtm=Scarica file da SRTM
-function.getwikipedia=Ottieni informazioni da Wikipedia
+function.getwikipedia=Ottieni i punti Wikipedia nelle vicinanze
function.searchwikipedianames=Cerca il nome in Wikipedia
+function.searchosmpois=Ottieni i punti OSM nelle vicinanze
function.searchopencachingde=Cerca OpenCaching.de
function.mapillary=Cerca Mapillary.com
function.downloadosm=Scarica dati OSM dell'area
function.duplicatepoint=Duplica punto corrente in coda
function.setcolours=Scegli colori
-function.setlinewidth=Scegli la lo spessore
+function.setdisplaysettings=Opzioni di visualizzazione
function.setlanguage=Scegli la lingua
function.connecttopoint=Collega al punto
function.disconnectfrompoint=Scollega dal punto
@@ -146,6 +146,7 @@ function.diskcache=Salva mappe su disco
function.managetilecache=Gestione del cache di tasselli
function.getweatherforecast=Ottieni previsioni del tempo
function.setaltitudetolerance=Configura tolleranza di altitudini
+function.selecttimezone=Seleziona fuso orario
# Dialogs
dialog.exit.confirm.title=Esci da GpsPrune
@@ -264,10 +265,6 @@ dialog.baseimage.zoom=Livello di zoom
dialog.baseimage.incomplete=Immagine incompleta
dialog.baseimage.tiles=Tiles
dialog.baseimage.size=Dimensione immagine
-dialog.exportsvg.text=Seleziona i parametri per esportare in SVG
-dialog.exportsvg.phi=Angolo orizzontale \u03d5
-dialog.exportsvg.theta=Angolo di elevazione \u03b8
-dialog.exportsvg.gradients=Usa il gradiente per le ombre
dialog.exportimage.noimagepossible=Le mappe devono essere memorizzate su disco prima di poter essere esportate.
dialog.exportimage.drawtrack=Disegna traccia sulla mappa
dialog.exportimage.drawtrackpoints=Disegna punti
@@ -387,6 +384,9 @@ dialog.wikipedia.column.name=Titolo articolo
dialog.wikipedia.column.distance=Distanza
dialog.wikipedia.nonefound=Nessuna punti trovata
dialog.wikipedia.gallery=Immagine
+dialog.osmpois.column.name=Nome
+dialog.osmpois.column.type=Tipo
+dialog.osmpois.nonefound=Nessuna punti trovata
dialog.geocaching.nonefound=Nessuna punti trovata
dialog.correlate.notimestamps=Non ci sono informazioni temporali tra i dati dei punti, non c'\u00e8 niente per collegarli con le foto.
dialog.correlate.nouncorrelatedphotos=Non ci sono foto non correlate.\nSei sicuro di voler continuare?
@@ -446,12 +446,12 @@ dialog.deletemarked.nonefound=Nessun punto rimosso
dialog.pastecoordinates.desc=Inserisci o incolla qui le coordinate
dialog.pastecoordinates.coords=Coordinate
dialog.pastecoordinates.nothingfound=Per favore, controlla le coordinate e riprova
-dialog.help.help=Per favore vedi\n http://gpsprune.activityworkshop.net/\nper maggiori informazioni e per la guida utente.
+dialog.help.help=Per favore vedi\n https://gpsprune.activityworkshop.net/\nper maggiori informazioni e per la guida utente.
dialog.about.version=Versione
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune \u00e8 un programma per il caricamento, la visione e l'edit di dati provenienti da un GPS.
dialog.about.summarytext2=\u00c8 rilasciato sotto la licenza Gnu GPL per l'uso gratuito e aperto ed il suo miglioramento, con validit\u00e0 mondiale.
La copia, la ridistribuzione sono permesse e incoraggiate
in accordo con i termini inclusi nel file license.txt
.
-dialog.about.summarytext3=Per favore vedi http://activityworkshop.net/
per maggiori informazioni e per la guida utente.
+dialog.about.summarytext3=Per favore vedi https://activityworkshop.net/
per maggiori informazioni e per la guida utente.
dialog.about.languages=Lingue disponibili
dialog.about.translatedby=Testo italiano di Giovanni Sartor + altro
dialog.about.systeminfo=Info di sistema
@@ -462,11 +462,6 @@ dialog.about.systeminfo.povray=Povray installato
dialog.about.systeminfo.exiftool=Exiftool installato
dialog.about.systeminfo.gpsbabel=Gpsbabel installato
dialog.about.systeminfo.gnuplot=Gnuplot installato
-dialog.about.systeminfo.exiflib=Libreria exif
-dialog.about.systeminfo.exiflib.internal=Interna
-dialog.about.systeminfo.exiflib.internal.failed=Interna (non trovata)
-dialog.about.systeminfo.exiflib.external=Esterna
-dialog.about.systeminfo.exiflib.external.failed=Esterna (non trovata)
dialog.about.yes=S\u00ec
dialog.about.no=No
dialog.about.credits=Crediti
@@ -485,7 +480,7 @@ dialog.checkversion.newversion1=Una nuova versione di GpsPrune \u00e8 disponibil
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Questa nuova versione \u00e8 stata rilasciata il
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Per scaricare la nuova versione vai a http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Per scaricare la nuova versione vai a https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=Puoi utilizzare i seguenti tast di scelta rapida al posto del mouse
dialog.keys.keylist=Tasti freccia | Muovi mappa destra, sinistra, su, giu' |
Ctrl + freccia destra, sinistra | Selezione punto successivo o precedente |
Ctrl + freccia su, giu' | Zoom in o out |
Ctrl + pagina su, giu' | Segmento successivo o precedente |
Ctrl + Home, End | Punto primo o ultimo |
Del | Cancella punto attuale |
dialog.keys.normalmodifier=Ctrl
@@ -564,7 +559,17 @@ dialog.diskcache.deleteall=Cancellare tutti tasselli
dialog.diskcache.deleted=Cancellati %d files dal cache
dialog.deletefieldvalues.intro=Selezione il campo da cancellare dall'intervallo corrente
dialog.deletefieldvalues.nofields=Non ci sono campi da cancellare nell'intervallo corrente
-dialog.setlinewidth.text=Specifica il tratteggio delle linee per disegnare la traccia (1-4)
+dialog.displaysettings.linewidth=Tratteggio delle linee per disegnare la traccia (1-4)
+dialog.displaysettings.antialias=Usa antialiasing
+dialog.displaysettings.waypointicons=Icone waypoint
+dialog.displaysettings.wpicon.default=Default
+dialog.displaysettings.wpicon.ringpt=Etichetta rotonda
+dialog.displaysettings.wpicon.plectrum=Plettro
+dialog.displaysettings.wpicon.ring=Anello
+dialog.displaysettings.wpicon.pin=Spillo da lavagna
+dialog.displaysettings.size.small=Piccole
+dialog.displaysettings.size.medium=Medie
+dialog.displaysettings.size.large=Grandi
dialog.downloadosm.desc=Conferma lo scarico dei dati raw OSM per l'area specificata:
dialog.searchwikipedianames.search=Cerca per:
dialog.weather.location=Localit\u00e0
@@ -596,6 +601,12 @@ dialog.deletebydate.column.keep=Tieni
dialog.deletebydate.column.delete=Cancella
dialog.setaltitudetolerance.text.metres=Tolleranza di altitudini (metri)
dialog.setaltitudetolerance.text.feet=Tolleranza di altitudini (feet)
+dialog.settimezone.intro=Qui puoi selezionare il fuso orario con cui visualizzare il timestamp dei punti
+dialog.settimezone.system=Utilizza il fuso orario di sistema
+dialog.settimezone.custom=Utilizza il seguente fuso orario:
+dialog.settimezone.list.toomany=Troppe zone
+dialog.settimezone.selectedzone=Fuso orario selezionato
+dialog.settimezone.offsetfromutc=Offset rispetto a UTC
dialog.autoplay.duration=Durata (sec)
dialog.autoplay.usetimestamps=Usa dati temporali
dialog.autoplay.rewind=Riavvolga
@@ -812,7 +823,6 @@ wikipedia.lang=it
openweathermap.lang=it
webservice.peakfinder=Apri Peakfinder.org
webservice.geohack=Apri la pagina Geohack
-webservice.panoramio=Apri la mappa Panoramio
# Cardinals for 3d plots
cardinal.n=N
@@ -870,7 +880,6 @@ error.jpegload.dialogtitle=Errore nel caricamento delle foto
error.jpegload.nofilesfound=File non trovato
error.jpegload.nojpegsfound=File jpeg non trovato
error.jpegload.nogpsfound=Informazioni GPS non trovate
-error.jpegload.exifreadfailed=Lettera dei dati Exif fallita. I dati Exif non possono\n essere letti senza una libreria interna o esterna.
error.audioload.nofilesfound=Riprese audio non trovate
error.gpsload.unknown=Errore sconosciuto
error.undofailed.title=Impossibile annullare
diff --git a/tim/prune/lang/prune-texts_ja.properties b/tim/prune/lang/prune-texts_ja.properties
index 087e8f7..4f9d7ee 100644
--- a/tim/prune/lang/prune-texts_ja.properties
+++ b/tim/prune/lang/prune-texts_ja.properties
@@ -79,7 +79,6 @@ function.sendtogps=GPS\u3078\u4fdd\u5b58
function.exportkml=KML\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
function.exportgpx=GPX\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
function.exportpov=POV\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
-function.exportsvg=SVG\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
function.exportimage=\u30a4\u30e1\u30fc\u30b8\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
function.editwaypointname=\u30a6\u30a7\u30a4\u30dd\u30a4\u30f3\u30c8\u306e\u540d\u524d\u3092\u7de8\u96c6
function.compress=\u30c8\u30e9\u30c3\u30af\u3092\u5727\u7e2e
@@ -105,7 +104,6 @@ function.searchwikipedianames=\u540d\u524d\u3067Wikipedia\u3092\u691c\u7d22
function.downloadosm=\u30a8\u30ea\u30a2\u306eOSM\u30c7\u30fc\u30bf\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
function.duplicatepoint=\u91cd\u8907\u70b9
function.setcolours=\u8272\u3092\u8a2d\u5b9a
-function.setlinewidth=\u884c\u306e\u5e45\u3092\u8a2d\u5b9a
function.setlanguage=\u8a00\u8a9e\u8a2d\u5b9a
function.connecttopoint=\u70b9\u306b\u63a5\u7d9a
function.disconnectfrompoint=\u70b9\u304b\u3089\u63a5\u7d9a\u89e3\u9664
@@ -332,12 +330,12 @@ dialog.deletemarked.nonefound=\u9664\u304f\u3053\u3068\u304c\u3067\u304d\u308b\u
dialog.pastecoordinates.desc=\u5ea7\u6a19\u3092\u3053\u3053\u306b\u5165\u529b\u3059\u308b\u304b\u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002
dialog.pastecoordinates.coords=\u5ea7\u6a19
dialog.pastecoordinates.nothingfound=\u5ea7\u6a19\u306e\u78ba\u8a8d\u3092\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-dialog.help.help=\u8a73\u3057\u3044\u60c5\u5831\u3084\u3001\u30e6\u30fc\u30b6\u30fc\u30ac\u30a4\u30c9\u306a\u3069\u306f\u3001\nhttp://gpsprune.activityworkshop.net/ \u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002
+dialog.help.help=\u8a73\u3057\u3044\u60c5\u5831\u3084\u3001\u30e6\u30fc\u30b6\u30fc\u30ac\u30a4\u30c9\u306a\u3069\u306f\u3001\nhttps://gpsprune.activityworkshop.net/ \u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002
dialog.about.version=\u30d0\u30fc\u30b8\u30e7\u30f3
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune \u306f\u3001GPS\u53d7\u4fe1\u6a5f\u304b\u3089\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u307f\u3001\u8868\u793a\u3057\u3001\u7de8\u96c6\u3059\u308b\u305f\u3081\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002
dialog.about.summarytext2=\u3053\u308c\u306f\u3001Gnu GPL\u306e\u4e0b\u306b\u516c\u958b\u3055\u308c\u3001\u81ea\u7531\u3067\u3001\u30aa\u30fc\u30d7\u30f3\u3067\u3001\u4e16\u754c\u4e2d\u3067\u3064\u304b\u3048\u3001\u62e1\u5f35\u53ef\u80fd\u3067\u3059\u3002
"license.txt"
\u306b\u304b\u304b\u308c\u3066\u3044\u308b\u6761\u4ef6\u306b\u3088\u308b\u3068\u3001
\u8907\u88fd\u30fb\u518d\u914d\u5e03\u30fb\u6539\u5909\u306f\u3001\u8a31\u3055\u308c\u3066\u304a\u308a\u3001\u304b\u3064\u5968\u52b1\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-dialog.about.summarytext3=\u3082\u3063\u3068\u8a73\u3057\u3044\u60c5\u5831\u3084\u30e6\u30fc\u30b6\u30fc\u30ac\u30a4\u30c9\u306a\u3069\u306f\u3001http://activityworkshop.net/
\u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002
+dialog.about.summarytext3=\u3082\u3063\u3068\u8a73\u3057\u3044\u60c5\u5831\u3084\u30e6\u30fc\u30b6\u30fc\u30ac\u30a4\u30c9\u306a\u3069\u306f\u3001https://activityworkshop.net/
\u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002
dialog.about.languages=\u5229\u7528\u53ef\u80fd\u306a\u8a00\u8a9e
dialog.about.translatedby=\u65e5\u672c\u8a9e\u7ffb\u8a33\uff1aOpenStreetMap \u8ca2\u732e\u8005\u306enazotoko
dialog.about.systeminfo=\u30b7\u30b9\u30c6\u30e0\u60c5\u5831
@@ -348,7 +346,6 @@ dialog.about.systeminfo.povray=Povray \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08
dialog.about.systeminfo.exiftool=Exiftool \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08
dialog.about.systeminfo.gpsbabel=Gpsbabel \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08
dialog.about.systeminfo.gnuplot=Gnuplot \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08
-dialog.about.systeminfo.exiflib=Exif\u30e9\u30a4\u30d6\u30e9\u30ea
dialog.about.yes=\u306f\u3044
dialog.about.no=\u3044\u3044\u3048
dialog.about.credits=\u30af\u30ec\u30b8\u30c3\u30c8
@@ -367,7 +364,7 @@ dialog.checkversion.newversion1=\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306e GpsPr
dialog.checkversion.newversion2=\u3067\u3059\u3002
dialog.checkversion.releasedate1=\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306f\u3001
dialog.checkversion.releasedate2=\u306b\u30ea\u30ea\u30fc\u30b9\u3057\u307e\u3057\u305f\u3002
-dialog.checkversion.download=\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f\u3001 http://gpsprune.activityworkshop.net/download.html \u3078\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002
+dialog.checkversion.download=\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f\u3001 https://gpsprune.activityworkshop.net/download.html \u3078\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002
dialog.keys.intro=\u30de\u30a6\u30b9\u306e\u4ee3\u308f\u308a\u306b\u6b21\u306e\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u30ad\u30fc\u3092\u4f7f\u3046\u4e8b\u304c\u3067\u304d\u307e\u3059\u3002
dialog.keys.keylist=\u77e2\u5370\u30ad\u30fc | \u5730\u56f3\u3092\u4e0a\u4e0b\u5de6\u53f3\u306b\u79fb\u52d5 |
Ctrl + \u5de6\u30fb\u53f3\u77e2\u5370 | \u524d\u30fb\u6b21\u306e\u70b9\u3092\u9078\u629e |
Ctrl + \u4e0a\u30fb\u4e0b\u77e2\u5370 | \u62e1\u5927\u30fb\u7e2e\u5c0f |
Del | \u73fe\u5728\u306e\u70b9\u3092\u524a\u9664 |
dialog.keys.normalmodifier=Ctrl\u30ad\u30fc
@@ -415,7 +412,7 @@ dialog.diskcache.save=\u30c7\u30a3\u30b9\u30af\u306b\u30a4\u30e1\u30fc\u30b8\u30
dialog.diskcache.dir=\u30ad\u30e3\u30c3\u30b7\u30e5\u30c7\u30a3\u30ec\u30af\u30c8\u30ea
dialog.diskcache.createdir=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210
dialog.diskcache.nocreate=\u30ad\u30e3\u30c3\u30b7\u30e5\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u4f5c\u6210\u3055\u308c\u306a\u304b\u3063\u305f\u3002
-dialog.setlinewidth.text=\u30c8\u30e9\u30c3\u30af\u63cf\u753b\u306e\u7dda\u5e45\u30921-4\u306e\u7bc4\u56f2\u3067\u5165\u529b
+dialog.displaysettings.linewidth=\u30c8\u30e9\u30c3\u30af\u63cf\u753b\u306e\u7dda\u5e45\u30921-4\u306e\u7bc4\u56f2\u3067\u5165\u529b
dialog.searchwikipedianames.search=\u53f3\u8a18\u3092\u691c\u7d22:
# 3d window
diff --git a/tim/prune/lang/prune-texts_ko.properties b/tim/prune/lang/prune-texts_ko.properties
index e1f1945..21c0c60 100644
--- a/tim/prune/lang/prune-texts_ko.properties
+++ b/tim/prune/lang/prune-texts_ko.properties
@@ -77,7 +77,6 @@ function.sendtogps=GPS\ub85c \uc790\ub8cc \ubcf4\ub0b4\uae30
function.exportkml=KML \ub0b4\ubcf4\ub0b4\uae30
function.exportgpx=GPX \ub0b4\ubcf4\ub0b4\uae30
function.exportpov=POV \ub0b4\ubcf4\ub0b4\uae30
-function.exportsvg=SVG \ub0b4\ubcf4\ub0b4\uae30
function.editwaypointname=\uacbd\uc720\uc9c0 \uc774\ub984 \uc218\uc815
function.compress=\uacbd\ub85c \uc555\ucd95\ud558\uae30
function.addtimeoffset=\uc624\ud504\uc14b \uc2dc\uac04 \ucd94\uac00
@@ -100,7 +99,6 @@ function.searchwikipedianames=\uc774\ub984\uc73c\ub85c \uc704\ud0a4\ud53c\ub514\
function.downloadosm=OSM \ub370\uc774\ud0c0 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uae30
function.duplicatepoint=\uc9c0\uc810 \ubcf5\uc0ac\ud558\uae30
function.setcolours=\uc0c9\uc0c1 \uc9c0\uc815
-function.setlinewidth=\uc120 \ub113\uc774 \uc9c0\uc815
function.setlanguage=\uc5b8\uc5b4 \uc9c0\uc815
function.connecttopoint=\uc9c0\uc810\uc73c\ub85c \uc5f0\uacb0
function.disconnectfrompoint=\uc9c0\uc810\uc5d0\uc11c \uc5f0\uacb0 \ub04a\uae30
@@ -194,10 +192,6 @@ dialog.exportpov.modelstyle=\ubaa8\ub378 \uc2a4\ud0c0\uc77c
dialog.exportpov.ballsandsticks=\ub9c9\ub300\uae30\uc640 \uacf5
dialog.exportpov.tubesandwalls=\ubcbd\uacfc \ud29c\ube0c
dialog.3d.warningtracksize=\uc774 \ud2b8\ub799\uc740 \uc9c0\uc810\uc774 \ub108\ubb34 \ub9ce\uc544 Java3D\uac00 \ud45c\ud604 \ubabb\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. /n \uadf8\ub798\ub3c4 \uacc4\uc18d \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?
-dialog.exportsvg.text=SVG\ub85c \ub0b4\ubcf4\ub0bc \ud30c\ub77c\ubbf8\ud130\ub97c \uc120\ud0dd\ud558\uc138\uc694
-dialog.exportsvg.phi=\ubc29\uc704\uac01(\u03d5)
-dialog.exportsvg.theta=\uace0\ub3c4(\u03b8)
-dialog.exportsvg.gradients=\uc250\uc774\ub529\uc5d0 \uadf8\ub798\ub514\uc5b8\ud2b8 \uc0ac\uc6a9\ud558\uae30
dialog.pointtype.desc=\uc9c0\uc810 \ud615\uc2dd \uc800\uc7a5\ud558\uae30
dialog.pointtype.track=\ud2b8\ub799 \uc9c0\uc810
dialog.pointtype.waypoint=\uacbd\uc720 \uc9c0\uc810
@@ -335,12 +329,12 @@ dialog.compress.summarylabel=\uc0ad\uc81c\ud560 \uc9c0\uc810
dialog.pastecoordinates.desc=\uc790\ud45c\ub97c \ub123\uc73c\uc138\uc694
dialog.pastecoordinates.coords=\uc88c\ud45c
dialog.pastecoordinates.nothingfound=\uc88c\ud45c\ub97c \ud655\uc778\ud558\uc2dc\uace0 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \ubcf4\uc138\uc694.
-dialog.help.help=\ub354 \uc790\uc138\ud55c \uc815\ubcf4\ub098 \uc0ac\uc6a9\uc790\uc124\uba85\uc740 \uc774\uacf3\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n http://gpsprune.activityworkshop.net/
+dialog.help.help=\ub354 \uc790\uc138\ud55c \uc815\ubcf4\ub098 \uc0ac\uc6a9\uc790\uc124\uba85\uc740 \uc774\uacf3\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n https://gpsprune.activityworkshop.net/
dialog.about.version=\ubc84\uc804
dialog.about.build=\ube4c\ub4dc
dialog.about.summarytext1=GpsPrune\uc740 GPS\uc218\uc2e0\uae30\uc5d0\uc11c \uc704\uce58 \uc815\ubcf4\ub97c \ubc1b\uace0, \ud654\uba74\uc5d0 \ubcf4\uc5ec\uc8fc\uace0, \uc218\uc815\ud558\uac8c \ud574\uc8fc\ub294 \ud504\ub85c\uadf8\ub7a8\uc785\ub2c8\ub2e4.
dialog.about.summarytext2=\uc774 \ud504\ub85c\uadf8\ub7a8\uc740 \uc790\uc720\ub86d\uac8c, \uac1c\ubc29\uc801\uc73c\ub85c, \uadf8\ub9ac\uace0 \uc804\uc138\uacc4\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uace0 \uac1c\uc120\ud558\uae30 \uc704\ud574 Gnu GPL \uc5d0 \ub530\ub77c\uc11c \ubc30\ud3ec\ub429\ub2c8\ub2e4.
\uc774 \ud504\ub85c\uadf8\ub7a8\uc5d0 \ud3ec\ud568\ub41c license.txt
\ud30c\uc77c\uc758 \uc870\uac74\uc5d0 \ub530\ub77c \ubcf5\uc81c, \uc7ac\ubc30\ud3ec, \uc218\uc815\uc774 \ud5c8\uac00\ub418\uace0, \uc7a5\ub824\ub429\ub2c8\ub2e4.
-dialog.about.summarytext3=\ub354 \uc790\uc138\ud55c \uc815\ubcf4\ub098 \uc0ac\uc6a9\uc790\uc124\uba85\uc740 \uc774\uacf3\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.http://activityworkshop.net/
+dialog.about.summarytext3=\ub354 \uc790\uc138\ud55c \uc815\ubcf4\ub098 \uc0ac\uc6a9\uc790\uc124\uba85\uc740 \uc774\uacf3\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.https://activityworkshop.net/
dialog.about.languages=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5b8\uc5b4\ub4e4
dialog.about.translatedby=\ud55c\uad6d\uc5b4 Hooau
dialog.about.systeminfo=\uc2dc\uc2a4\ud15c \uc815\ubcf4
@@ -351,11 +345,6 @@ dialog.about.systeminfo.povray=Povray\uac00 \uc124\uce58\ub418\uc5c8\uc74c
dialog.about.systeminfo.exiftool=Exiftool\uc774 \uc124\uce58\ub418\uc5c8\uc74c
dialog.about.systeminfo.gpsbabel=Gpsbabel\uc774 \uc124\uce58\ub418\uc5c8\uc74c
dialog.about.systeminfo.gnuplot=Gnuplot\uc774 \uc124\uce58\ub418\uc5c8\uc74c
-dialog.about.systeminfo.exiflib=Exif \ub77c\uc774\ube0c\ub7ec\ub9ac
-dialog.about.systeminfo.exiflib.internal=\ub0b4\uc7a5
-dialog.about.systeminfo.exiflib.internal.failed=\ub0b4\uc7a5(\ucc3e\uc9c0\ubabb\ud568)
-dialog.about.systeminfo.exiflib.external=\uc678\uc7a5
-dialog.about.systeminfo.exiflib.external.failed=\uc678\uc7a5(\ucc3e\uc9c0\ubabb\ud568)
dialog.about.yes=\uc608
dialog.about.no=\uc544\ub2c8\uc624
dialog.about.credits=\uc5d0\uac8c \uac10\uc0ac\ub97c
@@ -374,7 +363,7 @@ dialog.checkversion.newversion1=GpsPrune\uc758 \uc0c8 \ubc84\uc804\uc744 \uc9c0\
dialog.checkversion.newversion2=\ubc84\uc804\uc785\ub2c8\ub2e4.
dialog.checkversion.releasedate1=\uc0c8 \ubc84\uc804\uc740
dialog.checkversion.releasedate2=\uc5d0 \ubc30\ud3ec\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-dialog.checkversion.download=\uc0c8 \ubc84\uc804\uc744 \ub2e4\uc6b4\ubc1b\uace0 \uc2f6\uc73c\uc138\uc694? \uadf8\ub7fc \uc544\ub798 URL\ub85c \uc640\uc8fc\uc138\uc694. /n http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=\uc0c8 \ubc84\uc804\uc744 \ub2e4\uc6b4\ubc1b\uace0 \uc2f6\uc73c\uc138\uc694? \uadf8\ub7fc \uc544\ub798 URL\ub85c \uc640\uc8fc\uc138\uc694. /n https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=\ub9c8\uc6b0\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\uc2dc\uace0 \uc544\ub798 \ub2e8\ucd95\ud0a4\ub97c \uc0ac\uc6a9\ud574\ubcf4\uc138\uc694.
dialog.keys.keylist=\ud654\uc0b4\ud45c \ud0a4 | \uc88c,\uc6b0,\uc544\ub798,\uc704\ub85c \uc9c0\ub3c4 \uc774\ub3d9 |
Ctrl + \uc67c\ucabd, \uc624\ub978\ucabd \ud654\uc0b4\ud45c | \uc9c0\uc810 \uc120\ud0dd \uc774\ub3d9 |
Ctrl + \uc704, \uc544\ub798 \ud654\uc0b4\ud45c | \uc9c0\ub3c4 \ud655\ub300 \ucd95\uc18c |
Ctrl + PgUp, PgDown | \uc774\uc804 \uc774\ud6c4 \ubd80\ubd84 \uc120\ud0dd |
Ctrl + Home, End | \ucc98\uc74c \uc9c0\uc810, \ub9c8\uc9c0\ub9c9 \uc9c0\uc810 \uc120\ud0dd |
Del | \ud604\uc7ac \uc9c0\uc810 \uc0ad\uc81c |
dialog.keys.normalmodifier=Ctrl
@@ -425,7 +414,7 @@ dialog.diskcache.dir=\uce90\uc2dc \ub514\ub809\ud1a0\ub9ac
dialog.diskcache.createdir=\ub514\ub809\ud1a0\ub9ac \ub9cc\ub4e4\uae30
dialog.diskcache.nocreate=\uce90\uc2dc \ub514\ub809\ud1a0\ub9ac\uac00 \ub9cc\ub4e4\uc5b4\uc9c0\uc9c0 \uc54a\uc558\uc5b4\uc694.
dialog.deletefieldvalues.intro=\ud604\uc7ac \ubc94\uc704\uc5d0\uc11c \uc0ad\uc81c\ud560 \ud544\ub4dc\ub97c \uc120\ud0dd
-dialog.setlinewidth.text=\ud2b8\ub799\uc744 \uadf8\ub9b4 \uc120\uc758 \ub450\uaed8\ub97c \uc801\uc73c\uc138\uc694(1-4)
+dialog.displaysettings.linewidth=\ud2b8\ub799\uc744 \uadf8\ub9b4 \uc120\uc758 \ub450\uaed8\ub97c \uc801\uc73c\uc138\uc694(1-4)
dialog.downloadosm.desc=\ud2b9\uc815\uc9c0\uc5ed\uc758 raw OSM \ub370\uc774\ud130\ub97c \ub2e4\uc6b4\ub85c\ub4dc \ud558\uc2dc\uaca0\uc5b4\uc694?
dialog.searchwikipedianames.search=\ucc3e\uae30
@@ -653,7 +642,6 @@ error.jpegload.dialogtitle=\uc0ac\uc9c4 \ubd88\ub7ec\uc624\ub294 \uc911 \uc5d0\u
error.jpegload.nofilesfound=\ucc3e\uc740 \ud30c\uc77c \uc5c6\uc74c.
error.jpegload.nojpegsfound=\ucc3e\uc740 jpeg\ud30c\uc77c \uc5c6\uc74c.
error.jpegload.nogpsfound=GPS \uc815\ubcf4\ub97c \ucc3e\uc9c0 \ubabb\ud568.
-error.jpegload.exifreadfailed=Exif\uc815\ubcf4 \uc77d\uae30 \uc2e4\ud328./n\ub0b4\uc7a5\uc774\ub098 \uc678\uc7a5 \ub77c\uc774\ube0c\ub7ec\uc774\uac00 \uc5c6\uc73c\uba74/nExif\uc815\ubcf4\ub97c \uc77d\uc744 \uc218 \uc5c6\uc5b4\uc694.
error.audioload.nofilesfound=\ucc3e\uc740 \uc18c\ub9ac\ud30c\uc77c \uc5c6\uc74c.
error.gpsload.unknown=\uc54c\ub824\uc9c0\uc9c0 \uc54a\uc740 \uc624\ub958.
error.undofailed.title=\ub418\ub3cc\ub9ac\uae30 \uc2e4\ud328.
diff --git a/tim/prune/lang/prune-texts_nl.properties b/tim/prune/lang/prune-texts_nl.properties
index 47b9601..fb5006d 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
+# Dutch entries thanks to Jeroen
# Menu entries
menu.file=Bestand
@@ -38,9 +38,9 @@ menu.view.browser.yahoo=Yahoo maps
menu.view.browser.bing=Bing maps
menu.settings=Instellingen
menu.settings.onlinemode=Kaarten van internet ophalen
-menu.settings.antialias=Gebruik anti-aliasering
menu.settings.autosave=Automatisch opslaan bij afsluiten
menu.help=Help
+
# Popup menu for map
menu.map.zoomin=Zoom +
menu.map.zoomout=Zoom -
@@ -82,7 +82,6 @@ function.sendtogps=Gegevens verzenden naar GPS
function.exportkml=Export KML
function.exportgpx=Export GPX
function.exportpov=Export POV
-function.exportsvg=Export SVG
function.exportimage=Bestand exporteren
function.editwaypointname=Hernoem waypoint
function.compress=Route comprimeren
@@ -110,18 +109,20 @@ function.setpaths=Instellen programmapaden
function.selectsegment=Selecteer huidige segment
function.splitsegments=Splits route in segmenten
function.sewsegments=Voeg segmenten samen
+function.createmarkerwaypoints=aak waypoints voor markering
function.getgpsies=Routes van Gpsies ophalen
function.uploadgpsies=Upload routes naar Gpsies
function.lookupsrtm=Hoogtes van SRTM ophalen
function.downloadsrtm=Downloaden SRTM tegels
function.getwikipedia=Wikipedia artikelen uit de buurt ophalen
function.searchwikipedianames=Wikipedia zoeken op naam
+function.searchosmpois=Haal nabije OSM punten op
function.searchopencachingde=Doorzoek OpenCaching.de
function.mapillary=Zoek naar foto's op Mapillary
function.downloadosm=Downloaden OSM data voor gebied
function.duplicatepoint=Dupliceer punt
function.setcolours=Instellen kleuren
-function.setlinewidth=Instellen lijndikte
+function.setdisplaysettings=Instellen afbeeldingopties
function.setlanguage=Instellen taal
function.connecttopoint=Aan punt vastzetten
function.disconnectfrompoint=Van punt losmaken
@@ -146,6 +147,7 @@ function.diskcache=Kaart opslaan op schijf
function.managetilecache=Beheer tegelcache
function.getweatherforecast=Ophalen weersvoorspelling
function.setaltitudetolerance=Instellen hoogtetolerantie
+function.selecttimezone=Instellen tijdzone
# Dialogs
dialog.exit.confirm.title=GpsPrune afsluiten
@@ -264,10 +266,6 @@ dialog.baseimage.zoom=Zoom niveau
dialog.baseimage.incomplete=Afbeelding onvolledig
dialog.baseimage.tiles=Tegels
dialog.baseimage.size=Afbeeldinggrootte
-dialog.exportsvg.text=Selecteer de camera hoeken voor SVG export
-dialog.exportsvg.phi=Azimut hoek \u03d5
-dialog.exportsvg.theta=Stijgingshoek \u03b8
-dialog.exportsvg.gradients=Gebruik gradaties voor schaduw
dialog.exportimage.noimagepossible=Kaartafbeeldingen dienen gecached te worden naar disk om ze te kunnen exporteren.
dialog.exportimage.drawtrack=Teken route op kaart
dialog.exportimage.drawtrackpoints=Teken routepunten
@@ -387,6 +385,9 @@ dialog.wikipedia.column.name=Artikelnaam
dialog.wikipedia.column.distance=Afstand
dialog.wikipedia.nonefound=Geen punten gevonden
dialog.wikipedia.gallery=Galerie
+dialog.osmpois.column.name=Naam
+dialog.osmpois.column.type=Type
+dialog.osmpois.nonefound=Geen punten gevonden
dialog.geocaching.nonefound=Geen punten gevonden
dialog.correlate.notimestamps=Er zit geen tijdinformatie in de punten, dus kunnen ze niet aan foto's gekoppeld worden.
dialog.correlate.nouncorrelatedphotos=Er zijn geen ongekoppelde foto's.\nWeet u zeker dat u wilt doorgaan?
@@ -446,12 +447,12 @@ dialog.deletemarked.nonefound=Er konden geen punten verwijderd worden
dialog.pastecoordinates.desc=Geef co\u00f6rdinaten in
dialog.pastecoordinates.coords=Co\u00f6rdinaten
dialog.pastecoordinates.nothingfound=Controleer de co\u00f6rdinaten en probeer het nogmaals
-dialog.help.help=Ga naar\n http://gpsprune.activityworkshop.net/\nvoor meer informatie en handleidingen.
+dialog.help.help=Ga naar\n https://gpsprune.activityworkshop.net/\nvoor meer informatie en handleidingen.
dialog.about.version=Versie
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune is een programma voor het laden, tonen en wijzigen van data uit GPS ontvangers.
dialog.about.summarytext2=Uitgebracht onder de Gnu GPL voor gratis, open, wereldwijd gebruik en verbetering
Kopieren, verspreiding en aanpassing is toegestaan en aangemoedigd
volgens de voorwaarden in het bestand license.txt
.
-dialog.about.summarytext3=Ga naar http://activityworkshop.net/
voor meer informatie en handleidingen.
+dialog.about.summarytext3=Ga naar https://activityworkshop.net/
voor meer informatie en handleidingen.
dialog.about.languages=Beschikbare talen
dialog.about.translatedby=Nederlandse vertaling door JFO
dialog.about.systeminfo=Systeeminformatie
@@ -462,11 +463,6 @@ dialog.about.systeminfo.povray=Povray ge\u00efnstalleerd
dialog.about.systeminfo.exiftool=Exiftool ge\u00efnstalleer
dialog.about.systeminfo.gpsbabel=Gpsbabel ge\u00efnstalleer
dialog.about.systeminfo.gnuplot=Gnuplot ge\u00efnstalleer
-dialog.about.systeminfo.exiflib=Exif bibliotheek
-dialog.about.systeminfo.exiflib.internal=Intern
-dialog.about.systeminfo.exiflib.internal.failed=Intern (niet gevonden)
-dialog.about.systeminfo.exiflib.external=Extern
-dialog.about.systeminfo.exiflib.external.failed=Extern (niet gevonden)
dialog.about.yes=Ja
dialog.about.no=Nee
dialog.about.credits=Credits
@@ -485,7 +481,7 @@ dialog.checkversion.newversion1=Een nieuwe versie van GpsPrune is beschikbaar. D
dialog.checkversion.newversion2=.
dialog.checkversion.releasedate1=Deze nieuwe versie was vrijgegeven op
dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Om de nieuwst versie te downloaden, ga naar http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Om de nieuwst versie te downloaden, ga naar https://gpsprune.activityworkshop.net/download.html.
dialog.keys.intro=De volgende sneltoetsen vervangen muisacties
dialog.keys.keylist=Pijltjestoetsen | verschuif de kaart links, rechts, omhoog, omlaag |
Ctrl + pijltje naar links, rechts | Selecteer volgende, vorige punt |
Ctrl + pijltje omhoog, omlaag | Zoom in of uit |
Ctrl + PgUp, PgDown | Selecteer vorig, volgend segment |
Ctrl + Home, End | Select eerste, laatste punt |
Del | Verwijder huidige punt |
dialog.keys.normalmodifier=Ctrl
@@ -564,7 +560,17 @@ dialog.diskcache.deleteall=Verwijder alle tegels
dialog.diskcache.deleted=%d bestanden uit de cache verwijderd
dialog.deletefieldvalues.intro=Selecteer het te verwijderen veld voor de huidige reeks
dialog.deletefieldvalues.nofields=Er zijn geen velden in deze reeks om te verwijderen
-dialog.setlinewidth.text=Geef lijndikte voor routes (1-4)
+dialog.displaysettings.linewidth=Geef lijndikte voor routes (1-4)
+dialog.displaysettings.antialias=Gebruik anti-aliasering
+dialog.displaysettings.waypointicons=Waypoint iconen
+dialog.displaysettings.wpicon.default=Standaard
+dialog.displaysettings.wpicon.ringpt=Rond markeerpunt
+dialog.displaysettings.wpicon.plectrum=Plectrum
+dialog.displaysettings.wpicon.ring=Ring
+dialog.displaysettings.wpicon.pin=Punaise
+dialog.displaysettings.size.small=Klein
+dialog.displaysettings.size.medium=Middel
+dialog.displaysettings.size.large=Groot
dialog.downloadosm.desc=Bevestig het downloaden van ruwe OSM data voor dit gebied:
dialog.searchwikipedianames.search=Zoeken naar:
dialog.weather.location=Locatie
@@ -596,11 +602,18 @@ dialog.deletebydate.column.keep=Behouden
dialog.deletebydate.column.delete=Verwijderen
dialog.setaltitudetolerance.text.metres=Grens (in meters) waaronder kleine klimmen en afdalingen worden genegeerd
dialog.setaltitudetolerance.text.feet=Grens (in feet) waaronder kleine klimmen en afdalingen worden genegeerd
+dialog.settimezone.intro=Selecteer de tijdzone waarin tijdinformatie van punten wordt afgebeeld
+dialog.settimezone.system=Gebruik tijdzone vna het systeem
+dialog.settimezone.custom=Gebruik de volgende tijdzone
+dialog.settimezone.list.toomany=Te veel keuze
+dialog.settimezone.selectedzone=Geselecteerde tijdzone
+dialog.settimezone.offsetfromutc=Verschil ten opzichte van UTC
dialog.autoplay.duration=Duur (sec.)
dialog.autoplay.usetimestamps=Gebruik tijdinfo van punt
dialog.autoplay.rewind=Terug naar begin
dialog.autoplay.pause=Pauze
dialog.autoplay.play=Afspelen
+
# 3d window
dialog.3d.title=GpsPrune in 3D
dialog.3d.altitudefactor=Hoogte overdrijvingsfactor
@@ -805,13 +818,12 @@ units.degreesfahrenheit.short=\u00baF
logic.and=en
logic.or=of
-# External urls
+# External urls and services
url.googlemaps=maps.google.nl
wikipedia.lang=nl
openweathermap.lang=nl
webservice.peakfinder=Open Peakfinder.org
webservice.geohack=Open Geohack pagina
-webservice.panoramio=Open Panoramio kaart
# Cardinals for 3d plots
cardinal.n=N
@@ -869,7 +881,6 @@ error.jpegload.dialogtitle=Fout bij inlezen foto's
error.jpegload.nofilesfound=Bestanden niet gevonden
error.jpegload.nojpegsfound=Geen jpeg-bestanden gevonden
error.jpegload.nogpsfound=Geen GPS informatie gevonden
-error.jpegload.exifreadfailed=Kon geen Exif informatie inlezen. Exif informatie kan niet worden gelezen\n zonder interne of externe bibliotheek.
error.audioload.nofilesfound=Geen audiobestanden gevonden
error.gpsload.unknown=Onbekende fout
error.undofailed.title=Terugdraaien mislukt
diff --git a/tim/prune/lang/prune-texts_no.properties b/tim/prune/lang/prune-texts_no.properties
new file mode 100644
index 0000000..e5a89f6
--- /dev/null
+++ b/tim/prune/lang/prune-texts_no.properties
@@ -0,0 +1,140 @@
+# Text entries for the GpsPrune application
+# Norwegian entries
+
+# Menu entries
+menu.file=Fil
+menu.file.addphotos=Legg til bilder
+menu.file.recentfiles=Nyeste filer
+menu.file.save=Lagre som tekst
+menu.file.exit=Avslutt
+menu.online=
+menu.track=
+menu.track.undo=Angre
+menu.track.clearundo=Nullstill angreliste
+menu.track.markrectangle=Marker punkter i rektangel
+function.deletemarked=Slett markerte punkter
+menu.range=Intervall
+menu.range.all=Velg alle
+menu.range.none=Velg ingen
+menu.range.start=Velg intervallets startpunkt
+menu.range.end=Velg intervallets slutpunkt
+menu.range.average=Nytt punkt midt i intervallet
+menu.range.reverse=Reverser intervallet
+menu.range.mergetracksegments=Sl\u00e5 sammen delintervaller
+menu.range.cutandmove=Kutt av og flytt valgt intervall
+menu.point=Punkt
+menu.point.editpoint=Rediger punkt
+menu.point.deletepoint=Slett punkt
+menu.photo=Bilde
+menu.photo.saveexif=Lagre Exif-data
+menu.audio=Lyd
+menu.view=Visning
+menu.view.showsidebars=Vis sidefelter
+menu.view.browser=Vis kart i nettleser
+menu.view.browser.google=Google kart
+menu.view.browser.openstreetmap=Openstreetmap
+menu.view.browser.mapquest=Mapquest
+menu.view.browser.yahoo=Yahoo maps
+menu.view.browser.bing=Bing maps
+menu.settings=Innstillinger
+menu.settings.onlinemode=Last kart fra Internet
+menu.settings.autosave=Lagre innstillinger automatisk ved avslutning
+menu.help=Hjelp
+# Popup menu for map
+menu.map.zoomin=Zoom inn
+menu.map.zoomout=Zoom ut
+menu.map.zoomfull=Zoom til hele sporet
+menu.map.newpoint=Lag nytt punkt
+menu.map.drawpoints=Lag en serie punkter
+menu.map.connect=Knyt sporpunkter til linje
+menu.map.autopan=Autosentrering
+menu.map.showmap=Vis kart
+menu.map.showscalebar=Vis m\u00e5lestokk
+menu.map.editmode=Redigeringsmodus
+
+# Alt keys for menus
+altkey.menu.file=F
+altkey.menu.online=
+altkey.menu.track=S
+altkey.menu.range=I
+altkey.menu.point=P
+altkey.menu.view=V
+altkey.menu.photo=B
+altkey.menu.audio=L
+altkey.menu.settings=n
+altkey.menu.help=H
+
+# Ctrl shortcuts for menu items
+shortcut.menu.file.open=\u00c5
+shortcut.menu.file.load=
+shortcut.menu.file.save=L
+shortcut.menu.track.undo=g
+shortcut.menu.edit.compress=K
+shortcut.menu.range.all=A
+shortcut.menu.help.help=H
+
+# Functions
+function.open=\u00c5pne fil
+function.importwithgpsbabel=Importer fil med GPSBabel
+function.loadfromgps=Hent data fra GPS
+function.sendtogps=Overf\u00f8r data til GPS
+function.exportkml=Eksporter KML
+function.exportgpx=Eksporter GPX
+function.exportpov=Eksporter POV
+function.exportimage=
+function.editwaypointname=Endre waypoint-navn
+function.compress=Komprimer spor
+function.deleterange=Fjern valgt intervall
+function.croptrack=Beskj\u00e6r sporet
+function.interpolate=Interpoler punkter
+function.deletebydate=
+function.addtimeoffset=Legg til tidsinkrement
+function.addaltitudeoffset=Legg til h\u00f8ideinkrement
+function.rearrangewaypoints=
+function.convertnamestotimes=Les waypoint-navn som tidspunkter
+function.deletefieldvalues=Slett feltets verdier
+function.findwaypoint=Finn waypoint
+function.pastecoordinates=Legg til nye koordinater
+function.charts=Grafer
+function.show3d=3-D visning
+function.distances=Avstander
+function.fullrangedetails=Vis alle detaljer
+function.estimatetime=
+function.learnestimationparams=
+function.setmapbg=Velg grunnlagskart
+function.setpaths=Angi plassering av programmer
+function.selectsegment=
+function.splitsegments=
+function.sewsegments=
+function.getgpsies=Vis spor fra gpsies.com
+function.uploadgpsies=Last opp spor til gpsies.com
+function.lookupsrtm=Hent h\u00f8yde fra SRTM
+function.downloadsrtm=
+function.getwikipedia=Vis Wikipedia info for omegn
+function.searchwikipedianames=S\u00f8k Wikipedia
+function.searchopencachingde=
+function.downloadosm=Last ned OSM data for omr\u00e5det
+function.duplicatepoint=Dupliser punkt
+function.setcolours=Velg farger
+function.setlanguage=Velg spr\u00e5k
+function.connecttopoint=Knytt til punkt
+function.disconnectfrompoint=Koble fra punkt
+function.removephoto=Fjern foto
+function.correlatephotos=Relater alle bilder
+function.rearrangephotos=Omarranger bilder
+function.rotatephotoleft=Roter bilde mot venstre
+function.rotatephotoright=Roter bilde mot h\u00f8yre
+function.photopopup=Vis bilde popup
+function.ignoreexifthumb=Ignorer exif miniatyrbilder
+function.loadaudio=Legg til lydklipp
+function.removeaudio=Fjern lydklipp
+function.correlateaudios=Relater alle lydklipp
+function.playaudio=Spill lydklipp
+function.stopaudio=Avbryt lydklipp
+function.help=Hjelp
+function.showkeys=Vis hurtigtaster
+function.about=Om GpsPrune
+function.checkversion=Sjekk etter nye versjoner
+function.saveconfig=Lagre innstillinger
+function.diskcache=Om lagring av kart
+function.managetilecache=H\u00e5ndter kart-flis-lager
diff --git a/tim/prune/lang/prune-texts_pl.properties b/tim/prune/lang/prune-texts_pl.properties
index 405c594..fb73385 100644
--- a/tim/prune/lang/prune-texts_pl.properties
+++ b/tim/prune/lang/prune-texts_pl.properties
@@ -38,7 +38,7 @@ menu.view.browser.yahoo=Mapy Yahoo
menu.view.browser.bing=Mapy Bing
menu.settings=Ustawienia
menu.settings.onlinemode=\u0141aduj mapy z sieci
-menu.settings.antialias=U\u017Cyj antyaliasingu
+dialog.displaysettings.antialias=U\u017Cyj antyaliasingu
menu.settings.autosave=Autozapis ustawie\u0144 przy wyj\u015bciu
menu.help=Pomoc
# Popup menu for map
@@ -82,7 +82,6 @@ function.sendtogps=Wy\u015blij dane do urz\u0105dzenia GPS
function.exportkml=Eksportuj jako KML
function.exportgpx=Eksportuj jako GPX
function.exportpov=Eksportuj jako POV
-function.exportsvg=Eksportuj jako SVG
function.exportimage=Eksportuj jako obraz
function.editwaypointname=Zmie\u0144 nazw\u0119 punktu po\u015bredniego
function.compress=Kompresuj \u015bcie\u017ck\u0119
@@ -104,12 +103,13 @@ function.distances=Odleg\u0142o\u015bci
function.fullrangedetails=Wszystkie detale
function.estimatetime=Przewidywany czas
function.learnestimationparams=Skoryguj wsp\u00f3\u0142czynniki szacowania czasu
-function.autoplay=Gra\u0107 \u015bcie\u017ck\u0119
+function.autoplay=Gra\u0107 \u015bcie\u017ck\u0119
function.setmapbg=Wybierz map\u0119 t\u0142a
function.setpaths=Ustaw \u015bcie\u017cki do program\u00f3w
function.selectsegment=Wybierz bie\u017c\u0105cy fragment
function.splitsegments=Podziel \u015bcie\u017ck\u0119 na fragmenty
function.sewsegments=Po\u0142\u0105cz fragmenty
+function.createmarkerwaypoints=Stw\u00f3rz markery podzia\u0142u
function.getgpsies=Pobierz \u015bcie\u017cki z Gpsies
function.uploadgpsies=Wy\u015blij \u015bcie\u017cki do Gpsies
function.lookupsrtm=Pobierz wysoko\u015bci z SRTM
@@ -121,7 +121,6 @@ function.mapillary=Szukaj zdj\u0119cia w Mapillary
function.downloadosm=Za\u0142aduj dane obszaru z OSM
function.duplicatepoint=Duplikuj plik
function.setcolours=Ustaw kolory
-function.setlinewidth=Ustaw szeroko\u015b\u0107 linii
function.setlanguage=Zmie\u0144 j\u0119zyk
function.connecttopoint=Przy\u0142\u0105cz do punktu
function.disconnectfrompoint=Od\u0142\u0105cz od punktu
@@ -264,10 +263,6 @@ dialog.baseimage.zoom=Poziom zbli\u017cenia
dialog.baseimage.incomplete=Obraz niekompletny
dialog.baseimage.tiles=Kafelki
dialog.baseimage.size=Rozmiar obrazu
-dialog.exportsvg.text=Wybierz parametry eksportu do pliku SVG
-dialog.exportsvg.phi=azymut \u03d5
-dialog.exportsvg.theta=K\u0105t wzniesienia \u03b8
-dialog.exportsvg.gradients=U\u017cyj gradientu jako wype\u0142nienia
dialog.exportimage.noimagepossible=Obrazy map musz\u0105 zosta\u0107 zapisane na dysku przed ich eksportem
dialog.exportimage.drawtrack=Rysuj \u015bcie\u017ck\u0119 na mapie
dialog.exportimage.drawtrackpoints=Rysuj punkty
@@ -398,8 +393,8 @@ dialog.correlate.select.photolater=P\u00f3\u017aniejsze zdj\u0119cie
dialog.correlate.options.intro=Wybierz opcje dla automatycznej korelacji
dialog.correlate.options.offsetpanel=Przesuni\u0119cie czasowe
dialog.correlate.options.offset=Przesuni\u0119cie
-dialog.correlate.options.offset.hours=godzin,
-dialog.correlate.options.offset.minutes=minut i
+dialog.correlate.options.offset.hours=godziny,
+dialog.correlate.options.offset.minutes=minuty i
dialog.correlate.options.offset.seconds=sekund
dialog.correlate.options.photolater=Zdj\u0119cie p\u00f3\u017aniejsze ni\u017c punkt
dialog.correlate.options.pointlaterphoto=Punkt p\u00f3\u017aniejszy ni\u017c zdj\u0119cie
@@ -446,12 +441,12 @@ dialog.deletemarked.nonefound=Nie mo\u017cna usun\u0105\u0107 \u017cadnych punkt
dialog.pastecoordinates.desc=Wprowad\u017a lub wklej wsp\u00f3\u0142rz\u0119dne
dialog.pastecoordinates.coords=Wsp\u00f3\u0142rz\u0119dne
dialog.pastecoordinates.nothingfound=Sprawd\u017a wsp\u00f3\u0142rz\u0119dne i spr\u00f3buj jeszcze raz
-dialog.help.help=Na stronie\nhttp://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna nowego podr\u0119cznika u\u017cytkownika w formacie PDF.
+dialog.help.help=Na stronie\nhttp://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
dialog.about.version=Wersja
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune s\u0142u\u017cy do pobierania, wy\u015bwietlania i edycji danych z odbiornik\u00f3w GPS.
dialog.about.summarytext2=Ten program zosta\u0142 udost\u0119pniony na podstawie licencji GNU pozwalaj\u0105cej
na jego wolne, nieograniczone i og\u00f3lno\u015bwiatowe u\u017cytkowanie i rozszerzanie.
Kopiowanie, rozprowadzanie i modyfikowanie s\u0105 dozwolone i zalecane
zgodnie z warunkami zawartymi w do\u0142\u0105czonym plikulicense.txt
-dialog.about.summarytext3=Na stronie http://activityworkshop.net/
znajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna nowego podr\u0119cznika u\u017cytkownika w formacie PDF.
+dialog.about.summarytext3=Na stronie https://activityworkshop.net/
znajdziesz wi\u0119cej informacji i porad
oraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
dialog.about.languages=Dost\u0119pne j\u0119zyki
dialog.about.translatedby=Tekst po polsku: Piotr, Weehal
dialog.about.systeminfo=Informacje o systemie
@@ -462,11 +457,6 @@ dialog.about.systeminfo.povray=Povray zainstalowany
dialog.about.systeminfo.exiftool=Exiftool zainstalowany
dialog.about.systeminfo.gpsbabel=Gpsbabel zainstalowany
dialog.about.systeminfo.gnuplot=Gnuplot zainstalowany
-dialog.about.systeminfo.exiflib=Biblioteka Exif
-dialog.about.systeminfo.exiflib.internal=Wewn\u0119trzny
-dialog.about.systeminfo.exiflib.internal.failed=Wewn\u0119trzny (nie znaleziony)
-dialog.about.systeminfo.exiflib.external=Zewn\u0119trzny
-dialog.about.systeminfo.exiflib.external.failed=Zewn\u0119trzny (nie znaleziony)
dialog.about.yes=Tak
dialog.about.no=Nie
dialog.about.credits=Podzi\u0119kowania
@@ -564,7 +554,7 @@ dialog.diskcache.deleteall=Usu\u0144 wszystkie p\u0142ytki
dialog.diskcache.deleted=Usuni\u0119to %d plik\u00f3w z kesza
dialog.deletefieldvalues.intro=Wybierz pola do skasowania z wybranego zakresu
dialog.deletefieldvalues.nofields=Brak p\u00f3l do skasowania dla tego zakresu
-dialog.setlinewidth.text=Wprowad\u017a grubo\u015b\u0107 linii do rysowania \u015bcie\u017cek
+dialog.displaysettings.linewidth=Wprowad\u017a grubo\u015b\u0107 linii do rysowania \u015bcie\u017cek
dialog.downloadosm.desc=Potwierd\u017a \u015bci\u0105gni\u0119cie danych dla tego obszaru z OSM:
dialog.searchwikipedianames.search=Szukaj
dialog.weather.location=Pozycja
@@ -597,7 +587,7 @@ dialog.deletebydate.column.delete=Usu\u0144
dialog.setaltitudetolerance.text.metres=Limit (w metrach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
dialog.setaltitudetolerance.text.feet=Limit (w stopach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
dialog.autoplay.duration=Czas trwania (sek)
-dialog.autoplay.usetimestamps=U\u017Cyj znaczników czasowych
+dialog.autoplay.usetimestamps=U\u017Cyj znacznik\u00f3w czasowych
dialog.autoplay.rewind=Przewin\u0105\u0107
dialog.autoplay.pause=Pauza
dialog.autoplay.play=Graj
@@ -812,7 +802,6 @@ wikipedia.lang=pl
openweathermap.lang=pl
webservice.peakfinder=Otw\u00f3rz w Peakfinder.org
webservice.geohack=Otw\u00f3rz w Geohack
-webservice.panoramio=Otw\u00f3rz w Panoramio.com
# Cardinals for 3d plots
cardinal.n=N
@@ -870,7 +859,6 @@ error.jpegload.dialogtitle=B\u0142\u0105d \u0142adowania zdj\u0119cia
error.jpegload.nofilesfound=Nie znaleziono plik\u00f3w
error.jpegload.nojpegsfound=Nie znaleziono plik\u00f3w jpeg
error.jpegload.nogpsfound=Nie znaleziono informacji GPS
-error.jpegload.exifreadfailed=Nie powiod\u0142o si\u0119 odczytanie informacji Exif\nInformacji tych nie mo\u017cna przeczyta\u0107 bez wewn\u0119trznej lub zewn\u0119trznej biblioteki.
error.audioload.nofilesfound=Nie znaleziono plik\u00f3w audio
error.gpsload.unknown=Nieznany b\u0142\u0105d
error.undofailed.title=Cofnij nie powiod\u0142o si\u0119
diff --git a/tim/prune/lang/prune-texts_pt.properties b/tim/prune/lang/prune-texts_pt.properties
index a3875d6..f12eaf6 100644
--- a/tim/prune/lang/prune-texts_pt.properties
+++ b/tim/prune/lang/prune-texts_pt.properties
@@ -82,7 +82,6 @@ function.sendtogps=Enviar dados para o GPS
function.exportkml=Exportar para KML
function.exportgpx=Exportar para GPX
function.exportpov=Exportar para POV
-function.exportsvg=Exportar para SVG
function.exportimage=Exportar imagem
function.editwaypointname=Editar nome do ponto
function.compress=Comprimir rota
@@ -118,7 +117,6 @@ function.mapillary=Procurar na Mapillary.com
function.downloadosm=Baixar dados OSM para a \u00e1rea
function.duplicatepoint=Duplicar ponto
function.setcolours=Definir cores
-function.setlinewidth=Definir espessura da linha
function.setlanguage=Definir idioma
function.connecttopoint=Conectar ao ponto
function.disconnectfrompoint=Desconectar do ponto
@@ -260,10 +258,6 @@ dialog.baseimage.zoom=N\u00edvel de amplia\u00e7\u00e3o
dialog.baseimage.incomplete=Imagem incompleta
dialog.baseimage.tiles=Ladrilhos
dialog.baseimage.size=Tamanho da imagem
-dialog.exportsvg.text=Selecione os par\u00e2metros para a exporta\u00e7\u00e3o para o SVG
-dialog.exportsvg.phi=\u00c2ngulo do azimute \u03d5
-dialog.exportsvg.theta=\u00c2ngulo da eleva\u00e7\u00e3o \u03b8
-dialog.exportsvg.gradients=Usar gradientes para sombreamento
dialog.exportimage.noimagepossible=Imagens de mapa precisam estar em cache no disco para serem usados por uma exporta\u00e7\u00e3o.
dialog.exportimage.drawtrack=Desenhar rota no mapa
dialog.exportimage.drawtrackpoints=Desenhar pontos da rota
@@ -378,8 +372,10 @@ dialog.gpsies.activity.motorbiking=Motocross
dialog.gpsies.activity.snowshoe=Snowshoeing
dialog.gpsies.activity.sailing=Sailing
dialog.gpsies.activity.skating=Patina\u00e7\u00e3o
+dialog.mapillary.nonefound=Nenhuma foto encontrada
dialog.wikipedia.column.name=Nome do artigo
dialog.wikipedia.column.distance=Dist\u00e2ncia
+dialog.wikipedia.nonefound=Nenhum artigo encontrado
dialog.correlate.notimestamps=N\u00e3o existem data-hora nos dados dos pontos, assim n\u00e3o h\u00e1 nada para correlacionar com as fotos
dialog.correlate.nouncorrelatedphotos=Existem fotos n\u00e3o correlacionadas.\nVoc\u00ea tem certeza de que deseja continuar?
dialog.correlate.nouncorrelatedaudios=Existem \u00e1udios n\u00e3o correlacionados.\nVoc\u00ea tem certeza de que deseja continuar?
@@ -453,11 +449,6 @@ dialog.about.systeminfo.povray=Povray instalado
dialog.about.systeminfo.exiftool=Exittool instalado
dialog.about.systeminfo.gpsbabel=Gpsbabel instalado
dialog.about.systeminfo.gnuplot=Gnuplot instalado
-dialog.about.systeminfo.exiflib=Biblioteca do Exif
-dialog.about.systeminfo.exiflib.internal=Interna
-dialog.about.systeminfo.exiflib.internal.failed=Interna (n\u00e3o encontrada)
-dialog.about.systeminfo.exiflib.external=Externa
-dialog.about.systeminfo.exiflib.external.failed=Externa (n\u00e3o encontrada)
dialog.about.yes=Sim
dialog.about.no=N\u00e3o
dialog.about.credits=Cr\u00e9ditos
@@ -542,7 +533,7 @@ dialog.diskcache.deleteall=Apagar todos os fundos
dialog.diskcache.deleted=Removidos %d arquivos do cache
dialog.deletefieldvalues.intro=Selecione o campo a remover para o intervalo atual
dialog.deletefieldvalues.nofields=N\u00e3o existem campos a remover para este intervalo
-dialog.setlinewidth.text=Insira a espessura das linhas para desenhar as rotas (1-4)
+dialog.displaysettings.linewidth=Espessura das linhas para desenhar as rotas (1-4)
dialog.downloadosm.desc=Confirmar a transfer\u00eancia de dados OSM brutos para a \u00e1rea especificada:
dialog.searchwikipedianames.search=Procurar por:
dialog.weather.location=Localiza\u00e7\u00e3o
@@ -785,7 +776,6 @@ wikipedia.lang=pt
openweathermap.lang=pt
webservice.peakfinder=Abrir Peakfinder.org
webservice.geohack=Abrir p\u00e1gina Geohack
-webservice.panoramio=Abrir mapa do Panoramio
# Cardinals for 3d plots
cardinal.n=N
@@ -843,7 +833,6 @@ error.jpegload.dialogtitle=Erro ao carregar fotos
error.jpegload.nofilesfound=Nenhum arquivo encontrado
error.jpegload.nojpegsfound=Nenhum arquivo jpeg encontrado
error.jpegload.nogpsfound=Nenhuma informa\u00e7\u00e3o de GPS encontrada
-error.jpegload.exifreadfailed=Falha ao ler informa\u00e7\u00f5es do Exif. Nenhuma informa\u00e7\u00e3o do Exif pode ser lida\nseja na biblioteca interna, seja na externa.
error.audioload.nofilesfound=Nenhum arquivo de \u00e1udio encontrado
error.gpsload.unknown=Erro desconhecido
error.undofailed.title=Falha ao desfazer
diff --git a/tim/prune/lang/prune-texts_ro.properties b/tim/prune/lang/prune-texts_ro.properties
index 46e0c58..b920ed2 100644
--- a/tim/prune/lang/prune-texts_ro.properties
+++ b/tim/prune/lang/prune-texts_ro.properties
@@ -38,7 +38,7 @@ menu.view.browser.yahoo=Harta Yahoo
menu.view.browser.bing=Harta Bing
menu.settings=Set\u0103ri
menu.settings.onlinemode=\u00cencarc\u0103 h\u0103r\u021bi
-menu.settings.antialias=Folose\u0219te antialiasing
+dialog.displaysettings.antialias=Folose\u0219te antialiasing
menu.settings.autosave=Salveaz\u0103 set\u0103rile automat la ie\u0219ire
menu.help=Ajutor
@@ -83,7 +83,6 @@ function.sendtogps=Trimite date spre GPS
function.exportkml=Export\u0103 \u00een fi\u015fier KML
function.exportgpx=Export\u0103 \u00een fi\u015fier GPX
function.exportpov=Export\u0103 \u00een fi\u015fier POV
-function.exportsvg=Export\u0103 \u00een fi\u015fier SVG
function.exportimage=Export\u0103 imagine
function.editwaypointname=Editeaz\u0103 nume waypoint
function.compress=Comprim\u0103 traseu
@@ -122,7 +121,6 @@ function.mapillary=Caut\u0103 fotografii \u00een Mapillary
function.downloadosm=Descarc\u0103 date OSM pentru zona traseului
function.duplicatepoint=Duplic\u0103 punctul
function.setcolours=Seteaz\u0103 culori
-function.setlinewidth=Seteaz\u0103 grosime linie
function.setlanguage=Seteaz\u0103 limb\u0103
function.connecttopoint=Conecteaz\u0103 la punct
function.disconnectfrompoint=Deconecteaz\u0103 de la punct
@@ -265,10 +263,6 @@ dialog.baseimage.zoom=Nivel de zoom
dialog.baseimage.incomplete=Imagine incomplet\u0103
dialog.baseimage.tiles=\u021aigle
dialog.baseimage.size=Dimensiunea imaginii
-dialog.exportsvg.text=Alege\u021bi parametrii pentru export SVG
-dialog.exportsvg.phi=Azimut \u03d5
-dialog.exportsvg.theta=\u00cenclina\u0163ie \u03b8
-dialog.exportsvg.gradients=Folose\u0219te gradien\u021bi pentru umbrire
dialog.exportimage.noimagepossible=Imaginile hart\u0103 trebuie sa fie salvate \u00een cache pe disc pentru a putea fi folosite la export.
dialog.exportimage.drawtrack=Deseneaz\u0103 traseu pe hart\u0103
dialog.exportimage.drawtrackpoints=Deseneaz\u0103 punctele traseului
@@ -463,11 +457,6 @@ dialog.about.systeminfo.povray=Povray instalat
dialog.about.systeminfo.exiftool=Exiftool instalat
dialog.about.systeminfo.gpsbabel=Gpsbabel instalat
dialog.about.systeminfo.gnuplot=Gnuplot instalat
-dialog.about.systeminfo.exiflib=Bibliotec\u0103 Exif
-dialog.about.systeminfo.exiflib.internal=Intern
-dialog.about.systeminfo.exiflib.internal.failed=Intern (absent)
-dialog.about.systeminfo.exiflib.external=Extern
-dialog.about.systeminfo.exiflib.external.failed=Extern (absent)
dialog.about.yes=Da
dialog.about.no=Nu
dialog.about.credits=Mul\u021bumiri
@@ -565,7 +554,7 @@ dialog.diskcache.deleteall=\u015eterge toate imaginile
dialog.diskcache.deleted=Au fost \u0219terse %d fi\u0219iere din cache
dialog.deletefieldvalues.intro=Alege\u021bi c\u00e2mpurile ce urmeaz\u0103 a fi \u0219terse din intervalul curent
dialog.deletefieldvalues.nofields=Nu poate fi \u0219ters nici un c\u00e2mp pentru intervalul dat
-dialog.setlinewidth.text=Introduce\u021bi grosimea liniilor ce vor fi desenate pentru trasee (1-3)
+dialog.displaysettings.linewidth=Introduce\u021bi grosimea liniilor ce vor fi desenate pentru trasee (1-3)
dialog.downloadosm.desc=Confirma\u021bi desc\u0103rcarea datelor brute OSM pentru zona specificat\u0103:
dialog.searchwikipedianames.search=Caut\u0103:
dialog.weather.location=Loca\u0163ie
@@ -813,7 +802,6 @@ wikipedia.lang=ro
openweathermap.lang=ro
webservice.peakfinder=Deschide Peakfinder.org
webservice.geohack=Deschide pagina Geohack
-webservice.panoramio=Deschide harta Panoramio
# Cardinals for 3d plots
cardinal.n=N
@@ -871,7 +859,6 @@ error.jpegload.dialogtitle=Eroare la \u00eenc\u0103rcarea fotografiilor
error.jpegload.nofilesfound=Nu a fost g\u0103sit niciun fi\u0219ier
error.jpegload.nojpegsfound=Nu a fost g\u0103sit niciun fi\u0219ier jpeg
error.jpegload.nogpsfound=\u00cen EXIF-ul fi\u0219ierelor JPEG nu a fost g\u0103sit\u0103 informa\u021bie GPS
-error.jpegload.exifreadfailed=Citirea informa\u021biei EXIF a e\u0219uat. Informa\u021bia EXIF nu poate fi citit\u0103 far\u0103 o bibliotec\u0103 extern\u0103 sau intern\u0103.
error.audioload.nofilesfound=Nu a fost g\u0103sit niciun clip audio.
error.gpsload.unknown=Eroare cu cauz\u0103 necunoscut\u0103
error.undofailed.title=Anularea a e\u0219uat
diff --git a/tim/prune/lang/prune-texts_ru.properties b/tim/prune/lang/prune-texts_ru.properties
index 6e6e8d7..e72acfa 100644
--- a/tim/prune/lang/prune-texts_ru.properties
+++ b/tim/prune/lang/prune-texts_ru.properties
@@ -1,17 +1,17 @@
# Text entries for the GpsPrune application
-# Russian entries thanks to Sergey, Roman
+# Russian entries thanks to Sergey, Roman, Valerij
# 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.recentfiles=\u041d\u0435\u0434\u0430\u0432\u043d\u0438\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.file.exit=\u0412\u044b\u0439\u0442\u0438
menu.online=\u041e\u043d\u043b\u0430\u0439\u043d
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.markrectangle=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435
+menu.track.markrectangle=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435
function.deletemarked=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
menu.range=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b
menu.range.all=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
@@ -20,7 +20,7 @@ menu.range.start=\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u
menu.range.end=\u041a\u043e\u043d\u0435\u0446 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
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.mergetracksegments=\u0421\u043e\u0435\u0434\u0438\u043d\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
@@ -36,19 +36,19 @@ 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=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\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\u0430
-menu.settings.antialias=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
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 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e
-menu.map.newpoint=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443
+menu.map.newpoint=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \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.autopan=\u0410\u0432\u0442\u043e\u0444\u043e\u043a\u0443\u0441 \u043d\u0430 \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 \u0448\u043a\u0430\u043b\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430
menu.map.editmode=\u0420\u0435\u0436\u0438\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
@@ -82,19 +82,18 @@ function.sendtogps=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432
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.exportimage=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u0301\u043d\u0438\u0435
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.marklifts=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u044a\u0451\u043c\u0438\u043d\u0438\u043a \u0432 \u0433\u043e\u0440\u0443
+function.marklifts=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u044a\u0451\u043c\u043d\u0438\u043a\u0438 \u0432 \u0433\u043e\u0440\u0443
function.deleterange=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
function.croptrack=\u041e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u0442\u0440\u0435\u043a
-function.interpolate=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u0435\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
+function.interpolate=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b
function.deletebydate=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0434\u0430\u0442\u0435
-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.rearrangewaypoints=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\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.addtimeoffset=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+function.addaltitudeoffset=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
+function.rearrangewaypoints=\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430
+function.convertnamestotimes=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u0443\u0442\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
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
@@ -102,32 +101,34 @@ 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.estimatetime=\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f
+function.estimatetime=\u0421\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f
function.learnestimationparams=\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
-function.autoplay=\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435
+function.autoplay=\u0410\u0432\u0442\u043e\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u0430
function.setmapbg=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443-\u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0443
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.selectsegment=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442
function.splitsegments=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0435\u043a \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b
function.sewsegments=\u0421\u043a\u043b\u0435\u0438\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0442\u0440\u0435\u043a\u0430 \u0432\u043e\u0435\u0434\u0438\u043d\u043e
+function.createmarkerwaypoints=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
function.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.downloadsrtm=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c STRM
+function.lookupsrtm=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438\u0437 SRTM
+function.downloadsrtm=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SRTM-\u0442\u0430\u0439\u043b\u044b
function.getwikipedia=\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u0412\u0438\u043a\u0438
function.searchwikipedianames=\u041f\u043e\u0438\u0441\u043a \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0412\u0438\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438
-function.searchopencachingde=\u041f\u043e\u0438\u0441\u043a OpenCaching.de
+function.searchosmpois=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 OSM
+function.searchopencachingde=\u041f\u043e\u0438\u0441\u043a \u0442\u0430\u0439\u043d\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 OpenCaching.de
function.mapillary=\u041f\u043e\u0438\u0441\u043a \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0444\u043e\u0442\u043e
-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.downloadosm=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c OSM \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c
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.setdisplaysettings=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f
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.correlatephotos=\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+function.rearrangephotos=\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\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
@@ -141,19 +142,20 @@ 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.saveconfig=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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
+function.managetilecache=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u044d\u0448\u0435\u043c
function.getweatherforecast=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u043d\u043e\u0437 \u043f\u043e\u0433\u043e\u0434\u044b
-function.setaltitudetolerance=\u0417\u0430\u0434\u0430\u0442\u044c \u043e\u0433\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
+function.setaltitudetolerance=\u0417\u0430\u0434\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
+function.selecttimezone=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441
# Dialogs
-dialog.exit.confirm.title=\u0412\u044b\u0445\u043e\u0434
+dialog.exit.confirm.title=\u0412\u044b\u0439\u0442\u0438
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.deletepoint.deletephoto=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u0441 \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.deleteaudio.deletepoint=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0443 \u044d\u0442\u043e\u0433\u043e \u0430\u0443\u0434\u0438\u043e \u0444\u0430\u0439\u043b\u0430?
@@ -174,6 +176,9 @@ dialog.openoptions.deliminfo.norecords=\u041d\u0435\u0442 \u0437\u0430\u043f\u04
dialog.openoptions.altitudeunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0432\u044b\u0441\u043e\u0442\u044b
dialog.openoptions.speedunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438
dialog.openoptions.vertspeedunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b
+dialog.openoptions.vspeed.intro=\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438:
+dialog.openoptions.vspeed.positiveup=\u041f\u043e\u0434\u044a\u0451\u043c\u0430
+dialog.openoptions.vspeed.positivedown=\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u044f
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
@@ -181,7 +186,7 @@ dialog.jpegload.subdirectories=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c
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.jpegload.progress=\u041f\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
@@ -193,10 +198,28 @@ dialog.gpssend.sendtracks=\u041f\u043e\u0441\u043b\u0430\u0442\u044c \u0442\u044
dialog.gpssend.trackname=\u0418\u043c\u044f \u0442\u0440\u0435\u043a\u0430
dialog.gpsbabel.filters=\u0424\u0438\u043b\u044c\u0442\u0440\u044b
dialog.addfilter.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440
+dialog.gpsbabel.filter.discard=\u041e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c
dialog.gpsbabel.filter.simplify=\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c
dialog.gpsbabel.filter.distance=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
dialog.gpsbabel.filter.interpolate=\u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f
+dialog.gpsbabel.filter.discard.intro=\u041e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438, \u0435\u0441\u043b\u0438
+dialog.gpsbabel.filter.discard.hdop=\u0423\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 >
+dialog.gpsbabel.filter.discard.vdop=\u0423\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 >
dialog.gpsbabel.filter.discard.numsats=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432 <
+dialog.gpsbabel.filter.discard.nofix=\u0422\u043e\u0447\u043a\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439
+dialog.gpsbabel.filter.discard.unknownfix=\u0422\u043e\u0447\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435
+dialog.gpsbabel.filter.simplify.intro=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0434\u043e
+dialog.gpsbabel.filter.simplify.maxpoints=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a <
+dialog.gpsbabel.filter.simplify.maxerror=\u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f <
+dialog.gpsbabel.filter.simplify.crosstrack=\u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043e\u043a
+dialog.gpsbabel.filter.simplify.length=\u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0434\u043b\u0438\u043d\u0435
+dialog.gpsbabel.filter.simplify.relative=\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e hdop
+dialog.gpsbabel.filter.distance.intro=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0442\u043e\u0447\u043a\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0431\u043b\u0438\u0437\u043a\u0438 \u043a \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0435
+dialog.gpsbabel.filter.distance.distance=\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <
+dialog.gpsbabel.filter.distance.time=\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f <
+dialog.gpsbabel.filter.interpolate.intro=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0442\u0440\u0435\u043a\u0430
+dialog.gpsbabel.filter.interpolate.distance=\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 >
+dialog.gpsbabel.filter.interpolate.time=\u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f >
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
@@ -207,7 +230,7 @@ dialog.save.coordinateunits=\u0415\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u0
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.overwrite.text=\u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\u0425\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)
@@ -215,9 +238,11 @@ dialog.exportkml.kmz=\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u043b\u044f kmz
dialog.exportkml.exportimages=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u044d\u0441\u043a\u0438\u0437\u0430 \u0432 kmz
dialog.exportkml.imagesize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f
dialog.exportkml.trackcolour=\u0426\u0432\u0435\u0442 \u0442\u0440\u0435\u043a\u0430
+dialog.exportkml.standardkml=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 KML
+dialog.exportkml.extendedkml=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 KML \u0441 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438
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.includetimestamps=\u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \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
@@ -233,7 +258,7 @@ dialog.exportpov.tubesandwalls=\u0422\u0440\u0443\u0431\u044b \u0438 \u0441\u044
dialog.3d.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.3d.useterrain=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u043b\u044c\u0435\u0444
dialog.3d.terraingridsize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0442\u043a\u0438
-dialog.exportpov.baseimage=\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u044b(\u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0438)
+dialog.exportpov.baseimage=\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u044b (\u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0430)
dialog.exportpov.cannotmakebaseimage=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043e\u0441\u043d\u043e\u0432\u044b
dialog.baseimage.title=\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b
dialog.baseimage.useimage=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435
@@ -242,10 +267,6 @@ dialog.baseimage.zoom=\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u04
dialog.baseimage.incomplete=\u041d\u0435 \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
dialog.baseimage.tiles=\u0422\u0430\u0439\u043b\u044b
dialog.baseimage.size=\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f
-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.exportimage.noimagepossible=\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a\u0430\u0440\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u043d\u0430 \u0434\u0438\u0441\u043a \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430
dialog.exportimage.drawtrack=\u0420\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435
dialog.exportimage.drawtrackpoints=\u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0442\u0440\u0435\u043a\u0430
@@ -255,15 +276,15 @@ dialog.pointtype.track=\u0422\u043e\u0447\u043a\u0438 \u0442\u0440\u0435\u043a\u
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.pointtype.selection=\u0422\u043e\u043b\u044c\u043a\u043e \u0432\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.confirmreversetrack.text=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\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\u0423\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.confirmcutandmove.text=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\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\u0423\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435?
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.interpolate.betweenwaypoints=\u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\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.pretext=\u0412\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
@@ -282,7 +303,7 @@ dialog.addtimeoffset.subtract=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \
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.addtimeoffset.notimestamps=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \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
@@ -306,7 +327,7 @@ 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.intro=\u041a\u0440\u0430\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
@@ -324,8 +345,13 @@ dialog.estimatetime.parameters.timefor=\u0412\u0440\u0435\u043c\u044f \u0434\u04
dialog.estimatetime.results=\u0412\u043e\u0442:
dialog.estimatetime.results.estimatedtime=\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f
dialog.estimatetime.results.actualtime=\u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f
+dialog.estimatetime.error.nodistance=\u0420\u0430\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0442\u0440\u0435\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435
dialog.estimatetime.error.noaltitudes=\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0432\u044b\u0441\u043e\u0442\u0435
-dialog.learnestimationparams.averageerror=\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043e\u0448\u0438\u0431\u043a\u0430 (%)
+dialog.learnestimationparams.intro=\u042d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u043a\u0443
+dialog.learnestimationparams.averageerror=\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c (%)
+dialog.learnestimationparams.combine=\u042d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438
+dialog.learnestimationparams.combinedresults=\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b
+dialog.learnestimationparams.weight.100pccurrent=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
dialog.learnestimationparams.weight.current=\u0442\u0435\u043a\u0443\u0449\u0435\u0435
dialog.learnestimationparams.weight.calculated=\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435
dialog.learnestimationparams.weight.50pc=\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e
@@ -355,9 +381,16 @@ dialog.gpsies.activity.motorbiking=\u041d\u0430 \u043c\u043e\u0442\u043e\u0446\u
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.mapillary.nonefound=\u0424\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
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.wikipedia.nonefound=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438
+dialog.wikipedia.gallery=\u0413\u0430\u043b\u0435\u0440\u0435\u044f
+dialog.osmpois.column.name=\u0418\u043c\u044f
+dialog.osmpois.column.type=\u0422\u0438\u043f
+dialog.osmpois.nonefound=\u0422\u043e\u0447\u0435\u043a \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
+dialog.geocaching.nonefound=\u0422\u0430\u0439\u043d\u0438\u043a\u043e\u0432 \u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
+dialog.correlate.notimestamps=\u041d\u0435\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.nouncorrelatedaudios=\u041d\u0435\u0442 \u043d\u0435\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.\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
@@ -390,6 +423,7 @@ 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.rearrangewaypoints.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 \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
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.rearrange.tostart=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e
dialog.rearrange.toend=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0435\u0446
@@ -400,12 +434,12 @@ dialog.rearrange.sortbyname=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u04
dialog.rearrange.sortbytime=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438
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.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.title=\u0421\u0436\u0430\u0442\u0438\u0435 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0414\u0443\u0433\u043b\u0430\u0441\u0430-\u041f\u0435\u043a\u0435\u0440\u0430
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.compress.confirm=%d \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b.\n\u0427\u0442\u043e\u0431\u044b \u0438\u0445 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043c\u0435\u043d\u044e \u0422\u0440\u0435\u043a->\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438
@@ -413,15 +447,15 @@ dialog.compress.confirmnone=\u043d\u0435\u0442 \u043f\u043e\u043c\u0435\u0447\u0
dialog.deletemarked.nonefound=\u041d\u0435\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \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.pastecoordinates.nothingfound=\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437
dialog.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://gpsprune.activityworkshop.net/
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.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 https://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.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, \u0412\u0430\u043b\u0435\u0440\u0438\u0439 \u0420\u043e\u043c\u0430\u043d\u043e\u0432\u0441\u043a\u0438\u0439
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
@@ -430,11 +464,6 @@ dialog.about.systeminfo.povray=Povray \u0443\u0441\u0442\u0430\u043d\u043e\u0432
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
@@ -454,7 +483,7 @@ 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://gpsprune.activityworkshop.net/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.intro=\u0412\u043c\u0435\u0441\u0442\u043e \u043c\u044b\u0448\u0438 \u043c\u043e\u0436\u043d\u043e \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
@@ -495,16 +524,29 @@ dialog.colourchooser.title=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u04
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.colourer.intro=\u0422\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0442\u0440\u0435\u043a\u043e\u0432
+dialog.colourer.type=\u0422\u0438\u043f \u043e\u043a\u0440\u0430\u0441\u043a\u0438
+dialog.colourer.type.none=\u041d\u0435\u0442
+dialog.colourer.type.byfile=\u041f\u043e \u0444\u0430\u0439\u043b\u0443
+dialog.colourer.type.bysegment=\u041f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443
+dialog.colourer.type.byaltitude=\u041f\u043e \u0432\u044b\u0441\u043e\u0442\u0435
+dialog.colourer.type.byspeed=\u041f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438
+dialog.colourer.type.byvertspeed=\u041f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438
+dialog.colourer.type.bygradient=\u041f\u043e \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0443
+dialog.colourer.type.bydate=\u041f\u043e \u0434\u0430\u0442\u0435
+dialog.colourer.start=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
+dialog.colourer.end=\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
+dialog.colourer.maxcolours=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0432\u0435\u0442\u043e\u0432
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=\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u043d\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 GpsPrune .
+dialog.setlanguage.secondintro=\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c 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.setlanguage.endmessagewithautosave=\u041f\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.dir=\u041f\u0430\u043f\u043a\u0430 \u043a\u044d\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.nocreate=\u041f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043a\u044d\u0448\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430
dialog.diskcache.cannotwrite=\u0422\u0430\u0439\u043b\u044b \u043a\u0430\u0440\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435
dialog.diskcache.table.path=\u041f\u0443\u0442\u044c
dialog.diskcache.table.usedby=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f
@@ -519,7 +561,17 @@ dialog.diskcache.deleteall=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u04
dialog.diskcache.deleted=\u0423\u0434\u0430\u043b\u0435\u043d\u043e %d \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.deletefieldvalues.nofields=\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043d\u0435\u0442 \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f
-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.displaysettings.linewidth=\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.displaysettings.antialias=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
+dialog.displaysettings.waypointicons=\u0417\u043d\u0430\u0447\u043a\u0438 \u043f\u0443\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a
+dialog.displaysettings.wpicon.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+dialog.displaysettings.wpicon.ringpt=\u041a\u0440\u0443\u0433\u043b\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440
+dialog.displaysettings.wpicon.plectrum=\u041c\u0435\u0434\u0438\u0430\u0442\u043e\u0440
+dialog.displaysettings.wpicon.ring=\u041a\u0440\u0443\u0433
+dialog.displaysettings.wpicon.pin=\u0417\u0430\u043a\u043e\u043b\u043a\u0430
+dialog.displaysettings.size.small=\u041c\u0430\u043b\u044b\u0439
+dialog.displaysettings.size.medium=\u0421\u0440\u0435\u0434\u043d\u0438\u0439
+dialog.displaysettings.size.large=\u0411\u043e\u043b\u044c\u0448\u043e\u0439
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:
dialog.weather.location=\u041c\u0435\u0441\u0442\u043e
@@ -544,6 +596,21 @@ dialog.weather.wind=\u0412\u0435\u0442\u0435\u0440
dialog.weather.temp=\u0422\u00b0
dialog.weather.humidity=\u0412\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u044c
dialog.weather.creditnotice=\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 openweathermap.org.
+dialog.deletebydate.onlyonedate=\u0423 \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0434\u0430\u0442\u0430.
+dialog.deletebydate.intro=\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0430\u0442\u044b \u0432 \u0442\u0440\u0435\u043a\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438
+dialog.deletebydate.nodate=\u041d\u0435\u0442 \u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+dialog.deletebydate.column.keep=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c
+dialog.deletebydate.column.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+dialog.setaltitudetolerance.text.metres=\u041f\u0440\u0435\u0434\u0435\u043b (\u0432 \u043c\u0435\u0442\u0440\u0430\u0445), \u043d\u0438\u0436\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u043e\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u0443\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f
+dialog.setaltitudetolerance.text.feet=\u041f\u0440\u0435\u0434\u0435\u043b (\u0432 \u0444\u0443\u0442\u0430\u0445), \u043d\u0438\u0436\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u043e\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u0443\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f
+dialog.settimezone.intro=\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a \u0442\u043e\u0447\u0435\u043a
+dialog.settimezone.system=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441
+dialog.settimezone.custom=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441:
+dialog.settimezone.list.toomany=\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430
+dialog.settimezone.selectedzone=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441
+dialog.settimezone.offsetfromutc=\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e UTC
+dialog.autoplay.duration=\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u0441\u0435\u043a.)
+dialog.autoplay.usetimestamps=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0442\u043e\u0447\u043a\u0438
dialog.autoplay.rewind=\u041d\u0430\u0437\u0430\u0434
dialog.autoplay.pause=\u0414\u0435\u0301\u043b\u0430\u0442\u044c \u043f\u0430\u0301\u0443\u0437\u0443
dialog.autoplay.play=\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438
@@ -590,11 +657,15 @@ confirm.downloadsrtm.1=\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e %d
confirm.downloadsrtm.none=\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0436\u0435 \u0432 \u043a\u044d\u0448\u0435
confirm.deletefieldvalues=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u044b
confirm.audioload=\u0424\u0430\u0439\u043b\u044b \u0437\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b
-confirm.correlateaudios.single=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430
+confirm.correlateaudios.single=\u0417\u0432\u0443\u043a\u043e\u0437\u0430\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430
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
# Tips, shown just once when appropriate
tip.title=\u0421\u043e\u0432\u0435\u0442
+tip.useamapcache=\u041f\u0443\u0442\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u044d\u0448\u0430 \u0434\u0438\u0441\u043a\u0430 (\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -> \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a\u00bb)\n\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a.
+tip.learntimeparams=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\n\u0422\u0440\u0435\u043a->\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u043a\u0438.
+tip.downloadsrtm=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e, \u0432\u044b\u0437\u043e\u0432\u043e\u043c\n\u041e\u043d\u043b\u0430\u0439\u043d-> \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SRTM-\u0442\u0430\u0439\u043b\u044b\n\u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u044d\u0448\u0435 \u043a\u0430\u0440\u0442\u044b.
+tip.usesrtmfor3d=\u042d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0441\u043e\u0442.\n\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SRTM, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442 \u0434\u043b\u044f \u0432\u0438\u0434\u0430 3D.
tip.manuallycorrelateone=\u041f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.
# Buttons
@@ -607,7 +678,7 @@ button.overwrite=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0
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.edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-button.exit=\u0412\u044b\u0445\u043e\u0434
+button.exit=\u0412\u044b\u0439\u0442\u0438
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
@@ -622,7 +693,7 @@ button.preview=\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u044
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 \u0432\u0435\u0431\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443
+button.showwebpage=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0431-\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=\u041e\u0431\u0437\u043e\u0440...
@@ -754,7 +825,6 @@ wikipedia.lang=ru
openweathermap.lang=ru
webservice.peakfinder=\u041e\u0442\u043a\u0440\u044b\u0442\u044c Peakfinder.org
webservice.geohack=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 Geohack
-webservice.panoramio=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u0440\u0442\u0443 Panoramio
# Cardinals for 3d plots
cardinal.n=\u0421\u0435\u0432\u0435\u0440
@@ -812,7 +882,6 @@ error.jpegload.dialogtitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u04
error.jpegload.nofilesfound=\u0424\u0430\u0439\u043b\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b
error.jpegload.nojpegsfound=JPEG-\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
@@ -822,9 +891,9 @@ error.rearrange.noop=\u041f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u043
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.
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.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.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\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.
@@ -836,4 +905,7 @@ error.playaudiofailed=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0441\u0
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
+error.learnestimationparams.failed=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430.\n\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0440\u0435\u043a\u0438.
error.tracksplit.nosplit=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0435\u043a
+error.downloadsrtm.nocache=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b.\n\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u044d\u0448 \u0434\u0438\u0441\u043a\u0430.
+error.sewsegments.nothingdone=\u041d\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0448\u0438\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u0435.\n\u0412 \u0442\u0440\u0435\u043a\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 %d \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432.
diff --git a/tim/prune/lang/prune-texts_sv.properties b/tim/prune/lang/prune-texts_sv.properties
index 59a84af..7b227d2 100644
--- a/tim/prune/lang/prune-texts_sv.properties
+++ b/tim/prune/lang/prune-texts_sv.properties
@@ -82,7 +82,6 @@ function.sendtogps=Skicka till GPS
function.exportkml=Exportera KML
function.exportgpx=Exportera GPX
function.exportpov=Exportera POV
-function.exportsvg=Exportera SVG
function.exportimage=Exportera bildfil
function.editwaypointname=Redigera namn p\u00e5 waypoint
function.compress=Komprimera sp\u00e5r
diff --git a/tim/prune/lang/prune-texts_uk.properties b/tim/prune/lang/prune-texts_uk.properties
index ddfb0ac..212edf4 100644
--- a/tim/prune/lang/prune-texts_uk.properties
+++ b/tim/prune/lang/prune-texts_uk.properties
@@ -81,7 +81,6 @@ function.sendtogps=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\
function.exportkml=\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 KML
function.exportgpx=\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 GPX
function.exportpov=\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 POV
-function.exportsvg=\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 SVG
function.exportimage=\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f
function.editwaypointname=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0456\u043c\u2019\u044f \u0448\u043b\u044f\u0445\u043e\u0432\u043e\u0457 \u0442\u043e\u0447\u043a\u0438
function.compress=\u0421\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u0442\u0440\u0435\u043a
@@ -116,7 +115,6 @@ function.searchwikipedianames=\u041f\u043e\u0448\u0443\u043a \u0441\u0442\u0430\
function.downloadosm=\u0417\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 OSM-\u0434\u0430\u043d\u0456 \u043d\u0430 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0456\u044e
function.duplicatepoint=\u041a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438 \u0442\u043e\u0447\u043a\u0443 \u0432 \u043a\u0456\u043d\u0435\u0446\u044c \u0442\u0440\u0435\u043a\u0443
function.setcolours=\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438
-function.setlinewidth=\u0417\u0430\u0434\u0430\u0442\u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u043b\u0456\u043d\u0456\u0457
function.setlanguage=\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043c\u043e\u0432\u0443
function.connecttopoint=\u041f\u0440\u0438\u043a\u0440\u0456\u043f\u0438\u0442\u0438 \u0434\u043e \u0442\u043e\u0447\u043a\u0438
function.disconnectfrompoint=\u0412\u0456\u0434\u043a\u0440\u0456\u043f\u0438\u0442\u0438 \u0432\u0456\u0434 \u0442\u043e\u0447\u043a\u0438
diff --git a/tim/prune/lang/prune-texts_zh.properties b/tim/prune/lang/prune-texts_zh.properties
index a2344e4..d1c1282 100644
--- a/tim/prune/lang/prune-texts_zh.properties
+++ b/tim/prune/lang/prune-texts_zh.properties
@@ -81,7 +81,6 @@ function.sendtogps=\u53d1\u9001\u81f3GPS
function.exportkml=\u8f93\u51faKML\u6587\u4ef6
function.exportgpx=\u8f93\u51faGPX\u6587\u4ef6
function.exportpov=\u8f93\u51faPOV\u6587\u4ef6
-function.exportsvg=\u8f93\u51faSVG\u6587\u4ef6
function.exportimage=\u8f93\u51fa\u56fe\u50cf
function.editwaypointname=\u7f16\u8f91\u822a\u70b9\u540d
function.compress=\u538b\u7f29\u8f68\u8ff9(\u6807\u8bb0\u8981\u5220\u9664\u822a\u70b9)
@@ -116,7 +115,6 @@ function.searchwikipedianames=\u6309\u540d\u5b57\u4ece\u7ef4\u57fa\u767e\u79d1\u
function.downloadosm=\u4e0b\u8f7d\u6b64\u5730OSM\u6570\u636e
function.duplicatepoint=\u590d\u5236\u70b9
function.setcolours=\u8bbe\u7f6e\u989c\u8272
-function.setlinewidth=\u8bbe\u7f6e\u7ebf\u4f53\u5bbd\u5ea6
function.setlanguage=\u8bbe\u7f6e\u8bed\u8a00
function.connecttopoint=\u94fe\u63a5\u5230\u5f53\u524d\u70b9
function.disconnectfrompoint=\u64a4\u9500\u94fe\u63a5
@@ -259,10 +257,6 @@ dialog.baseimage.zoom=\u7f29\u653e\u7ea7\u522b
dialog.baseimage.incomplete=\u56fe\u50cf\u4e0d\u5b8c\u6574
dialog.baseimage.tiles=\u5730\u56fe\u5757
dialog.baseimage.size=\u56fe\u50cf\u5c3a\u5bf8
-dialog.exportsvg.text=\u9009\u62e9\u8f93\u51faSVG\u6587\u4ef6\u7684\u53c2\u6570
-dialog.exportsvg.phi=\u65b9\u4f4d\u89d2
-dialog.exportsvg.theta=\u4ef0\u89d2
-dialog.exportsvg.gradients=\u4f7f\u7528\u6e10\u53d8\u8272
dialog.exportimage.noimagepossible=\u8f93\u51fa\u7684\u5730\u56fe\u56fe\u50cf\u9996\u5148\u9700\u8981\u7f13\u5b58\u5728\u672c\u5730\u78c1\u76d8\u4e0a
dialog.exportimage.drawtrack=\u7ed8\u51fa\u8f68\u8ff9
dialog.exportimage.drawtrackpoints=\u7ed8\u51fa\u5404\u8f68\u8ff9\u70b9
@@ -442,8 +436,8 @@ dialog.help.help=\u66f4\u591a\u4fe1\u606f\u548c\u7528\u6cd5\uff0c\u8bf7\u53c2\u8
dialog.about.version=\u7248\u672c
dialog.about.build=Build
dialog.about.summarytext1=GpsPrune\u662f\u4e00\u4e2a\u4eceGPS\u4e2d\u5bfc\u5165\u6570\u636e\uff0c\u663e\u793a\u6570\u636e\u548c\u7f16\u8f91\u6570\u636e\u7684\u8f6f\u4ef6
-dialog.about.summarytext2=\u5b83\u7684\u53d1\u884c\u662f\u57fa\u4e8eGnu GPL\u89c4\u5219\uff0c\u662f\u514d\u8d39\u7684\uff0c\u5f00\u653e\u5f0f\u7684\uff0c\u5168\u4e16\u754c\u5171\u7528\u5e76\u6539\u5584\u589e\u5f3a\u5176\u529f\u80fd\n\u5728\u7b26\u5408"license.txt"\u6761\u4ef6\u4e0b\uff0c\u5bb9\u8bb8\u5e76\u9f13\u52b1\u590d\u5236\uff0c\u5206\u53d1\u53ca\u4fee\u6539\u3002
-dialog.about.summarytext3=\u66f4\u591a\u4fe1\u606f\u53ca\u7528\u6cd5\u6307\u5357\uff0c\u8bf7\u53c2\u8003\u7f51\u7ad9\uff1a\nhttp:activityworkshop.net/
+dialog.about.summarytext2=\u5b83\u7684\u53d1\u884c\u662f\u57fa\u4e8eGnu GPL\u89c4\u5219\uff0c\u662f\u514d\u8d39\u7684\uff0c\u5f00\u653e\u5f0f\u7684\uff0c\u5168\u4e16\u754c\u5171\u7528\u5e76\u6539\u5584\u589e\u5f3a\u5176\u529f\u80fd
\u5728\u7b26\u5408"license.txt"\u6761\u4ef6\u4e0b\uff0c\u5bb9\u8bb8\u5e76\u9f13\u52b1\u590d\u5236\uff0c\u5206\u53d1\u53ca\u4fee\u6539\u3002
+dialog.about.summarytext3=\u66f4\u591a\u4fe1\u606f\u53ca\u7528\u6cd5\u6307\u5357\uff0c\u8bf7\u53c2\u8003\u7f51\u7ad9\uff1a
http:activityworkshop.net/
dialog.about.languages=\u652f\u6301\u8bed\u8a00
dialog.about.translatedby=\u4e2d\u6587\u7ffb\u8bd1\uff1a\u9ed1\u8001\u9648 (Sam Chen)
dialog.about.systeminfo=\u7cfb\u7edf\u4fe1\u606f
@@ -454,11 +448,6 @@ dialog.about.systeminfo.povray=Povray \u662f\u5426\u5b89\u88c5
dialog.about.systeminfo.exiftool=Exiftool \u662f\u5426\u5b89\u88c5
dialog.about.systeminfo.gpsbabel=Gpsbabel \u662f\u5426\u5b89\u88c5
dialog.about.systeminfo.gnuplot=Gnuplot \u662f\u5426\u5b89\u88c5
-dialog.about.systeminfo.exiflib=Exif \u5e93
-dialog.about.systeminfo.exiflib.internal=\u5185\u90e8
-dialog.about.systeminfo.exiflib.internal.failed=\u5185\u90e8(\u672a\u627e\u5230)
-dialog.about.systeminfo.exiflib.external=\u5916\u90e8
-dialog.about.systeminfo.exiflib.external.failed=\u5916\u90e8(\u672a\u627e\u5230)
dialog.about.yes=\u662f
dialog.about.no=\u5426
dialog.about.credits=\u81f4\u8c22
@@ -556,7 +545,7 @@ dialog.diskcache.deleteall=\u5220\u9664\u6240\u6709\u5730\u56fe\u5757
dialog.diskcache.deleted=\u5df2\u5220\u9664 %d \u7f13\u5b58\u5185\u6587\u4ef6
dialog.deletefieldvalues.intro=\u9009\u62e9\u5f53\u524d\u8303\u56f4\u5185\u8981\u5220\u9664\u7684\u5b57\u6bb5
dialog.deletefieldvalues.nofields=\u9009\u5b9a\u8303\u56f4\u5185\u6ca1\u6709\u8981\u5220\u9664\u7684\u5b57\u6bb5
-dialog.setlinewidth.text=\u8f93\u5165\u8f68\u8ff9\u7ebf\u5bbd\u50cf\u7d20\u503c(1-4)
+dialog.displaysettings.linewidth=\u8f93\u5165\u8f68\u8ff9\u7ebf\u5bbd\u50cf\u7d20\u503c(1-4)
dialog.downloadosm.desc=\u786e\u8ba4\u4eceOSM\u4e0b\u8f7d\u8be5\u5730\u533a\u539f\u59cb\u6570\u636e:
dialog.searchwikipedianames.search=\u67e5\u627e:
dialog.weather.location=\u5730\u70b9
@@ -853,7 +842,6 @@ error.jpegload.dialogtitle=\u5bfc\u5165\u7167\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\n\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
diff --git a/tim/prune/load/FieldGuesser.java b/tim/prune/load/FieldGuesser.java
index c76318d..970926b 100644
--- a/tim/prune/load/FieldGuesser.java
+++ b/tim/prune/load/FieldGuesser.java
@@ -4,7 +4,7 @@ import tim.prune.I18nManager;
import tim.prune.data.Field;
import tim.prune.data.Latitude;
import tim.prune.data.Longitude;
-import tim.prune.data.Timestamp;
+import tim.prune.data.TimestampUtc;
/**
* Class to try to match data with field names,
@@ -317,7 +317,7 @@ public abstract class FieldGuesser
{
// must be at least 7 characters long
if (inValue.length() < 7) {return false;}
- Timestamp stamp = new Timestamp(inValue);
+ TimestampUtc stamp = new TimestampUtc(inValue);
return stamp.isValid();
}
}
diff --git a/tim/prune/load/FileLoader.java b/tim/prune/load/FileLoader.java
index cf60f9e..52bdef2 100644
--- a/tim/prune/load/FileLoader.java
+++ b/tim/prune/load/FileLoader.java
@@ -137,7 +137,7 @@ public class FileLoader
else if (fileExtension.equals(".jpg") || fileExtension.equals("jpeg"))
{
Photo photo = JpegLoader.createPhoto(inFile);
- TreeSet photoSet = new TreeSet();
+ TreeSet photoSet = new TreeSet(new MediaSorter());
photoSet.add(photo);
_app.informPhotosLoaded(photoSet);
_app.informNoDataLoaded(); // To trigger load of next file if any
diff --git a/tim/prune/load/JpegLoader.java b/tim/prune/load/JpegLoader.java
index 672cd02..3e22eba 100644
--- a/tim/prune/load/JpegLoader.java
+++ b/tim/prune/load/JpegLoader.java
@@ -14,15 +14,16 @@ import tim.prune.I18nManager;
import tim.prune.config.Config;
import tim.prune.data.Altitude;
import tim.prune.data.DataPoint;
-import tim.prune.data.Field;
import tim.prune.data.LatLonRectangle;
import tim.prune.data.Latitude;
import tim.prune.data.Longitude;
import tim.prune.data.Photo;
import tim.prune.data.Timestamp;
+import tim.prune.data.TimestampLocal;
+import tim.prune.data.TimestampUtc;
import tim.prune.data.UnitSetLibrary;
import tim.prune.function.Cancellable;
-import tim.prune.jpeg.ExifGateway;
+import tim.prune.jpeg.InternalExifLibrary;
import tim.prune.jpeg.JpegData;
/**
@@ -224,7 +225,7 @@ public class JpegLoader implements Runnable, Cancellable
// Create Photo object
Photo photo = new Photo(inFile);
// Try to get information out of exif
- JpegData jpegData = ExifGateway.getJpegData(inFile);
+ JpegData jpegData = new InternalExifLibrary().getJpegData(inFile);
Timestamp timestamp = null;
if (jpegData != null)
{
@@ -253,12 +254,12 @@ public class JpegLoader implements Runnable, Cancellable
}
// Use file timestamp if exif timestamp isn't available
if (timestamp == null) {
- timestamp = new Timestamp(inFile.lastModified());
+ timestamp = new TimestampUtc(inFile.lastModified());
}
// Apply timestamp to photo and its point (if any)
photo.setTimestamp(timestamp);
if (photo.getDataPoint() != null) {
- photo.getDataPoint().setFieldValue(Field.TIMESTAMP, timestamp.getText(Timestamp.Format.ISO8601), false);
+ // photo.getDataPoint().setFieldValue(Field.TIMESTAMP, timestamp.getText(Timestamp.Format.ISO8601), false);
}
return photo;
}
@@ -355,7 +356,7 @@ public class JpegLoader implements Runnable, Cancellable
if (inDate == null || inTime == null || inDate.length != 3 || inTime.length != 3) {
return null;
}
- return new Timestamp(inDate[0], inDate[1], inDate[2],
+ return new TimestampLocal(inDate[0], inDate[1], inDate[2],
inTime[0], inTime[1], inTime[2]);
}
@@ -370,7 +371,7 @@ public class JpegLoader implements Runnable, Cancellable
Timestamp stamp = null;
try
{
- stamp = new Timestamp(Integer.parseInt(inStamp.substring(0, 4)),
+ stamp = new TimestampLocal(Integer.parseInt(inStamp.substring(0, 4)),
Integer.parseInt(inStamp.substring(5, 7)),
Integer.parseInt(inStamp.substring(8, 10)),
Integer.parseInt(inStamp.substring(11, 13)),
diff --git a/tim/prune/load/TextFileLoader.java b/tim/prune/load/TextFileLoader.java
index 8fd30b2..b4a0ca8 100644
--- a/tim/prune/load/TextFileLoader.java
+++ b/tim/prune/load/TextFileLoader.java
@@ -440,6 +440,11 @@ public class TextFileLoader
_vSpeedUnitsDropdown.addItem(I18nManager.getText(spUnit.getNameKey()));
}
vSpeedGrid.add(_vSpeedUnitsDropdown);
+ final String vSpeedLabelText = I18nManager.getText("dialog.openoptions.vspeed.intro");
+ if (!vSpeedLabelText.isEmpty()) {
+ vSpeedGrid.add(new JLabel(vSpeedLabelText));
+ vSpeedGrid.add(new JLabel(""));
+ }
_vSpeedUpwardsRadio = new JRadioButton(I18nManager.getText("dialog.openoptions.vspeed.positiveup"));
JRadioButton vSpeedDownwardsRadio = new JRadioButton(I18nManager.getText("dialog.openoptions.vspeed.positivedown"));
ButtonGroup vSpeedDirGroup = new ButtonGroup();
diff --git a/tim/prune/readme.txt b/tim/prune/readme.txt
index c8120c1..780ecc0 100644
--- a/tim/prune/readme.txt
+++ b/tim/prune/readme.txt
@@ -1,11 +1,11 @@
-GpsPrune version 18.6
-=====================
+GpsPrune version 19
+===================
GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
including format conversion, charting, 3d visualisation, audio and photo correlation, and online resource lookup.
Full details can be found at https://gpsprune.activityworkshop.net/
-GpsPrune is copyright 2006-2016 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
+GpsPrune is copyright 2006-2018 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
You may freely use the software, and may help others to freely use it too. For further information
on your rights and how they are protected, see the included license.txt file.
@@ -17,7 +17,7 @@ Running
=======
To run GpsPrune from the jar file, simply call it from a command prompt or shell:
- java -jar gpsprune_18.6.jar
+ java -jar gpsprune_19.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,49 +25,28 @@ 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_18.6.jar --lang=DE
+ java -jar gpsprune_19.jar --lang=DE
-New with version 18.6
-=====================
-The following fix was made since version 18.5:
- - Change of URL for SRTM tiles, and recognise when downloaded file is too small to be valid
-
-New with version 18.5
-=====================
-The following fixes and additions were made since version 18.4:
- - When points have no altitudes, send them to a GPS with altitude 0 (prevents weird values when reading back)
- - When points are not displayed on map, still colour the lines according to the selected scheme
- - When points all have crazy values, don't hang the profile chart
- - When images can't be fetched from the internet, don't delete expired cache images
- - Translation updates to es, uk, ru, cz
-
-New with version 18.4
-=====================
-The following fixes and additions were made since version 18.3:
- - Updated GPSBabel format descriptions (thanks, Juergen!)
- - Removed calls to the retired opencaching.com site (thanks, Garmin!)
-
-New with version 18.3
-=====================
-The following fixes and additions were made since version 18.2:
- - Fix for saving track names and descriptions containing ampersands in xml formats (thanks, Joe!)
- - Additional window icon sizes (thanks, Sebastic!)
- - Remember window size
-
-New with version 18.2
-=====================
-The following fixes and additions were made since version 18.1:
- - Fix for saving point names containing ampersands in gpx, kml, kmz formats (thanks, Joe!)
- - Minor translation updates to nl, it, pl
-
-New with version 18.1
-=====================
+New with version 19
+===================
The following fixes and additions were made since version 18:
- Fix for duration rounding bug affecting sub-second timestamps
- Wikipedia search now also includes galleries from wikimedia
- Photo popup window now gets updated when the track selection changes
- - Small improvements to Ukrainian, Dutch translations
+ - Remove export to SVG function as it has fallen behind the java3d and pov options
+ - Remove Turkish language because there haven't been any translators since early 2010
+ - Function to add waypoints along the track at intervals of distance or time (eg every 5 km)
+ - Optionally draw arrows on the track lines to show direction of travel
+ - Waypoint rendering using icons (wishlist 71)
+ - Allow user to select timezone in which timestamps are displayed (wishlist 61)
+ - Provide call to geonames.org's OSM node search function, to find amenities (like bus stops) close to the current point
+ - Fix OSM download function using overpass API
+ - Fix opencyclemap URLs
+ - Fix reading of Exif data for some unusual cases (from Adobe Lightroom?)
+ - Remove Panoramio
+ - Update wikimedia catalogue
+ - Debian and Ubuntu packages no longer rely on external libmetadata jar
New with version 18
===================
diff --git a/tim/prune/save/FileSaver.java b/tim/prune/save/FileSaver.java
index 1e199d9..45af83e 100644
--- a/tim/prune/save/FileSaver.java
+++ b/tim/prune/save/FileSaver.java
@@ -604,7 +604,7 @@ public class FileSaver
if (inPoint.hasTimestamp())
{
// format value accordingly
- inBuffer.append(inPoint.getTimestamp().getText(inTimestampFormat));
+ inBuffer.append(inPoint.getTimestamp().getText(inTimestampFormat, null));
}
}
else if (inField == Field.MEDIA_FILENAME)
diff --git a/tim/prune/save/GpxExporter.java b/tim/prune/save/GpxExporter.java
index 7cac01c..39b6a36 100644
--- a/tim/prune/save/GpxExporter.java
+++ b/tim/prune/save/GpxExporter.java
@@ -541,7 +541,7 @@ public class GpxExporter extends GenericFunction implements Runnable
source = replaceGpxTags(source, "lat=\"", "\"", inPoint.getLatitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT));
source = replaceGpxTags(source, "lon=\"", "\"", inPoint.getLongitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT));
source = replaceGpxTags(source, "", "", inPoint.getAltitude().getStringValue(UnitSetLibrary.UNITS_METRES));
- source = replaceGpxTags(source, "", inPoint.getTimestamp().getText(Timestamp.Format.ISO8601));
+ source = replaceGpxTags(source, "", inPoint.getTimestamp().getText(Timestamp.Format.ISO8601, null));
if (inPoint.isWaypoint())
{
source = replaceGpxTags(source, "", "", XmlUtils.fixCdata(inPoint.getWaypointName()));
@@ -693,7 +693,7 @@ public class GpxExporter extends GenericFunction implements Runnable
if (inPoint.hasTimestamp() && inSettings.getExportTimestamps())
{
inWriter.write("\t\t\n");
}
// write waypoint name after elevation and time
@@ -762,7 +762,7 @@ public class GpxExporter extends GenericFunction implements Runnable
if (inPoint.hasTimestamp() && inSettings.getExportTimestamps())
{
inWriter.write("\t\t\t\t\n");
}
// photo, audio
diff --git a/tim/prune/save/ImageExporter.java b/tim/prune/save/ImageExporter.java
index f3383fe..ea18892 100644
--- a/tim/prune/save/ImageExporter.java
+++ b/tim/prune/save/ImageExporter.java
@@ -40,6 +40,8 @@ import tim.prune.gui.colour.PointColourer;
import tim.prune.gui.map.MapSource;
import tim.prune.gui.map.MapSourceLibrary;
import tim.prune.gui.map.MapUtils;
+import tim.prune.gui.map.WpIconDefinition;
+import tim.prune.gui.map.WpIconLibrary;
import tim.prune.load.GenericFileFilter;
import tim.prune.threedee.ImageDefinition;
@@ -331,18 +333,33 @@ public class ImageExporter extends GenericFunction implements BaseImageConsumer
// Now the waypoints
final Color textColour = Config.getColourScheme().getColour(ColourScheme.IDX_TEXT);
g.setColor(textColour);
+ WpIconDefinition wpIconDefinition = null;
+ final int wpType = Config.getConfigInt(Config.KEY_WAYPOINT_ICONS);
+ if (wpType != WpIconLibrary.WAYPT_DEFAULT)
+ {
+ wpIconDefinition = WpIconLibrary.getIconDefinition(wpType, WpIconLibrary.SIZE_MEDIUM);
+ }
// Loop again to draw waypoints
for (int i=0; i");
if (point.hasTimestamp()) {
- whenList.append(point.getTimestamp().getText(Timestamp.Format.ISO8601));
+ whenList.append(point.getTimestamp().getText(Timestamp.Format.ISO8601, null));
}
whenList.append("\n");
// Add coordinates to the list
diff --git a/tim/prune/save/PovExporter.java b/tim/prune/save/PovExporter.java
index c002747..e0fc9d3 100644
--- a/tim/prune/save/PovExporter.java
+++ b/tim/prune/save/PovExporter.java
@@ -480,7 +480,7 @@ public class PovExporter extends Export3dFunction
private void writeStartOfFile(FileWriter inWriter, String inLineSeparator, File inImageFile, File inTerrainFile)
throws IOException
{
- inWriter.write("// Pov file produced by GpsPrune - see http://gpsprune.activityworkshop.net/");
+ inWriter.write("// Pov file produced by GpsPrune - see https://gpsprune.activityworkshop.net/");
inWriter.write(inLineSeparator);
inWriter.write("#version 3.6;");
inWriter.write(inLineSeparator);
@@ -864,7 +864,7 @@ public class PovExporter extends Export3dFunction
/**
* @param inCode height code to check
- * @return validated height code within range 0 to max
+ * @return validated height code within range 0 to maxHeightCode
*/
private static byte checkHeightCode(byte inCode)
{
diff --git a/tim/prune/save/SvgExporter.java b/tim/prune/save/SvgExporter.java
deleted file mode 100644
index d623b4a..0000000
--- a/tim/prune/save/SvgExporter.java
+++ /dev/null
@@ -1,520 +0,0 @@
-package tim.prune.save;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.NumberFormat;
-import java.util.Iterator;
-import java.util.TreeSet;
-
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-
-import tim.prune.App;
-import tim.prune.I18nManager;
-import tim.prune.UpdateMessageBroker;
-import tim.prune.config.Config;
-import tim.prune.data.Track;
-import tim.prune.function.Export3dFunction;
-import tim.prune.gui.DialogCloser;
-import tim.prune.load.GenericFileFilter;
-import tim.prune.threedee.ThreeDModel;
-
-/**
- * Class to export a 3d scene of the track to a specified Svg file
- */
-public class SvgExporter extends Export3dFunction
-{
- private Track _track = null;
- private JDialog _dialog = null;
- private JFileChooser _fileChooser = null;
- private double _phi = 0.0, _theta = 0.0;
- private JTextField _phiField = null, _thetaField = null;
- private JTextField _altitudeFactorField = null;
- private JCheckBox _gradientsCheckbox = null;
- private static final double _scaleFactor = 200.0;
-
-
- /**
- * Constructor
- * @param inApp App object
- */
- public SvgExporter(App inApp)
- {
- super(inApp);
- _track = inApp.getTrackInfo().getTrack();
- // Set default rotation angles
- _phi = 30; _theta = 55;
- }
-
- /** Get the name key */
- public String getNameKey() {
- return "function.exportsvg";
- }
-
- /**
- * Set the rotation angles using coordinates for the camera
- * @param inX X coordinate of camera
- * @param inY Y coordinate of camera
- * @param inZ Z coordinate of camera
- */
- public void setCameraCoordinates(double inX, double inY, double inZ)
- {
- // Calculate phi and theta based on camera x,y,z
- _phi = Math.toDegrees(Math.atan2(inX, inZ));
- _theta = Math.toDegrees(Math.atan2(inY, Math.sqrt(inX*inX + inZ*inZ)));
- }
-
-
- /**
- * Show the dialog to select options and export file
- */
- public void begin()
- {
- // Make dialog window to select input parameters
- if (_dialog == null)
- {
- _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true);
- _dialog.setLocationRelativeTo(_parentFrame);
- _dialog.getContentPane().add(makeDialogComponents());
- }
- // Get exaggeration factor from config
- final int exaggFactor = Config.getConfigInt(Config.KEY_HEIGHT_EXAGGERATION);
- if (exaggFactor > 0) {
- _altFactor = exaggFactor / 100.0;
- }
-
- // Set angles
- NumberFormat threeDP = NumberFormat.getNumberInstance();
- threeDP.setMaximumFractionDigits(3);
- _phiField.setText(threeDP.format(_phi));
- _thetaField.setText(threeDP.format(_theta));
- // Set vertical scale
- _altitudeFactorField.setText("" + _altFactor);
- // Show dialog
- _dialog.pack();
- _dialog.setVisible(true);
- }
-
-
- /**
- * Make the dialog components to select the export options
- * @return Component holding gui elements
- */
- private Component makeDialogComponents()
- {
- JPanel panel = new JPanel();
- panel.setLayout(new BorderLayout());
- JLabel introLabel = new JLabel(I18nManager.getText("dialog.exportsvg.text"));
- introLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 6, 4));
- panel.add(introLabel, BorderLayout.NORTH);
- // OK, Cancel buttons
- JPanel buttonPanel = new JPanel();
- buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
- JButton okButton = new JButton(I18nManager.getText("button.ok"));
- okButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e)
- {
- doExport();
- _dialog.dispose();
- }
- });
- buttonPanel.add(okButton);
- JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
- cancelButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _dialog.dispose();
- }
- });
- buttonPanel.add(cancelButton);
- panel.add(buttonPanel, BorderLayout.SOUTH);
-
- // central panel
- JPanel centralPanel = new JPanel();
- centralPanel.setLayout(new GridLayout(0, 2, 10, 4));
-
- // rotation angles
- JLabel phiLabel = new JLabel(I18nManager.getText("dialog.exportsvg.phi"));
- phiLabel.setHorizontalAlignment(SwingConstants.TRAILING);
- centralPanel.add(phiLabel);
- _phiField = new JTextField("" + _phi);
- _phiField.addKeyListener(new DialogCloser(_dialog));
- centralPanel.add(_phiField);
- JLabel thetaLabel = new JLabel(I18nManager.getText("dialog.exportsvg.theta"));
- thetaLabel.setHorizontalAlignment(SwingConstants.TRAILING);
- centralPanel.add(thetaLabel);
- _thetaField = new JTextField("" + _theta);
- centralPanel.add(_thetaField);
- // Altitude exaggeration
- JLabel altFactorLabel = new JLabel(I18nManager.getText("dialog.3d.altitudefactor"));
- altFactorLabel.setHorizontalAlignment(SwingConstants.TRAILING);
- centralPanel.add(altFactorLabel);
- _altitudeFactorField = new JTextField("" + _altFactor);
- centralPanel.add(_altitudeFactorField);
- // Checkbox for gradients or not
- JLabel gradientsLabel = new JLabel(I18nManager.getText("dialog.exportsvg.gradients"));
- gradientsLabel.setHorizontalAlignment(SwingConstants.TRAILING);
- centralPanel.add(gradientsLabel);
- _gradientsCheckbox = new JCheckBox();
- _gradientsCheckbox.setSelected(true);
- centralPanel.add(_gradientsCheckbox);
-
- // add this grid to the holder panel
- JPanel holderPanel = new JPanel();
- holderPanel.setLayout(new BorderLayout(5, 5));
- JPanel boxPanel = new JPanel();
- boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
- boxPanel.add(centralPanel);
- holderPanel.add(boxPanel, BorderLayout.CENTER);
-
- panel.add(holderPanel, BorderLayout.CENTER);
- return panel;
- }
-
-
- /**
- * Select the file and export data to it
- */
- private void doExport()
- {
- // Copy camera coordinates
- _phi = checkAngle(_phiField.getText());
- _theta = checkAngle(_thetaField.getText());
-
- // OK pressed, so choose output file
- if (_fileChooser == null)
- {
- _fileChooser = new JFileChooser();
- _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
- _fileChooser.setFileFilter(new GenericFileFilter("filetype.svg", new String[] {"svg"}));
- _fileChooser.setAcceptAllFileFilterUsed(false);
- // start from directory in config which should be set
- final String configDir = Config.getConfigString(Config.KEY_TRACK_DIR);
- if (configDir != null) {_fileChooser.setCurrentDirectory(new File(configDir));}
- }
-
- // Allow choose again if an existing file is selected
- boolean chooseAgain = false;
- do
- {
- chooseAgain = false;
- if (_fileChooser.showSaveDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
- {
- // OK pressed and file chosen
- File file = _fileChooser.getSelectedFile();
- if (!file.getName().toLowerCase().endsWith(".svg")) {
- file = new File(file.getAbsolutePath() + ".svg");
- }
- // Check if file exists and if necessary prompt for overwrite
- Object[] buttonTexts = {I18nManager.getText("button.overwrite"), I18nManager.getText("button.cancel")};
- if (!file.exists() || JOptionPane.showOptionDialog(_parentFrame,
- I18nManager.getText("dialog.save.overwrite.text"),
- I18nManager.getText("dialog.save.overwrite.title"), JOptionPane.YES_NO_OPTION,
- JOptionPane.WARNING_MESSAGE, null, buttonTexts, buttonTexts[1])
- == JOptionPane.YES_OPTION)
- {
- // Export the file
- if (exportFile(file))
- {
- // file saved - store directory in config for later
- Config.setConfigString(Config.KEY_TRACK_DIR, file.getParentFile().getAbsolutePath());
- // also store exaggeration
- Config.setConfigInt(Config.KEY_HEIGHT_EXAGGERATION, (int) (_altFactor * 100));
- }
- else {
- // export failed so need to choose again
- chooseAgain = true;
- }
- }
- else {
- // overwrite cancelled so need to choose again
- chooseAgain = true;
- }
- }
- } while (chooseAgain);
- }
-
-
- /**
- * Export the track data to the specified file
- * @param inFile File object to save to
- * @return true if successful
- */
- private boolean exportFile(File inFile)
- {
- FileWriter writer = null;
- // find out the line separator for this system
- String lineSeparator = System.getProperty("line.separator");
- try
- {
- // create and scale model
- ThreeDModel model = new ThreeDModel(_track);
- try
- {
- // try to use given altitude factor
- _altFactor = Double.parseDouble(_altitudeFactorField.getText());
- model.setAltitudeFactor(_altFactor);
- }
- catch (NumberFormatException nfe) {}
- model.scale();
-
- boolean useGradients = _gradientsCheckbox.isSelected();
-
- // Create file and write basics
- writer = new FileWriter(inFile);
- writeStartOfFile(writer, useGradients, lineSeparator);
- writeBasePlane(writer, lineSeparator);
- // write out cardinal letters NESW
- writeCardinals(writer, lineSeparator);
-
- // write out points
- writeDataPoints(writer, model, useGradients, lineSeparator);
- writeEndOfFile(writer, lineSeparator);
-
- // everything worked
- UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.save.ok1")
- + " " + _track.getNumPoints() + " " + I18nManager.getText("confirm.save.ok2")
- + " " + inFile.getAbsolutePath());
- return true;
- }
- catch (IOException ioe)
- {
- JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.save.failed") + " : " + ioe.getMessage(),
- I18nManager.getText("error.save.dialogtitle"), JOptionPane.ERROR_MESSAGE);
- }
- finally
- {
- // close file ignoring exceptions
- try {
- writer.close();
- }
- catch (Exception e) {}
- }
- return false;
- }
-
-
- /**
- * Write the start of the Svg file
- * @param inWriter Writer to use for writing file
- * @param inUseGradients true to use gradients, false for flat fills
- * @param inLineSeparator line separator to use
- * @throws IOException on file writing error
- */
- private static void writeStartOfFile(FileWriter inWriter, boolean inUseGradients,
- String inLineSeparator)
- throws IOException
- {
- inWriter.write("");
- inWriter.write(inLineSeparator);
- inWriter.write("");
- inWriter.write(inLineSeparator);
- inWriter.write("");
- inWriter.write(inLineSeparator);
- }
-
- /**
- * Write out all the data points to the file in the balls-and-sticks style
- * @param inWriter Writer to use for writing file
- * @param inModel model object for getting data points
- * @param inUseGradients true to use gradients, false for flat fills
- * @param inLineSeparator line separator to use
- * @throws IOException on file writing error
- */
- private void writeDataPoints(FileWriter inWriter, ThreeDModel inModel, boolean inUseGradients,
- String inLineSeparator)
- throws IOException
- {
- final int numPoints = inModel.getNumPoints();
- TreeSet fragments = new TreeSet();
- for (int i=0; i 0.0)
- {
- int[] baseCoords = convertCoordinates(inModel.getScaledHorizValue(i), inModel.getScaledVertValue(i), 0);
- builder.append("");
- builder.append(inLineSeparator);
- }
- // ball (different according to type)
- if (inModel.getPointType(i) == ThreeDModel.POINT_TYPE_WAYPOINT)
- {
- // waypoint ball
- builder.append("");
- }
- else
- {
- // normal track point ball
- builder.append("");
- }
- builder.append(inLineSeparator);
- // add to set
- fragments.add(new SvgFragment(builder.toString(), coords[1]));
- }
-
- // Iterate over the sorted set and write to file
- Iterator iterator = fragments.iterator();
- while (iterator.hasNext()) {
- inWriter.write(iterator.next().getFragment());
- }
- }
-
-
- /**
- * Check the given angle value
- * @param inString String entered by user
- * @return validated value
- */
- private static double checkAngle(String inString)
- {
- double value = 0.0;
- try {
- value = Double.parseDouble(inString);
- }
- catch (Exception e) {} // ignore parse failures
- return value;
- }
-}
diff --git a/tim/prune/save/SvgFragment.java b/tim/prune/save/SvgFragment.java
deleted file mode 100644
index 0d9c5d4..0000000
--- a/tim/prune/save/SvgFragment.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package tim.prune.save;
-
-/**
- * Class to enable the sorting of Svg fragments
- */
-public class SvgFragment implements Comparable
-{
- private String _fragment = null;
- private int _yCoord = 0;
-
- /**
- * Constructor
- * @param inFragment fragment of svg source
- * @param inYCoord y coordinate of point, for sorting
- */
- public SvgFragment(String inFragment, int inYCoord)
- {
- _fragment = inFragment;
- _yCoord = inYCoord;
- }
-
- /**
- * @return svg fragment
- */
- public String getFragment()
- {
- return _fragment;
- }
-
- /**
- * Compare method
- */
- public int compareTo(SvgFragment inOther)
- {
- int ycompare = _yCoord - inOther._yCoord;
- if (ycompare != 0) {return ycompare;}
- return _fragment.compareTo(inOther._fragment);
- }
-
- /**
- * @param inOther other fragment to compare this one with
- * @return true if the fragments are equal
- */
- public boolean equals(SvgFragment inOther)
- {
- return _fragment.equals(inOther._fragment);
- }
-
- /**
- * @param inOther other object to compare this one with
- * @return true if the objects are equal
- */
- public boolean equals(Object inOther) {
- return (inOther instanceof SvgFragment?equals((SvgFragment) inOther):false);
- }
-}
diff --git a/tim/prune/threedee/Java3DWindow.java b/tim/prune/threedee/Java3DWindow.java
index fdda0fc..579245d 100644
--- a/tim/prune/threedee/Java3DWindow.java
+++ b/tim/prune/threedee/Java3DWindow.java
@@ -227,17 +227,6 @@ public class Java3DWindow implements ThreeDWindow
}
}});
panel.add(povButton);
- // Add button for exporting svg
- JButton svgButton = new JButton(I18nManager.getText("function.exportsvg"));
- svgButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e)
- {
- if (_orbit != null) {
- callbackRender(FunctionLibrary.FUNCTION_SVGEXPORT);
- }
- }});
- panel.add(svgButton);
-
// Close button
JButton closeButton = new JButton(I18nManager.getText("button.close"));
closeButton.addActionListener(new ActionListener()
@@ -614,7 +603,7 @@ public class Java3DWindow implements ThreeDWindow
Appearance tAppearance = new Appearance();
if (inBaseImage != null)
{
- gi.setTextureCoordinateParams(1, 2); // one coord set of two dimensions
+ gi.setTextureCoordinateParams(1, 2); // one coord set of two dimensions
gi.setTextureCoordinates(0, inHelper.getTextureCoordinates());
Texture mapImage = new TextureLoader(inBaseImage.getImage()).getTexture();
tAppearance.setTexture(mapImage);
@@ -641,7 +630,7 @@ public class Java3DWindow implements ThreeDWindow
/**
* Calculate the angles and call them back to the app
- * @param inFunction function to call (either pov or svg)
+ * @param inFunction function to call for export
*/
private void callbackRender(Export3dFunction inFunction)
{
@@ -664,8 +653,8 @@ public class Java3DWindow implements ThreeDWindow
// Give the settings to the rendering function
inFunction.setCameraCoordinates(result.x, result.y, result.z);
inFunction.setAltitudeExaggeration(_altFactor);
- inFunction.setTerrainDefinition(_terrainDefinition); // ignored by svg, used by pov
- inFunction.setImageDefinition(_imageDefinition); // ignored by svg, used by pov
+ inFunction.setTerrainDefinition(_terrainDefinition);
+ inFunction.setImageDefinition(_imageDefinition);
inFunction.begin();
}
diff --git a/tim/prune/undo/UndoAddTimeOffset.java b/tim/prune/undo/UndoAddTimeOffset.java
index 5238213..0a50699 100644
--- a/tim/prune/undo/UndoAddTimeOffset.java
+++ b/tim/prune/undo/UndoAddTimeOffset.java
@@ -11,7 +11,7 @@ public class UndoAddTimeOffset implements UndoOperation
{
/** Start and end indices of section */
private int _startIndex, _endIndex;
- /** time offset */
+ /** time offset in seconds */
private long _timeOffset;
@@ -19,7 +19,7 @@ public class UndoAddTimeOffset implements UndoOperation
* Constructor
* @param inStart start index of section
* @param inEnd end index of section
- * @param inOffset time offset
+ * @param inOffset time offset in seconds
*/
public UndoAddTimeOffset(int inStart, int inEnd, long inOffset)
{
@@ -45,7 +45,7 @@ public class UndoAddTimeOffset implements UndoOperation
public void performUndo(TrackInfo inTrackInfo) throws UndoException
{
// Perform the inverse operation
- inTrackInfo.getTrack().addTimeOffset(_startIndex, _endIndex, -_timeOffset, true);
+ inTrackInfo.getTrack().addTimeOffsetSeconds(_startIndex, _endIndex, -_timeOffset, true);
UpdateMessageBroker.informSubscribers();
}
}
diff --git a/tim/prune/undo/UndoAppendPoints.java b/tim/prune/undo/UndoAppendPoints.java
new file mode 100644
index 0000000..14e147b
--- /dev/null
+++ b/tim/prune/undo/UndoAppendPoints.java
@@ -0,0 +1,51 @@
+package tim.prune.undo;
+
+import tim.prune.I18nManager;
+import tim.prune.data.TrackInfo;
+
+/**
+ * Operation to undo an operation (such as create marker waypoints)
+ * in which a number of points were appended to the track
+ */
+public class UndoAppendPoints implements UndoOperation
+{
+ private int _previousTrackLength = -1;
+ private int _numAppended = 0;
+
+
+ /**
+ * Constructor
+ */
+ public UndoAppendPoints(int inTrackLength)
+ {
+ _previousTrackLength = inTrackLength;
+ }
+
+ /**
+ * @param inNumPoints number of points appended to track
+ */
+ public void setNumPointsAppended(int inNumPoints)
+ {
+ _numAppended = inNumPoints;
+ }
+
+ /**
+ * @return description of operation including number of points loaded
+ */
+ public String getDescription()
+ {
+ return I18nManager.getText("undo.insert") + " (" + _numAppended + ")";
+ }
+
+ /**
+ * Perform the undo operation on the given Track
+ * @param inTrackInfo TrackInfo object on which to perform the operation
+ */
+ public void performUndo(TrackInfo inTrackInfo) throws UndoException
+ {
+ // crop track to previous size
+ inTrackInfo.getTrack().cropTo(_previousTrackLength);
+ // clear selection
+ inTrackInfo.getSelection().clearAll();
+ }
+}
--
2.43.0