[Git][debian-gis-team/gpsprune][upstream] New upstream version 21.1

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Mon Feb 7 04:53:08 GMT 2022



Bas Couwenberg pushed to branch upstream at Debian GIS Project / gpsprune


Commits:
41e39600 by Bas Couwenberg at 2022-02-07T05:33:14+01:00
New upstream version 21.1
- - - - -


25 changed files:

- build.sh
- tim/prune/GpsPrune.java
- tim/prune/config/ColourScheme.java
- tim/prune/data/Field.java
- tim/prune/data/FieldList.java
- tim/prune/function/AboutScreen.java
- tim/prune/function/settings/AddMapSourceDialog.java
- tim/prune/function/settings/SetLanguage.java
- tim/prune/function/settings/SetMapBgFunction.java
- tim/prune/function/sew/SplitSegmentsFunction.java
- tim/prune/gui/map/MapCanvas.java
- tim/prune/gui/map/MapPosition.java
- tim/prune/gui/map/MapSource.java
- tim/prune/gui/map/MapSourceLibrary.java
- − tim/prune/gui/map/MffMapSource.java
- tim/prune/gui/map/OsmMapSource.java
- tim/prune/gui/map/SiteNameUtils.java
- tim/prune/gui/profile/ProfileChart.java
- + tim/prune/lang/prune-texts_ca.properties
- tim/prune/lang/prune-texts_cy.properties
- tim/prune/lang/prune-texts_es.properties
- tim/prune/lang/prune-texts_fr.properties
- tim/prune/lang/prune-texts_it.properties
- tim/prune/lang/prune-texts_zh.properties
- tim/prune/readme.txt


Changes:

=====================================
build.sh
=====================================
@@ -1,6 +1,6 @@
 # Build script
 # Version number
-PRUNENAME=gpsprune_21
+PRUNENAME=gpsprune_21.1
 # remove compile directory
 rm -rf compile
 # remove dist directory


=====================================
tim/prune/GpsPrune.java
=====================================
@@ -31,16 +31,16 @@ import tim.prune.gui.profile.ProfileChart;
 /**
  * GpsPrune is a tool to visualize, edit, convert and prune GPS data
  * Please see the included readme.txt or https://activityworkshop.net
- * This software is copyright activityworkshop.net 2006-2021 and made available through the Gnu GPL version 2.
+ * This software is copyright activityworkshop.net 2006-2022 and made available through the Gnu GPL version 2.
  * For license details please see the included license.txt.
  * GpsPrune is the main entry point to the application, including initialisation and launch
  */
 public class GpsPrune
 {
 	/** Version number of application, used in about screen and for version check */
-	public static final String VERSION_NUMBER = "21";
+	public static final String VERSION_NUMBER = "21.1";
 	/** Build number, just used for about screen */
-	public static final String BUILD_NUMBER = "390";
+	public static final String BUILD_NUMBER = "392";
 	/** Static reference to App object */
 	private static App APP = null;
 
@@ -238,17 +238,15 @@ public class GpsPrune
 		// Avoid automatically shutting down if window closed
 		frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
 
-		// set window icons of different resolutions (1.6+)
+		// set window icons of different resolutions
 		try
 		{
-			ArrayList<Image> icons = new ArrayList<Image>();
+			ArrayList<Image> icons = new ArrayList<>();
 			String[] resolutions = {"_16", "_20", "_22", "_24", "_32", "_36", "_48", "_64", "_72", "_96", "_128"};
 			for (String r : resolutions) {
 				icons.add(IconManager.getImageIcon(IconManager.WINDOW_ICON + r + ".png").getImage());
 			}
-			Class<?> d = java.awt.Window.class;
-			// This is the same as frame.setIconImages(icons) but is compilable also for java1.5 where this isn't available
-			d.getDeclaredMethod("setIconImages", new Class[]{java.util.List.class}).invoke(frame, icons);
+			frame.setIconImages(icons);
 		}
 		catch (Exception e)
 		{


=====================================
tim/prune/config/ColourScheme.java
=====================================
@@ -79,11 +79,11 @@ public class ColourScheme
 	 */
 	public String toString()
 	{
-		StringBuffer buff = new StringBuffer();
+		StringBuilder builder = new StringBuilder();
 		for (int i=0; i<NUM_COLOURS; i++) {
-			buff.append(ColourUtils.makeHexCode(getColour(i)));
-			buff.append(',');
+			builder.append(ColourUtils.makeHexCode(getColour(i)));
+			builder.append(',');
 		}
-		return buff.toString();
+		return builder.toString();
 	}
 }


=====================================
tim/prune/data/Field.java
=====================================
@@ -107,9 +107,8 @@ public class Field
 	 */
 	public static Field getField(String inFieldName)
 	{
-		for (int i=0; i<ALL_AVAILABLE_FIELDS.length; i++)
+		for (Field field : ALL_AVAILABLE_FIELDS)
 		{
-			Field field = ALL_AVAILABLE_FIELDS[i];
 			if (field.getName().equals(inFieldName)) {
 				return field;
 			}


=====================================
tim/prune/data/FieldList.java
=====================================
@@ -161,13 +161,12 @@ public class FieldList
 	 */
 	public String toString()
 	{
-		StringBuffer buffer = new StringBuffer();
-		buffer.append('(');
-		for (int i=0; i<_fieldArray.length; i++)
-		{
-			buffer.append(_fieldArray[i].getName()).append(',');
+		StringBuilder result = new StringBuilder();
+		result.append('(');
+		for (Field field : _fieldArray) {
+			result.append(field.getName()).append(',');
 		}
-		buffer.append(')');
-		return buffer.toString();
+		result.append(')');
+		return result.toString();
 	}
 }


=====================================
tim/prune/function/AboutScreen.java
=====================================
@@ -187,7 +187,7 @@ public class AboutScreen extends GenericFunction
 			new JLabel(" Gy\u00F6rgy, HooAU, Sergey, P\u00E9ter, serhijdubyk, Peter, Cristian,"),
 			1, 6);
 		addToGridBagPanel(creditsPanel, gridBag, constraints,
-			new JLabel(" Roman, Erkki, Carlos, Tche333"),
+			new JLabel(" Roman, Erkki, Carlos, Tche333, J.M."),
 			1, 7);
 		addToGridBagPanel(creditsPanel, gridBag, constraints,
 			new JLabel(I18nManager.getText("dialog.about.credits.translations") + " : "),
@@ -266,9 +266,10 @@ public class AboutScreen extends GenericFunction
 			+ "<p>" + I18nManager.getText("dialog.about.summarytext2") + "</p>"
 			+ "<p>" + I18nManager.getText("dialog.about.summarytext3") + "</p>"
 			+ "<p>" + I18nManager.getText("dialog.about.languages") + " : "
-				+ "afrikaans, \u010de\u0161tina, deutsch, english, espa\u00F1ol, fran\u00E7ais, italiano,<br>" +
-				" magyar, nederlands, polski, portugu\u00EAs, rom\u00E2n\u0103, suomi, svenska, \u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian),<br>" +
-				" \u4e2d\u6587 (chinese), \u65E5\u672C\u8A9E (japanese), \uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean), schwiizerd\u00FC\u00FCtsch</p>"
+				+ "afrikaans, catal\u00e0, \u010de\u0161tina, deutsch, english, espa\u00F1ol, fran\u00E7ais,<br>" +
+				" italiano, magyar, nederlands, polski, portugu\u00EAs, rom\u00E2n\u0103, suomi, svenska,<br>" +
+				" \u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian), \u4e2d\u6587 (chinese), \u65E5\u672C\u8A9E (japanese), \uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean),<br>" +
+				" schwiizerd\u00FC\u00FCtsch</p>"
 			+ "<p>" + I18nManager.getText("dialog.about.translatedby") + "</p>";
 	}
 


=====================================
tim/prune/function/settings/AddMapSourceDialog.java
=====================================
@@ -6,7 +6,6 @@ import java.awt.FlowLayout;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
-import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
@@ -31,8 +30,8 @@ import tim.prune.gui.map.OsmMapSource;
  */
 public class AddMapSourceDialog
 {
-	private SetMapBgFunction _parent = null;
-	private JDialog _addDialog = null;
+	private final SetMapBgFunction _parent;
+	private final JDialog _addDialog;
 	private MapSource _originalSource = null;
 	// controls for osm panel
 	private JTextField _oNameField = null;
@@ -84,11 +83,7 @@ public class AddMapSourceDialog
 			}
 		};
 		// Listener for any gui changes (to enable ok when anything changes on an edit)
-		ActionListener okEnabler = new ActionListener() {
-			public void actionPerformed(ActionEvent arg0) {
-				enableOK();
-			}
-		};
+		ActionListener okEnabler = arg0 -> enableOK();
 
 		// openstreetmap panel
 		JPanel osmPanel = new JPanel();
@@ -104,8 +99,9 @@ public class AddMapSourceDialog
 		c.ipadx = 3; c.ipady = 5;
 		c.insets = new Insets(0, 0, 5, 0);
 		c.anchor = GridBagConstraints.FIRST_LINE_START;
+		c.fill = GridBagConstraints.HORIZONTAL;
 		gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")), c);
-		_oNameField = new JTextField(18);
+		_oNameField = new JTextField();
 		_oNameField.addKeyListener(keyListener);
 		c.gridx = 1; c.weightx = 1.0;
 		gbPanel.add(_oNameField, c);
@@ -114,7 +110,7 @@ public class AddMapSourceDialog
 		c.weightx = 0.0;
 		c.insets = new Insets(0, 0, 0, 0);
 		gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer1url")), c);
-		_baseUrlField = new JTextField(18);
+		_baseUrlField = new JTextField(25);
 		_baseUrlField.addKeyListener(keyListener);
 		c.gridx = 1; c.weightx = 1.0;
 		gbPanel.add(_baseUrlField, c);
@@ -133,7 +129,7 @@ public class AddMapSourceDialog
 		// Top layer
 		c.gridx = 0; c.gridy = 2;
 		gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer2url")), c);
-		_topUrlField = new JTextField(18);
+		_topUrlField = new JTextField();
 		_topUrlField.addKeyListener(keyListener);
 		c.gridx = 1; c.weightx = 1.0;
 		gbPanel.add(_topUrlField, c);
@@ -150,8 +146,9 @@ public class AddMapSourceDialog
 		}
 		// Max zoom
 		c.gridx = 0; c.gridy = 3;
+		c.fill = GridBagConstraints.NONE;
 		gbPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")), c);
-		_oZoomCombo = new JComboBox<Integer>();
+		_oZoomCombo = new JComboBox<>();
 		for (int i=10; i<=20; i++) {
 			_oZoomCombo.addItem(i);
 		}
@@ -171,21 +168,10 @@ public class AddMapSourceDialog
 		JPanel buttonPanel = new JPanel();
 		buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
 		_okButton = new JButton(I18nManager.getText("button.ok"));
-		ActionListener okListener = new ActionListener() {
-			public void actionPerformed(ActionEvent e)
-			{
-				finish();
-			}
-		};
-		_okButton.addActionListener(okListener);
+		_okButton.addActionListener(e -> finish());
 		buttonPanel.add(_okButton);
 		JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
-		cancelButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e)
-			{
-				_addDialog.dispose();
-			}
-		});
+		cancelButton.addActionListener(e -> _addDialog.dispose());
 		buttonPanel.add(cancelButton);
 		dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
 		return dialogPanel;
@@ -213,8 +199,6 @@ public class AddMapSourceDialog
 		_topUrlField.setText("");
 		_topTypeRadios[0].setSelected(true);
 		_oZoomCombo.setSelectedIndex(8);
-		_okButton.setEnabled(false);
-		_addDialog.setVisible(true);
 	}
 
 	/**
@@ -225,23 +209,18 @@ public class AddMapSourceDialog
 		if (_originalSource == null)
 		{
 			clearAllFields();
-			return;
 		}
-
-		// See if it's an osm source
-		try
+		else
 		{
-			OsmMapSource osmSource = (OsmMapSource) _originalSource;
-			_oNameField.setText(osmSource.getName());
-			_baseUrlField.setText(osmSource.getBaseUrl(0));
-			int baseType = getBaseType(osmSource.getFileExtension(0));
+			_oNameField.setText(_originalSource.getName());
+			_baseUrlField.setText(_originalSource.getBaseUrl(0));
+			int baseType = getBaseType(_originalSource.getFileExtension(0));
 			_baseTypeRadios[baseType].setSelected(true);
-			_topUrlField.setText(osmSource.getNumLayers()==0?"":osmSource.getBaseUrl(1));
-			int topType = getBaseType(osmSource.getFileExtension(1));
+			_topUrlField.setText(_originalSource.getNumLayers()==0 ? "" : _originalSource.getBaseUrl(1));
+			int topType = getBaseType(_originalSource.getFileExtension(1));
 			_topTypeRadios[topType].setSelected(true);
-			_oZoomCombo.setSelectedIndex(getZoomIndex(osmSource.getMaxZoomLevel()));
+			_oZoomCombo.setSelectedIndex(getZoomIndex(_originalSource.getMaxZoomLevel()));
 		}
-		catch (ClassCastException cce) {} // ignore, sourceFound flag stays false
 
 		_okButton.setEnabled(false);
 		_addDialog.setVisible(true);
@@ -250,8 +229,7 @@ public class AddMapSourceDialog
 	/**
 	 * Check the currently entered details and enable the OK button if it looks OK
 	 */
-	private void enableOK()
-	{
+	private void enableOK()	{
 		_okButton.setEnabled(isOsmPanelOk());
 	}
 
@@ -262,14 +240,13 @@ public class AddMapSourceDialog
 	private boolean isOsmPanelOk()
 	{
 		boolean ok = _oNameField.getText().trim().length() > 1;
-		String baseUrl = null, topUrl = null;
 		// Try to parse base url if given
 		String baseText = _baseUrlField.getText().trim();
-		baseUrl = MapSource.fixBaseUrl(baseText);
+		final String baseUrl = MapSource.fixBaseUrl(baseText);
 		if (baseText.length() > 0 && baseUrl == null) {ok = false;}
 		// Same again for top url if given
 		String topText = _topUrlField.getText().trim();
-		topUrl = MapSource.fixBaseUrl(topText);
+		final String topUrl = MapSource.fixBaseUrl(topText);
 		if (topText.length() > 0 && topUrl == null) {ok = false;}
 		// looks ok if at least one url given
 		return (ok && (baseUrl != null || topUrl != null));


=====================================
tim/prune/function/settings/SetLanguage.java
=====================================
@@ -41,13 +41,14 @@ public class SetLanguage extends GenericFunction
 	private int _startIndex = 0;
 
 	/** Names of languages for display in dropdown (not translated) */
-	private static final String[] LANGUAGE_NAMES = {"afrikaans", "\u010de\u0161tina", "deutsch", "english", "american english",
-		"espa\u00F1ol", "fran\u00E7ais", "italiano", "magyar", "nederlands", "polski", "portugu\u00EAs", "rom\u00E2n\u0103",
-		"suomi", "svenska", "\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian)", "\u4e2d\u6587 (chinese)",
+	private static final String[] LANGUAGE_NAMES = {"afrikaans", "catal\u00e0", "\u010de\u0161tina", "deutsch",
+		"english", "american english", "espa\u00F1ol", "fran\u00E7ais", "italiano", "magyar", "nederlands",
+		"polski", "portugu\u00EAs", "rom\u00E2n\u0103", "suomi", "svenska",
+		"\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (russian)", "\u4e2d\u6587 (chinese)",
 		"\u65E5\u672C\u8A9E (japanese)", "\uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0 (korean)", "schwiizerd\u00FC\u00FCtsch"
 	};
 	/** Associated language codes (must be in same order as names!) */
-	private static final String[] LANGUAGE_CODES = {"af", "cz", "de", "en", "en_us", "es", "fr", "it", "hu",
+	private static final String[] LANGUAGE_CODES = {"af", "ca", "cz", "de", "en", "en_us", "es", "fr", "it", "hu",
 		"nl", "pl", "pt", "ro", "fi", "sv", "ru", "zh", "ja", "ko", "de_ch"
 	};
 


=====================================
tim/prune/function/settings/SetMapBgFunction.java
=====================================
@@ -42,6 +42,7 @@ public class SetMapBgFunction extends GenericFunction
 	private String _initialSource = null;
 	private JButton _okButton = null, _cancelButton = null;
 	private JButton _deleteButton = null, _editButton = null;
+	private boolean _sourceAdded = false;
 	// Add dialog
 	private AddMapSourceDialog _addDialog = null;
 	// Flags for what has been edited
@@ -183,6 +184,7 @@ public class SetMapBgFunction extends GenericFunction
 		// Scroll down to see selected index
 		_list.ensureIndexIsVisible(currSource);
 		_sourcesEdited = false;
+		_sourceAdded = false;
 	}
 
 	/**
@@ -225,6 +227,7 @@ public class SetMapBgFunction extends GenericFunction
 		if (_addDialog == null) {
 			_addDialog = new AddMapSourceDialog(_dialog, this);
 		}
+		_sourceAdded = (inSource == null);
 		_addDialog.showDialog(inSource);
 	}
 
@@ -234,6 +237,7 @@ public class SetMapBgFunction extends GenericFunction
 	private void deleteMapSource()
 	{
 		int serverNum = getSelectedServer();
+		_sourceAdded = false;
 		MapSourceLibrary.deleteSource(serverNum);
 		updateList();
 		enableButtons();
@@ -252,10 +256,15 @@ public class SetMapBgFunction extends GenericFunction
 	 */
 	public void updateList()
 	{
-		_listModel.fireChanged();
 		_sourcesEdited = true;
 		Config.setConfigString(Config.KEY_MAPSOURCE_LIST, MapSourceLibrary.getConfigString());
 		enableButtons();
+		if (_sourceAdded) {
+			// Select the last one in the list (the one just added)
+			_list.setSelectedIndex(_listModel.getSize()-1);
+		}
+		_listModel.fireChanged();
+		_list.ensureIndexIsVisible(_list.getSelectedIndex());
 	}
 
 	/**


=====================================
tim/prune/function/sew/SplitSegmentsFunction.java
=====================================
@@ -47,13 +47,13 @@ public class SplitSegmentsFunction extends DistanceTimeLimitFunction
 		// Make undo object
 		UndoSplitSegments undo = new UndoSplitSegments(_app.getTrackInfo().getTrack());
 		final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
-		DataPoint currPoint = null, prevPoint = null;
+		DataPoint prevPoint = null;
 		int numSplitsMade = 0;
 
 		// Now actually do it, looping through the points in the track
 		for (int i=0; i<numPoints; i++)
 		{
-			currPoint = _app.getTrackInfo().getTrack().getPoint(i);
+			DataPoint currPoint = _app.getTrackInfo().getTrack().getPoint(i);
 			if (!currPoint.isWaypoint())
 			{
 				boolean splitHere = (prevPoint != null)


=====================================
tim/prune/gui/map/MapCanvas.java
=====================================
@@ -89,7 +89,9 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 	/** Current drawing mode */
 	private int _drawMode = MODE_DEFAULT;
 	/** Current waypoint icon definition */
-	WpIconDefinition _waypointIconDefinition = null;
+	private WpIconDefinition _waypointIconDefinition = null;
+	/** Remember whether map is being drawn with empty track or not */
+	private boolean _emptyTrack = true;
 
 	/** Constant for click sensitivity when selecting nearest point */
 	private static final int CLICK_SENSITIVITY = 10;
@@ -415,12 +417,12 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 			}
 
 			// Recognise empty map position, if no data has been loaded
-			if (_mapPosition.isEmpty())
+			if (_emptyTrack && _track.getNumPoints() > 1)
 			{
-				// Set to some default area
 				zoomToFit();
 				_recalculate = true;
 			}
+			_emptyTrack = (_track.getNumPoints() == 0);
 
 			// Draw the map contents if necessary
 			if (_mapImage == null || _recalculate)
@@ -466,12 +468,15 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 					break;
 
 				case MODE_DRAW_POINTS_CONT:
-					// draw line to mouse position to show drawing mode
-					inG.setColor(Config.getColourScheme().getColour(ColourScheme.IDX_POINT));
-					int prevIndex = _track.getNumPoints()-1;
-					int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(prevIndex));
-					int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(prevIndex));
-					inG.drawLine(px, py, _dragToX, _dragToY);
+					int prevIndex = _track.getNumPoints() - 1;
+					if (prevIndex >= 0)
+					{
+						// draw line to mouse position to show drawing mode
+						inG.setColor(Config.getColourScheme().getColour(ColourScheme.IDX_POINT));
+						int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(prevIndex));
+						int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(prevIndex));
+						inG.drawLine(px, py, _dragToX, _dragToY);
+					}
 					break;
 			}
 		}


=====================================
tim/prune/gui/map/MapPosition.java
=====================================
@@ -17,8 +17,7 @@ public class MapPosition
 	private int _zoom = 12;
 	/** Factor to zoom by, 2 to the power of zoom */
 	private int _zoomFactor = 1 << _zoom;
-	/** Flag to mark if this position has ever been set */
-	private boolean _empty = true;
+
 	/** Maximum zoom level */
 	private static final int MAX_ZOOM = 21;
 
@@ -54,7 +53,6 @@ public class MapPosition
 		setZoom(requiredZoom);
 		_xPosition = transformToPixels((inMinX + inMaxX) / 2.0);
 		_yPosition = transformToPixels((inMinY + inMaxY) / 2.0);
-		_empty = false;
 	}
 
 	/**
@@ -65,7 +63,6 @@ public class MapPosition
 	{
 		_zoom = inZoom;
 		_zoomFactor = 1 << _zoom;
-		_empty = false;
 	}
 
 	/**
@@ -98,7 +95,6 @@ public class MapPosition
 		// Set position
 		_xPosition = (_xPosition - inWidth/2 + (inMinX + inMaxX) / 2) * multFactor;
 		_yPosition = (_yPosition - inHeight/2 + (inMinY + inMaxY) / 2) * multFactor;
-		_empty = false;
 	}
 
 	/**
@@ -283,12 +279,4 @@ public class MapPosition
 		_xPosition += inDeltaX;
 		_yPosition += inDeltaY;
 	}
-
-	/**
-	 * @return true if this position has never been set
-	 */
-	public boolean isEmpty()
-	{
-		return _empty;
-	}
 }


=====================================
tim/prune/gui/map/MapSource.java
=====================================
@@ -73,47 +73,73 @@ public abstract class MapSource
 
 	/**
 	 * Checks the given url for having the right prefix and trailing slash
-	 * @param inUrl url to check
+	 * @param inUrlString url to check
 	 * @return validated url with correct prefix and trailing slash, or null
 	 */
-	public static String fixBaseUrl(String inUrl)
+	public static String fixBaseUrl(String inUrlString)
 	{
-		if (inUrl == null || inUrl.equals("")) {return null;}
-		String urlstr = inUrl;
-		boolean urlOk = false;
+		if (inUrlString == null || inUrlString.equals("")) {return null;}
+		String urlstr = inUrlString;
 
 		// check prefix
-		try
-		{
-			urlOk = new URL(urlstr.replace('[', 'w').replace(']', 'w')).toString() != null;
-		}
-		catch (MalformedURLException e)
-		{
-			urlOk = false;
+		URL url = null;
+		try {
+			url = new URL(urlstr.replace('[', 'w').replace(']', 'w'));
 		}
-
-		if (!urlOk)
-		{
+		catch (MalformedURLException me) {
 			// fail if protocol specified
 			if (urlstr.contains("://")) {return null;}
-			// add the http protocol
+			// add the http protocol and try again
 			urlstr = "http://" + urlstr;
+			try {
+				url = new URL(urlstr.replace('[', 'w').replace(']', 'w'));
+			}
+			catch (MalformedURLException e) {
+				return null;
+			}
 		}
-		// check trailing /
-		if (!urlstr.endsWith("/")) {
+		// url host must contain a dot (but not two consecutively)
+		if (url.getHost().indexOf('.') < 0
+			|| url.getHost().contains("..")
+			|| !placeHoldersOk(url.getPath())) {
+			return null;
+		}
+		// Possibly add trailing slash, but only if placeholders aren't used
+		if (urlstr.indexOf('{') < 0 && !urlstr.endsWith("/")) {
 			urlstr = urlstr + "/";
 		}
-		// Validate current url, return null if not ok
-		try
-		{
-			URL url = new URL(urlstr.replace('[', 'w').replace(']', 'w'));
-			// url host must contain a dot
-			if (url.getHost().indexOf('.') < 0) {return null;}
+		return urlstr;
+	}
+
+	private static boolean placeHoldersOk(String path) {
+		if (path.indexOf('{') < 0 && path.indexOf('}') < 0) {
+			return true; // no placeholders
 		}
-		catch (MalformedURLException e) {
-			urlstr = null;
+		boolean expectLetter = false, expectClose = false;
+		boolean foundX = false, foundY = false, foundZ = false;
+		for (char c : path.toCharArray()) {
+			if (expectClose) {
+				if (c != '}') {return false;}
+				expectClose = false;
+			}
+			else if (expectLetter) {
+				switch (c) {
+					case 'x': foundX = true; break;
+					case 'y': foundY = true; break;
+					case 'z': foundZ = true; break;
+					default: return false;
+				}
+				expectLetter = false;
+				expectClose = true;
+			}
+			else if (c == '{') {
+				expectLetter = true;
+			}
+			else if (c == '}') {
+				return false; // close not expected
+			}
 		}
-		return urlstr;
+		return foundX && foundY && foundZ;
 	}
 
 


=====================================
tim/prune/gui/map/MapSourceLibrary.java
=====================================
@@ -42,8 +42,8 @@ public abstract class MapSourceLibrary
 		_sourceList.add(new OsmMapSource("Cycling Trails", "https://[abc].tile.openstreetmap.org/", "png",
 			"https://tile.waymarkedtrails.org/cycling/", "png", 18));
 		_sourceList.add(new OsmMapSource("Reitkarte", "http://topo[234].wanderreitkarte.de/topo/"));
-		_sourceList.add(new MffMapSource("Mapsforfree", "https://maps-for-free.com/layer/relief/", "jpg",
-			"https://maps-for-free.com/layer/water/", "gif", 11));
+		_sourceList.add(new OsmMapSource("Mapsforfree", "https://maps-for-free.com/layer/relief/z{z}/row{y}/{z}_{x}-{y}.jpg", "jpg",
+			"https://maps-for-free.com/layer/water/z{z}/row{y}/{z}_{x}-{y}.gif", "gif", 11));
 		_sourceList.add(new OsmMapSource("Hikebikemap", "https://tiles.wmflabs.org/hikebike/",
 			"https://tiles.wmflabs.org/hillshading/", 18));
 		_sourceList.add(new OsmMapSource("OpenSeaMap", "http://tile.openstreetmap.org/",


=====================================
tim/prune/gui/map/MffMapSource.java deleted
=====================================
@@ -1,92 +0,0 @@
-package tim.prune.gui.map;
-
-import tim.prune.I18nManager;
-
-/**
- * Class to provide a map source for maps-for-free sources
- * These are double-layer sources with jpg and gif tiles
- */
-public class MffMapSource extends MapSource
-{
-	/** Name for this source */
-	private String _name = null;
-	/** Base urls */
-	private String[] _baseUrls = null;
-	/** Site names */
-	private String[] _siteNames = null;
-	/** Maximum zoom level */
-	private int _maxZoom = 0;
-
-	/**
-	 * Constructor giving name, url and maximum zoom
-	 * @param inName source name
-	 * @param inUrl1 base url for layer 1
-	 * @param inExt1 extension for layer 1
-	 * @param inUrl2 base url for layer 2
-	 * @param inExt2 extension for layer 2
-	 * @param inMaxZoom maximum zoom level
-	 */
-	public MffMapSource(String inName, String inUrl1, String inExt1,
-		String inUrl2, String inExt2, int inMaxZoom)
-	{
-		_name = inName;
-		if (_name == null || _name.trim().equals("")) {_name = I18nManager.getText("mapsource.unknown");}
-		_baseUrls = new String[2];
-		_baseUrls[0] = fixBaseUrl(inUrl1);
-		_baseUrls[1] = fixBaseUrl(inUrl2);
-		_siteNames = new String[2];
-		_siteNames[0] = SiteNameUtils.convertUrlToDirectory(_baseUrls[0]);
-		_siteNames[1] = SiteNameUtils.convertUrlToDirectory(_baseUrls[1]);
-		_extensions = new String[2];
-		_extensions[0] = inExt1;
-		_extensions[1] = inExt2;
-		_maxZoom = inMaxZoom;
-	}
-
-	/**
-	 * @return name
-	 */
-	public String getName() {
-		return _name;
-	}
-
-	/** Number of layers is always 2 for mff sources */
-	public int getNumLayers() {
-		return 2;
-	}
-
-	/** Get base url for specified layer */
-	public String getBaseUrl(int inLayerNum) {
-		return _baseUrls[inLayerNum];
-	}
-
-	/** site name without protocol or www. */
-	public String getSiteName(int inLayerNum) {
-		return _siteNames[inLayerNum];
-	}
-
-	/**
-	 * Make the URL to get the specified tile
-	 */
-	public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
-	{
-		return _baseUrls[inLayerNum] + "z" + inZoom + "/row" + inY + "/" + inZoom + "_" + inX + "-" + inY + "." + getFileExtension(inLayerNum);
-	}
-
-	/**
-	 * @return maximum zoom level
-	 */
-	public final int getMaxZoomLevel()
-	{
-		return _maxZoom;
-	}
-
-	/**
-	 * @return semicolon-separated list of all fields
-	 */
-	public String getConfigString()
-	{
-		// TODO: Maybe a gui will be necessary for this one day
-		return "not required";
-	}
-}


=====================================
tim/prune/gui/map/OsmMapSource.java
=====================================
@@ -17,9 +17,7 @@ public class OsmMapSource extends MapSource
 	/** Site names */
 	private String[] _siteNames = null;
 	/** Maximum zoom level */
-	private int _maxZoom = 0;
-	/** API key, usually remains empty */
-	private String _apiKey = null;
+	private final int _maxZoom;
 
 
 	/**
@@ -41,10 +39,13 @@ public class OsmMapSource extends MapSource
 	 */
 	public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
 	{
-		if (inStr2 != null && inStr2.length() == 3)
-			init(inName, inStr1, inStr2, null, null, inMaxZoom);
-		else
-			init(inName, inStr1, "png", inStr2, "png", inMaxZoom);
+		if (inStr2 != null && inStr2.length() == 3) {
+			init(inName, inStr1, inStr2, null, null);
+		}
+		else {
+			init(inName, inStr1, "png", inStr2, "png");
+		}
+		_maxZoom = inMaxZoom;
 	}
 
 	/**
@@ -59,7 +60,8 @@ public class OsmMapSource extends MapSource
 	public OsmMapSource(String inName, String inUrl1, String inExt1,
 		String inUrl2, String inExt2, int inMaxZoom)
 	{
-		init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
+		init(inName, inUrl1, inExt1, inUrl2, inExt2);
+		_maxZoom = inMaxZoom;
 	}
 
 	/**
@@ -69,10 +71,9 @@ public class OsmMapSource extends MapSource
 	 * @param inExt1 extension for base layer
 	 * @param inUrl2 upper layer url
 	 * @param inExt2 extension for top layer
-	 * @param inMaxZoom maximum zoom level
 	 */
 	private void init(String inName, String inUrl1, String inExt1,
-		String inUrl2, String inExt2, int inMaxZoom)
+		String inUrl2, String inExt2)
 	{
 		_name = inName;
 		if (_name == null || _name.trim().equals("")) {_name = I18nManager.getText("mapsource.unknown");}
@@ -92,13 +93,6 @@ public class OsmMapSource extends MapSource
 			_siteNames[0] = _siteNames[1];
 			_baseUrls[1] = _siteNames[1] = null;
 		}
-		_maxZoom = inMaxZoom;
-	}
-
-	/** Set the API key (if required) */
-	public void setApiKey(String inKey)
-	{
-		_apiKey = inKey;
 	}
 
 	/**
@@ -122,7 +116,7 @@ public class OsmMapSource extends MapSource
 				else if (items.length == 6) { // two urls and two extensions
 					source = new OsmMapSource(items[0], items[1], items[2], items[3], items[4], Integer.parseInt(items[5]));
 				}
-			} catch (NumberFormatException nfe) {}
+			} catch (NumberFormatException ignored) {}
 		}
 		return source;
 	}
@@ -155,15 +149,14 @@ 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
-		StringBuilder url = new StringBuilder();
-		url.append(SiteNameUtils.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);
+		String path = SiteNameUtils.pickServerUrl(_baseUrls[inLayerNum]);
+		if (path.indexOf('{') < 0) {
+			return path + inZoom + '/' + inX + '/' + inY +
+					'.' + getFileExtension(inLayerNum);
 		}
-		return url.toString();
+		return path.replace("{z}", Integer.toString(inZoom))
+				.replace("{x}", Integer.toString(inX))
+				.replace("{y}", Integer.toString(inY));
 	}
 
 	/**
@@ -179,6 +172,6 @@ public class OsmMapSource extends MapSource
 	 */
 	public String getConfigString()
 	{
-		return "o:" +  getName() + ";" + getSiteStrings() + getMaxZoomLevel();
+		return "o:" + getName() + ";" + getSiteStrings() + getMaxZoomLevel();
 	}
 }


=====================================
tim/prune/gui/map/SiteNameUtils.java
=====================================
@@ -68,6 +68,18 @@ public abstract class SiteNameUtils
 				}
 			}
 		}
+		if (url.indexOf('{') > 0) {
+			url = removePlaceholders(url);
+		}
 		return url;
 	}
+
+
+	private static String removePlaceholders(String url) {
+		final int lastSlashPos = url.lastIndexOf('/');
+		if (lastSlashPos >= 0) {
+			url = url.substring(0, lastSlashPos+1);
+		}
+		return url.replace("{x}", "x").replace("{y}", "y").replace("{z}", "z");
+	}
 }


=====================================
tim/prune/gui/profile/ProfileChart.java
=====================================
@@ -3,13 +3,14 @@ package tim.prune.gui.profile;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
+import java.awt.FontMetrics;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
@@ -26,7 +27,7 @@ import tim.prune.gui.GenericDisplay;
 /**
  * Chart component for the profile display
  */
-public class ProfileChart extends GenericDisplay implements MouseListener
+public class ProfileChart extends GenericDisplay
 {
 	/** Inner class to handle popup menu clicks */
 	class MenuClicker implements ActionListener
@@ -155,7 +156,7 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 	private ChartParameters _previousParameters = new ChartParameters();
 
 	/** Possible scales to use */
-	private static final int[] LINE_SCALES = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 10, 5, 2, 1};
+	private static final int[] LINE_SCALES = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};
 	/** Border width around black line */
 	private static final int BORDER_WIDTH = 6;
 	/** Minimum size for profile chart in pixels */
@@ -172,7 +173,12 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 	{
 		super(inTrackInfo);
 		_data = new AltitudeData(inTrackInfo.getTrack());
-		addMouseListener(this);
+		addMouseListener(new MouseAdapter() {
+			@Override
+			public void mouseClicked(MouseEvent e) {
+				processMouseClick(e);
+			}
+		});
 		setLayout(new FlowLayout(FlowLayout.LEFT));
 		_label = new JLabel("Altitude"); // text will be replaced later
 		add(_label);
@@ -245,10 +251,14 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 			selectionEnd = _trackInfo.getSelection().getEnd();
 		}
 
+		FontMetrics fm = g.getFontMetrics();
+		final int fontHeight = fm.getHeight();
+		final int minLines = Math.max(2, getHeight() / fontHeight / 4);
+
 		int y = 0;
 		double value = 0.0;
 		// horizontal lines for scale - set to round numbers eg 500
-		final int lineScale = getLineScale(minValue, maxValue);
+		final int lineScale = getLineScale(minValue, maxValue, minLines);
 		double scaleValue = Math.ceil(minValue/lineScale) * lineScale;
 		final int zeroY = height - BORDER_WIDTH - (int) (yScaleFactor * (0.0 - minValue));
 
@@ -432,20 +442,19 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 	 * Work out the scale for the horizontal lines
 	 * @param inMin min value of data
 	 * @param inMax max value of data
+	 * @param inMinLines minimum number of lines to draw, depending on space
 	 * @return scale separation, or -1 for no scale
 	 */
-	private int getLineScale(double inMin, double inMax)
+	private int getLineScale(double inMin, double inMax, int inMinLines)
 	{
-		if ((inMax - inMin) < 2.0) {
+		if ((inMax - inMin) <= 2.0) {
 			return -1;
 		}
 		for (int scale : LINE_SCALES)
 		{
 			int numLines = (int)(inMax / scale) - (int)(inMin / scale);
-			// Check for too many lines
-			if (numLines > 10) return -1;
-			// If more than 1 line then use this scale
-			if (numLines > 1) return scale;
+			// If enough lines produced then use this scale
+			if (numLines >= inMinLines) return scale;
 		}
 		// no suitable scale found so just use minimum
 		return LINE_SCALES[LINE_SCALES.length-1];
@@ -509,7 +518,7 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 	/**
 	 * React to click on profile display
 	 */
-	public void mouseClicked(MouseEvent e)
+	private void processMouseClick(MouseEvent e)
 	{
 		if (_track == null || _track.getNumPoints() < 1) {return;}
 		// left clicks
@@ -572,28 +581,4 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 		_data.init(Config.getUnitSet());
 		repaint();
 	}
-
-	/**
-	 * mouse enter events ignored
-	 */
-	public void mouseEntered(MouseEvent e)
-	{}
-
-	/**
-	 * mouse exit events ignored
-	 */
-	public void mouseExited(MouseEvent e)
-	{}
-
-	/**
-	 * ignore mouse pressed for now too
-	 */
-	public void mousePressed(MouseEvent e)
-	{}
-
-	/**
-	 * and also ignore mouse released
-	 */
-	public void mouseReleased(MouseEvent e)
-	{}
 }


=====================================
tim/prune/lang/prune-texts_ca.properties
=====================================
@@ -0,0 +1,920 @@
+# Text entries for the GpsPrune application
+# Catalan entries, thanks to J.M. Ferrer i Gener
+
+# Menu entries
+menu.file=Arxiu
+menu.file.addphotos=Afegeix fotos
+menu.file.recentfiles=Obrir recents
+menu.file.save=Desa com a text
+menu.file.exit=Sortir
+menu.online=En l\u00ednia
+menu.track=Pista
+menu.track.undo=Desfer
+menu.track.clearundo=Netejar la llista de desfer
+menu.track.markrectangle=Seleccionar punts en rectangle
+menu.range=Interval
+menu.range.all=Seleccionar-ho tot
+menu.range.none=No seleccionar
+menu.range.start=Definir l'inici d'un interval
+menu.range.end=Definir la fi d'un interval
+menu.range.average=Mitjana del interval
+menu.range.reverse=Invertir el interval
+menu.range.mergetracksegments=Combinar els segments de la pista
+menu.range.cutandmove=Tallar i moure la selecci\u00f3
+menu.point=Punt
+menu.point.editpoint=Editar el punt
+menu.point.deletepoint=Esborrar el punt
+menu.photo=Foto
+menu.photo.saveexif=Desa les metadades
+menu.audio=\u00c0udio
+menu.view=Vista
+menu.view.showsidebars=Mostra les barres laterals
+menu.view.browser=Mostra a una finestra del navegador
+menu.view.browser.google=Google maps
+menu.view.browser.openstreetmap=Openstreetmap
+menu.view.browser.mapquest=Mapquest
+menu.view.browser.yahoo=Yahoo maps
+menu.view.browser.bing=Bing maps
+menu.view.browser.inlinemap=Inline map
+menu.view.browser.graphhopper=GraphHopper
+menu.settings=Prefer\u00e8ncies
+menu.settings.onlinemode=Carregar mapes des d'Internet
+menu.settings.autosave=Desa les prefer\u00e8ncies a la sortida
+menu.help=Ajuda
+
+# Popup menu for map
+menu.map.zoomin=Ampliar
+menu.map.zoomout=Reduir
+menu.map.zoomfull=Ajustar a la finestra
+menu.map.newpoint=Crear un punt
+menu.map.drawpoints=Crear s\u00e8ries de punts
+menu.map.connect=Connectar punts de la pista
+menu.map.autopan=Centra la vista
+menu.map.showmap=Mostra el mapa
+menu.map.showscalebar=Mostra l'escala
+menu.map.editmode=Mode edici\u00f3
+
+# Alt keys for menus
+altkey.menu.file=A
+altkey.menu.online=L
+altkey.menu.track=P
+altkey.menu.range=I
+altkey.menu.point=N
+altkey.menu.view=V
+altkey.menu.photo=O
+altkey.menu.audio=D
+altkey.menu.settings=C
+altkey.menu.help=J
+
+# Ctrl shortcuts for menu items
+shortcut.menu.file.open=O
+shortcut.menu.file.load=C
+shortcut.menu.file.save=D
+shortcut.menu.track.undo=Z
+shortcut.menu.track.compress=C
+shortcut.menu.range.all=T
+shortcut.menu.point.edit=E
+shortcut.menu.help.help=J
+
+# Functions
+function.open=Obrir
+function.importwithgpsbabel=Importar arxiu amb GPSBabel
+function.loadfromgps=Obtenir dades del GPS
+function.sendtogps=Exportar dades al GPS
+function.exportkml=Exportar en format KML
+function.exportgpx=Exportar en format GPX
+function.exportpov=Exportar en format POV
+function.exportimage=Exportar imatge
+function.editwaypointname=Editar el nom del punt de refer\u00e8ncia
+function.compress=Comprimir la pista
+function.deletemarked=Esborrar els punts seleccionats
+function.marklifts=Marcar els remuntadors
+function.deleterange=Esborrar l'interval
+function.croptrack=Retallar la pista
+function.interpolate=Interpolar punts
+function.deletebydate=Esborrar punts per la data
+function.addtimeoffset=Afegir despla\u00e7ament temporal
+function.addaltitudeoffset=Afegir despla\u00e7ament d'al\u00e7ada
+function.rearrangewaypoints=Reorganitza els punts de refer\u00e8ncia
+function.convertnamestotimes=Convertir els noms dels punts de refer\u00e8ncia en temps
+function.deletefieldvalues=Esborrar els valors d'un camp
+function.findwaypoint=Buscar un punt de refer\u00e8ncia
+function.pastecoordinates=Introduir les coordenades d'un punt
+function.pastecoordinatelist=Introduir una llista de coordenades
+function.enterpluscode=Introduir els codis d'ubicaci\u00f3 oberts
+function.charts=Gr\u00e0fiques
+function.show3d=Visi\u00f3 3-D
+function.distances=Dist\u00e0ncies
+function.viewfulldetails=Tots els detalls
+function.estimatetime=Temps estimat
+function.learnestimationparams=Aprendre els par\u00e0metres d'estimaci\u00f3 del temps
+function.autoplay=Seguiment autom\u00e0tic de la pista
+function.setmapbg=Fixa el tipus de mapa
+function.setpaths=Fixa el cam\u00ed del programa
+function.selectsegment=Seleccionar el segment en \u00fas.
+function.splitsegments=Trenca la pista en segments
+function.sewsegments=Uneix els segments de la pista
+function.createmarkerwaypoints=Crear punts de refer\u00e8ncia com a marcadors
+function.lookupsrtm=Obtenir al\u00e7ades de SRTM
+function.configuresrtmsources=Configurar SRTM proveidors
+function.getwikipedia=Obtenir articles de wikip\u00e8dia sobre llocs propers
+function.searchwikipedianames=Buscar Wikip\u00e8dia per noms
+function.searchosmpois=Obtenir punts OSM propers
+function.searchopencachingde=Buscar a OpenCaching.de
+function.mapillary=Buscar fotos a Mapillary
+function.downloadosm=Baixar les dades OSM per a l'\u00e0rea
+function.truncatecoords=Fixar el n\u00famero de decimals de les coordenades
+function.duplicatepoint=Duplicar un punt
+function.projectpoint=Projectar un punt
+function.projectcircle=Posar un cercle al voltant d'un punt
+function.setcolours=Triar els colors
+function.setdisplaysettings=Opcions de la pantalla
+function.setlanguage=Idioma
+function.connecttopoint=Connectar al punt
+function.disconnectfrompoint=Desconnectar del punt
+function.removephoto=Esborrar foto
+function.correlatephotos=Correlacionar fotos
+function.rearrangephotos=Reorganitzar fotos
+function.rotatephotoleft=Girar foto a l'esquerra
+function.rotatephotoright=Girar foto a la dreta
+function.photopopup=Ampliar la foto
+function.ignoreexifthumb=Carregar la foto complerta
+function.loadaudio=Afegir clips d'\u00e0udio
+function.removeaudio=Esborrar clips d'\u00e0udio
+function.correlateaudios=Correlacionar \u00e0udios
+function.playaudio=Escoltar el clip d'\u00e0udio
+function.stopaudio=Aturar el clip d'\u00e0udio
+function.help=Ajuda
+function.showkeys=Mostra les dreceres
+function.about=Sobre Gpsprune
+function.checkversion=Comprovar la versi\u00f3
+function.saveconfig=Desar les prefer\u00e8ncies
+function.diskcache=Desar els mapes al disk
+function.managetilecache=Editar la mem\u00f2ria cau dels mapes
+function.getweatherforecast=Pron\u00f2stic del temps
+function.setaltitudetolerance=Toler\u00e0ncia d'altitud
+function.selecttimezone=Triar la zona temporal
+
+# Dialogs
+dialog.exit.confirm.title=Sortir
+dialog.exit.unsaveddata.text=No s'han desat les dades.Segur que voleu sortir?
+dialog.exit.unsavedsettings.text=Es recomana desar les prefer\u00e8ncies abans de sortir. Sortir?
+dialog.openappend.title=Afegir a les dades existents
+dialog.openappend.text=Vol afegir aquestes dades a les dades existents?
+dialog.deletepoint.title=Esborra el punt
+dialog.deletepoint.deletephoto=Esborrar la foto associada a aquest punt?
+dialog.deletephoto.title=Esborrar la foto
+dialog.deletephoto.deletepoint=Esborrar el punt associat a aquesta foto?
+dialog.deleteaudio.deletepoint=Esborrar el punt associat a aquest \u00e1udio clip?
+dialog.openoptions.title=Opcions d'apertura
+dialog.openoptions.filesnippet=Extracte de l'arxiu
+dialog.load.table.field=Camp
+dialog.load.table.datatype=Tipus de dades
+dialog.load.table.description=Descripci\u00f3
+dialog.delimiter.label=Delimitador de camps
+dialog.delimiter.comma=Coma,
+dialog.delimiter.tab=Tabulador
+dialog.delimiter.space=Espai
+dialog.delimiter.semicolon=Punt i coma;
+dialog.delimiter.other=Altres
+dialog.openoptions.deliminfo.records=registres, amb
+dialog.openoptions.deliminfo.fields=camps
+dialog.openoptions.deliminfo.norecords=Sense registres
+dialog.openoptions.altitudeunits=Unitats d'altitud
+dialog.openoptions.speedunits=Unitats de velocitat
+dialog.openoptions.vertspeedunits=Unitats de velocitat vertical
+dialog.openoptions.vspeed.intro=
+dialog.openoptions.vspeed.positiveup=Velocitats positives cap amunt
+dialog.openoptions.vspeed.positivedown=Velocitats positives cap avall
+dialog.open.contentsdoubled=Aquest arxiu cont\u00e9 dues c\u00f2pies de cada punt,\nuna com a punt de refer\u00e8ncia i l'altra com a punt de pista.
+dialog.selecttracks.intro=Seleccionar la pista o pistes a carregar
+dialog.selecttracks.noname=Sense nom
+dialog.jpegload.subdirectories=Incloure sotsdirectoris
+dialog.jpegload.loadjpegswithoutcoords=Incloure fotos sense coordenades
+dialog.jpegload.loadjpegsoutsidearea=Incloure fotos fora de l'\u00e0rea en \u00fas
+dialog.jpegload.progress.title=Carregant fotos
+dialog.jpegload.progress=Espereu, si us plau, mentre es busquen les potos
+dialog.gpsload.nogpsbabel=No s'ha pogut trobar el programa gpsbabel. Continuar?
+dialog.gpsload.device=Nom del dispositiu
+dialog.gpsload.format=Format
+dialog.gpsload.getwaypoints=Carregar punts de refer\u00e8ncia
+dialog.gpsload.gettracks=Carregar pistes
+dialog.gpsload.save=Desar
+dialog.gpssend.sendwaypoints=Enviar punts de refer\u00e8ncia
+dialog.gpssend.sendtracks=Enviar pistes
+dialog.gpssend.trackname=Nom de la pista
+dialog.gpsbabel.filters=Filtres
+dialog.addfilter.title=Afegir filtres
+dialog.gpsbabel.filter.discard=Descartar
+dialog.gpsbabel.filter.simplify=Simplificar
+dialog.gpsbabel.filter.distance=Dist\u00e0ncia
+dialog.gpsbabel.filter.interpolate=Interpolar
+dialog.gpsbabel.filter.discard.intro=Descartar punts si
+dialog.gpsbabel.filter.discard.hdop=Hdop >
+dialog.gpsbabel.filter.discard.vdop=Vdop >
+dialog.gpsbabel.filter.discard.numsats=Nombre de sat\u00e8l\u00b7lits <
+dialog.gpsbabel.filter.discard.nofix=El punt no es pot resoldre
+dialog.gpsbabel.filter.discard.unknownfix=El punt t\u00e9 una soluci\u00f3 desconeguda
+dialog.gpsbabel.filter.simplify.intro=Esborra punts fins
+dialog.gpsbabel.filter.simplify.maxpoints=Nombre de punts <
+dialog.gpsbabel.filter.simplify.maxerror=o error de dist\u00e0ncia <
+dialog.gpsbabel.filter.simplify.crosstrack=pista defectuosa
+dialog.gpsbabel.filter.simplify.length=diferent longitud
+dialog.gpsbabel.filter.simplify.relative=relatiu a Hdop
+dialog.gpsbabel.filter.distance.intro=Eliminar punts si estan a prop de qualsevol punt anterior
+dialog.gpsbabel.filter.distance.distance=Si dist\u00e0ncia <
+dialog.gpsbabel.filter.distance.time=i la diferencia de temps <
+dialog.gpsbabel.filter.interpolate.intro=Afegiu punts addicionals entre els punts de la pista
+dialog.gpsbabel.filter.interpolate.distance=Si dist\u00e0ncia >
+dialog.gpsbabel.filter.interpolate.time=o la difer\u00e8ncia de temps >
+dialog.saveoptions.title=Desar l'arxiu
+dialog.save.fieldstosave=Camps a desar
+dialog.save.table.field=Camp
+dialog.save.table.hasdata=T\u00e9 dades
+dialog.save.table.save=Desar
+dialog.save.headerrow=Sortida de la fila de cap\u00e7alera
+dialog.save.coordinateunits=Format de les coordenades
+dialog.save.altitudeunits=Unitats de l'altitud
+dialog.save.timestampformat=Format del temps
+dialog.save.overwrite.title=L'arxiu ja existeix
+dialog.save.overwrite.text=Aquesl arxiu ja existeix. El voleu substituir?
+dialog.save.notypesselected=No s'ha seleccionat cap tipus de punt
+dialog.exportkml.text=T\u00edtol per a les dades
+dialog.exportkml.altitude=Altituds absolutes (aviaci\u00f3)
+dialog.exportkml.kmz=Comprimir per fer un arxiu kmz
+dialog.exportkml.exportimages=Exporta les miniatures d'imatge a kmz
+dialog.exportkml.imagesize=Mida de la imatge
+dialog.exportkml.trackcolour=Color de la pista
+dialog.exportkml.standardkml=Standard KML
+dialog.exportkml.extendedkml=KML ampliat amb marques de temps
+dialog.exportgpx.name=Nom
+dialog.exportgpx.desc=Descripci\u00f3
+dialog.exportgpx.includetimestamps=Incloure marques de temps
+dialog.exportgpx.copysource=Copiar l`xml font
+dialog.exportgpx.encoding=Codificaci\u00f3
+dialog.exportgpx.encoding.system=Sistema
+dialog.exportgpx.encoding.utf8=UTF-8
+dialog.exportpov.text=Per favor, introdueixi els par\u00e0metres per a la exportaci\u00f3 POV
+dialog.exportpov.font=Font
+dialog.exportpov.camerax=C\u00e0mera X
+dialog.exportpov.cameray=C\u00e0mera Y
+dialog.exportpov.cameraz=C\u00e0mera Z
+dialog.exportpov.modelstyle=Estil del model
+dialog.exportpov.ballsandsticks=Pilotes i pals
+dialog.exportpov.tubesandwalls=Tubs i parets
+dialog.3d.warningtracksize=Aquesta pista t\u00e9 un gran nombre de punts, que \u00e9s possible que Java3D no pugui mostrar.\nEst\u00e0 segur que vol continuar?
+dialog.3d.useterrain=Mostra el terreny
+dialog.3d.terraingridsize=Mida de la graella
+dialog.exportpov.baseimage=Imatge base
+dialog.exportpov.cannotmakebaseimage=No es pot desar la imatge base
+dialog.baseimage.title=Imatge del mapa
+dialog.baseimage.useimage=Usa la imatge
+dialog.baseimage.mapsource=Font del mapa
+dialog.baseimage.zoom=Grau d'ampliaci\u00f3
+dialog.baseimage.tiles=Fitxes
+dialog.baseimage.size=Mida de la imatge
+dialog.exportimage.noimagepossible=Les imatges del mapa s'han d'emmagatzemar a la mem\u00f2ria cau al disc per poder-les utilitzar per a una exportaci\u00f3.
+dialog.exportimage.drawtrack=Dibuixar la pista al mapa
+dialog.exportimage.drawtrackpoints=Dibuixar els punts de la pista
+dialog.exportimage.textscalepercent=Factor d'escala de text (%)
+dialog.pointtype.desc=Desa els seg\u00fcents tipus de punts:
+dialog.pointtype.track=Punts de la pista
+dialog.pointtype.waypoint=Punts de refer\u00e8ncia
+dialog.pointtype.photo=Punts de foto
+dialog.pointtype.audio=Punts d'\u00e0udio
+dialog.pointtype.selection=Punts seleccionats
+dialog.confirmreversetrack.title=Confirmar la inversi\u00f3 de l'ordre dels punts.
+dialog.confirmreversetrack.text=Aquesta pista cont\u00e9 informaci\u00f3 temporal que perdr\u00e0 el sentit un cop invertit l'ordre dels punts.\nVol continuar amb la inversi\u00f3 de l'ordre dels punts?
+dialog.confirmcutandmove.title=Confirmar tallar i moure
+dialog.confirmcutandmove.text=Aquesta pista cont\u00e9 informaci\u00f3 temporal que perdr\u00e0 el sentit un cop s'hagi mogut la pista.\nVol continuar amb el moviment?
+dialog.interpolate.parameter.text=Nombre de punts a insertar entre cada parella de punts
+dialog.interpolate.betweenwaypoints=Interpolar entre els punts de refer\u00e8ncia
+dialog.undo.title=Accions a desfer
+dialog.undo.pretext=Seleccionar les accions a desfer
+dialog.undo.none.title=No es pot desfer
+dialog.undo.none.text=No hi ha res a desfer
+dialog.clearundo.title=Netejar la llista de desfer
+dialog.clearundo.text=Segur que vol esborrar tota la llista.\nEs perdr\u00e0 tota la informaci\u00f3!
+dialog.pointedit.title=Editar el punt
+dialog.pointedit.intro=Seleccionar el camp a modificar i canviar el valor
+dialog.pointedit.table.field=Camp
+dialog.pointedit.nofield=Cap camp seleccionat
+dialog.pointedit.table.value=Valor
+dialog.pointnameedit.name=Nom del punt de refer\u00e8ncia
+dialog.pointnameedit.uppercase=Maj\u00fascules
+dialog.pointnameedit.lowercase=Min\u00fascules
+dialog.pointnameedit.titlecase=Inicial de cada paraula en maj\u00fascula
+dialog.truncatecoords.intro=Seleccionar el format de les coordenades i el nombre de decimals
+dialog.truncatecoords.numdigits=Nombre de decimals
+dialog.truncatecoords.preview=Previsualitzaci\u00f3
+dialog.addtimeoffset.add=Suma temps
+dialog.addtimeoffset.subtract=Resta temps
+dialog.addtimeoffset.weeks=Setmanes
+dialog.addtimeoffset.days=Dies
+dialog.addtimeoffset.hours=Hores
+dialog.addtimeoffset.minutes=Minuts
+dialog.addtimeoffset.notimestamps=No es pot afegir  el despla\u00e7ament temporal perqu\u00e8 la selecci\u00f3 no t\u00e9 informaci\u00f3 temporal
+dialog.findwaypoint.intro=Escriure part del nom del punt de refer\u00e8ncia
+dialog.findwaypoint.search=Buscar
+dialog.saveexif.title=Desar les metadades
+dialog.saveexif.intro=Seleccionar les fotos a desar marcant els quadrets
+dialog.saveexif.nothingtosave=No hi ha res a desar perqu\u00e8 les coordenades no han canviat
+dialog.saveexif.noexiftool=No s'ha pogut trobar car programa per a editar les metadades. Continuar?
+dialog.saveexif.table.photoname=Nom de la foto
+dialog.saveexif.table.status=Estatus
+dialog.saveexif.table.save=Desa
+dialog.saveexif.photostatus.connected=Connectat
+dialog.saveexif.photostatus.disconnected=Desconnectat
+dialog.saveexif.photostatus.modified=Modificat
+dialog.saveexif.overwrite=Substitruir fitxers
+dialog.saveexif.force=For\u00e7a malgrat errors menors
+dialog.charts.xaxis=Eixos X
+dialog.charts.yaxis=Eixos Y
+dialog.charts.output=Sortida
+dialog.charts.screen=Sortida a la pantalla
+dialog.charts.svg=Sortida a un arxiu SVG
+dialog.charts.svgwidth=Amplada SVG
+dialog.charts.svgheight=Al\u00e7ada SVG
+dialog.charts.needaltitudeortimes=La pista ha de tenir altituds o informaci\u00f3 temporal per a dibuixar gr\u00e0fics
+dialog.charts.gnuplotnotfound=No es pot trobar gnuplot amb aquest cam\u00ed
+dialog.distances.intro=Dist\u00e0ncies en l\u00ednea recta entre punts
+dialog.distances.column.from=De punt
+dialog.distances.column.to=A punt
+dialog.distances.currentpoint=Punt actual
+dialog.distances.toofewpoints=Aquesta funci\u00f3 necessita punts de refer\u00e8ncia per a calcular dist\u00e0ncies entre ells
+dialog.fullrangedetails.intro=Detalls de l'interval seleccionat
+dialog.fullrangedetails.coltotal=Incloses les llacunes
+dialog.fullrangedetails.colsegments=Sense llacunes
+dialog.estimatetime.details=Detalls
+dialog.estimatetime.gentle=Suau
+dialog.estimatetime.steep=Costerut
+dialog.estimatetime.climb=Pujada
+dialog.estimatetime.descent=Baixada
+dialog.estimatetime.parameters=Par\u00e0metres
+dialog.estimatetime.parameters.timefor=Temps per a
+dialog.estimatetime.results=Resultats
+dialog.estimatetime.results.estimatedtime=Temps estimat
+dialog.estimatetime.results.actualtime=Temps real
+dialog.estimatetime.error.nodistance=Es necessiten punts connectats per a calcular la dist\u00e0ncia
+dialog.estimatetime.error.noaltitudes=No hi ha informaci\u00f3 sobre l'altitud.
+dialog.learnestimationparams.intro=Par\u00e0metres de la pista
+dialog.learnestimationparams.averageerror=Error mitj\u00e0
+dialog.learnestimationparams.combine=Aquests par\u00e0metres es poden combinar amb els valors actuals
+dialog.learnestimationparams.combinedresults=Reultats combinats
+dialog.learnestimationparams.weight.100pccurrent=Mantenir el valors actuals
+dialog.learnestimationparams.weight.current=Actual
+dialog.learnestimationparams.weight.calculated=Calculat
+dialog.learnestimationparams.weight.50pc=Mitjana dels valors actuals i dels calculats
+dialog.learnestimationparams.weight.100pccalculated=Fer servir un altres valors calculats
+dialog.setmapbg.intro=Seleccionar una de les fons de mapes o afegir-ne una de nova
+dialog.addmapsource.title=Afegir una font de mapes
+dialog.addmapsource.sourcename=Nom de la font
+dialog.addmapsource.layer1url=URL de la primera capa
+dialog.addmapsource.layer2url=URL opcional de la segona capa
+dialog.addmapsource.maxzoom=Nivell m\u00e0xim d'ampliaci\u00f3
+dialog.addmapsource.noname=Sense nom
+dialog.gpsies.column.name=Nom de la pista
+dialog.gpsies.column.length=Llargada
+dialog.gpsies.description=Descripci\u00f3
+dialog.gpsies.nodescription=Sense descripci\u00f3
+dialog.gpsies.nonefound=No hi ha cap pista
+dialog.mapillary.nonefound=No hi ha cap foto
+dialog.wikipedia.column.name=Nom de l'article
+dialog.wikipedia.column.distance=Dist\u00e0ncia
+dialog.wikipedia.nonefound=No hi ha cap entrada a wikip\u00e8dia
+dialog.osmpois.column.name=Nom
+dialog.osmpois.column.type=Tipus
+dialog.osmpois.nonefound=No hi ha cap punt
+dialog.geocaching.nonefound=No hi ha cap geoamagatall
+dialog.correlate.notimestamps=No es pot correlacionar res amb les fotos perqu\u00e8 el punts no tenen informaci\u00f3 temporal.
+dialog.correlate.nouncorrelatedphotos=No hi han fotos correlacionades.\nContinuar?
+dialog.correlate.nouncorrelatedaudios=No hi han \u00e0udios correlacionats.\nContinuar?
+dialog.correlate.photoselect.intro=Seleccionar una de les fotos correlacionades per a fer servir de difer\u00e8ncia temporal
+dialog.correlate.select.photoname=Nom de la foto
+dialog.correlate.select.timediff=Difer\u00e8ncia hor\u00e0ria
+dialog.correlate.select.photolater=Foto m\u00e9s tard
+dialog.correlate.options.intro=Seleccionar les opcions per a la correlaci\u00f3 autom\u00e0tica
+dialog.correlate.options.offsetpanel=Difer\u00e8ncia temporal
+dialog.correlate.options.offset=Difer\u00e8ncia
+dialog.correlate.options.offset.hours=hores
+dialog.correlate.options.offset.minutes=minuts i
+dialog.correlate.options.offset.seconds=segons
+dialog.correlate.options.photolater=Foto m\u00e9s tard que el punt
+dialog.correlate.options.pointlaterphoto=Punt m\u00e9s tard que la foto
+dialog.correlate.options.audiolater=\u00c0udio m\u00e9s tard que el punt
+dialog.correlate.options.pointlateraudio=Punt m\u00e9s tard que l'\u00c0udio
+dialog.correlate.options.limitspanel=Limits de la correlaci\u00f3
+dialog.correlate.options.notimelimit=Temps sense l\u00edmit
+dialog.correlate.options.timelimit=L\u00edmit temporal
+dialog.correlate.options.nodistancelimit=Dist\u00e0ncia sense l\u00edmit
+dialog.correlate.options.distancelimit=L\u00edmit de la dist\u00e0ncia
+dialog.correlate.options.correlate=Correlacionar
+dialog.correlate.alloutsiderange=Totes les fotos s\u00f3n fora de rang de temps de la pista, o sigui que cap d'elles es pot correlacionar.\nProvar canviant el despla\u00e7ament de temps o correlacionant manualment al menys una foto.
+dialog.correlate.filetimes=Les marques de temps dels fitxers denoten:
+dialog.correlate.filetimes2=del clip d'\u00e0udio
+dialog.correlate.correltimes=Per a correlaci\u00f3, fer servir:
+dialog.correlate.timestamp.beginning=Comen\u00e7ament
+dialog.correlate.timestamp.middle=Meitat
+dialog.correlate.timestamp.end=Fi
+dialog.correlate.audioselect.intro=Seleccionar un d'aquest \u00e0udios correlacionats per a fer servir de despla\u00e7ament de temps
+dialog.correlate.select.audioname=Nom de l'\u00c0udio
+dialog.correlate.select.audiolater=L'\u00e0udio m\u00e9s tard
+dialog.rearrangewaypoints.desc=Selecciona la destinaci\u00f3 i ordena els punts de refer\u00e8ncia
+dialog.rearrangephotos.desc=Selecciona la destinaci\u00f3 i ordena els punts de foto
+dialog.rearrange.tostart=Moure cap al comen\u00e7ament
+dialog.rearrange.toend=Moure cap a  la fi
+dialog.rearrange.tonearest=Cadascun al punt de la pista m\u00e9s proper
+dialog.rearrange.nosort=No ordenar
+dialog.rearrange.sortbyfilename=Ordena per nom de l'arxiu
+dialog.rearrange.sortbyname=Ordena per nom
+dialog.rearrange.sortbytime=Ordena per temps
+dialog.compress.closepoints.title=Eliminaci\u00f3 del punt proper
+dialog.compress.closepoints.paramdesc=Factor d'expansi\u00f3
+dialog.compress.wackypoints.title=Eliminaci\u00f3 de punt boig
+dialog.compress.wackypoints.paramdesc=Factor de dist\u00e0ncia
+dialog.compress.singletons.title=Eliminaci\u00f3 de singulars
+dialog.compress.singletons.paramdesc=Factor de dist\u00e0ncia
+dialog.compress.duplicates.title=Eliminaci\u00f3 de duplicats
+dialog.compress.douglaspeucker.title=Compressi\u00f3 Douglas-Peucker
+dialog.compress.douglaspeucker.paramdesc=Factor d'expansi\u00f3
+dialog.compress.summarylabel=Punts a esborrar
+dialog.compress.confirm=%d punts s'han seleccionat.\n Esborrar-los?
+dialog.compress.confirmnone=No s'ha seleccionat cap punt
+dialog.deletemarked.nonefound=No s'ha pogut esborrar cap punt
+dialog.pastecoordinates.desc=Introduir les coordenades aqu\u00ed
+dialog.pastecoordinates.coords=Coordenades
+dialog.pastecoordinates.nothingfound=Error, torna a entrar-les
+dialog.pastecoordinatelist.desc=Introduir les coordenades per als punts nous amb un punt per l\u00ednia
+dialog.pluscode.desc=Introduir el plus codi aqu\u00ed
+dialog.pluscode.code=Plus codi
+dialog.pluscode.nothingfound=Torna a entrar el codi
+dialog.help.help=Per favor obriu\n https://gpsprune.activityworkshop.net/\n per a tenir m\u00e9s informaci\u00f3, \n i tamb\u00e9 un manual en PDF que es pot comprar.
+dialog.about.version=Versi\u00f3
+dialog.about.build=Construir
+dialog.about.summarytext1=GpsPrune \u00e9s un programa per carregar, mostrar i editar dades dels receptors GPS.
+dialog.about.summarytext2=Est\u00e0 publicat sota la GPL Gnu per a un \u00fas i millora gratu\u00efts, oberts i arreu del m\u00f3n.<br>La c\u00f2pia, la redistribuci\u00f3 i la modificaci\u00f3 estan permeses i recomanades<br>d'acord amb les condicions del arxiu <code>license.txt</code> incl\u00f2s.
+dialog.about.summarytext3=Consulteu <code style="font-weight:bold">https://activityworkshop.net/</code> per obtenir m\u00e9s informaci\u00f3 i consells, inclosa<br>una guia d'usuari en PDF que podeu comprar.
+dialog.about.languages=Idiomes disponibles
+dialog.about.translatedby=Text en catal\u00e0 per J.M. Ferrer i Gener
+dialog.about.systeminfo=Informaci\u00f3 del sistema
+dialog.about.systeminfo.os=Sistema operatiu
+dialog.about.systeminfo.java=Java Runtime
+dialog.about.systeminfo.java3d=Java3d instal\u00b7lat
+dialog.about.systeminfo.exiftool=Exiftool instal\u00b7lat
+dialog.about.systeminfo.gpsbabel=Gpsbabel instal\u00b7lat
+dialog.about.systeminfo.gnuplot=Gnuplot instal\u00b7lat
+dialog.about.yes=S\u00ed
+dialog.about.no=No
+dialog.about.credits=Cr\u00e8dits
+dialog.about.credits.code=Codi GpsPrune escrit per
+dialog.about.credits.exifcode=Codi Exif per
+dialog.about.credits.icons=Algunes icones extretes de
+dialog.about.credits.translators=Traductors
+dialog.about.credits.translations=Traduccions ajudades per
+dialog.about.credits.devtools=Eines de desenvolupament
+dialog.about.credits.othertools=Altres eines
+dialog.about.credits.thanks=Gr\u00e0cies a
+dialog.about.readme=Llegeixme
+dialog.checkversion.error=No s'ha pogut comprovar el n\u00famero de versi\u00f3.\nSi us plau, comproveu la connexi\u00f3 a Internet.
+dialog.checkversion.uptodate=Esteu utilitzant la darrera versi\u00f3 de GpsPrune.
+dialog.checkversion.newversion1=Ja est\u00e0 disponible una nova versi\u00f3 de GpsPrune! L'\u00faltima versi\u00f3 \u00e9s ara versi\u00f3
+dialog.checkversion.newversion2=.
+dialog.checkversion.releasedate1=Aquesta nova versi\u00f3 es va publicar el
+dialog.checkversion.releasedate2=.
+dialog.checkversion.download=Per descarregar la nova versi\u00f3, aneu a https://gpsprune.activityworkshop.net/download.html.
+dialog.keys.intro=Podeu utilitzar les tecles de drecera seg\u00fcents en lloc d'utilitzar el ratol\u00ed
+dialog.keys.keylist=<table><tr><td>Tecles de fletxa</td><td>Despla\u00e7a el mapa esquerra, dreta, amunt, avall</td></tr><tr><td>Ctrl + esquerra, fletxa dreta</td> <td>Selecciona el punt anterior o seg\u00fcent</td></tr><tr><td>Ctrl + fletxa amunt, avall</td><td>Apropar o reduir</td></tr><tr> <td>Ctrl + PgAp, PgDown</td><td>Selecciona el segment anterior i seg\u00fcent</td></tr><tr><td>Ctrl + Inici, Final</td><td>Selecciona primer, darrer punt</td></tr><tr><td>Suprimeix</td><td>Suprimeix el punt actual</td></tr></table>
+dialog.keys.normalmodifier=Ctrl
+dialog.keys.macmodifier=Command
+dialog.paths.prune.gnuplotpath=Cam\u00ed a gnuplot
+dialog.paths.prune.gpsbabelpath=Cam\u00ed a gpsbabel
+dialog.paths.prune.exiftoolpath=Cam\u00ed a exiftool
+dialog.setpaths.intro=Si ho necessiteu, podeu triar els camins a les aplicacions externes:
+dialog.setpaths.found=S'ha trobat el cam\u00ed?
+dialog.addaltitude.noaltitudes=L'interval seleccionat no cont\u00e9 altituds
+dialog.addaltitude.desc=Despla\u00e7ament d'altitud per afegir
+dialog.lookupsrtm.overwritezeros=Sobreescriu els valors d'altitud de zero?
+dialog.setcolours.intro=Feu clic a un pegat de color per canviar-lo
+dialog.setcolours.background=Fons
+dialog.setcolours.borders=Vores
+dialog.setcolours.lines=L\u00ednies
+dialog.setcolours.primary=Primari
+dialog.setcolours.secondary=Secundari
+dialog.setcolours.point=Punts
+dialog.setcolours.selection=Selecci\u00f3
+dialog.setcolours.text=Text
+dialog.colourchooser.title=Tria el color
+dialog.colourchooser.red=Vermell
+dialog.colourchooser.green=Vert
+dialog.colourchooser.blue=Blau
+dialog.colourer.intro=Un pintor de punts pot donar colors diferents als punts de la pista
+dialog.colourer.type=Tipus de pintor
+dialog.colourer.type.none=Res
+dialog.colourer.type.byfile=Per arxiu
+dialog.colourer.type.bysegment=Per segment
+dialog.colourer.type.byaltitude=Per altitud
+dialog.colourer.type.byspeed=Per velocitat
+dialog.colourer.type.byvertspeed=Per velocitat vertical
+dialog.colourer.type.bygradient=Per gradient
+dialog.colourer.type.bydate=Per data
+dialog.colourer.start=Iniciar color
+dialog.colourer.end=Finalitzar color
+dialog.colourer.maxcolours=Nombre m\u00e0xim de colors
+dialog.setlanguage.firstintro=Podeu seleccionar un dels idiomes inclosos<p>o seleccionar un arxiu de text per utilitzar-lo.
+dialog.setlanguage.secondintro=Heu de desar la vostra configuraci\u00f3 i despr\u00e9s<p>reiniciar GpsPrune per canviar l'idioma.
+dialog.setlanguage.language=Idioma
+dialog.setlanguage.languagefile=Arxiu d'idioma
+dialog.setlanguage.endmessage=Ara deseu la vostra configuraci\u00f3 i reinicieu GpsPrune\nperqu\u00e8 el canvi d'idioma tingui efecte.
+dialog.setlanguage.endmessagewithautosave=Si us plau, reinicieu GpsPrune perqu\u00e8 el canvi d'idioma tingui efecte.
+dialog.diskcache.save=Desa les imatges del mapa al disc
+dialog.diskcache.dir=Directori de mem\u00f2ria cau
+dialog.diskcache.createdir=Crear un directori
+dialog.diskcache.nocreate=No s'ha creat el directori de la mem\u00f2ria cau
+dialog.diskcache.cannotwrite=Les fitxes del mapa no es poden desar al directori seleccionat
+dialog.diskcache.table.path=Cam\u00ed
+dialog.diskcache.table.usedby=Utilitzat per
+dialog.diskcache.table.zoom=Ampliar/Reduir
+dialog.diskcache.table.tiles=Fitxes
+dialog.diskcache.table.megabytes=Megabytes
+dialog.diskcache.tileset=Conjunt de fitxes
+dialog.diskcache.tileset.multiple=m\u00faltiple
+dialog.diskcache.deleteold=Esborrar les fitxes velles
+dialog.diskcache.maximumage=Edat m\u00e0xima en dies
+dialog.diskcache.deleteall=Esborrar totes les fitxes
+dialog.diskcache.deleted=Esborrats %d arxius de la mem\u00f2ria cau
+dialog.deletefieldvalues.intro=Seleccioneu el camp que voleu suprimir per a l'interval actual
+dialog.deletefieldvalues.nofields=No hi ha camps per eliminar per a aquest interval
+dialog.displaysettings.linewidth=Gruix de l\u00ednies per a les vies (1-4)
+dialog.displaysettings.antialias=Utilitzeu l'antialiasing
+dialog.displaysettings.waypointicons=Icones dels punts de refer\u00e8ncia
+dialog.displaysettings.wpicon.default=Defecte
+dialog.displaysettings.wpicon.ringpt=Marcador rod\u00f3
+dialog.displaysettings.wpicon.plectrum=Plectrum
+dialog.displaysettings.wpicon.ring=Anell
+dialog.displaysettings.wpicon.pin=Pin del tauler
+dialog.displaysettings.size.small=Petit
+dialog.displaysettings.size.medium=Mitj\u00e0
+dialog.displaysettings.size.large=Gran
+dialog.displaysettings.windowstyle=Estil de les finestres (s'ha de reiniciar)
+dialog.displaysettings.windowstyle.default=Defecte
+dialog.displaysettings.windowstyle.nimbus=Nimbus
+dialog.displaysettings.windowstyle.gtk=GTK
+dialog.downloadosm.desc=Confirmeu la desc\u00e0rrega de les dades originals de l'OSM per a l'\u00e0rea especificada:
+dialog.searchwikipedianames.search=Buscar per:
+dialog.weather.location=Ubicaci\u00f3
+dialog.weather.update=Previsi\u00f3 actualitzada
+dialog.weather.sunrise=Sortida del sol
+dialog.weather.sunset=Posta del sol
+dialog.weather.temperatureunits=Temperatures
+dialog.weather.currentforecast=El Temps actual
+dialog.weather.dailyforecast=Previsi\u00f3 di\u00e0ria
+dialog.weather.3hourlyforecast=Previsi\u00f3 de tres hores
+dialog.weather.day.now=El Temps actual
+dialog.weather.day.today=Avui
+dialog.weather.day.tomorrow=Dem\u00e0
+dialog.weather.day.monday=Dilluns
+dialog.weather.day.tuesday=Dimars
+dialog.weather.day.wednesday=Dimecres
+dialog.weather.day.thursday=Dijous
+dialog.weather.day.friday=Divendres
+dialog.weather.day.saturday=Dissabte
+dialog.weather.day.sunday=Diumenge
+dialog.weather.wind=Vent
+dialog.weather.temp=Temp
+dialog.weather.humidity=Humitat
+dialog.weather.creditnotice=Aquestes dades estan disponibles a openweathermap.org. El seu lloc web t\u00e9 m\u00e9s detalls
+dialog.deletebydate.onlyonedate=Tots els punts es van registrar en la mateixa data.
+dialog.deletebydate.intro=Per a cada data de la pista, podeu triar suprimir o mantenir els punts
+dialog.deletebydate.nodate=No hi ha informaci\u00f3 temporal
+dialog.deletebydate.column.keep=Mantenir
+dialog.deletebydate.column.delete=Esborrar
+dialog.setaltitudetolerance.text.metres=L\u00edmit (en metres) per sota del qual s'ignoraran les petites pujades i baixades
+dialog.setaltitudetolerance.text.feet=L\u00edmit (en peus) per sota del qual s'ignoraran les petites pujades i baixades
+dialog.settimezone.intro=Aqu\u00ed podeu seleccionar la zona hor\u00e0ria on mostrar les marques de temps dels punts
+dialog.settimezone.system=Utilitzeu la zona hor\u00e0ria del sistema
+dialog.settimezone.custom=Utilitzeu la seg\u00fcent zona hor\u00e0ria:
+dialog.settimezone.list.toomany=Massa per triar
+dialog.settimezone.selectedzone=Zona hor\u00e0ria seleccionada
+dialog.settimezone.offsetfromutc=Despla\u00e7ament des de UTC
+dialog.autoplay.duration=Durada (segons)
+dialog.autoplay.usetimestamps=Utilitza la informaci\u00f3 temporal del punt
+dialog.autoplay.rewind=Tornar al principi
+dialog.autoplay.pause=Pausa
+dialog.autoplay.play=En marxa
+dialog.markers.halves=Punts a mig cam\u00ed
+dialog.markers.half.distance=Mitja dist\u00e0ncia
+dialog.markers.half.climb=Mitja pujada
+dialog.markers.half.descent=Mitja baixada
+dialog.projectpoint.desc=Introdu\u00efu la direcci\u00f3 i la dist\u00e0ncia per projectar aquest punt
+dialog.projectpoint.bearing=Ruta (graus des del N)
+dialog.projectcircle.desc=Introdu\u00efu la dist\u00e0ncia des d'aquest punt fins al cercle circumdant
+dialog.configuresrtm.intro1=Les altituds de SRTM poden provenir de dades de baixa resoluci\u00f3 sense iniciar sessi\u00f3,
+dialog.configuresrtm.intro2=o registrant-se a la NASA per obtenir dades d'alta resoluci\u00f3
+dialog.configuresrtm.threesecond=Dades de baixa resoluci\u00f3 (tres segons d'arc)
+dialog.configuresrtm.threesecond.desc=Les dades de baixa resoluci\u00f3 sempre estan habilitades sense registre ni compte
+dialog.configuresrtm.onesecond=Dades d'alta resoluci\u00f3 (un segon d'arc)
+dialog.configuresrtm.onesecond.desc1=Les dades d'alta resoluci\u00f3 requereixen un registre i un compte
+dialog.configuresrtm.onesecond.desc2=Creeu un compte a https://urs.earthdata.nasa.gov/users/new
+dialog.configuresrtm.showregistrationwebsite=Anar ara al lloc web de la NASA per registrar-te?
+dialog.configuresrtm.userid=Nom d'usuari registrat a NASA Earthdata
+dialog.configuresrtm.password=Contrasenya registrada a NASA Earthdata
+dialog.configuresrtm.loginfailed=El servidor d'Earthdata ha rebutjat el nom d'usuari i la contrasenya
+
+# 3d window
+dialog.3d.title=Vista en 3-D de GpsPrune
+dialog.3d.altitudefactor=Factor d'exageraci\u00f3 d'altitud
+
+# Confirm messages
+confirm.loadfile=Dades carregades de l'arxiu
+confirm.save.ok1=Desat amb \u00e8xit
+confirm.save.ok2=punts a l'arxiu
+confirm.deletepoint.single=s'ha esborrat un punt
+confirm.deletepoint.multi=s'han esborrat punts
+confirm.point.edit=punt editat
+confirm.mergetracksegments=Segment de la pista fusionats
+confirm.reverserange=Interval invertit
+confirm.addtimeoffset=S'ha afegit el despla\u00e7ament temporal
+confirm.addaltitudeoffset=S'ha afegit el despla\u00e7ament d'altitud
+confirm.rearrangewaypoints=Punts de refer\u00e8ncia reordenats
+confirm.rearrangephotos=Fotos reordenades
+confirm.splitsegments=S'han fet %d divisions de segments
+confirm.sewsegments=S'han fet %d unions de segments
+confirm.cutandmove=La selecci\u00f3 s'ha mogut
+confirm.pointsadded=afegits %d punts
+confirm.convertnamestotimes=S'han convertit els noms dels punts de refer\u00e8ncia
+confirm.saveexif.ok=Desats %d arxius de fotos
+confirm.undo.single=operaci\u00f3 desfeta
+confirm.undo.multi=operacions desfetes
+confirm.jpegload.single=foto afegida
+confirm.jpegload.multi=Fotos afegides
+confirm.media.connect=media connectat
+confirm.photo.disconnect=foto desconectada
+confirm.audio.disconnect=Audio desconectat
+confirm.media.removed=esborrar
+confirm.correlatephotos.single=s'ha correlacionat la foto
+confirm.correlatephotos.multi=s'han correlacionat les fotos
+confirm.createpoint=punt creat
+confirm.rotatephoto=foto girada
+confirm.running=Corrent ...
+confirm.lookupsrtm=Trobats %d valors d'altitud
+confirm.downloadsrtm=S'han baixat %d arxius a la mem\u00f2ria cau
+confirm.downloadsrtm.1=S'han baixat %d arxiiu a la mem\u00f2ria cau
+confirm.deletefieldvalues=Valors del camp esborrats
+confirm.audioload=Afegits arxius d'\u00e0udio
+confirm.correlateaudios.single=l'\u00e0udio estava correlacionat
+confirm.correlateaudios.multi=els \u00e0udios estaven correlacionats
+confirm.applytimestamps=Marques de temps aplicades a la selecci\u00f3
+
+# Tips, shown just once when appropriate
+tip.title=Concell
+tip.useamapcache=Si configureu una mem\u00f2ria cau de disc (Configuraci\u00f3 -> Desa els mapes al disc)\npodeu accelerar la visualitzaci\u00f3 i reduir el tr\u00e0nsit de xarxa.
+tip.learntimeparams=Els resultats seran m\u00e9s precisos si utilitzeu\nTrack -> Apr\u00e8n els par\u00e0metres d'estimaci\u00f3 del temps\na les pistes enregistrades.
+tip.downloadsrtm=Podeu accelerar-ho configurant una mem\u00f2ria cau del disc\nper desar les dades SRTM localment.
+tip.usesrtmfor3d=Aquesta pista no t\u00e9 altituds.\nPodeu utilitzar les funcions SRTM per obtenir\naltituds aproximades per a la vista 3D.
+tip.manuallycorrelateone=En connectar manualment almenys un element, es pot calcular el despla\u00e7ament temporal.
+tip.nonstandardconfigfilename=Si escolliu un nom d'arxiu no est\u00e0ndard per a la configuraci\u00f3,\nhaureu d'indicar a GpsPrune a l'inici com trobar-lo\nusant el par\u00e0metre "--configfile".
+
+# Buttons
+button.ok=D'acord
+button.back=Anterior
+button.next=Seg\u00fcent
+button.finish=Fi
+button.cancel=Cancel\u00b7lar
+button.overwrite=Sobreescriure
+button.moveup=Moure amunt
+button.movedown=Moure avall
+button.edit=Editar
+button.exit=Sortir
+button.close=Tancar
+button.continue=Continuar
+button.yes=S\u00ed
+button.no=No
+button.yestoall=S\u00ed a tot
+button.notoall=No a tot
+button.always=Sempre
+button.select=Seleccionar
+button.selectall=Seleccionar-ho tot
+button.selectnone=Anular la selecci\u00f3
+button.preview=Previsualitzaci\u00f3
+button.load=Carrega
+button.guessfields=Endevina camps
+button.showwebpage=Obre la p\u00e0gina web
+button.check=Comprovar
+button.resettodefaults=Restableix els valors predeterminats
+button.browse=Navega ...
+button.addnew=Afegir un de nou
+button.delete=Esborrar
+button.manage=Gestionar
+button.combine=Combinar
+button.keepselected=Mantenir seleccionat
+button.deleteselected=Esborrar seleccionat
+button.apply=Aplicar
+
+# File types
+filetype.txt=Arxius TXT
+filetype.jpeg=Arxius JPG
+filetype.kmlkmz=Arxius KML, KMZ
+filetype.kml=Arxius KML
+filetype.kmz=Arxius KMZ
+filetype.gpx=Arxius GPX
+filetype.pov=Arxius POV
+filetype.svg=Arxius SVG
+filetype.png=Arxius PNG
+filetype.audio=Arxius MP3, OGG, WAV
+
+# Display components
+display.nodata=No s'han carregat dades
+display.noaltitudes=Les dades de la pista no inclouen altituds
+display.notimestamps=Les dades de la pista no inclouen marques de temps
+display.novalues=Les dades de la pista no inclouen valors per a aquest camp
+details.trackdetails=Detalls de la pista
+details.notrack=No hi ha cap pista carregada
+details.track.points=Punts
+details.track.file=Arxiu
+details.track.numfiles=Nombre d'arxius
+details.pointdetails=Detalls del punt
+details.index.selected=\u00cdndex
+details.index.of=de
+details.nopointselection=No s'ha seleccionat cap punt
+details.photofile=Arxiu fotogr\u00e0fic
+details.norangeselection=No s'ha seleccionat cap interval
+details.rangedetails=Detalls de l'interval
+details.range.selected=Seleccionat
+details.range.to=a
+details.altitude.to=a
+details.range.climb=Pujada
+details.range.descent=Baixada
+details.coordformat=Format de les coordenades
+details.distanceunits=Unitats de dist\u00e0ncia
+display.range.time.secs=s
+display.range.time.mins=m
+display.range.time.hours=h
+display.range.time.days=d
+details.range.avespeed=Velocitat mitjana
+details.range.maxspeed=Velocitat m\u00e0xima
+details.range.numsegments=Nombre de segments
+details.range.pace=Ritme
+details.range.gradient=Gradient
+details.lists.waypoints=Punts de refer\u00e8ncia
+details.lists.photos=Fotos
+details.lists.audio=\u00c0udio
+details.photodetails=Detalls de la foto
+details.nophoto=No s'ha seleccionat cap foto
+details.photo.loading=Carregant
+details.photo.bearing=Posici\u00f3
+details.media.connected=Conectat
+details.media.fullpath=Cam\u00ed complert
+details.audiodetails=Detalls de l'\u00e0udio
+details.noaudio=No s'ha seleccionat cap clip d'\u00e0udio
+details.audio.file=Arxiu d'\u00e0udio
+details.audio.playing=Sonant ...
+map.overzoom=No hi ha cap mapa disponible en aquest nivell d'ampliaci\u00f3
+
+# Field names
+fieldname.latitude=Latitud
+fieldname.longitude=Longitud
+fieldname.coordinates=Coordenades
+fieldname.altitude=Altitud
+fieldname.timestamp=Temps
+fieldname.time=Temps
+fieldname.date=Data
+fieldname.waypointname=Nom
+fieldname.waypointtype=Tipus
+fieldname.newsegment=Segment
+fieldname.custom=Personalitzat
+fieldname.prefix=Camp
+fieldname.distance=Dist\u00e0ncia
+fieldname.duration=Durada
+fieldname.speed=Velocitat
+fieldname.verticalspeed=Velocitat vertical
+fieldname.description=Descripci\u00f3
+fieldname.comment=Comentari
+fieldname.mediafilename=Nom de l'arxiu
+
+# Measurement units
+units.original=Original
+units.default=Defecte
+units.metres=Metres
+units.metres.short=m
+units.feet=Peus
+units.feet.short=Ps
+units.kilometres=Kil\u00f2metres
+units.kilometres.short=km
+units.kilometresperhour=km per hora
+units.kilometresperhour.short=km/h
+units.miles=Milles
+units.miles.short=mi
+units.milesperhour=milles per hora
+units.milesperhour.short=mph
+units.nauticalmiles=Milles n\u00e0utiques
+units.nauticalmiles.short=M.n.
+units.nauticalmilesperhour.short=Nusos
+units.metrespersec=metres per segond
+units.metrespersec.short=m/s
+units.feetpersec=peus per segon
+units.feetpersec.short=ps/s
+units.hours=hores
+units.minutes=minuts
+units.seconds=segons
+units.degminsec=Grau-min-seg
+units.degmin=Grau-min
+units.deg=Graus
+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=i
+logic.or=o
+
+# External urls and services
+url.googlemaps=maps.google.cat
+wikipedia.lang=ca
+openweathermap.lang=ca
+webservice.peakfinder=Obrir Peakfinder.org
+webservice.geohack=Obrir Geohack page
+
+# Cardinals for 3d plots
+cardinal.n=N
+cardinal.s=S
+cardinal.e=E
+cardinal.w=O
+
+# Undo operations
+undo.load=Carregar dades
+undo.loadphotos=carregar fotos
+undo.loadaudios=carregar clips d'\u00e0udio
+undo.editpoint=editar un punt
+undo.deletepoint=esborrar un punt
+undo.removephoto=esborrar una foto
+undo.removeaudio=esborrar un clip d'\u00e0udio
+undo.deleterange=esborrar un interval
+undo.croptrack=retallar una pista
+undo.deletemarked=esborrar punts
+undo.insert=insertar punts
+undo.reverse=invertir un interval
+undo.mergetracksegments=combinar segments de pista
+undo.splitsegments=segments de pista dividits
+undo.sewsegments=unir segments de pista
+undo.addtimeoffset=afegir despla\u00e7ament temporal
+undo.addaltitudeoffset=afegir despla\u00e7ament d'altitud
+undo.rearrangewaypoints=reordena els punts de refer\u00e8ncia
+undo.cutandmove=moure una secci\u00f3
+undo.connect=connectar
+undo.disconnect=desconnectar
+undo.correlatephotos=correlacionar fotos
+undo.rearrangephotos=reordenar fotos
+undo.createpoint=crear punt
+undo.rotatephoto=girar foto
+undo.convertnamestotimes=convertir noms en temps
+undo.lookupsrtm=buscar les altituds a SRTM
+undo.deletefieldvalues=suprimir els valors del camp
+undo.correlateaudios=correlacionar \u00e0udios
+undo.applytimestamps=Aplicar marques temporals
+
+# Error messages
+error.save.dialogtitle=S'ha produ\u00eft un error en desar les dades
+error.save.nodata=No hi ha dades per desar
+error.save.failed=No s'han pogut desar les dades a l'arxiu
+error.saveexif.filenotfound=No s'ha pogut trobar l'arxiu fotogr\u00e0fic
+error.saveexif.cannotoverwrite1=l'arxiu fotogr\u00e0fic
+error.saveexif.cannotoverwrite2=\u00e9s nom\u00e9s de lectura i no es pot sobreescriure. Escriure a la c\u00f2pia?
+error.saveexif.failed=No s'han pogut desar %d de les imatges
+error.saveexif.forced=S'ha requerit for\u00e7ar %d de les imatges
+error.load.dialogtitle=Error carregant les dades
+error.load.noread=No es pot llegir l'arxiu
+error.load.nopoints=No s'ha trobat informaci\u00f3 sobre coordenades a l'arxiu
+error.load.unknownxml=No es pot recon\u00e8ixer el format xml
+error.load.noxmlinzip=No s'ha trobar cap arxiu xml
+error.load.othererror=Error llegint l'arxiu:
+error.load.nopointsintext=No s'ha trobat informaci\u00f3 sobre coordenades
+error.jpegload.dialogtitle=Error carregant les fotos
+error.jpegload.nofilesfound=No hi han arxius
+error.jpegload.nojpegsfound=No hi han fitxers jpeg
+error.jpegload.nogpsfound=No s'ha trobat informaci\u00f3 sobre GPS
+error.audioload.nofilesfound=No s'ha trobat cap clip d'\u00e0udio
+error.gpsload.unknown=Error desconegut
+error.undofailed.title=No s'ha pogut desfer
+error.undofailed.text=No s'ha pogut desfer l'operaci\u00f3
+error.function.noop.title=La funci\u00f3 no retorna res
+error.rearrange.noop=La reordenaci\u00f3 no ha funcionat
+error.function.notavailable.title=Funci\u00f3 no disponible
+error.function.nojava3d=Aquesta funci\u00f3 necessita la biblioteca Java3d
+error.3d=S'ha produ\u00eft un error amb la pantalla 3D
+error.readme.notfound=No s'ha trobat l'arxiu llegeixme
+error.osmimage.dialogtitle=S'ha produ\u00eft un error en carregar les imatges del mapa
+error.osmimage.failed=No s'han pogut carregar les imatges del mapa. Si us plau, comproveu la connexi\u00f3 a Internet.
+error.language.wrongfile=El fitxer seleccionat no sembla ser un fitxer d'idioma per a GpsPrune
+error.convertnamestotimes.nonames=No es va poder convertir cap nom en temps
+error.lookupsrtm.nonefound=No hi ha valors d'altitud disponibles per a aquests punts
+error.lookupsrtm.nonerequired=Tots els punts ja tenen altituds, aix\u00ed que no hi ha res a cercar
+error.showphoto.failed=No s'ha pogut carregar la foto
+error.playaudiofailed=No s'ha pogut reproduir el clip d'\u00e0udio
+error.cache.notthere=No s'ha trobat el directori de la mem\u00f2ria cau de fitxes
+error.cache.empty=El directori de la mem\u00f2ria cau de fitxes est\u00e0 buit
+error.cache.cannotdelete=No s'ha pogut suprimir cap fitxa
+error.learnestimationparams.failed=No es poden aprendre els par\u00e0metres d'aquesta pista.\nProva de carregar m\u00e9s pistes
+error.tracksplit.nosplit=La pista no es va poder dividir
+error.sewsegments.nothingdone=No s'han pogut unir cap segment.\nAra hi ha %d segments a la pista.


=====================================
tim/prune/lang/prune-texts_cy.properties
=====================================
@@ -7,7 +7,9 @@ menu.file.exit=Gadael
 menu.online=Rhyngrwyd
 menu.track=Wysg
 menu.track.undo=Dadwneud
+menu.range=Amrediad
 menu.point=Pwynt
+menu.point.deletepoint=Dileu'r pwynt
 menu.photo=Llun
 menu.photo.saveexif=Cadw Exif
 menu.audio=Awdio
@@ -26,7 +28,7 @@ menu.map.showscalebar=Dangoswch y bar graddfa
 # Alt keys for menus
 altkey.menu.file=F
 altkey.menu.online=R
-altkey.menu.range=N
+altkey.menu.range=M
 altkey.menu.track=T
 altkey.menu.point=P
 altkey.menu.view=G
@@ -41,14 +43,18 @@ function.exportkml=Cadw KML
 function.exportgpx=Cadw GPX
 function.exportpov=Cadw POV
 function.exportimage=Cadw llun
+function.deleterange=Dileu'r amrediad
 function.charts=Siartiau
 function.distances=Pellterau
 function.viewfulldetails=Manylion
 function.help=Cymorth
 function.about=Ynghylych GpsPrune
+function.selecttimezone=Gosod y gylchfa amser
 
 # Dialogs
 dialog.exit.confirm.title=Gadael GpsPrune
+dialog.deletepoint.title=Dileu'r pwynt
+dialog.load.table.description=Disgrifiad
 dialog.delimiter.comma=Coma ,
 dialog.delimiter.semicolon=Hannercolon ;
 dialog.gpsload.format=Fformat
@@ -86,6 +92,13 @@ dialog.displaysettings.size.small=Bach
 dialog.displaysettings.size.large=Mawr
 dialog.weather.day.today=Heddiw
 dialog.weather.day.tomorrow=Yfory
+dialog.weather.day.monday=Dydd Llun
+dialog.weather.day.tuesday=Dydd Mawrth
+dialog.weather.day.wednesday=Dydd Mercher
+dialog.weather.day.thursday=Dydd Iau
+dialog.weather.day.friday=Dydd Gwener
+dialog.weather.day.saturday=Dydd Sadwrn
+dialog.weather.day.sunday=Dydd Sul
 
 # Buttons
 button.ok=Iawn
@@ -97,13 +110,17 @@ button.preview=Rhagarddangosfa
 button.delete=Dilea
 
 # Display components
+details.track.points=Pwyntiau
 details.track.file=Ffeil
+details.index.selected=Mynegai
+details.index.of=o
 details.lists.audio=Awdio
 
 # Field names
 fieldname.latitude=Lledred
 fieldname.longitude=Hydred
 fieldname.coordinates=Cyfesurynnau
+fieldname.altitude=Uchder
 fieldname.waypointname=Enw
 fieldname.distance=Pellter
 fieldname.speed=Cyflymder
@@ -118,3 +135,7 @@ logic.or=neu
 url.googlemaps=maps.google.co.uk
 wikipedia.lang=cy
 openweathermap.lang=en
+
+# Undo operations
+undo.deletepoint=dileu'r pwynt
+undo.deleterange=dileu'r amrediad


=====================================
tim/prune/lang/prune-texts_es.properties
=====================================
@@ -300,6 +300,7 @@ dialog.pointnameedit.name=Nombre de waypoint
 dialog.pointnameedit.uppercase=May\u00fasculas
 dialog.pointnameedit.lowercase=min\u00fasculas
 dialog.pointnameedit.titlecase=Mezcla
+dialog.truncatecoords.preview=Previsi\u00f3n
 dialog.addtimeoffset.add=A\u00f1adir tiempo
 dialog.addtimeoffset.subtract=Sustraer tiempo
 dialog.addtimeoffset.weeks=Semanas


=====================================
tim/prune/lang/prune-texts_fr.properties
=====================================
@@ -120,6 +120,7 @@ function.searchosmpois=Rechercher de marques OSM \u00e0 proximit\u00e9
 function.searchopencachingde=Rechercher dans OpenCaching.de
 function.mapillary=Rechercher dans Mapillary
 function.downloadosm=T\u00e9l\u00e9charger les donn\u00e9es OSM de la zone
+function.truncatecoords=Tronquer les coordonn\u00e9es
 function.duplicatepoint=Dupliquer le point
 function.setcolours=Choisir les couleurs
 function.setdisplaysettings=Pr\u00e9f\u00e9rences d'affichage
@@ -296,6 +297,8 @@ dialog.pointnameedit.name=Nom de waypoint
 dialog.pointnameedit.uppercase=CASSE MAJUSCULES
 dialog.pointnameedit.lowercase=casse minuscules
 dialog.pointnameedit.titlecase=Casse Phrase
+dialog.truncatecoords.numdigits=Nombre de d\u00e9cimales
+dialog.truncatecoords.preview=Pr\u00e9visualisation
 dialog.addtimeoffset.add=Retarder l'heure
 dialog.addtimeoffset.subtract=Avancer l'heure
 dialog.addtimeoffset.weeks=Semaines


=====================================
tim/prune/lang/prune-texts_it.properties
=====================================
@@ -113,12 +113,14 @@ function.splitsegments=Dividi traccia in segmenti
 function.sewsegments=Riorganizza segmenti insieme
 function.createmarkerwaypoints=Crea marcatori
 function.lookupsrtm=Ottieni quote da SRTM
+function.configuresrtmsources=Configura le fonti SRTM
 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.truncatecoords=Tronca le coordinate
 function.duplicatepoint=Duplica punto corrente in coda
 function.setcolours=Scegli colori
 function.setdisplaysettings=Opzioni di visualizzazione
@@ -296,6 +298,8 @@ dialog.pointnameedit.name=Nome del waypoint
 dialog.pointnameedit.uppercase=MAIUSCOLE
 dialog.pointnameedit.lowercase=minuscole
 dialog.pointnameedit.titlecase=Iniziali Maiuscole
+dialog.truncatecoords.numdigits=Numero di cifre decimali
+dialog.truncatecoords.preview=Previsualizzazione
 dialog.addtimeoffset.add=Scarto in aggiunta
 dialog.addtimeoffset.subtract=Scarto in sottrazione
 dialog.addtimeoffset.weeks=Settimane


=====================================
tim/prune/lang/prune-texts_zh.properties
=====================================
@@ -158,6 +158,7 @@ function.selecttimezone=\u8bbe\u7f6e\u65f6\u533a
 # Dialogs
 dialog.exit.confirm.title=\u9000\u51fa
 dialog.exit.unsaveddata.text=\u6570\u636e\u672a\u4fdd\u5b58\uff0c\u662f\u5426\u9000\u51fa\uff1f
+dialog.exit.unsavedsettings.text=\u5efa\u8bae\u5728\u9000\u51fa\u524d\u70b9\u51fb"\u4fdd\u5b58\u8bbe\u7f6e"\uff0c\u662f\u5426\u9000\u51fa\uff1f
 dialog.openappend.title=\u9644\u52a0\u81f3\u5df2\u5bfc\u5165\u6570\u636e
 dialog.openappend.text=\u9644\u52a0\u73b0\u6709\u6570\u636e\u81f3\u5df2\u5bfc\u5165\u6570\u636e
 dialog.deletepoint.title=\u5220\u9664\u8f68\u8ff9\u70b9


=====================================
tim/prune/readme.txt
=====================================
@@ -1,11 +1,11 @@
-GpsPrune version 21
-===================
+GpsPrune version 21.1
+=====================
 
 GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
 including format conversion, charting, 3d visualisation, audio and photo correlation, and online resource lookup.
 Full details can be found at https://gpsprune.activityworkshop.net/
 
-GpsPrune is copyright 2006-2021 activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
+GpsPrune is copyright 2006-2022 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_21.jar
+   java -jar gpsprune_21.1.jar
 
 If the jar file is saved in a different directory, you will need to include the path.
 Depending on your system settings, you may be able to click or double-click on the jar file
@@ -25,9 +25,16 @@ in a file manager window to execute it.  A shortcut, menu item, alias, desktop i
 or other link can of course be made should you wish.
 
 To specify a language other than the default, use an additional parameter, eg:
-   java -jar gpsprune_21.jar --lang=DE
+   java -jar gpsprune_21.1.jar --lang=DE
 
 
+New with version 21.1
+=====================
+  - Addition of Catalan language thanks to J.M. Ferrer i Gener
+  - Modification of zoom behaviour when started with data file(s) (Issue #43)
+  - Ability to use parameterized tile server definitions
+  - Tweak scale lines on profile view
+
 New with version 21
 ===================
 The following fixes and additions were made since version 20:



View it on GitLab: https://salsa.debian.org/debian-gis-team/gpsprune/-/commit/41e3960069d4d27231a341220513878e7e6f6521

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gpsprune/-/commit/41e3960069d4d27231a341220513878e7e6f6521
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20220207/155e52ed/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list