forked from upstream-mirrors/OpenTracks
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 931574bc11 | |||
| caddbd8501 | |||
| 8ece2c8612 | |||
| 3a219321d1 | |||
| 35cb924a17 | |||
| b67e5bbd20 | |||
| 1db275230e | |||
| 5ac72092fb | |||
| bdd9ded1e8 | |||
| 759aeb6ed6 | |||
| 12023d51ae | |||
| c426785b90 | |||
| 09d960c7a1 | |||
| f37fe4a503 | |||
| 013e56bef0 | |||
| d6835ba766 | |||
| d7890cbc81 | |||
| 2b6886c534 |
@@ -24,12 +24,13 @@ Application id: de.dennisguse.opentracks.playstore
|
||||
|
||||
Requirement: `gem install fastlane`
|
||||
|
||||
1. Update store meta data (e.g., description and screenshots)
|
||||
`fastlane supply --version_code $(git rev-list HEAD --count master) --skip_upload_apk`
|
||||
(requires API key)
|
||||
2. Build signed apk
|
||||
1. Build signed apk
|
||||
(requires keystore)
|
||||
3. Upload signed apk to [Google Play Console](https://play.google.com/apps/publish)
|
||||
2. Upload signed apk to [Google Play Console](https://play.google.com/apps/publish)
|
||||
3. Update store meta data (e.g., description and screenshots)
|
||||
`fastlane supply --version_code VERSION_CODE --skip_upload_apk`
|
||||
(use the version code from the manifest)
|
||||
(requires API key)
|
||||
|
||||
## Translations (localization)
|
||||
|
||||
@@ -100,4 +100,5 @@ dependencies {
|
||||
|
||||
testImplementation 'androidx.test:core:1.2.0'
|
||||
testImplementation 'org.mockito:mockito-core:3.0.0'
|
||||
implementation 'com.google.android.material:material:1.0.0'
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
v3.2.11: OpenTracks
|
||||
|
||||
Bug:
|
||||
- Max speed is identical to avg speed
|
||||
|
||||
Bugfix:
|
||||
- Crash on heart rate sensor selection
|
||||
|
||||
Developer:
|
||||
- Replaced TabHost by TabsLayout
|
||||
- Removed special first waypoint
|
||||
- Removed duplicate translations
|
||||
@@ -1 +1 @@
|
||||
OpenTracks est une application de suivi d'activités sportives qui respecte totalement votre vie privée.
|
||||
OpenTracks - Suivi d'activités sportives respectueux de votre vie privée.
|
||||
|
||||
@@ -19,7 +19,7 @@ package de.dennisguse.opentracks;
|
||||
import android.location.Location;
|
||||
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
|
||||
/**
|
||||
|
||||
@@ -27,6 +27,9 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import de.dennisguse.opentracks.content.CustomContentProvider.DatabaseHelper;
|
||||
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
|
||||
/**
|
||||
* Tests {@link CustomContentProvider}.
|
||||
|
||||
+121
-212
@@ -35,7 +35,12 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -52,12 +57,9 @@ public class CustomContentProviderUtilsTest {
|
||||
private static final String MOCK_DESC = "Mock Next Waypoint Desc!";
|
||||
private static final String TEST_DESC = "Test Desc!";
|
||||
private static final String TEST_DESC_NEW = "Test Desc new!";
|
||||
private static final double INITIAL_LATITUDE = 37.0;
|
||||
private static final double INITIAL_LONGITUDE = -57.0;
|
||||
private static final double ALTITUDE_INTERVAL = 2.5;
|
||||
|
||||
private Context context = ApplicationProvider.getApplicationContext();
|
||||
private ContentProviderUtils providerUtils;
|
||||
private ContentProviderUtils contentProviderUtils;
|
||||
|
||||
@Mock
|
||||
private Cursor cursorMock;
|
||||
@@ -67,8 +69,8 @@ public class CustomContentProviderUtilsTest {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
providerUtils = new ContentProviderUtils(context);
|
||||
providerUtils.deleteAllTracks(context);
|
||||
contentProviderUtils = new ContentProviderUtils(context);
|
||||
contentProviderUtils.deleteAllTracks(context);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -132,9 +134,9 @@ public class CustomContentProviderUtilsTest {
|
||||
|
||||
private List<Location> testIterator(long trackId, int numPoints, int batchSize, boolean descending, LocationFactory locationFactory) {
|
||||
long lastPointId = initializeTrack(trackId, numPoints);
|
||||
((ContentProviderUtils) providerUtils).setDefaultCursorBatchSize(batchSize);
|
||||
((ContentProviderUtils) contentProviderUtils).setDefaultCursorBatchSize(batchSize);
|
||||
List<Location> locations = new ArrayList<Location>(numPoints);
|
||||
try (LocationIterator it = providerUtils.getTrackPointLocationIterator(trackId, -1L, descending, locationFactory)) {
|
||||
try (LocationIterator it = contentProviderUtils.getTrackPointLocationIterator(trackId, -1L, descending, locationFactory)) {
|
||||
while (it.hasNext()) {
|
||||
Location loc = it.next();
|
||||
Assert.assertNotNull(loc);
|
||||
@@ -153,8 +155,8 @@ public class CustomContentProviderUtilsTest {
|
||||
track.setId(id);
|
||||
track.setName("Test: " + id);
|
||||
track.setNumberOfPoints(numPoints);
|
||||
providerUtils.insertTrack(track);
|
||||
track = providerUtils.getTrack(id);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
track = contentProviderUtils.getTrack(id);
|
||||
Assert.assertNotNull(track);
|
||||
|
||||
Location[] locations = new Location[numPoints];
|
||||
@@ -166,12 +168,12 @@ public class CustomContentProviderUtilsTest {
|
||||
loc.setAltitude(i * 2.5);
|
||||
locations[i] = loc;
|
||||
}
|
||||
providerUtils.bulkInsertTrackPoint(locations, numPoints, id);
|
||||
contentProviderUtils.bulkInsertTrackPoint(locations, numPoints, id);
|
||||
|
||||
// Load all inserted locations.
|
||||
long lastPointId = -1;
|
||||
int counter = 0;
|
||||
try (LocationIterator it = providerUtils.getTrackPointLocationIterator(id, -1L, false, LocationFactory.DEFAULT_LOCATION_FACTORY)) {
|
||||
try (LocationIterator it = contentProviderUtils.getTrackPointLocationIterator(id, -1L, false, LocationFactory.DEFAULT_LOCATION_FACTORY)) {
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
lastPointId = it.getLocationId();
|
||||
@@ -208,7 +210,7 @@ public class CustomContentProviderUtilsTest {
|
||||
String name = NAME_PREFIX + trackId;
|
||||
when(cursorMock.getString(columnIndex++)).thenReturn(name);
|
||||
|
||||
Track track = providerUtils.createTrack(cursorMock);
|
||||
Track track = contentProviderUtils.createTrack(cursorMock);
|
||||
Assert.assertEquals(trackId, track.getId());
|
||||
Assert.assertEquals(name, track.getName());
|
||||
}
|
||||
@@ -220,10 +222,10 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testDeleteAllTracks() {
|
||||
// Insert track, points and waypoint at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
Waypoint waypoint = new Waypoint();
|
||||
providerUtils.insertWaypoint(waypoint);
|
||||
contentProviderUtils.insertWaypoint(waypoint);
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
Cursor tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID);
|
||||
Assert.assertEquals(1, tracksCursor.getCount());
|
||||
@@ -232,7 +234,7 @@ public class CustomContentProviderUtilsTest {
|
||||
Cursor waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID);
|
||||
Assert.assertEquals(1, waypointCursor.getCount());
|
||||
// Delete all.
|
||||
providerUtils.deleteAllTracks(context);
|
||||
contentProviderUtils.deleteAllTracks(context);
|
||||
// Check whether all have been deleted.
|
||||
tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID);
|
||||
Assert.assertEquals(0, tracksCursor.getCount());
|
||||
@@ -249,15 +251,15 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testDeleteTrack() {
|
||||
// Insert three tracks, points of two tracks and way point of one track.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
|
||||
providerUtils.insertTrack(track);
|
||||
insertTrackWithLocations(getTrack(trackId + 1, 10));
|
||||
insertTrackWithLocations(getTrack(trackId + 2, 10));
|
||||
contentProviderUtils.insertTrack(track);
|
||||
insertTrackWithLocations(TestDataUtil.getTrack(trackId + 1, 10));
|
||||
insertTrackWithLocations(TestDataUtil.getTrack(trackId + 2, 10));
|
||||
|
||||
Waypoint waypoint = new Waypoint();
|
||||
waypoint.setTrackId(trackId);
|
||||
providerUtils.insertWaypoint(waypoint);
|
||||
contentProviderUtils.insertWaypoint(waypoint);
|
||||
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
Cursor tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID);
|
||||
@@ -267,7 +269,7 @@ public class CustomContentProviderUtilsTest {
|
||||
Cursor waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID);
|
||||
Assert.assertEquals(1, waypointCursor.getCount());
|
||||
// Delete one track.
|
||||
providerUtils.deleteTrack(context, trackId);
|
||||
contentProviderUtils.deleteTrack(context, trackId);
|
||||
// Check whether all data of a track has been deleted.
|
||||
tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID);
|
||||
Assert.assertEquals(2, tracksCursor.getCount());
|
||||
@@ -282,10 +284,10 @@ public class CustomContentProviderUtilsTest {
|
||||
*/
|
||||
@Test
|
||||
public void testGetAllTracks() {
|
||||
int initialTrackNumber = providerUtils.getAllTracks().size();
|
||||
int initialTrackNumber = contentProviderUtils.getAllTracks().size();
|
||||
long trackId = System.currentTimeMillis();
|
||||
providerUtils.insertTrack(getTrack(trackId, 0));
|
||||
List<Track> allTracks = providerUtils.getAllTracks();
|
||||
contentProviderUtils.insertTrack(TestDataUtil.getTrack(trackId, 0));
|
||||
List<Track> allTracks = contentProviderUtils.getAllTracks();
|
||||
Assert.assertEquals(initialTrackNumber + 1, allTracks.size());
|
||||
Assert.assertEquals(trackId, allTracks.get(allTracks.size() - 1).getId());
|
||||
}
|
||||
@@ -296,8 +298,8 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testGetLastTrack() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
providerUtils.insertTrack(getTrack(trackId, 0));
|
||||
Assert.assertEquals(trackId, providerUtils.getLastTrack().getId());
|
||||
contentProviderUtils.insertTrack(TestDataUtil.getTrack(trackId, 0));
|
||||
Assert.assertEquals(trackId, contentProviderUtils.getLastTrack().getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -306,8 +308,8 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testGetTrack() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
providerUtils.insertTrack(getTrack(trackId, 0));
|
||||
Assert.assertNotNull(providerUtils.getTrack(trackId));
|
||||
contentProviderUtils.insertTrack(TestDataUtil.getTrack(trackId, 0));
|
||||
Assert.assertNotNull(contentProviderUtils.getTrack(trackId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -316,15 +318,15 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testUpdateTrack() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 0);
|
||||
Track track = TestDataUtil.getTrack(trackId, 0);
|
||||
String nameOld = "name1";
|
||||
String nameNew = "name2";
|
||||
track.setName(nameOld);
|
||||
providerUtils.insertTrack(track);
|
||||
Assert.assertEquals(nameOld, providerUtils.getTrack(trackId).getName());
|
||||
contentProviderUtils.insertTrack(track);
|
||||
Assert.assertEquals(nameOld, contentProviderUtils.getTrack(trackId).getName());
|
||||
track.setName(nameNew);
|
||||
providerUtils.updateTrack(track);
|
||||
Assert.assertEquals(nameNew, providerUtils.getTrack(trackId).getName());
|
||||
contentProviderUtils.updateTrack(track);
|
||||
Assert.assertEquals(nameNew, contentProviderUtils.getTrack(trackId).getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -333,8 +335,8 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testCreateContentValues_waypoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
// Bottom
|
||||
long startTime = 1000L;
|
||||
// AverageSpeed
|
||||
@@ -355,7 +357,6 @@ public class CustomContentProviderUtilsTest {
|
||||
// Insert at first.
|
||||
Waypoint waypoint = new Waypoint();
|
||||
waypoint.setDescription(TEST_DESC);
|
||||
waypoint.setType(WaypointType.STATISTICS);
|
||||
waypoint.setTripStatistics(statistics);
|
||||
|
||||
Location location = new Location("test");
|
||||
@@ -364,7 +365,7 @@ public class CustomContentProviderUtilsTest {
|
||||
location.setAccuracy((float) 1 / 100.0f);
|
||||
location.setAltitude(2.5);
|
||||
waypoint.setLocation(location);
|
||||
providerUtils.insertWaypoint(waypoint);
|
||||
contentProviderUtils.insertWaypoint(waypoint);
|
||||
|
||||
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(contentResolverMock);
|
||||
|
||||
@@ -406,7 +407,7 @@ public class CustomContentProviderUtilsTest {
|
||||
long trackId = 11L;
|
||||
when(cursorMock.getLong(columnIndex++)).thenReturn(trackId);
|
||||
|
||||
Waypoint waypoint = providerUtils.createWaypoint(cursorMock);
|
||||
Waypoint waypoint = contentProviderUtils.createWaypoint(cursorMock);
|
||||
Assert.assertEquals(id, waypoint.getId());
|
||||
Assert.assertEquals(name, waypoint.getName());
|
||||
Assert.assertEquals(trackId, waypoint.getTrackId());
|
||||
@@ -414,50 +415,37 @@ public class CustomContentProviderUtilsTest {
|
||||
|
||||
/**
|
||||
* Tests the method
|
||||
* {@link ContentProviderUtils#deleteWaypoint(Context, long, DescriptionGenerator)}
|
||||
* {@link ContentProviderUtils#deleteWaypoint(Context, long)}
|
||||
* when there is only one waypoint in the track.
|
||||
*/
|
||||
@Test
|
||||
public void testDeleteWaypoint_onlyOneWayPoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
// Insert at first.
|
||||
Waypoint waypoint1 = new Waypoint();
|
||||
waypoint1.setDescription(TEST_DESC);
|
||||
waypoint1.setTrackId(trackId);
|
||||
waypoint1.setType(WaypointType.STATISTICS);
|
||||
providerUtils.insertWaypoint(waypoint1);
|
||||
contentProviderUtils.insertWaypoint(waypoint1);
|
||||
|
||||
// Delete
|
||||
DescriptionGenerator descriptionGenerator = new DescriptionGenerator() {
|
||||
contentProviderUtils.deleteWaypoint(context, 1);
|
||||
|
||||
@Override
|
||||
public String generateWaypointDescription(TripStatistics tripStatistics) {
|
||||
return CustomContentProviderUtilsTest.MOCK_DESC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateTrackDescription(Track aTrack, boolean html) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
providerUtils.deleteWaypoint(context, 1, descriptionGenerator);
|
||||
|
||||
Assert.assertNull(providerUtils.getWaypoint(1));
|
||||
Assert.assertNull(contentProviderUtils.getWaypoint(1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the method
|
||||
* {@link ContentProviderUtils#deleteWaypoint(Context, long, DescriptionGenerator)}
|
||||
* {@link ContentProviderUtils#deleteWaypoint(Context, long)}
|
||||
* when there is more than one waypoint in the track.
|
||||
*/
|
||||
@Test
|
||||
public void testDeleteWaypoint_hasNextWayPoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
TripStatistics statistics = new TripStatistics();
|
||||
statistics.setStartTime(1000L);
|
||||
@@ -475,120 +463,74 @@ public class CustomContentProviderUtilsTest {
|
||||
|
||||
// Insert at first.
|
||||
Waypoint waypoint1 = new Waypoint();
|
||||
waypoint1.setDescription(Long.toString(trackId));
|
||||
waypoint1.setDescription(MOCK_DESC);
|
||||
waypoint1.setTrackId(trackId);
|
||||
waypoint1.setType(WaypointType.STATISTICS);
|
||||
waypoint1.setTripStatistics(statistics);
|
||||
long waypoint1Id = ContentUris.parseId(providerUtils.insertWaypoint(waypoint1));
|
||||
long waypoint1Id = ContentUris.parseId(contentProviderUtils.insertWaypoint(waypoint1));
|
||||
|
||||
Waypoint waypoint2 = new Waypoint();
|
||||
waypoint2.setDescription(Long.toString(trackId));
|
||||
waypoint2.setDescription(MOCK_DESC);
|
||||
waypoint2.setTrackId(trackId);
|
||||
waypoint2.setType(WaypointType.STATISTICS);
|
||||
waypoint2.setTripStatistics(statistics);
|
||||
long waypoint2Id = ContentUris.parseId(providerUtils.insertWaypoint(waypoint2));
|
||||
|
||||
long waypoint2Id = ContentUris.parseId(contentProviderUtils.insertWaypoint(waypoint2));
|
||||
|
||||
// Delete
|
||||
DescriptionGenerator descriptionGenerator = new DescriptionGenerator() {
|
||||
@Override
|
||||
public String generateWaypointDescription(TripStatistics tripStatistics) {
|
||||
return CustomContentProviderUtilsTest.MOCK_DESC;
|
||||
}
|
||||
Assert.assertNotNull(contentProviderUtils.getWaypoint(waypoint1Id));
|
||||
contentProviderUtils.deleteWaypoint(context, waypoint1Id);
|
||||
Assert.assertNull(contentProviderUtils.getWaypoint(waypoint1Id));
|
||||
|
||||
@Override
|
||||
public String generateTrackDescription(Track aTrack, boolean html) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
Assert.assertNotNull(providerUtils.getWaypoint(waypoint1Id));
|
||||
providerUtils.deleteWaypoint(context, waypoint1Id, descriptionGenerator);
|
||||
Assert.assertNull(providerUtils.getWaypoint(waypoint1Id));
|
||||
|
||||
Assert.assertEquals(CustomContentProviderUtilsTest.MOCK_DESC, providerUtils.getWaypoint(waypoint2Id)
|
||||
.getDescription());
|
||||
Assert.assertEquals(MOCK_DESC, contentProviderUtils.getWaypoint(waypoint2Id).getDescription());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the method {@link ContentProviderUtils#getFirstWaypointId(long)}.
|
||||
*/
|
||||
@Test
|
||||
public void testGetFirstWaypointId() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
|
||||
Waypoint waypoint1 = new Waypoint();
|
||||
waypoint1.setTrackId(trackId);
|
||||
long waypoint1id = ContentUris.parseId(providerUtils.insertWaypoint(waypoint1));
|
||||
|
||||
Waypoint waypoint2 = new Waypoint();
|
||||
waypoint2.setTrackId(trackId);
|
||||
long waypoint2id = ContentUris.parseId(providerUtils.insertWaypoint(waypoint2));
|
||||
|
||||
Assert.assertEquals(-1L, providerUtils.getFirstWaypointId(-1));
|
||||
Assert.assertEquals(waypoint1id, providerUtils.getFirstWaypointId(trackId));
|
||||
Assert.assertEquals(waypoint2id, providerUtils.getLastWaypoint(trackId, WaypointType.WAYPOINT).getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the method {@link ContentProviderUtils#getNextWaypointNumber(long, WaypointType)}.
|
||||
* Tests the method {@link ContentProviderUtils#getNextWaypointNumber(long)}.
|
||||
*/
|
||||
@Test
|
||||
public void testGetNextWaypointNumber() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
Waypoint waypoint1 = new Waypoint();
|
||||
waypoint1.setType(WaypointType.STATISTICS);
|
||||
waypoint1.setTrackId(trackId);
|
||||
Waypoint waypoint2 = new Waypoint();
|
||||
waypoint2.setType(WaypointType.WAYPOINT);
|
||||
waypoint2.setTrackId(trackId);
|
||||
Waypoint waypoint3 = new Waypoint();
|
||||
waypoint3.setType(WaypointType.STATISTICS);
|
||||
waypoint3.setTrackId(trackId);
|
||||
Waypoint waypoint4 = new Waypoint();
|
||||
waypoint4.setType(WaypointType.WAYPOINT);
|
||||
waypoint4.setTrackId(trackId);
|
||||
providerUtils.insertWaypoint(waypoint1);
|
||||
providerUtils.insertWaypoint(waypoint2);
|
||||
providerUtils.insertWaypoint(waypoint3);
|
||||
providerUtils.insertWaypoint(waypoint4);
|
||||
contentProviderUtils.insertWaypoint(waypoint1);
|
||||
contentProviderUtils.insertWaypoint(waypoint2);
|
||||
contentProviderUtils.insertWaypoint(waypoint3);
|
||||
contentProviderUtils.insertWaypoint(waypoint4);
|
||||
|
||||
Assert.assertEquals(2, providerUtils.getNextWaypointNumber(trackId, WaypointType.STATISTICS));
|
||||
Assert.assertEquals(3, providerUtils.getNextWaypointNumber(trackId, WaypointType.WAYPOINT));
|
||||
Assert.assertEquals(4, contentProviderUtils.getNextWaypointNumber(trackId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the method
|
||||
* {@link ContentProviderUtils#getLastWaypoint(long, WaypointType)}.
|
||||
* {@link ContentProviderUtils#getLastWaypoint(long)}.
|
||||
*/
|
||||
@Test
|
||||
public void testGetLastStatisticsWaypoint() {
|
||||
public void testGetLastWaypoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
Waypoint waypoint1 = new Waypoint();
|
||||
waypoint1.setTrackId(trackId);
|
||||
waypoint1.setType(WaypointType.STATISTICS);
|
||||
waypoint1.setDescription("Desc1");
|
||||
Waypoint waypoint2 = new Waypoint();
|
||||
waypoint2.setTrackId(trackId);
|
||||
waypoint2.setType(WaypointType.STATISTICS);
|
||||
waypoint2.setDescription("Desc2");
|
||||
Waypoint waypoint3 = new Waypoint();
|
||||
waypoint3.setTrackId(trackId);
|
||||
waypoint3.setType(WaypointType.WAYPOINT);
|
||||
waypoint3.setDescription("Desc3");
|
||||
providerUtils.insertWaypoint(waypoint1);
|
||||
providerUtils.insertWaypoint(waypoint2);
|
||||
providerUtils.insertWaypoint(waypoint3);
|
||||
contentProviderUtils.insertWaypoint(waypoint1);
|
||||
contentProviderUtils.insertWaypoint(waypoint2);
|
||||
contentProviderUtils.insertWaypoint(waypoint3);
|
||||
|
||||
Assert.assertEquals("Desc2", providerUtils.getLastWaypoint(trackId, WaypointType.STATISTICS).getDescription());
|
||||
Assert.assertEquals("Desc3", contentProviderUtils.getLastWaypoint(trackId).getDescription());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -598,15 +540,15 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testInsertAndGetWaypoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
Waypoint waypoint = new Waypoint();
|
||||
waypoint.setDescription(TEST_DESC);
|
||||
waypoint.setTrackId(trackId);
|
||||
long waypointId = ContentUris.parseId(providerUtils.insertWaypoint(waypoint));
|
||||
long waypointId = ContentUris.parseId(contentProviderUtils.insertWaypoint(waypoint));
|
||||
|
||||
Assert.assertEquals(TEST_DESC, providerUtils.getWaypoint(waypointId).getDescription());
|
||||
Assert.assertEquals(TEST_DESC, contentProviderUtils.getWaypoint(waypointId).getDescription());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -615,20 +557,20 @@ public class CustomContentProviderUtilsTest {
|
||||
@Test
|
||||
public void testUpdateWaypoint() {
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
// Insert at first.
|
||||
Waypoint waypoint = new Waypoint();
|
||||
waypoint.setDescription(TEST_DESC);
|
||||
waypoint.setTrackId(trackId);
|
||||
long waypointId = ContentUris.parseId(providerUtils.insertWaypoint(waypoint));
|
||||
long waypointId = ContentUris.parseId(contentProviderUtils.insertWaypoint(waypoint));
|
||||
|
||||
// Update
|
||||
waypoint = providerUtils.getWaypoint(waypointId);
|
||||
waypoint = contentProviderUtils.getWaypoint(waypointId);
|
||||
waypoint.setDescription(TEST_DESC_NEW);
|
||||
providerUtils.updateWaypoint(waypoint);
|
||||
contentProviderUtils.updateWaypoint(waypoint);
|
||||
|
||||
Assert.assertEquals(TEST_DESC_NEW, providerUtils.getWaypoint(waypointId).getDescription());
|
||||
Assert.assertEquals(TEST_DESC_NEW, contentProviderUtils.getWaypoint(waypointId).getDescription());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -638,13 +580,13 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testBulkInsertTrackPoint() {
|
||||
// Insert track, point at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
|
||||
providerUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), -1, trackId);
|
||||
Assert.assertEquals(20, providerUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
providerUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), 8, trackId);
|
||||
Assert.assertEquals(28, providerUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
contentProviderUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), -1, trackId);
|
||||
Assert.assertEquals(20, contentProviderUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
contentProviderUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), 8, trackId);
|
||||
Assert.assertEquals(28, contentProviderUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -699,7 +641,7 @@ public class CustomContentProviderUtilsTest {
|
||||
byte[] sensor = "Sensor state".getBytes();
|
||||
when(cursorMock.getBlob(index++)).thenReturn(sensor);
|
||||
|
||||
Location location = providerUtils.createTrackPoint(cursorMock);
|
||||
Location location = contentProviderUtils.createTrackPoint(cursorMock);
|
||||
Assert.assertEquals((double) longitude, location.getLongitude(), 0.01);
|
||||
Assert.assertEquals((double) latitude, location.getLatitude(), 0.01);
|
||||
Assert.assertEquals(time, location.getTime(), 0.01);
|
||||
@@ -714,11 +656,11 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testInsertTrackPoint() {
|
||||
// Insert track, point at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
|
||||
providerUtils.insertTrackPoint(createLocation(22), trackId);
|
||||
Assert.assertEquals(11, providerUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
contentProviderUtils.insertTrackPoint(TestDataUtil.createLocation(22), trackId);
|
||||
Assert.assertEquals(11, contentProviderUtils.getTrackPointCursor(trackId, -1L, 1000, false).getCount());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -728,10 +670,10 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetFirstTrackPointId() {
|
||||
// Insert track, point at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
|
||||
Assert.assertNotEquals(-1L, providerUtils.getFirstTrackPointId(trackId));
|
||||
Assert.assertNotEquals(-1L, contentProviderUtils.getFirstTrackPointId(trackId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -741,10 +683,10 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetLastTrackPointId() {
|
||||
// Insert track, point at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
|
||||
Assert.assertTrue(providerUtils.getFirstTrackPointId(trackId) < providerUtils.getLastTrackPointId(trackId));
|
||||
Assert.assertTrue(contentProviderUtils.getFirstTrackPointId(trackId) < contentProviderUtils.getLastTrackPointId(trackId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -754,10 +696,10 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetLastValidTrackPoint() {
|
||||
// Insert track, points at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
insertTrackWithLocations(track);
|
||||
|
||||
Location lastLocation = providerUtils.getLastValidTrackPoint(trackId);
|
||||
Location lastLocation = contentProviderUtils.getLastValidTrackPoint(trackId);
|
||||
checkLocation(9, lastLocation);
|
||||
}
|
||||
|
||||
@@ -768,15 +710,15 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetTrackPointCursor_desc() {
|
||||
// Insert track, points at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
long[] trackpointIds = new long[track.getNumberOfPoints()];
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
trackpointIds[i] = ContentUris.parseId(providerUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
trackpointIds[i] = ContentUris.parseId(contentProviderUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
}
|
||||
|
||||
Cursor cursor = providerUtils.getTrackPointCursor(trackId, trackpointIds[1], 5, true);
|
||||
Cursor cursor = contentProviderUtils.getTrackPointCursor(trackId, trackpointIds[1], 5, true);
|
||||
Assert.assertEquals(2, cursor.getCount());
|
||||
}
|
||||
|
||||
@@ -787,15 +729,15 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetTrackPointCursor_asc() {
|
||||
// Insert track, points at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
long[] trackpointIds = new long[track.getNumberOfPoints()];
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
trackpointIds[i] = ContentUris.parseId(providerUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
trackpointIds[i] = ContentUris.parseId(contentProviderUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
}
|
||||
|
||||
Cursor cursor = providerUtils.getTrackPointCursor(trackId, trackpointIds[8], 5, false);
|
||||
Cursor cursor = contentProviderUtils.getTrackPointCursor(trackId, trackpointIds[8], 5, false);
|
||||
Assert.assertEquals(2, cursor.getCount());
|
||||
}
|
||||
|
||||
@@ -806,17 +748,17 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetTrackPointLocationIterator_desc() {
|
||||
// Insert track, points at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
long[] trackpointIds = new long[track.getNumberOfPoints()];
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
trackpointIds[i] = ContentUris.parseId(providerUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
trackpointIds[i] = ContentUris.parseId(contentProviderUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
}
|
||||
|
||||
long startTrackPointId = trackpointIds[9];
|
||||
|
||||
LocationIterator locationIterator = providerUtils.getTrackPointLocationIterator(trackId, startTrackPointId, true, LocationFactory.DEFAULT_LOCATION_FACTORY);
|
||||
LocationIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, startTrackPointId, true, LocationFactory.DEFAULT_LOCATION_FACTORY);
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
Assert.assertTrue(locationIterator.hasNext());
|
||||
Location location = locationIterator.next();
|
||||
@@ -833,17 +775,17 @@ public class CustomContentProviderUtilsTest {
|
||||
public void testGetTrackPointLocationIterator_asc() {
|
||||
// Insert track, point at first.
|
||||
long trackId = System.currentTimeMillis();
|
||||
Track track = getTrack(trackId, 10);
|
||||
providerUtils.insertTrack(track);
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
|
||||
long[] trackpointIds = new long[track.getNumberOfPoints()];
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
trackpointIds[i] = ContentUris.parseId(providerUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
trackpointIds[i] = ContentUris.parseId(contentProviderUtils.insertTrackPoint(track.getLocations().get(i), track.getId()));
|
||||
}
|
||||
|
||||
long startTrackPointId = trackpointIds[0];
|
||||
|
||||
LocationIterator locationIterator = providerUtils.getTrackPointLocationIterator(trackId, startTrackPointId, false, LocationFactory.DEFAULT_LOCATION_FACTORY);
|
||||
LocationIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, startTrackPointId, false, LocationFactory.DEFAULT_LOCATION_FACTORY);
|
||||
for (int i = 0; i < trackpointIds.length; i++) {
|
||||
Assert.assertTrue(locationIterator.hasNext());
|
||||
Location location = locationIterator.next();
|
||||
@@ -854,50 +796,17 @@ public class CustomContentProviderUtilsTest {
|
||||
Assert.assertFalse(locationIterator.hasNext());
|
||||
}
|
||||
|
||||
/**
|
||||
* Simulates a track which is used for testing.
|
||||
*
|
||||
* @param id the id of the track
|
||||
* @param numPoints the location number in the track
|
||||
* @return the simulated track
|
||||
*/
|
||||
private Track getTrack(long id, int numPoints) {
|
||||
Track track = new Track();
|
||||
track.setId(id);
|
||||
track.setName("Test: " + id);
|
||||
track.setNumberOfPoints(numPoints);
|
||||
for (int i = 0; i < numPoints; i++) {
|
||||
track.addLocation(createLocation(i));
|
||||
}
|
||||
return track;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a location.
|
||||
*
|
||||
* @param i the index to set the value of location.
|
||||
* @return created location
|
||||
*/
|
||||
private Location createLocation(int i) {
|
||||
Location loc = new Location("test");
|
||||
loc.setLatitude(INITIAL_LATITUDE + (double) i / 10000.0);
|
||||
loc.setLongitude(INITIAL_LONGITUDE - (double) i / 10000.0);
|
||||
loc.setAccuracy((float) i / 100.0f);
|
||||
loc.setAltitude(i * ALTITUDE_INTERVAL);
|
||||
return loc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the value of a location.
|
||||
*
|
||||
* @param i the index of this location which created in the method {@link CustomContentProviderUtilsTest#getTrack(long, int)}
|
||||
* @param i the index of this location which created in the method {@link TestDataUtil#getTrack(long, int)}
|
||||
* @param location the location to be checked
|
||||
*/
|
||||
private void checkLocation(int i, Location location) {
|
||||
Assert.assertEquals(INITIAL_LATITUDE + (double) i / 10000.0, location.getLatitude(), 0.01);
|
||||
Assert.assertEquals(INITIAL_LONGITUDE - (double) i / 10000.0, location.getLongitude(), 0.01);
|
||||
Assert.assertEquals(TestDataUtil.INITIAL_LATITUDE + (double) i / 10000.0, location.getLatitude(), 0.01);
|
||||
Assert.assertEquals(TestDataUtil.INITIAL_LONGITUDE - (double) i / 10000.0, location.getLongitude(), 0.01);
|
||||
Assert.assertEquals((float) i / 100.0f, location.getAccuracy(), 0.01);
|
||||
Assert.assertEquals(i * ALTITUDE_INTERVAL, location.getAltitude(), 0.01);
|
||||
Assert.assertEquals(i * TestDataUtil.ALTITUDE_INTERVAL, location.getAltitude(), 0.01);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -906,7 +815,7 @@ public class CustomContentProviderUtilsTest {
|
||||
* @param track track to be inserted
|
||||
*/
|
||||
private void insertTrackWithLocations(Track track) {
|
||||
providerUtils.insertTrack(track);
|
||||
providerUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), track.getLocations().size(), track.getId());
|
||||
contentProviderUtils.insertTrack(track);
|
||||
contentProviderUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), track.getLocations().size(), track.getId());
|
||||
}
|
||||
}
|
||||
|
||||
+16
-14
@@ -27,29 +27,31 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Tests for {@link DescriptionGeneratorImpl}.
|
||||
* Tests for {@link DescriptionGenerator}.
|
||||
*
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class DescriptionGeneratorImplTest {
|
||||
public class DescriptionGeneratorTest {
|
||||
|
||||
private static final long START_TIME = 1288721514000L;
|
||||
private DescriptionGeneratorImpl descriptionGenerator;
|
||||
private DescriptionGenerator descriptionGenerator;
|
||||
|
||||
private Context context = ApplicationProvider.getApplicationContext();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
descriptionGenerator = new DescriptionGeneratorImpl(ApplicationProvider.getApplicationContext());
|
||||
descriptionGenerator = new DescriptionGenerator(ApplicationProvider.getApplicationContext());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#generateTrackDescription(Track, boolean)}.
|
||||
* Tests {@link DescriptionGenerator#generateTrackDescription(Track, boolean)}.
|
||||
*/
|
||||
@Test
|
||||
public void testGenerateTrackDescription() {
|
||||
@@ -92,7 +94,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#generateWaypointDescription(TripStatistics)}.
|
||||
* Tests {@link DescriptionGenerator#generateWaypointDescription(TripStatistics)}.
|
||||
*/
|
||||
@Test
|
||||
public void testGenerateWaypointDescription() {
|
||||
@@ -128,7 +130,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeDistance(double, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writeDistance(double, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteDistance() {
|
||||
@@ -138,7 +140,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeTime(long, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writeTime(long, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteTime() {
|
||||
@@ -148,7 +150,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeSpeed(double, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writeSpeed(double, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteSpeed() {
|
||||
@@ -158,7 +160,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeElevation(double, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writeElevation(double, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteElevation() {
|
||||
@@ -168,7 +170,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writePace(double, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writePace(double, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWritePace() {
|
||||
@@ -178,7 +180,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)}.
|
||||
* Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)}.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteGrade() {
|
||||
@@ -188,7 +190,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)} with a NaN.
|
||||
* Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)} with a NaN.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteGrade_nan() {
|
||||
@@ -198,7 +200,7 @@ public class DescriptionGeneratorImplTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)} with an infinite number.
|
||||
* Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)} with an infinite number.
|
||||
*/
|
||||
@Test
|
||||
public void testWriteGrade_infinite() {
|
||||
@@ -36,6 +36,8 @@ import java.util.List;
|
||||
|
||||
import de.dennisguse.opentracks.content.SearchEngine.ScoredResult;
|
||||
import de.dennisguse.opentracks.content.SearchEngine.SearchQuery;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.location.Location;
|
||||
|
||||
public class TestDataUtil {
|
||||
|
||||
public static final double INITIAL_LATITUDE = 37.0;
|
||||
public static final double INITIAL_LONGITUDE = -57.0;
|
||||
public static final double ALTITUDE_INTERVAL = 2.5;
|
||||
|
||||
/**
|
||||
* Simulates a track which is used for testing.
|
||||
*
|
||||
* @param id the id of the track
|
||||
* @param numPoints the location number in the track
|
||||
* @return the simulated track
|
||||
*/
|
||||
public static Track getTrack(long id, int numPoints) {
|
||||
Track track = new Track();
|
||||
track.setId(id);
|
||||
track.setName("Test: " + id);
|
||||
track.setNumberOfPoints(numPoints);
|
||||
for (int i = 0; i < numPoints; i++) {
|
||||
track.addLocation(createLocation(i));
|
||||
}
|
||||
return track;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a location.
|
||||
*
|
||||
* @param i the index to set the value of location.
|
||||
* @return created location
|
||||
*/
|
||||
public static Location createLocation(int i) {
|
||||
Location loc = new Location("test");
|
||||
loc.setLatitude(INITIAL_LATITUDE + (double) i / 10000.0);
|
||||
loc.setLongitude(INITIAL_LONGITUDE - (double) i / 10000.0);
|
||||
loc.setAccuracy((float) i / 100.0f);
|
||||
loc.setAltitude(i * ALTITUDE_INTERVAL);
|
||||
loc.setTime(i + 1);
|
||||
return loc;
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -33,10 +33,10 @@ import java.util.Locale;
|
||||
import java.util.SimpleTimeZone;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.eq;
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
package de.dennisguse.opentracks.io.file.importer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.location.Location;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.filters.LargeTest;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* Export a track to {@link TrackFileFormat} and verify that the import is identical.
|
||||
* <p>
|
||||
* TODO: test ignores {@link de.dennisguse.opentracks.stats.TripStatistics} for now.
|
||||
*/
|
||||
@RunWith(JUnit4.class)
|
||||
public class ExportImportTest {
|
||||
|
||||
private static final String TAG = ExportImportTest.class.getSimpleName();
|
||||
|
||||
private Context context = ApplicationProvider.getApplicationContext();
|
||||
|
||||
private ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
|
||||
|
||||
private static final String TRACK_ICON = "the track icon";
|
||||
private static final String TRACK_CATEGORY = "the category";
|
||||
private static final String TRACK_DESCRIPTION = "the description";
|
||||
private final List<Waypoint> waypoints = new ArrayList<>();
|
||||
private long importTrackId;
|
||||
private long trackId = System.currentTimeMillis();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
Track track = TestDataUtil.getTrack(trackId, 10);
|
||||
track.setIcon(TRACK_ICON);
|
||||
track.setCategory(TRACK_CATEGORY);
|
||||
track.setDescription(TRACK_DESCRIPTION);
|
||||
contentProviderUtils.insertTrack(track);
|
||||
contentProviderUtils.bulkInsertTrackPoint(track.getLocations().toArray(new Location[0]), track.getLocations().size(), track.getId());
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
Waypoint waypoint = new Waypoint();
|
||||
waypoint.setName("the waypoint " + i);
|
||||
waypoint.setDescription("the waypoint description " + i);
|
||||
waypoint.setCategory("the waypoint category" + i);
|
||||
waypoint.setIcon("the waypoing icon" + i);
|
||||
waypoint.setPhotoUrl("the photo url" + i);
|
||||
waypoint.setTrackId(trackId);
|
||||
waypoint.setLocation(track.getLocations().get(i));
|
||||
contentProviderUtils.insertWaypoint(waypoint);
|
||||
|
||||
waypoints.add(waypoint);
|
||||
}
|
||||
|
||||
assertEquals(waypoints.size(), contentProviderUtils.getWaypointCount(trackId));
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
contentProviderUtils.deleteTrack(context, trackId);
|
||||
contentProviderUtils.deleteTrack(context, importTrackId);
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kml_only_track() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kml_with_trackdetail() {
|
||||
// given
|
||||
Track track = contentProviderUtils.getTrack(trackId);
|
||||
|
||||
TrackFileFormat trackFileFormat = TrackFileFormat.KML_WITH_TRACKDETAIL;
|
||||
TrackExporter trackExporter = trackFileFormat.newTrackExporter(context, new Track[]{track}, null);
|
||||
|
||||
// when
|
||||
// 1. export
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
trackExporter.writeTrack(context, outputStream);
|
||||
|
||||
System.out.println(outputStream.toString());
|
||||
|
||||
// 2. import
|
||||
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
|
||||
AbstractFileTrackImporter trackImporter = new KmlFileTrackImporter(context, -1L);
|
||||
importTrackId = trackImporter.importFile(inputStream);
|
||||
|
||||
// then
|
||||
// 1. track
|
||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||
assertNotNull(importedTrack);
|
||||
assertEquals(track.getLocations(), importedTrack.getLocations());
|
||||
assertEquals(track.getCategory(), importedTrack.getCategory());
|
||||
assertEquals(track.getDescription(), importedTrack.getDescription());
|
||||
assertEquals(track.getName(), importedTrack.getName());
|
||||
assertEquals(track.getIcon(), importedTrack.getIcon());
|
||||
|
||||
// 2. waypoints
|
||||
assertWaypoints();
|
||||
|
||||
//TODO Check absolute time of trackpoints
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kml_with_trackdetail_and_sensordata() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kmz_only_track() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kmz_with_trackdetail() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kmz_with_trackdetail_and_sensordata() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void kmz_with_trackdetail_and_sensordata_and_pictures() {
|
||||
// TODO
|
||||
Log.e(TAG, "Test not implemented.");
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@Test
|
||||
public void gpx() {
|
||||
// given
|
||||
Track track = contentProviderUtils.getTrack(trackId);
|
||||
|
||||
TrackFileFormat trackFileFormat = TrackFileFormat.GPX;
|
||||
TrackExporter trackExporter = trackFileFormat.newTrackExporter(context, new Track[]{track}, null);
|
||||
|
||||
// when
|
||||
// 1. export
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
trackExporter.writeTrack(context, outputStream);
|
||||
|
||||
// 2. import
|
||||
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
|
||||
AbstractFileTrackImporter trackImporter = new GpxFileTrackImporter(context, contentProviderUtils);
|
||||
importTrackId = trackImporter.importFile(inputStream);
|
||||
|
||||
// then
|
||||
// 1. track
|
||||
Track trackImported = contentProviderUtils.getTrack(importTrackId);
|
||||
assertNotNull(trackImported);
|
||||
assertEquals(track.getLocations(), trackImported.getLocations());
|
||||
assertEquals(track.getCategory(), trackImported.getCategory());
|
||||
assertEquals(track.getDescription(), trackImported.getDescription());
|
||||
assertEquals(track.getName(), trackImported.getName());
|
||||
|
||||
//TODO exporting and importing a track icon is not yet supported by GpxTrackWriter.
|
||||
//assertEquals(track.getIcon(), trackImported.getIcon());
|
||||
|
||||
// 2. waypoints
|
||||
assertWaypoints();
|
||||
|
||||
//TODO Check absolute time of trackpoints
|
||||
}
|
||||
|
||||
private void assertWaypoints() {
|
||||
assertEquals(waypoints.size(), contentProviderUtils.getWaypointCount(importTrackId));
|
||||
|
||||
List<Waypoint> importedWaypoints = contentProviderUtils.getWaypoints(importTrackId);
|
||||
for (int i = 0; i < waypoints.size(); i++) {
|
||||
Waypoint waypoint = waypoints.get(i);
|
||||
Waypoint importedWaypoint = importedWaypoints.get(i);
|
||||
assertEquals(waypoint.getCategory(), importedWaypoint.getCategory());
|
||||
assertEquals(waypoint.getDescription(), importedWaypoint.getDescription());
|
||||
// assertEquals(waypoint.getIcon(), importedWaypoint.getIcon()); // TODO for KML
|
||||
assertEquals(waypoint.getName(), importedWaypoint.getName());
|
||||
assertEquals("", importedWaypoint.getPhotoUrl());
|
||||
|
||||
assertEquals(waypoint.getLocation().getLatitude(), importedWaypoint.getLocation().getLatitude(), 0.001);
|
||||
assertEquals(waypoint.getLocation().getLongitude(), importedWaypoint.getLocation().getLongitude(), 0.001);
|
||||
assertEquals(waypoint.getLocation().getAltitude(), importedWaypoint.getLocation().getAltitude(), 0.001);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -27,7 +27,7 @@ import org.mockito.junit.MockitoJUnitRunner;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
import static org.mockito.Mockito.any;
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ import org.mockito.junit.MockitoJUnitRunner;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
import static org.mockito.Mockito.any;
|
||||
|
||||
+2
-4
@@ -53,10 +53,8 @@ public class AdaptiveLocationListenerPolicyTest extends TestCase {
|
||||
assertEquals(MAX, adocationListenerPolicy.getDesiredPollingInterval());
|
||||
|
||||
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_NORMAL);
|
||||
// First get the half of NEW_IDLE_TIME_NORMAL, and then round it to the
|
||||
// nearest second.
|
||||
assertEquals((NEW_IDLE_TIME_NORMAL / 2 / 1000) * 1000,
|
||||
adocationListenerPolicy.getDesiredPollingInterval());
|
||||
// First get the half of NEW_IDLE_TIME_NORMAL, and then round it to the nearest second.
|
||||
assertEquals((NEW_IDLE_TIME_NORMAL / 2 / 1000) * 1000, adocationListenerPolicy.getDesiredPollingInterval());
|
||||
|
||||
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_SMALL);
|
||||
assertEquals(MIN, adocationListenerPolicy.getDesiredPollingInterval());
|
||||
|
||||
+13
-16
@@ -44,10 +44,8 @@ import java.util.concurrent.TimeoutException;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.CustomContentProvider;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
@@ -56,7 +54,7 @@ import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
*
|
||||
* @author Bartlomiej Niechwiej
|
||||
* <p>
|
||||
* ATTENTION: This tests deletes all stored tracks in the database.
|
||||
* //TODO ATTENTION: This tests deletes all stored tracks in the database.
|
||||
* So, if it is executed on a real device, data might be lost.
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
@@ -69,7 +67,7 @@ public class TrackRecordingServiceTest {
|
||||
public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
|
||||
private Context context = ApplicationProvider.getApplicationContext();
|
||||
private ContentProviderUtils providerUtils;
|
||||
private ContentProviderUtils contentProviderUtils;
|
||||
|
||||
private final long trackId = Math.abs(new Random().nextLong());
|
||||
|
||||
@@ -84,14 +82,14 @@ public class TrackRecordingServiceTest {
|
||||
};
|
||||
customContentProvider.attachInfo(context, null);
|
||||
|
||||
providerUtils = new ContentProviderUtils(context);
|
||||
contentProviderUtils = new ContentProviderUtils(context);
|
||||
|
||||
// Let's use default values.
|
||||
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context);
|
||||
sharedPreferences.edit().clear().apply();
|
||||
|
||||
// Ensure that the database is empty before every test
|
||||
providerUtils.deleteAllTracks(context);
|
||||
contentProviderUtils.deleteAllTracks(context);
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -103,7 +101,7 @@ public class TrackRecordingServiceTest {
|
||||
}
|
||||
|
||||
// Ensure that the database is empty after every test
|
||||
providerUtils.deleteAllTracks(context);
|
||||
contentProviderUtils.deleteAllTracks(context);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@@ -123,7 +121,7 @@ public class TrackRecordingServiceTest {
|
||||
@MediumTest
|
||||
@Test
|
||||
public void testRecording_noTracks() throws Exception {
|
||||
List<Track> tracks = providerUtils.getAllTracks();
|
||||
List<Track> tracks = contentProviderUtils.getAllTracks();
|
||||
Assert.assertTrue(tracks.isEmpty());
|
||||
|
||||
Intent startIntent = createStartIntent(context);
|
||||
@@ -203,8 +201,8 @@ public class TrackRecordingServiceTest {
|
||||
|
||||
private void addTrack(Track track, boolean isRecording) {
|
||||
Assert.assertTrue(track.getId() >= 0);
|
||||
providerUtils.insertTrack(track);
|
||||
Assert.assertEquals(track.getId(), providerUtils.getTrack(track.getId()).getId());
|
||||
contentProviderUtils.insertTrack(track);
|
||||
Assert.assertEquals(track.getId(), contentProviderUtils.getTrack(track.getId()).getId());
|
||||
PreferencesUtils.setLong(context, R.string.recording_track_id_key, isRecording ? track.getId() : PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
||||
PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, !isRecording);
|
||||
}
|
||||
@@ -231,7 +229,7 @@ public class TrackRecordingServiceTest {
|
||||
ITrackRecordingService service = ((ITrackRecordingService) mServiceRule.bindService(createStartIntent(context)));
|
||||
Assert.assertFalse(service.isRecording());
|
||||
|
||||
long waypointId = service.insertWaypoint(WaypointCreationRequest.DEFAULT_WAYPOINT);
|
||||
long waypointId = service.insertWaypoint(null, null, null, null);
|
||||
Assert.assertEquals(-1L, waypointId);
|
||||
}
|
||||
|
||||
@@ -244,12 +242,11 @@ public class TrackRecordingServiceTest {
|
||||
insertLocation(service);
|
||||
|
||||
long trackId = service.getRecordingTrackId();
|
||||
long waypointId = service.insertWaypoint(WaypointCreationRequest.DEFAULT_WAYPOINT);
|
||||
long waypointId = service.insertWaypoint(null, null, null, null);
|
||||
Assert.assertNotEquals(-1L, waypointId);
|
||||
Waypoint wpt = providerUtils.getWaypoint(waypointId);
|
||||
Waypoint wpt = contentProviderUtils.getWaypoint(waypointId);
|
||||
Assert.assertEquals(context.getString(R.string.marker_waypoint_icon_url), wpt.getIcon());
|
||||
Assert.assertEquals(context.getString(R.string.marker_name_format, 1), wpt.getName());
|
||||
Assert.assertEquals(WaypointType.WAYPOINT, wpt.getType());
|
||||
Assert.assertEquals(trackId, wpt.getTrackId());
|
||||
Assert.assertEquals(0.0, wpt.getLength(), 0.01);
|
||||
Assert.assertNotNull(wpt.getLocation());
|
||||
|
||||
+2
-3
@@ -27,8 +27,7 @@ import java.util.concurrent.TimeoutException;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.CustomContentProvider;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
@@ -219,7 +218,7 @@ public class TrackRecordingServiceTestLooper {
|
||||
service.insertTrackPoint(location);
|
||||
|
||||
if (i % 7 == 0) {
|
||||
service.insertWaypoint(WaypointCreationRequest.DEFAULT_WAYPOINT);
|
||||
service.insertWaypoint(null, null, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ limitations under the License.
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="de.dennisguse.opentracks"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="3195"
|
||||
android:versionName="v3.2.10"> <!-- For FDroid. -->
|
||||
android:versionCode="3213"
|
||||
android:versionName="v3.2.11"> <!-- For FDroid. -->
|
||||
<!-- Permission to initialize services -->
|
||||
<application
|
||||
android:name=".Startup"
|
||||
|
||||
@@ -31,7 +31,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
|
||||
import de.dennisguse.opentracks.fragments.MarkerDetailFragment;
|
||||
|
||||
|
||||
@@ -26,9 +26,7 @@ import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
|
||||
/**
|
||||
@@ -48,9 +46,6 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
private Waypoint waypoint;
|
||||
|
||||
// UI elements
|
||||
private View statisticsSection;
|
||||
private EditText statisticsName;
|
||||
private View waypointSection;
|
||||
private EditText waypointName;
|
||||
private AutoCompleteTextView waypointMarkerType;
|
||||
private EditText waypointDescription;
|
||||
@@ -65,10 +60,6 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null);
|
||||
|
||||
// Setup UI elements
|
||||
statisticsSection = findViewById(R.id.marker_edit_statistics_section);
|
||||
statisticsName = findViewById(R.id.marker_edit_statistics_name);
|
||||
|
||||
waypointSection = findViewById(R.id.marker_edit_waypoint_section);
|
||||
waypointName = findViewById(R.id.marker_edit_waypoint_name);
|
||||
waypointMarkerType = findViewById(R.id.marker_edit_waypoint_marker_type);
|
||||
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.waypoint_types, android.R.layout.simple_dropdown_item_1line);
|
||||
@@ -95,7 +86,7 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -124,9 +115,7 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
});
|
||||
|
||||
if (newMarker) {
|
||||
statisticsSection.setVisibility(View.GONE);
|
||||
waypointSection.setVisibility(View.VISIBLE);
|
||||
int nextWaypointNumber = trackId == -1L ? -1 : new ContentProviderUtils(this).getNextWaypointNumber(trackId, WaypointType.WAYPOINT);
|
||||
int nextWaypointNumber = trackId == -1L ? -1 : new ContentProviderUtils(this).getNextWaypointNumber(trackId);
|
||||
if (nextWaypointNumber == -1) {
|
||||
nextWaypointNumber = 0;
|
||||
}
|
||||
@@ -141,16 +130,9 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
boolean statistics = waypoint.getType() == WaypointType.STATISTICS;
|
||||
statisticsSection.setVisibility(statistics ? View.VISIBLE : View.GONE);
|
||||
waypointSection.setVisibility(statistics ? View.GONE : View.VISIBLE);
|
||||
if (statistics) {
|
||||
statisticsName.setText(waypoint.getName());
|
||||
} else {
|
||||
waypointName.setText(waypoint.getName());
|
||||
waypointMarkerType.setText(waypoint.getCategory());
|
||||
waypointDescription.setText(waypoint.getDescription());
|
||||
}
|
||||
waypointName.setText(waypoint.getName());
|
||||
waypointMarkerType.setText(waypoint.getCategory());
|
||||
waypointDescription.setText(waypoint.getDescription());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,29 +140,21 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
* Adds a marker.
|
||||
*/
|
||||
private void addMarker() {
|
||||
WaypointCreationRequest waypointCreationRequest = new WaypointCreationRequest(
|
||||
WaypointType.WAYPOINT,
|
||||
false,
|
||||
trackRecordingServiceConnection.addMarker(this,
|
||||
waypointName.getText().toString(),
|
||||
waypointMarkerType.getText().toString(),
|
||||
waypointDescription.getText().toString(),
|
||||
null,
|
||||
null);
|
||||
trackRecordingServiceConnection.addMarker(this, waypointCreationRequest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a marker.
|
||||
*/
|
||||
private void saveMarker() {
|
||||
boolean statistics = waypoint.getType() == WaypointType.STATISTICS;
|
||||
if (statistics) {
|
||||
waypoint.setName(statisticsName.getText().toString());
|
||||
} else {
|
||||
waypoint.setName(waypointName.getText().toString());
|
||||
waypoint.setCategory(waypointMarkerType.getText().toString());
|
||||
waypoint.setDescription(waypointDescription.getText().toString());
|
||||
}
|
||||
waypoint.setName(waypointName.getText().toString());
|
||||
waypoint.setCategory(waypointMarkerType.getText().toString());
|
||||
waypoint.setDescription(waypointDescription.getText().toString());
|
||||
|
||||
new ContentProviderUtils(this).updateWaypoint(waypoint);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,8 +38,8 @@ import androidx.loader.content.CursorLoader;
|
||||
import androidx.loader.content.Loader;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment;
|
||||
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
|
||||
import de.dennisguse.opentracks.util.ActivityUtils;
|
||||
@@ -126,17 +126,14 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
||||
long trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L);
|
||||
recordingTrackPaused = PreferencesUtils.isRecordingTrackPausedDefault(this);
|
||||
|
||||
contentProviderUtils = new ContentProviderUtils(this);
|
||||
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
|
||||
|
||||
long trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L);
|
||||
track = trackId != -1L ? contentProviderUtils.getTrack(trackId) : null;
|
||||
final long trackFirstWaypointId = trackId != -1 ? contentProviderUtils.getFirstWaypointId(trackId) : -1;
|
||||
|
||||
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
||||
|
||||
listView = findViewById(R.id.marker_list);
|
||||
listView.setEmptyView(findViewById(R.id.marker_list_empty));
|
||||
@@ -181,8 +178,8 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
|
||||
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
|
||||
if (track != null) {
|
||||
return new CursorLoader(MarkerListActivity.this, WaypointsColumns.CONTENT_URI, PROJECTION,
|
||||
WaypointsColumns.TRACKID + "=? AND " + WaypointsColumns._ID + "!=?",
|
||||
new String[]{String.valueOf(track.getId()), String.valueOf(trackFirstWaypointId)}, null);
|
||||
WaypointsColumns.TRACKID + "=?",
|
||||
new String[]{String.valueOf(track.getId())}, null);
|
||||
} else {
|
||||
return new CursorLoader(MarkerListActivity.this, WaypointsColumns.CONTENT_URI, PROJECTION,
|
||||
WaypointsColumns.STARTTIME + " IS NULL", null, null);
|
||||
|
||||
@@ -44,8 +44,8 @@ import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.SearchEngine;
|
||||
import de.dennisguse.opentracks.content.SearchEngine.ScoredResult;
|
||||
import de.dennisguse.opentracks.content.SearchEngine.SearchQuery;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.fragments.ConfirmDeleteDialogFragment;
|
||||
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment;
|
||||
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
|
||||
@@ -245,7 +245,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013q Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TabHost;
|
||||
import android.widget.TabHost.TabContentFactory;
|
||||
import android.widget.TabWidget;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* This is a helper class that implements the management of tabs and all details
|
||||
* of connecting a ViewPager with associated TabHost. It relies on a trick.
|
||||
* Normally a tab host has a simple API for supplying a View or Intent that each
|
||||
* tab will show. This is not sufficient for switching between pages. So instead
|
||||
* we make the content part of the tab host 0dp high (it is not shown) and the
|
||||
* TabsAdapter supplies its own dummy view to show as the tab content. It
|
||||
* listens to changes in tabs, and takes care of switch to the correct paged in
|
||||
* the ViewPager whenever the selected tab changes.
|
||||
* <p>
|
||||
* Copied from the FragmentTabsPager sample in the support library.
|
||||
*
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
//TODO Rework or better remove.
|
||||
public class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
|
||||
|
||||
private final Context context;
|
||||
private final TabHost tabHost;
|
||||
private final ViewPager viewPager;
|
||||
private final ArrayList<TabInfo> tabInfos = new ArrayList<>();
|
||||
|
||||
public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager viewPager) {
|
||||
super(activity.getSupportFragmentManager());
|
||||
this.context = activity;
|
||||
this.tabHost = tabHost;
|
||||
this.viewPager = viewPager;
|
||||
this.tabHost.setOnTabChangedListener(this);
|
||||
this.viewPager.setAdapter(this);
|
||||
this.viewPager.setOnPageChangeListener(this);
|
||||
}
|
||||
|
||||
public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle bundle) {
|
||||
tabSpec.setContent(new DummyTabFactory(context));
|
||||
|
||||
TabInfo info = new TabInfo(clss, bundle);
|
||||
|
||||
tabInfos.add(info);
|
||||
tabHost.addTab(tabSpec);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return tabInfos.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public Fragment getItem(int position) {
|
||||
TabInfo info = tabInfos.get(position);
|
||||
return Fragment.instantiate(context, info.clss.getName(), info.bundle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabChanged(String tabId) {
|
||||
int position = tabHost.getCurrentTab();
|
||||
viewPager.setCurrentItem(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
/*
|
||||
* Unfortunately when TabHost changes the current tab, it kindly also takes care of putting focus on it when not in touch mode.
|
||||
* The jerk. This hack tries to prevent this from pulling focus out of our ViewPager.
|
||||
*/
|
||||
TabWidget tabWidget = tabHost.getTabWidget();
|
||||
int oldFocusability = tabWidget.getDescendantFocusability();
|
||||
tabWidget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
|
||||
tabHost.setCurrentTab(position);
|
||||
tabWidget.setDescendantFocusability(oldFocusability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
}
|
||||
|
||||
/**
|
||||
* An object to hold a tab's info.
|
||||
*
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
private static final class TabInfo {
|
||||
|
||||
private final Class<?> clss;
|
||||
private final Bundle bundle;
|
||||
|
||||
TabInfo(Class<?> clss, Bundle bundle) {
|
||||
this.clss = clss;
|
||||
this.bundle = bundle;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A dummy {@link TabContentFactory} that creates an empty view to satisfy the {@link TabHost} API.
|
||||
*
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
private static class DummyTabFactory implements TabHost.TabContentFactory {
|
||||
|
||||
private final Context context;
|
||||
|
||||
DummyTabFactory(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View createTabContent(String tag) {
|
||||
View view = new View(context);
|
||||
view.setMinimumWidth(0);
|
||||
view.setMinimumHeight(0);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,20 +31,21 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.TabHost;
|
||||
import android.widget.TabHost.TabSpec;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TrackDataHub;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.fragments.ChartDistanceFragment;
|
||||
import de.dennisguse.opentracks.fragments.ChartTimeFragment;
|
||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||
@@ -86,7 +87,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
||||
private SharedPreferences sharedPreferences;
|
||||
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||
private TrackDataHub trackDataHub;
|
||||
private TabHost tabHost;
|
||||
private ViewPager pager;
|
||||
private TrackController trackController;
|
||||
|
||||
// From intent
|
||||
@@ -106,8 +107,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
||||
trackController.update(isRecording(), recordingTrackPaused);
|
||||
if (hasPhoto && photoUri != null) {
|
||||
hasPhoto = false;
|
||||
WaypointCreationRequest waypointCreationRequest = new WaypointCreationRequest(WaypointType.WAYPOINT, false, null, null, null, null, photoUri.toString());
|
||||
long markerId = trackRecordingServiceConnection.addMarker(TrackDetailActivity.this, waypointCreationRequest);
|
||||
long markerId = trackRecordingServiceConnection.addMarker(TrackDetailActivity.this, null, null, null, photoUri.toString());
|
||||
if (markerId != -1L) {
|
||||
//TODO: Make configurable.
|
||||
FileUtils.updateMediaScanner(TrackDetailActivity.this, photoUri);
|
||||
@@ -202,28 +202,46 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, bindChangedCallback);
|
||||
trackDataHub = TrackDataHub.newInstance(this);
|
||||
|
||||
tabHost = findViewById(R.id.tackdetail_tabhost);
|
||||
tabHost.setup();
|
||||
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager(), 1) {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
ViewPager viewPager = findViewById(R.id.pager);
|
||||
TabsAdapter tabsAdapter = new TabsAdapter(this, tabHost, viewPager);
|
||||
|
||||
TabSpec statsTabSpec = tabHost.newTabSpec(StatsFragment.STATS_FRAGMENT_TAG).setIndicator(getString(R.string.track_detail_stats_tab));
|
||||
tabsAdapter.addTab(statsTabSpec, StatsFragment.class, null);
|
||||
|
||||
TabSpec chartTimeTabSpec = tabHost.newTabSpec(ChartTimeFragment.CHART_FRAGMENT_TAG).setIndicator(getString(R.string.settings_chart_by_time));
|
||||
tabsAdapter.addTab(chartTimeTabSpec, ChartTimeFragment.class, null);
|
||||
|
||||
TabSpec chartDistanceTabSpec = tabHost.newTabSpec(ChartDistanceFragment.CHART_FRAGMENT_TAG).setIndicator(getString(R.string.settings_chart_by_distance));
|
||||
tabsAdapter.addTab(chartDistanceTabSpec, ChartDistanceFragment.class, null);
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return new StatsFragment();
|
||||
case 1:
|
||||
return new ChartTimeFragment();
|
||||
case 2:
|
||||
return new ChartDistanceFragment();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return getString(R.string.track_detail_stats_tab);
|
||||
case 1:
|
||||
return getString(R.string.settings_chart_by_time);
|
||||
case 2:
|
||||
return getString(R.string.settings_chart_by_distance);
|
||||
}
|
||||
return "Unknown Tab";
|
||||
}
|
||||
};
|
||||
pager = findViewById(R.id.track_detail_activity_view_pager);
|
||||
pager.setAdapter(adapter);
|
||||
TabLayout tabs = findViewById(R.id.track_detail_activity_tablayout);
|
||||
tabs.setupWithViewPager(pager);
|
||||
if (savedInstanceState != null) {
|
||||
tabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB_TAG_KEY));
|
||||
}
|
||||
|
||||
// Set the background after all three tabs are added
|
||||
for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {
|
||||
tabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.tab_indicator);
|
||||
pager.setCurrentItem(savedInstanceState.getInt(CURRENT_TAB_TAG_KEY));
|
||||
}
|
||||
|
||||
trackController = new TrackController(this, trackRecordingServiceConnection, false, recordListener, stopListener);
|
||||
@@ -291,14 +309,15 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(this);
|
||||
trackDataHub.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putString(CURRENT_TAB_TAG_KEY, tabHost.getCurrentTabTag());
|
||||
outState.putInt(CURRENT_TAB_TAG_KEY, pager.getCurrentItem());
|
||||
|
||||
if (photoUri != null) {
|
||||
outState.putParcelable(PHOTO_URI_KEY, photoUri);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ import android.widget.Spinner;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||
@@ -175,7 +175,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,7 +51,7 @@ import androidx.loader.content.Loader;
|
||||
import java.util.Locale;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.fragments.ConfirmDeleteDialogFragment;
|
||||
import de.dennisguse.opentracks.services.ITrackRecordingService;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
@@ -141,7 +141,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
||||
if (PreferencesUtils.isKey(TrackListActivity.this, R.string.recording_track_id_key, key)) {
|
||||
recordingTrackId = PreferencesUtils.getRecordingTrackId(TrackListActivity.this);
|
||||
if (key != null && PreferencesUtils.isRecording(recordingTrackId)) {
|
||||
trackRecordingServiceConnection.startAndBind();
|
||||
trackRecordingServiceConnection.startAndBind(TrackListActivity.this);
|
||||
}
|
||||
}
|
||||
if (PreferencesUtils.isKey(TrackListActivity.this, R.string.recording_track_paused_key, key)) {
|
||||
@@ -344,7 +344,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
||||
super.onStop();
|
||||
|
||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -406,14 +406,14 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
||||
|
||||
// Invoke trackRecordingService
|
||||
if (startGps) {
|
||||
trackRecordingServiceConnection.startAndBind();
|
||||
trackRecordingServiceConnection.startAndBind(this);
|
||||
bindChangedCallback.run();
|
||||
} else {
|
||||
ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound();
|
||||
if (trackRecordingService != null) {
|
||||
trackRecordingService.stopGps();
|
||||
}
|
||||
trackRecordingServiceConnection.unbindAndStop();
|
||||
trackRecordingServiceConnection.unbindAndStop(this);
|
||||
}
|
||||
|
||||
// Update menu after starting or stopping gps
|
||||
@@ -498,7 +498,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
||||
*/
|
||||
private void startRecording() {
|
||||
startNewRecording = true;
|
||||
trackRecordingServiceConnection.startAndBind();
|
||||
trackRecordingServiceConnection.startAndBind(this);
|
||||
|
||||
/*
|
||||
* If the binding has happened, then invoke the callback to start a new recording.
|
||||
|
||||
@@ -41,7 +41,7 @@ import java.util.List;
|
||||
|
||||
import de.dennisguse.opentracks.MarkerDetailActivity;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.stats.ExtremityMonitor;
|
||||
import de.dennisguse.opentracks.util.IntentUtils;
|
||||
import de.dennisguse.opentracks.util.MarkerUtils;
|
||||
@@ -555,7 +555,7 @@ public class ChartView extends View {
|
||||
canvas.save();
|
||||
float x = getX(getWaypointXValue(waypoint));
|
||||
canvas.drawLine(x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint);
|
||||
canvas.translate(x - (float) (markerWidth * WAYPOINT_X_ANCHOR), topBorder + spacer);
|
||||
canvas.translate(x - (markerWidth * WAYPOINT_X_ANCHOR), topBorder + spacer);
|
||||
|
||||
waypointMarker.draw(canvas);
|
||||
canvas.restore();
|
||||
|
||||
@@ -35,7 +35,11 @@ import java.util.NoSuchElementException;
|
||||
import de.dennisguse.opentracks.BuildConfig;
|
||||
import de.dennisguse.opentracks.android.ContentResolverWrapper;
|
||||
import de.dennisguse.opentracks.android.IContentResolver;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.FileUtils;
|
||||
@@ -51,11 +55,6 @@ public class ContentProviderUtils {
|
||||
private static final String TAG = ContentProviderUtils.class.getSimpleName();
|
||||
private static final int MAX_LATITUDE = 90000000;
|
||||
|
||||
/**
|
||||
* Maximum number of waypoints that will be loaded at one time.
|
||||
*/
|
||||
public static int MAX_LOADED_WAYPOINTS_POINTS = 10000;
|
||||
|
||||
/**
|
||||
* The authority (the first part of the URI) for the app's content provider.
|
||||
*/
|
||||
@@ -64,7 +63,12 @@ public class ContentProviderUtils {
|
||||
/**
|
||||
* The base URI for the app's content provider.
|
||||
*/
|
||||
static String CONTENT_BASE_URI = "content://" + AUTHORITY_PACKAGE;
|
||||
public static String CONTENT_BASE_URI = "content://" + AUTHORITY_PACKAGE;
|
||||
|
||||
/**
|
||||
* Maximum number of waypoints that will be loaded at one time.
|
||||
*/
|
||||
public static int MAX_LOADED_WAYPOINTS_POINTS = 10000;
|
||||
|
||||
private final IContentResolver contentResolver;
|
||||
private int defaultCursorBatchSize = 2000;
|
||||
@@ -443,9 +447,6 @@ public class ContentProviderUtils {
|
||||
if (!cursor.isNull(trackIdIndex)) {
|
||||
waypoint.setTrackId(cursor.getLong(trackIdIndex));
|
||||
}
|
||||
if (!cursor.isNull(typeIndex)) {
|
||||
waypoint.setType(WaypointType.values()[cursor.getInt(typeIndex)]);
|
||||
}
|
||||
if (!cursor.isNull(lengthIndex)) {
|
||||
waypoint.setLength(cursor.getFloat(lengthIndex));
|
||||
}
|
||||
@@ -538,26 +539,11 @@ public class ContentProviderUtils {
|
||||
* If deleting a statistics waypoint, this will also correct the next statistics waypoint after the deleted one to reflect the deletion.
|
||||
* The generator is used to update the next statistics waypoint.
|
||||
*
|
||||
* @param waypointId the waypoint id
|
||||
* @param descriptionGenerator the description generator. Can be null for waypoint marker
|
||||
* @param waypointId the waypoint id
|
||||
*/
|
||||
|
||||
public void deleteWaypoint(Context context, long waypointId, DescriptionGenerator descriptionGenerator) {
|
||||
public void deleteWaypoint(Context context, long waypointId) {
|
||||
final Waypoint waypoint = getWaypoint(waypointId);
|
||||
if (waypoint != null && waypoint.getType() == WaypointType.STATISTICS
|
||||
&& descriptionGenerator != null) {
|
||||
final Waypoint nextWaypoint = getNextStatisticsWaypointAfter(waypoint);
|
||||
if (nextWaypoint == null) {
|
||||
Log.d(TAG, "Unable to find the next statistics marker after deleting one.");
|
||||
} else {
|
||||
nextWaypoint.getTripStatistics().merge(waypoint.getTripStatistics());
|
||||
nextWaypoint.setDescription(
|
||||
descriptionGenerator.generateWaypointDescription(nextWaypoint.getTripStatistics()));
|
||||
if (!updateWaypoint(nextWaypoint)) {
|
||||
Log.e(TAG, "Unable to update the next statistics marker after deleting one.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (waypoint != null && waypoint.hasPhoto()) {
|
||||
Uri uri = waypoint.getPhotoURI();
|
||||
File file = new File(uri.getPath());
|
||||
@@ -574,36 +560,16 @@ public class ContentProviderUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the first waypoint id for a track.
|
||||
* The first waypoint is special as it contains the stats for the track.
|
||||
* Returns -1L if it doesn't exist.
|
||||
* Gets the last waypoint for a type. Returns null if it doesn't exist.
|
||||
*
|
||||
* @param trackId the track id
|
||||
*/
|
||||
public long getFirstWaypointId(long trackId) {
|
||||
if (trackId < 0) {
|
||||
return -1L;
|
||||
}
|
||||
try (Cursor cursor = getWaypointCursor(new String[]{WaypointsColumns._ID}, WaypointsColumns.TRACKID + "=?", new String[]{Long.toString(trackId)}, WaypointsColumns._ID, 1)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
return cursor.getLong(cursor.getColumnIndexOrThrow(WaypointsColumns._ID));
|
||||
}
|
||||
}
|
||||
return -1L;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last waypoint for a type. Returns null if it doesn't exist.
|
||||
*
|
||||
* @param trackId the track id
|
||||
* @param waypointType the waypoint type
|
||||
*/
|
||||
public Waypoint getLastWaypoint(long trackId, WaypointType waypointType) {
|
||||
public Waypoint getLastWaypoint(long trackId) {
|
||||
if (trackId < 0) {
|
||||
return null;
|
||||
}
|
||||
String selection = WaypointsColumns.TRACKID + "=? AND " + WaypointsColumns.TYPE + "=?";
|
||||
String[] selectionArgs = new String[]{Long.toString(trackId), Integer.toString(waypointType.ordinal())};
|
||||
String selection = WaypointsColumns.TRACKID + "=?";
|
||||
String[] selectionArgs = new String[]{Long.toString(trackId)};
|
||||
try (Cursor cursor = getWaypointCursor(null, selection, selectionArgs, WaypointsColumns._ID + " DESC", 1)) {
|
||||
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
@@ -617,21 +583,18 @@ public class ContentProviderUtils {
|
||||
* Gets the next waypoint number for a type.
|
||||
* Returns -1 if not able to get the next waypoint number.
|
||||
*
|
||||
* @param trackId the track id
|
||||
* @param waypointType the waypoint type
|
||||
* @param trackId the track id
|
||||
*/
|
||||
public int getNextWaypointNumber(long trackId, WaypointType waypointType) {
|
||||
public int getNextWaypointNumber(long trackId) {
|
||||
if (trackId < 0) {
|
||||
return -1;
|
||||
}
|
||||
String[] projection = {WaypointsColumns._ID};
|
||||
String selection = WaypointsColumns.TRACKID + "=? AND " + WaypointsColumns.TYPE + "=?";
|
||||
String[] selectionArgs = new String[]{Long.toString(trackId), Integer.toString(waypointType.ordinal())};
|
||||
String selection = WaypointsColumns.TRACKID + "=?";
|
||||
String[] selectionArgs = new String[]{Long.toString(trackId)};
|
||||
try (Cursor cursor = getWaypointCursor(projection, selection, selectionArgs, WaypointsColumns._ID, -1)) {
|
||||
if (cursor != null) {
|
||||
int count = cursor.getCount();
|
||||
// For statistics markers, the first marker is for the track statistics, so return the count as the next user visible number.
|
||||
return waypointType == WaypointType.STATISTICS ? count : count + 1;
|
||||
return cursor.getCount();
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
@@ -695,6 +658,19 @@ public class ContentProviderUtils {
|
||||
return getWaypointCursor(null, selection, selectionArgs, WaypointsColumns._ID, maxWaypoints);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public List<Waypoint> getWaypoints(long trackId) {
|
||||
ArrayList<Waypoint> waypoints = new ArrayList<>();
|
||||
try (Cursor cursor = getWaypointCursor(trackId, -1L, -1)) {
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
waypoints.add(createWaypoint(cursor));
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
}
|
||||
return waypoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of waypoints for a track.
|
||||
*
|
||||
@@ -713,8 +689,7 @@ public class ContentProviderUtils {
|
||||
cursor.moveToFirst();
|
||||
int count = cursor.getInt(0);
|
||||
cursor.close();
|
||||
// not count the first waypoint
|
||||
return count > 0 ? count - 1 : 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -751,7 +726,6 @@ public class ContentProviderUtils {
|
||||
values.put(WaypointsColumns.CATEGORY, waypoint.getCategory());
|
||||
values.put(WaypointsColumns.ICON, waypoint.getIcon());
|
||||
values.put(WaypointsColumns.TRACKID, waypoint.getTrackId());
|
||||
values.put(WaypointsColumns.TYPE, waypoint.getType().ordinal());
|
||||
values.put(WaypointsColumns.LENGTH, waypoint.getLength());
|
||||
values.put(WaypointsColumns.DURATION, waypoint.getDuration());
|
||||
values.put(WaypointsColumns.STARTID, waypoint.getStartId());
|
||||
@@ -796,18 +770,6 @@ public class ContentProviderUtils {
|
||||
return values;
|
||||
}
|
||||
|
||||
private Waypoint getNextStatisticsWaypointAfter(Waypoint waypoint) {
|
||||
String selection = WaypointsColumns._ID + ">? AND " + WaypointsColumns.TRACKID + "=? AND "
|
||||
+ WaypointsColumns.TYPE + "=" + WaypointType.STATISTICS.ordinal();
|
||||
String[] selectionArgs = new String[]{Long.toString(waypoint.getId()), Long.toString(waypoint.getTrackId())};
|
||||
try (Cursor cursor = getWaypointCursor(null, selection, selectionArgs, WaypointsColumns._ID, 1)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
return createWaypoint(cursor);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a waypoint cursor.
|
||||
*
|
||||
@@ -925,23 +887,6 @@ public class ContentProviderUtils {
|
||||
return -1L;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the first valid location for a track.
|
||||
* Returns null if it doesn't exist.
|
||||
*
|
||||
* @param trackId the track id
|
||||
*/
|
||||
public Location getFirstValidTrackPoint(long trackId) {
|
||||
if (trackId < 0) {
|
||||
return null;
|
||||
}
|
||||
String selection = TrackPointsColumns._ID + "=(select min(" + TrackPointsColumns._ID + ") from "
|
||||
+ TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND "
|
||||
+ TrackPointsColumns.LATITUDE + "<=" + MAX_LATITUDE + ")";
|
||||
String[] selectionArgs = new String[]{Long.toString(trackId)};
|
||||
return findTrackPointBy(selection, selectionArgs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last valid location for a track.
|
||||
* Returns null if it doesn't exist.
|
||||
@@ -1117,9 +1062,11 @@ public class ContentProviderUtils {
|
||||
values.put(TrackPointsColumns.LONGITUDE, (int) (location.getLongitude() * 1E6));
|
||||
values.put(TrackPointsColumns.LATITUDE, (int) (location.getLatitude() * 1E6));
|
||||
|
||||
// Hack for Samsung phones that don't properly populate the time field
|
||||
long time = location.getTime();
|
||||
// TODO: Check if this is really necessary!
|
||||
// Hack for Samsung phones that don't properly populate the time field
|
||||
if (time == 0) {
|
||||
Log.w(TAG, "location has no timestamp; setting current time");
|
||||
time = System.currentTimeMillis();
|
||||
}
|
||||
values.put(TrackPointsColumns.TIME, time);
|
||||
|
||||
@@ -34,6 +34,10 @@ import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
|
||||
/**
|
||||
* A {@link ContentProvider} that handles access to track points, tracks, and waypoints tables.
|
||||
*
|
||||
|
||||
@@ -25,6 +25,10 @@ import android.util.Log;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
|
||||
/**
|
||||
* Creates observers/listeners and manages their registration with {@link DataSource}.
|
||||
* The observers/listeners calls {@link DataSourceListener} when data changes.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
@@ -13,16 +13,37 @@
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
import de.dennisguse.opentracks.util.UnitConversions;
|
||||
|
||||
/**
|
||||
* An interface for an object that can generate descriptions of track and waypoint.
|
||||
* Generates descriptions for tracks and waypoints.
|
||||
*
|
||||
* @author Sandor Dornbush
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
public interface DescriptionGenerator {
|
||||
public class DescriptionGenerator {
|
||||
|
||||
private static final String HTML_LINE_BREAK = "<br>";
|
||||
private static final String HTML_PARAGRAPH_SEPARATOR = "<p>";
|
||||
private static final String TEXT_LINE_BREAK = "\n";
|
||||
private static final String TEXT_PARAGRAPH_SEPARATOR = "\n\n";
|
||||
|
||||
private Context context;
|
||||
|
||||
public DescriptionGenerator(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a track description.
|
||||
@@ -30,12 +51,205 @@ public interface DescriptionGenerator {
|
||||
* @param track the track
|
||||
* @param html true to output html, false to output plain text
|
||||
*/
|
||||
String generateTrackDescription(Track track, boolean html);
|
||||
public String generateTrackDescription(Track track, boolean html) {
|
||||
String paragraphSeparator = html ? HTML_PARAGRAPH_SEPARATOR : TEXT_PARAGRAPH_SEPARATOR;
|
||||
String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
// Created by
|
||||
String creator = html
|
||||
? "<a href='" + context.getString(R.string.app_web_url) + "'>" + context.getString(R.string.app_name) + "</a>"
|
||||
: context.getString(R.string.app_name);
|
||||
builder.append(creator);
|
||||
|
||||
builder.append(paragraphSeparator);
|
||||
|
||||
writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
|
||||
writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak);
|
||||
writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
|
||||
builder.append(generateTripStatisticsDescription(track.getTripStatistics(), html));
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a waypoint description from a trip statistics.
|
||||
*
|
||||
* @param tripStatistics the trip statistics
|
||||
*/
|
||||
String generateWaypointDescription(TripStatistics tripStatistics);
|
||||
public String generateWaypointDescription(TripStatistics tripStatistics) {
|
||||
return generateTripStatisticsDescription(tripStatistics, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a string to a string builder.
|
||||
*
|
||||
* @param text the string
|
||||
* @param builder the string builder
|
||||
* @param resId the resource id containing one string placeholder
|
||||
* @param lineBreak the line break
|
||||
*/
|
||||
private void writeString(String text, StringBuilder builder, int resId, String lineBreak) {
|
||||
if (text == null || text.length() == 0) {
|
||||
text = context.getString(R.string.value_unknown);
|
||||
}
|
||||
builder.append(context.getString(resId, text));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a description for a {@link TripStatistics}.
|
||||
*
|
||||
* @param stats the trip statistics
|
||||
* @param html true to use "<br>" for line break instead of "\n"
|
||||
*/
|
||||
private String generateTripStatisticsDescription(TripStatistics stats, boolean html) {
|
||||
String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
// Total distance
|
||||
writeDistance(stats.getTotalDistance(), builder, R.string.description_total_distance, lineBreak);
|
||||
|
||||
// Total time
|
||||
writeTime(stats.getTotalTime(), builder, R.string.description_total_time, lineBreak);
|
||||
|
||||
// Moving time
|
||||
writeTime(stats.getMovingTime(), builder, R.string.description_moving_time, lineBreak);
|
||||
|
||||
// Average speed
|
||||
writeSpeed(stats.getAverageSpeed(), builder, R.string.description_average_speed, lineBreak);
|
||||
|
||||
// Average moving speed
|
||||
writeSpeed(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_speed, lineBreak);
|
||||
|
||||
// Max speed
|
||||
writeSpeed(stats.getMaxSpeed(), builder, R.string.description_max_speed, lineBreak);
|
||||
|
||||
// Average pace
|
||||
writePace(stats.getAverageSpeed(), builder, R.string.description_average_pace_in_minute, lineBreak);
|
||||
|
||||
// Average moving pace
|
||||
writePace(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_pace_in_minute, lineBreak);
|
||||
|
||||
// Fastest pace
|
||||
writePace(stats.getMaxSpeed(), builder, R.string.description_fastest_pace_in_minute, lineBreak);
|
||||
|
||||
// Max elevation
|
||||
writeElevation(stats.getMaxElevation(), builder, R.string.description_max_elevation, lineBreak);
|
||||
|
||||
// Min elevation
|
||||
writeElevation(stats.getMinElevation(), builder, R.string.description_min_elevation, lineBreak);
|
||||
|
||||
// Elevation gain
|
||||
writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak);
|
||||
|
||||
// Max grade
|
||||
writeGrade(stats.getMaxGrade(), builder, R.string.description_max_grade, lineBreak);
|
||||
|
||||
// Min grade
|
||||
writeGrade(stats.getMinGrade(), builder, R.string.description_min_grade, lineBreak);
|
||||
|
||||
// Recorded time
|
||||
builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime())));
|
||||
builder.append(lineBreak);
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes distance.
|
||||
*
|
||||
* @param distance distance in meters
|
||||
* @param builder StringBuilder to append distance
|
||||
* @param resId resource id of distance string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeDistance(double distance, StringBuilder builder, int resId, String lineBreak) {
|
||||
double distanceInKm = distance * UnitConversions.M_TO_KM;
|
||||
double distanceInMi = distanceInKm * UnitConversions.KM_TO_MI;
|
||||
builder.append(context.getString(resId, distanceInKm, distanceInMi));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes time.
|
||||
*
|
||||
* @param time time in milliseconds.
|
||||
* @param builder StringBuilder to append time
|
||||
* @param resId resource id of time string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeTime(long time, StringBuilder builder, int resId, String lineBreak) {
|
||||
builder.append(context.getString(resId, StringUtils.formatElapsedTime(time)));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes speed.
|
||||
*
|
||||
* @param speed speed in meters per second
|
||||
* @param builder StringBuilder to append speed
|
||||
* @param resId resource id of speed string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeSpeed(double speed, StringBuilder builder, int resId, String lineBreak) {
|
||||
double speedInKmHr = speed * UnitConversions.MS_TO_KMH;
|
||||
double speedInMiHr = speedInKmHr * UnitConversions.KM_TO_MI;
|
||||
builder.append(context.getString(resId, speedInKmHr, speedInMiHr));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes pace.
|
||||
*
|
||||
* @param speed speed in meters per second
|
||||
* @param builder StringBuilder to append pace
|
||||
* @param resId resource id of pace string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writePace(double speed, StringBuilder builder, int resId, String lineBreak) {
|
||||
Pair<String, String> paceInMetrics = StringUtils.getSpeedParts(context, speed, true, false);
|
||||
Pair<String, String> paceInImperial = StringUtils.getSpeedParts(context, speed, false, false);
|
||||
|
||||
String formattedPaceMetrics = paceInMetrics.first != null ? paceInMetrics.first : context.getString(R.string.value_unknown);
|
||||
String formattedPaceImperial = paceInImperial.first != null ? paceInImperial.first : context.getString(R.string.value_unknown);
|
||||
|
||||
builder.append(context.getString(resId, formattedPaceMetrics, formattedPaceImperial));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes elevation.
|
||||
*
|
||||
* @param elevation elevation in meters
|
||||
* @param builder StringBuilder to append elevation
|
||||
* @param resId resource id of elevation string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeElevation(double elevation, StringBuilder builder, int resId, String lineBreak) {
|
||||
long elevationInM = Math.round(elevation);
|
||||
long elevationInFt = Math.round(elevation * UnitConversions.M_TO_FT);
|
||||
builder.append(context.getString(resId, elevationInM, elevationInFt));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes grade.
|
||||
*
|
||||
* @param grade grade in fraction
|
||||
* @param builder StringBuilder to append grade
|
||||
* @param resId resource id grade string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeGrade(double grade, StringBuilder builder, int resId, String lineBreak) {
|
||||
long gradeInPercent = Double.isNaN(grade) || Double.isInfinite(grade) ? 0L : Math.round(grade * 100);
|
||||
builder.append(context.getString(resId, gradeInPercent));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,243 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
import de.dennisguse.opentracks.util.UnitConversions;
|
||||
|
||||
/**
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
public class DescriptionGeneratorImpl implements DescriptionGenerator {
|
||||
|
||||
private static final String HTML_LINE_BREAK = "<br>";
|
||||
private static final String HTML_PARAGRAPH_SEPARATOR = "<p>";
|
||||
private static final String TEXT_LINE_BREAK = "\n";
|
||||
private static final String TEXT_PARAGRAPH_SEPARATOR = "\n\n";
|
||||
|
||||
private Context context;
|
||||
|
||||
public DescriptionGeneratorImpl(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateTrackDescription(Track track, boolean html) {
|
||||
String paragraphSeparator = html ? HTML_PARAGRAPH_SEPARATOR : TEXT_PARAGRAPH_SEPARATOR;
|
||||
String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
// Created by
|
||||
String creator = html
|
||||
? "<a href='" + context.getString(R.string.app_web_url) + "'>" + context.getString(R.string.app_name) + "</a>"
|
||||
: context.getString(R.string.app_name);
|
||||
builder.append(creator);
|
||||
|
||||
builder.append(paragraphSeparator);
|
||||
|
||||
writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
|
||||
writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak);
|
||||
writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
|
||||
builder.append(generateTripStatisticsDescription(track.getTripStatistics(), html));
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateWaypointDescription(TripStatistics tripStatistics) {
|
||||
return generateTripStatisticsDescription(tripStatistics, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a string to a string builder.
|
||||
*
|
||||
* @param text the string
|
||||
* @param builder the string builder
|
||||
* @param resId the resource id containing one string placeholder
|
||||
* @param lineBreak the line break
|
||||
*/
|
||||
private void writeString(String text, StringBuilder builder, int resId, String lineBreak) {
|
||||
if (text == null || text.length() == 0) {
|
||||
text = context.getString(R.string.value_unknown);
|
||||
}
|
||||
builder.append(context.getString(resId, text));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a description for a {@link TripStatistics}.
|
||||
*
|
||||
* @param stats the trip statistics
|
||||
* @param html true to use "<br>" for line break instead of "\n"
|
||||
*/
|
||||
private String generateTripStatisticsDescription(TripStatistics stats, boolean html) {
|
||||
String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
// Total distance
|
||||
writeDistance(stats.getTotalDistance(), builder, R.string.description_total_distance, lineBreak);
|
||||
|
||||
// Total time
|
||||
writeTime(stats.getTotalTime(), builder, R.string.description_total_time, lineBreak);
|
||||
|
||||
// Moving time
|
||||
writeTime(stats.getMovingTime(), builder, R.string.description_moving_time, lineBreak);
|
||||
|
||||
// Average speed
|
||||
writeSpeed(stats.getAverageSpeed(), builder, R.string.description_average_speed, lineBreak);
|
||||
|
||||
// Average moving speed
|
||||
writeSpeed(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_speed, lineBreak);
|
||||
|
||||
// Max speed
|
||||
writeSpeed(stats.getMaxSpeed(), builder, R.string.description_max_speed, lineBreak);
|
||||
|
||||
// Average pace
|
||||
writePace(stats.getAverageSpeed(), builder, R.string.description_average_pace_in_minute, lineBreak);
|
||||
|
||||
// Average moving pace
|
||||
writePace(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_pace_in_minute, lineBreak);
|
||||
|
||||
// Fastest pace
|
||||
writePace(stats.getMaxSpeed(), builder, R.string.description_fastest_pace_in_minute, lineBreak);
|
||||
|
||||
// Max elevation
|
||||
writeElevation(stats.getMaxElevation(), builder, R.string.description_max_elevation, lineBreak);
|
||||
|
||||
// Min elevation
|
||||
writeElevation(stats.getMinElevation(), builder, R.string.description_min_elevation, lineBreak);
|
||||
|
||||
// Elevation gain
|
||||
writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak);
|
||||
|
||||
// Max grade
|
||||
writeGrade(stats.getMaxGrade(), builder, R.string.description_max_grade, lineBreak);
|
||||
|
||||
// Min grade
|
||||
writeGrade(stats.getMinGrade(), builder, R.string.description_min_grade, lineBreak);
|
||||
|
||||
// Recorded time
|
||||
builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime())));
|
||||
builder.append(lineBreak);
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes distance.
|
||||
*
|
||||
* @param distance distance in meters
|
||||
* @param builder StringBuilder to append distance
|
||||
* @param resId resource id of distance string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeDistance(double distance, StringBuilder builder, int resId, String lineBreak) {
|
||||
double distanceInKm = distance * UnitConversions.M_TO_KM;
|
||||
double distanceInMi = distanceInKm * UnitConversions.KM_TO_MI;
|
||||
builder.append(context.getString(resId, distanceInKm, distanceInMi));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes time.
|
||||
*
|
||||
* @param time time in milliseconds.
|
||||
* @param builder StringBuilder to append time
|
||||
* @param resId resource id of time string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeTime(long time, StringBuilder builder, int resId, String lineBreak) {
|
||||
builder.append(context.getString(resId, StringUtils.formatElapsedTime(time)));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes speed.
|
||||
*
|
||||
* @param speed speed in meters per second
|
||||
* @param builder StringBuilder to append speed
|
||||
* @param resId resource id of speed string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeSpeed(double speed, StringBuilder builder, int resId, String lineBreak) {
|
||||
double speedInKmHr = speed * UnitConversions.MS_TO_KMH;
|
||||
double speedInMiHr = speedInKmHr * UnitConversions.KM_TO_MI;
|
||||
builder.append(context.getString(resId, speedInKmHr, speedInMiHr));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes pace.
|
||||
*
|
||||
* @param speed speed in meters per second
|
||||
* @param builder StringBuilder to append pace
|
||||
* @param resId resource id of pace string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writePace(double speed, StringBuilder builder, int resId, String lineBreak) {
|
||||
Pair<String, String> paceInMetrics = StringUtils.getSpeedParts(context, speed, true, false);
|
||||
Pair<String, String> paceInImperial = StringUtils.getSpeedParts(context, speed, false, false);
|
||||
|
||||
String formattedPaceMetrics = paceInMetrics.first != null ? paceInMetrics.first : context.getString(R.string.value_unknown);
|
||||
String formattedPaceImperial = paceInImperial.first != null ? paceInImperial.first : context.getString(R.string.value_unknown);
|
||||
|
||||
builder.append(context.getString(resId, formattedPaceMetrics, formattedPaceImperial));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes elevation.
|
||||
*
|
||||
* @param elevation elevation in meters
|
||||
* @param builder StringBuilder to append elevation
|
||||
* @param resId resource id of elevation string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeElevation(double elevation, StringBuilder builder, int resId, String lineBreak) {
|
||||
long elevationInM = Math.round(elevation);
|
||||
long elevationInFt = Math.round(elevation * UnitConversions.M_TO_FT);
|
||||
builder.append(context.getString(resId, elevationInM, elevationInFt));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes grade.
|
||||
*
|
||||
* @param grade grade in fraction
|
||||
* @param builder StringBuilder to append grade
|
||||
* @param resId resource id grade string
|
||||
* @param lineBreak line break string
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void writeGrade(double grade, StringBuilder builder, int resId, String lineBreak) {
|
||||
long gradeInPercent = Double.isNaN(grade) || Double.isInfinite(grade) ? 0L : Math.round(grade * 100);
|
||||
builder.append(context.getString(resId, gradeInPercent));
|
||||
builder.append(lineBreak);
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,10 @@ import java.util.Locale;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.WaypointsColumns;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.util.LocationUtils;
|
||||
import de.dennisguse.opentracks.util.UnitConversions;
|
||||
|
||||
@@ -21,6 +21,8 @@ import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import de.dennisguse.opentracks.android.IContentResolver;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.util.LocationUtils;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ package de.dennisguse.opentracks.content;
|
||||
|
||||
import android.location.Location;
|
||||
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
|
||||
/**
|
||||
* Listener for track data changes.
|
||||
*
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
package de.dennisguse.opentracks.content;
|
||||
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
|
||||
/**
|
||||
* A request for the service to create a waypoint at the current location.
|
||||
*
|
||||
* @author Sandor Dornbush
|
||||
*/
|
||||
public class WaypointCreationRequest {
|
||||
|
||||
public final static WaypointCreationRequest DEFAULT_WAYPOINT = new WaypointCreationRequest(WaypointType.WAYPOINT, false);
|
||||
|
||||
@Deprecated // TODO Do not create per
|
||||
public final static WaypointCreationRequest DEFAULT_START_TRACK = new WaypointCreationRequest(WaypointType.STATISTICS, true);
|
||||
|
||||
private WaypointType type;
|
||||
|
||||
// true if this marker contains the track statistics
|
||||
private boolean isTrackStatistics;
|
||||
|
||||
private String name;
|
||||
private String category;
|
||||
private String description;
|
||||
private String iconUrl;
|
||||
private String photoUrl;
|
||||
|
||||
private WaypointCreationRequest(WaypointType type, boolean isTrackStatistics) {
|
||||
this(type, isTrackStatistics, null, null, null, null, null);
|
||||
}
|
||||
|
||||
public WaypointCreationRequest(WaypointType type, boolean isTrackStatistics, String name, String category, String description, String iconUrl, String photoUrl) {
|
||||
this.type = type;
|
||||
this.isTrackStatistics = isTrackStatistics;
|
||||
this.name = name;
|
||||
this.category = category;
|
||||
this.description = description;
|
||||
this.iconUrl = iconUrl;
|
||||
this.photoUrl = photoUrl;
|
||||
}
|
||||
|
||||
public WaypointType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public boolean isTrackStatistics() {
|
||||
return isTrackStatistics;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public String getIconUrl() {
|
||||
return iconUrl;
|
||||
}
|
||||
|
||||
public String getPhotoUrl() {
|
||||
return photoUrl;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.location.Location;
|
||||
|
||||
+3
-1
@@ -14,11 +14,13 @@
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
|
||||
/**
|
||||
* Constants for the track points table.
|
||||
*
|
||||
+3
-1
@@ -14,11 +14,13 @@
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
|
||||
/**
|
||||
* Constants for the tracks table.
|
||||
*
|
||||
+2
-17
@@ -14,7 +14,7 @@
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.location.Location;
|
||||
import android.net.Uri;
|
||||
@@ -35,7 +35,6 @@ public final class Waypoint {
|
||||
private String category = "";
|
||||
private String icon = "";
|
||||
private long trackId = -1L;
|
||||
private WaypointType type = WaypointType.WAYPOINT;
|
||||
private double length = 0.0;
|
||||
private long duration = 0;
|
||||
private long startId = -1L;
|
||||
@@ -47,13 +46,12 @@ public final class Waypoint {
|
||||
public Waypoint() {
|
||||
}
|
||||
|
||||
public Waypoint(String name, String description, String category, String icon, long trackId, WaypointType type, double length, long duration, long startId, long stopId, Location location, TripStatistics tripStatistics, String photoUrl) {
|
||||
public Waypoint(String name, String description, String category, String icon, long trackId, double length, long duration, long startId, long stopId, Location location, TripStatistics tripStatistics, String photoUrl) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.category = category;
|
||||
this.icon = icon;
|
||||
this.trackId = trackId;
|
||||
this.type = type;
|
||||
this.length = length;
|
||||
this.duration = duration;
|
||||
this.startId = startId;
|
||||
@@ -111,14 +109,6 @@ public final class Waypoint {
|
||||
this.trackId = trackId;
|
||||
}
|
||||
|
||||
public WaypointType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(WaypointType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public double getLength() {
|
||||
return length;
|
||||
}
|
||||
@@ -186,9 +176,4 @@ public final class Waypoint {
|
||||
public boolean hasPhoto() {
|
||||
return photoUrl != null && !"".equals(photoUrl);
|
||||
}
|
||||
|
||||
public enum WaypointType {
|
||||
WAYPOINT,
|
||||
STATISTICS //Always the first waypoint; only one can exist.
|
||||
}
|
||||
}
|
||||
+5
-2
@@ -14,11 +14,13 @@
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package de.dennisguse.opentracks.content;
|
||||
package de.dennisguse.opentracks.content.data;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
|
||||
/**
|
||||
* Constants for waypoints table.
|
||||
*
|
||||
@@ -38,7 +40,8 @@ public interface WaypointsColumns extends BaseColumns {
|
||||
String CATEGORY = "category"; // waypoint category
|
||||
String ICON = "icon"; // waypoint icon
|
||||
String TRACKID = "trackid"; // track id
|
||||
String TYPE = "type"; // type
|
||||
@Deprecated //Unused
|
||||
String TYPE = "type"; // type
|
||||
String LENGTH = "length"; // length of the track (without smoothing)
|
||||
String DURATION = "duration"; // total duration of the track (not from last waypoint)
|
||||
String STARTTIME = "starttime"; // start time of the trip statistics
|
||||
@@ -37,11 +37,11 @@ import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.TrackDetailActivity;
|
||||
import de.dennisguse.opentracks.chart.ChartView;
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TrackDataHub;
|
||||
import de.dennisguse.opentracks.content.TrackDataListener;
|
||||
import de.dennisguse.opentracks.content.TrackDataType;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.stats.TripStatisticsUpdater;
|
||||
|
||||
@@ -28,7 +28,6 @@ import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
||||
import de.dennisguse.opentracks.util.DialogUtils;
|
||||
|
||||
/**
|
||||
@@ -83,8 +82,7 @@ public class DeleteMarkerDialogFragment extends DialogFragment {
|
||||
public void run() {
|
||||
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(fragmentActivity);
|
||||
for (long markerId : markerIds) {
|
||||
contentProviderUtils.deleteWaypoint(fragmentActivity,
|
||||
markerId, new DescriptionGeneratorImpl(fragmentActivity));
|
||||
contentProviderUtils.deleteWaypoint(fragmentActivity, markerId);
|
||||
}
|
||||
caller.onDeleteMarkerDone();
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import de.dennisguse.opentracks.MarkerEditActivity;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.util.IntentUtils;
|
||||
import de.dennisguse.opentracks.util.ListItemUtils;
|
||||
import de.dennisguse.opentracks.util.MarkerUtils;
|
||||
|
||||
@@ -37,11 +37,11 @@ import java.util.EnumSet;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.TrackDetailActivity;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TrackDataHub;
|
||||
import de.dennisguse.opentracks.content.TrackDataListener;
|
||||
import de.dennisguse.opentracks.content.TrackDataType;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.services.ITrackRecordingService;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
@@ -239,7 +239,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
if (trackRecordingServiceConnection != null) {
|
||||
trackRecordingServiceConnection.unbind();
|
||||
trackRecordingServiceConnection.unbind(getContext());
|
||||
}
|
||||
trackRecordingServiceConnection = null;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.util.Locale;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.io.file.exporter.FileTrackExporter;
|
||||
import de.dennisguse.opentracks.io.file.exporter.GpxTrackWriter;
|
||||
import de.dennisguse.opentracks.io.file.exporter.KmlTrackWriter;
|
||||
|
||||
@@ -28,8 +28,8 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.util.FileUtils;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
@@ -29,8 +29,8 @@ import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.LocationFactory;
|
||||
import de.dennisguse.opentracks.content.LocationIterator;
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.util.LocationUtils;
|
||||
|
||||
/**
|
||||
@@ -99,7 +99,6 @@ public class FileTrackExporter implements TrackExporter {
|
||||
boolean hasWaypoints = false;
|
||||
try (Cursor cursor = contentProviderUtils.getWaypointCursor(track.getId(), -1L, ContentProviderUtils.MAX_LOADED_WAYPOINTS_POINTS)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
// Intentionally skip first waypoint (contains statistics).
|
||||
for (int i = 0; i < cursor.getCount(); i++) {
|
||||
if (Thread.interrupted()) {
|
||||
throw new InterruptedException();
|
||||
|
||||
@@ -23,8 +23,8 @@ import java.io.PrintWriter;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -119,12 +119,9 @@ public class GpxTrackWriter implements TrackWriter {
|
||||
if (location.hasAltitude()) {
|
||||
printWriter.println("<ele>" + ELEVATION_FORMAT.format(location.getAltitude()) + "</ele>");
|
||||
}
|
||||
printWriter.println(
|
||||
"<time>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</time>");
|
||||
printWriter.println("<time>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</time>");
|
||||
printWriter.println("<name>" + StringUtils.formatCData(waypoint.getName()) + "</name>");
|
||||
printWriter.println("<cmt>" + StringUtils.formatCData(waypoint.getType().name()) + "</cmt>");
|
||||
printWriter.println(
|
||||
"<desc>" + StringUtils.formatCData(waypoint.getDescription()) + "</desc>");
|
||||
printWriter.println("<desc>" + StringUtils.formatCData(waypoint.getDescription()) + "</desc>");
|
||||
printWriter.println("<type>" + StringUtils.formatCData(waypoint.getCategory()) + "</type>");
|
||||
printWriter.println("</wpt>");
|
||||
}
|
||||
|
||||
@@ -28,11 +28,9 @@ import java.util.List;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.DescriptionGenerator;
|
||||
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
|
||||
@@ -43,19 +41,17 @@ import de.dennisguse.opentracks.util.StringUtils;
|
||||
*/
|
||||
public class KmlTrackWriter implements TrackWriter {
|
||||
|
||||
private static final String WAYPOINT_STYLE = "waypoint";
|
||||
private static final String STATISTICS_STYLE = "statistics";
|
||||
public static final String WAYPOINT_STYLE = "waypoint";
|
||||
private static final String START_STYLE = "start";
|
||||
private static final String END_STYLE = "end";
|
||||
private static final String TRACK_STYLE = "track";
|
||||
private static final String SCHEMA_ID = "schema";
|
||||
|
||||
private static final String SENSOR_TYPE_CADENCE = "cadence";
|
||||
private static final String SENSOR_TYPE_HEART_RATE = "heart_rate";
|
||||
private static final String SENSOR_TYPE_POWER = "power";
|
||||
public static final String SENSOR_TYPE_CADENCE = "cadence";
|
||||
public static final String SENSOR_TYPE_HEART_RATE = "heart_rate";
|
||||
public static final String SENSOR_TYPE_POWER = "power";
|
||||
|
||||
private static final String WAYPOINT_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
|
||||
private static final String STATISTICS_ICON = "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png";
|
||||
private static final String START_ICON = "http://maps.google.com/mapfiles/kml/paddle/grn-circle.png";
|
||||
private static final String END_ICON = "http://maps.google.com/mapfiles/kml/paddle/red-circle.png";
|
||||
private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
|
||||
@@ -88,7 +84,7 @@ public class KmlTrackWriter implements TrackWriter {
|
||||
this.exportTrackDetail = exportTrackDetail;
|
||||
this.exportSensorData = exportSensorData;
|
||||
this.exportPhotos = exportPhotos;
|
||||
this.descriptionGenerator = new DescriptionGeneratorImpl(context);
|
||||
this.descriptionGenerator = new DescriptionGenerator(context);
|
||||
this.contentProviderUtils = new ContentProviderUtils(context);
|
||||
}
|
||||
|
||||
@@ -125,7 +121,6 @@ public class KmlTrackWriter implements TrackWriter {
|
||||
writeTrackStyle();
|
||||
writePlacemarkerStyle(START_STYLE, START_ICON, 32, 1);
|
||||
writePlacemarkerStyle(END_STYLE, END_ICON, 32, 1);
|
||||
writePlacemarkerStyle(STATISTICS_STYLE, STATISTICS_ICON, 20, 2);
|
||||
writePlacemarkerStyle(WAYPOINT_STYLE, WAYPOINT_ICON, 20, 2);
|
||||
printWriter.println("<Schema id=\"" + SCHEMA_ID + "\">");
|
||||
|
||||
@@ -167,13 +162,11 @@ public class KmlTrackWriter implements TrackWriter {
|
||||
@Override
|
||||
public void writeWaypoint(Waypoint waypoint) {
|
||||
if (printWriter != null && exportTrackDetail) {
|
||||
String styleName = waypoint.getType() == WaypointType.STATISTICS ? STATISTICS_STYLE : WAYPOINT_STYLE;
|
||||
|
||||
if (waypoint.hasPhoto() && exportPhotos) {
|
||||
float heading = getHeading(waypoint.getTrackId(), waypoint.getLocation());
|
||||
writePhotoOverlay(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), styleName, waypoint.getLocation(), waypoint.getPhotoUrl(), heading);
|
||||
writePhotoOverlay(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), WAYPOINT_STYLE, waypoint.getLocation(), waypoint.getPhotoUrl(), heading);
|
||||
} else {
|
||||
writePlacemark(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), styleName, waypoint.getLocation());
|
||||
writePlacemark(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), WAYPOINT_STYLE, waypoint.getLocation());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -205,6 +198,7 @@ public class KmlTrackWriter implements TrackWriter {
|
||||
if (exportTrackDetail) {
|
||||
printWriter.println("<name>" + StringUtils.formatCData(track.getName()) + "</name>");
|
||||
printWriter.println("<description>" + StringUtils.formatCData(track.getDescription()) + "</description>");
|
||||
printWriter.println("<icon>" + StringUtils.formatCData(track.getIcon()) + "</icon>");
|
||||
}
|
||||
|
||||
printWriter.println("<styleUrl>#" + TRACK_STYLE + "</styleUrl>");
|
||||
|
||||
@@ -32,8 +32,8 @@ import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.util.FileUtils;
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,8 +19,8 @@ import android.location.Location;
|
||||
|
||||
import java.io.OutputStream;
|
||||
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
|
||||
/**
|
||||
* Interface for writing tracks to a file. The expected sequence of calls is:
|
||||
|
||||
+20
-52
@@ -39,12 +39,10 @@ import javax.xml.parsers.SAXParserFactory;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
||||
import de.dennisguse.opentracks.content.LocationFactory;
|
||||
import de.dennisguse.opentracks.content.LocationIterator;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingService;
|
||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||
import de.dennisguse.opentracks.stats.TripStatisticsUpdater;
|
||||
@@ -71,12 +69,13 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
private final ContentProviderUtils contentProviderUtils;
|
||||
private final int recordingDistanceInterval;
|
||||
|
||||
private final List<Long> trackIds;
|
||||
private final List<Waypoint> waypoints;
|
||||
private final List<Long> trackIds = new ArrayList<>();
|
||||
private final List<Waypoint> waypoints = new ArrayList<>();
|
||||
|
||||
// The current element content
|
||||
//TODO Should be made private and getter be used by child classes.
|
||||
protected String content;
|
||||
protected String icon;
|
||||
protected String name;
|
||||
protected String description;
|
||||
protected String category;
|
||||
@@ -104,8 +103,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
this.importTrackId = importTrackId;
|
||||
this.contentProviderUtils = contentProviderUtils;
|
||||
this.recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(context);
|
||||
trackIds = new ArrayList<>();
|
||||
waypoints = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -177,6 +174,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (location == null) {
|
||||
if (!locationIterator.hasNext()) {
|
||||
// No more track points. Ignore the rest of the waypoints.
|
||||
@@ -186,9 +184,11 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
trackTripStatisticstrackUpdater.addLocation(location, recordingDistanceInterval);
|
||||
markerTripStatisticsUpdater.addLocation(location, recordingDistanceInterval);
|
||||
}
|
||||
|
||||
if (waypoint.getLocation().getTime() > location.getTime()) {
|
||||
location = null;
|
||||
} else if (waypoint.getLocation().getTime() < location.getTime()) {
|
||||
Log.w(TAG, "Ignoring waypoint: current location was after waypoint.");
|
||||
waypoint = null;
|
||||
} else {
|
||||
// The waypoint location time matches the track point time
|
||||
@@ -201,27 +201,14 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
// Valid location
|
||||
if (location.getLatitude() == waypoint.getLocation().getLatitude() && location.getLongitude() == waypoint.getLocation().getLongitude()) {
|
||||
|
||||
// Get tripStatistics, description, and icon
|
||||
TripStatistics tripStatistics;
|
||||
String waypointDescription;
|
||||
String icon;
|
||||
if (waypoint.getType() == WaypointType.STATISTICS) {
|
||||
tripStatistics = markerTripStatisticsUpdater.getTripStatistics();
|
||||
markerTripStatisticsUpdater = new TripStatisticsUpdater(location.getTime());
|
||||
waypointDescription = new DescriptionGeneratorImpl(context).generateWaypointDescription(tripStatistics);
|
||||
icon = context.getString(R.string.marker_statistics_icon_url);
|
||||
} else {
|
||||
tripStatistics = null;
|
||||
waypointDescription = waypoint.getDescription();
|
||||
icon = context.getString(R.string.marker_waypoint_icon_url);
|
||||
}
|
||||
|
||||
// Get length and duration
|
||||
TripStatistics tripStatistics = null;
|
||||
String waypointDescription = waypoint.getDescription();
|
||||
String icon = context.getString(R.string.marker_waypoint_icon_url);
|
||||
double length = trackTripStatisticstrackUpdater.getTripStatistics().getTotalDistance();
|
||||
long duration = trackTripStatisticstrackUpdater.getTripStatistics().getTotalTime();
|
||||
|
||||
// Insert waypoint
|
||||
Waypoint newWaypoint = new Waypoint(waypoint.getName(), waypointDescription, waypoint.getCategory(), icon, track.getId(), waypoint.getType(), length, duration, -1L, -1L, location, tripStatistics, waypoint.getPhotoUrl());
|
||||
Waypoint newWaypoint = new Waypoint(waypoint.getName(), waypointDescription, waypoint.getCategory(), icon, track.getId(), length, duration, -1L, -1L, location, tripStatistics, waypoint.getPhotoUrl());
|
||||
contentProviderUtils.insertWaypoint(newWaypoint);
|
||||
}
|
||||
|
||||
@@ -265,7 +252,12 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
}
|
||||
if (category != null) {
|
||||
trackData.track.setCategory(category);
|
||||
trackData.track.setIcon(TrackIconUtils.getIconValue(context, category));
|
||||
//TODO remove when GPX and KML support reading this property.
|
||||
if (icon == null)
|
||||
trackData.track.setIcon(TrackIconUtils.getIconValue(context, category));
|
||||
}
|
||||
if (icon != null) {
|
||||
trackData.track.setIcon(icon);
|
||||
}
|
||||
if (trackData.tripStatisticsUpdater == null) {
|
||||
trackData.tripStatisticsUpdater = new TripStatisticsUpdater(trackData.importTime);
|
||||
@@ -274,7 +266,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
trackData.track.setTripStatistics(trackData.tripStatisticsUpdater.getTripStatistics());
|
||||
trackData.track.setNumberOfPoints(trackData.numberOfLocations);
|
||||
contentProviderUtils.updateTrack(trackData.track);
|
||||
insertFirstWaypoint(trackData.track);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -292,10 +283,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
|
||||
/**
|
||||
* Adds a waypoint.
|
||||
*
|
||||
* @param type the waypoint type
|
||||
*/
|
||||
protected void addWaypoint(WaypointType type) throws SAXException {
|
||||
protected void addWaypoint() throws SAXException {
|
||||
// Waypoint must have a time, else cannot match to the track points
|
||||
if (time == null) {
|
||||
return;
|
||||
@@ -318,7 +307,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
if (category != null) {
|
||||
waypoint.setCategory(category);
|
||||
}
|
||||
waypoint.setType(type);
|
||||
|
||||
if (photoUrl != null) {
|
||||
waypoint.setPhotoUrl(photoUrl);
|
||||
@@ -500,27 +488,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
data.track.setStopId(contentProviderUtils.getLastTrackPointId(data.track.getId()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts the first waypoint, the track statistics waypoint.
|
||||
*
|
||||
* @param track the track
|
||||
*/
|
||||
private void insertFirstWaypoint(Track track) {
|
||||
String waypointName = context.getString(R.string.marker_split_name_format, 0);
|
||||
String waypointCategory = "";
|
||||
TripStatisticsUpdater updater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime());
|
||||
TripStatistics tripStatistics = updater.getTripStatistics();
|
||||
String waypointDescription = new DescriptionGeneratorImpl(context).generateWaypointDescription(tripStatistics);
|
||||
String icon = context.getString(R.string.marker_statistics_icon_url);
|
||||
double length = 0.0;
|
||||
long duration = 0L;
|
||||
Location waypointLocation = new Location("");
|
||||
waypointLocation.setLatitude(100);
|
||||
waypointLocation.setLongitude(180);
|
||||
Waypoint waypoint = new Waypoint(waypointName, waypointDescription, waypointCategory, icon, track.getId(), WaypointType.STATISTICS, length, duration, -1L, -1L, waypointLocation, tripStatistics, "");
|
||||
contentProviderUtils.insertWaypoint(waypoint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up import.
|
||||
*/
|
||||
@@ -535,6 +502,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
|
||||
*
|
||||
* @author Jimmy Shih
|
||||
*/
|
||||
// TODO Why private inner class?
|
||||
private class TrackData {
|
||||
// The current track
|
||||
Track track = new Track();
|
||||
|
||||
@@ -25,7 +25,6 @@ import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
|
||||
/**
|
||||
* Imports a GPX file.
|
||||
@@ -184,6 +183,6 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
|
||||
* On waypoint end.
|
||||
*/
|
||||
private void onWaypointEnd() throws SAXException {
|
||||
addWaypoint(WaypointType.STATISTICS.name().equals(waypointType) ? WaypointType.STATISTICS : WaypointType.WAYPOINT);
|
||||
addWaypoint();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.util.FileUtils;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
|
||||
@@ -30,8 +30,8 @@ import java.util.ArrayList;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.io.file.exporter.KmlTrackWriter;
|
||||
|
||||
/**
|
||||
* Imports a KML file.
|
||||
@@ -42,15 +42,11 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
|
||||
|
||||
private static final String TAG = KmlFileTrackImporter.class.getSimpleName();
|
||||
|
||||
private static final String CADENCE = "cadence";
|
||||
private static final String HEART_RATE = "heart_rate";
|
||||
private static final String POWER = "power";
|
||||
|
||||
private static final String STATISTICS_STYLE = "#statistics";
|
||||
private static final String WAYPOINT_STYLE = "#waypoint";
|
||||
private static final String WAYPOINT_STYLE = "#" + KmlTrackWriter.WAYPOINT_STYLE;
|
||||
|
||||
private static final String TAG_COORDINATES = "coordinates";
|
||||
private static final String TAG_DESCRIPTION = "description";
|
||||
private static final String TAG_ICON = "icon";
|
||||
private static final String TAG_GX_COORD = "gx:coord";
|
||||
private static final String TAG_GX_MULTI_TRACK = "gx:MultiTrack";
|
||||
private static final String TAG_GX_SIMPLE_ARRAY_DATA = "gx:SimpleArrayData";
|
||||
@@ -140,6 +136,10 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
|
||||
if (content != null) {
|
||||
description = content.trim();
|
||||
}
|
||||
} else if (localName.equals(TAG_ICON)) {
|
||||
if (content != null) {
|
||||
icon = content.trim();
|
||||
}
|
||||
} else if (localName.equals(TAG_VALUE)) {
|
||||
if (content != null) {
|
||||
category = content.trim();
|
||||
@@ -168,6 +168,7 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
|
||||
private void onWaypointStart() {
|
||||
// Reset all Placemark variables
|
||||
name = null;
|
||||
icon = null;
|
||||
description = null;
|
||||
category = null;
|
||||
photoUrl = null;
|
||||
@@ -182,29 +183,16 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
|
||||
* On waypoint end.
|
||||
*/
|
||||
private void onWaypointEnd() throws SAXException {
|
||||
if (waypointType == null) {
|
||||
if (!WAYPOINT_STYLE.equals(waypointType)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add a waypoint if the waypointType matches
|
||||
WaypointType type;
|
||||
switch (waypointType) {
|
||||
case WAYPOINT_STYLE:
|
||||
type = WaypointType.WAYPOINT;
|
||||
break;
|
||||
case STATISTICS_STYLE:
|
||||
type = WaypointType.STATISTICS;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (photoUrl != null) {
|
||||
Uri uri = Uri.parse(photoUrl);
|
||||
photoUrl = getPhotoUrl(uri.getLastPathSegment());
|
||||
}
|
||||
|
||||
addWaypoint(type);
|
||||
addWaypoint();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -315,13 +303,13 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
|
||||
throw new SAXException(createErrorMessage("Unable to parse gx:value:" + content), e);
|
||||
}
|
||||
switch (sensorType) {
|
||||
case POWER:
|
||||
case KmlTrackWriter.SENSOR_TYPE_POWER:
|
||||
powerList.add(value);
|
||||
break;
|
||||
case HEART_RATE:
|
||||
case KmlTrackWriter.SENSOR_TYPE_HEART_RATE:
|
||||
heartRateList.add(value);
|
||||
break;
|
||||
case CADENCE:
|
||||
case KmlTrackWriter.SENSOR_TYPE_CADENCE:
|
||||
cadenceList.add(value);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -19,7 +19,6 @@ import android.location.Location;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
|
||||
/**
|
||||
@@ -83,10 +82,9 @@ public interface ITrackRecordingService {
|
||||
/**
|
||||
* Inserts a waypoint in the current recording track.
|
||||
*
|
||||
* @param request the details of the waypoint to be inserted
|
||||
* @return the ID of the inserted waypoint
|
||||
*/
|
||||
long insertWaypoint(WaypointCreationRequest request);
|
||||
long insertWaypoint(String name, String category, String description, String photoUrl);
|
||||
|
||||
/**
|
||||
* ONLY FOR TESTING
|
||||
|
||||
@@ -47,9 +47,8 @@ import de.dennisguse.opentracks.content.CustomContentProvider;
|
||||
import de.dennisguse.opentracks.content.LocationFactory;
|
||||
import de.dennisguse.opentracks.content.LocationIterator;
|
||||
import de.dennisguse.opentracks.content.SensorDataSetLocation;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
|
||||
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTaskFactory;
|
||||
@@ -292,50 +291,38 @@ public class TrackRecordingService extends Service {
|
||||
/**
|
||||
* Inserts a waypoint.
|
||||
*
|
||||
* @param waypointCreationRequest the waypoint creation request
|
||||
* @return the waypoint id
|
||||
*/
|
||||
public long insertWaypoint(WaypointCreationRequest waypointCreationRequest) {
|
||||
public long insertWaypoint(String name, String category, String description, String photoUrl) {
|
||||
if (!isRecording() || isPaused()) {
|
||||
return -1L;
|
||||
}
|
||||
|
||||
String name = waypointCreationRequest.getName();
|
||||
if (name == null) {
|
||||
int nextWaypointNumber = contentProviderUtils.getNextWaypointNumber(recordingTrackId, waypointCreationRequest.getType());
|
||||
int nextWaypointNumber = contentProviderUtils.getNextWaypointNumber(recordingTrackId);
|
||||
if (nextWaypointNumber == -1) {
|
||||
nextWaypointNumber = 0;
|
||||
nextWaypointNumber = 1;
|
||||
}
|
||||
name = getString(R.string.marker_name_format, nextWaypointNumber);
|
||||
name = getString(R.string.marker_name_format, nextWaypointNumber + 1);
|
||||
}
|
||||
|
||||
String category = waypointCreationRequest.getCategory() != null ? waypointCreationRequest.getCategory() : "";
|
||||
String description = waypointCreationRequest.getDescription() != null ? waypointCreationRequest.getDescription() : "";
|
||||
String icon = getString(R.string.marker_waypoint_icon_url);
|
||||
|
||||
double length;
|
||||
long duration;
|
||||
Location location = getLastValidTrackPointInCurrentSegment(recordingTrackId);
|
||||
if (location != null && trackTripStatisticsUpdater != null) {
|
||||
TripStatistics stats = trackTripStatisticsUpdater.getTripStatistics();
|
||||
length = stats.getTotalDistance();
|
||||
duration = stats.getTotalTime();
|
||||
} else {
|
||||
if (!waypointCreationRequest.isTrackStatistics()) {
|
||||
return -1L;
|
||||
}
|
||||
// For track statistics, make it an impossible location
|
||||
location = new Location("");
|
||||
location.setLatitude(100);
|
||||
location.setLongitude(180);
|
||||
length = 0.0;
|
||||
duration = 0L;
|
||||
if (location == null) {
|
||||
Log.i(TAG, "Could not create a waypoint as location is unknown.");
|
||||
return -1L;
|
||||
}
|
||||
|
||||
String photoUrl = waypointCreationRequest.getPhotoUrl() != null ? waypointCreationRequest.getPhotoUrl() : "";
|
||||
category = category != null ? category : "";
|
||||
description = description != null ? description : "";
|
||||
String icon = getString(R.string.marker_waypoint_icon_url);
|
||||
photoUrl = photoUrl != null ? photoUrl : "";
|
||||
|
||||
TripStatistics stats = trackTripStatisticsUpdater.getTripStatistics();
|
||||
double length = stats.getTotalDistance();
|
||||
long duration = stats.getTotalTime();
|
||||
|
||||
// Insert waypoint
|
||||
Waypoint waypoint = new Waypoint(name, description, category, icon, recordingTrackId, waypointCreationRequest.getType(), length, duration, -1L, -1L, location, null, photoUrl);
|
||||
Waypoint waypoint = new Waypoint(name, description, category, icon, recordingTrackId, length, duration, -1L, -1L, location, null, photoUrl);
|
||||
Uri uri = contentProviderUtils.insertWaypoint(waypoint);
|
||||
return Long.parseLong(uri.getLastPathSegment());
|
||||
}
|
||||
@@ -371,9 +358,6 @@ public class TrackRecordingService extends Service {
|
||||
track.setTripStatistics(trackTripStatisticsUpdater.getTripStatistics());
|
||||
contentProviderUtils.updateTrack(track);
|
||||
|
||||
//TODO Do not use insertWaypoint
|
||||
insertWaypoint(WaypointCreationRequest.DEFAULT_START_TRACK);
|
||||
|
||||
startRecording(true);
|
||||
return trackId;
|
||||
}
|
||||
@@ -892,8 +876,8 @@ public class TrackRecordingService extends Service {
|
||||
}
|
||||
|
||||
@Override
|
||||
public long insertWaypoint(WaypointCreationRequest waypointCreationRequest) {
|
||||
return trackRecordingService.insertWaypoint(waypointCreationRequest);
|
||||
public long insertWaypoint(String name, String category, String description, String photoUrl) {
|
||||
return trackRecordingService.insertWaypoint(name, category, description, photoUrl);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
|
||||
+12
-17
@@ -31,7 +31,6 @@ import androidx.annotation.NonNull;
|
||||
import de.dennisguse.opentracks.BuildConfig;
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.TrackEditActivity;
|
||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||
import de.dennisguse.opentracks.util.IntentUtils;
|
||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||
import de.dennisguse.opentracks.util.ServiceUtils;
|
||||
@@ -48,9 +47,6 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
|
||||
private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName();
|
||||
|
||||
@Deprecated
|
||||
//TODO Always the context of the owner of a service connection (i.e., let it be passed to every call).
|
||||
private final Context context;
|
||||
private final Runnable callback;
|
||||
|
||||
private ITrackRecordingService trackRecordingService;
|
||||
@@ -62,29 +58,28 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
* @param callback the callback to invoke when the service binding changes
|
||||
*/
|
||||
public TrackRecordingServiceConnection(Context context, Runnable callback) {
|
||||
this.context = context;
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts and binds the service.
|
||||
*/
|
||||
public void startAndBind() {
|
||||
bindService(true);
|
||||
public void startAndBind(Context context) {
|
||||
bindService(context, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds the service if it is started.
|
||||
*/
|
||||
public void bindIfStarted() {
|
||||
bindService(false);
|
||||
public void bindIfStarted(Context context) {
|
||||
bindService(context, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unbinds and stops the service.
|
||||
*/
|
||||
public void unbindAndStop() {
|
||||
unbind();
|
||||
public void unbindAndStop(Context context) {
|
||||
unbind(context);
|
||||
context.stopService(new Intent(context, TrackRecordingService.class));
|
||||
}
|
||||
|
||||
@@ -111,7 +106,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
/**
|
||||
* Unbinds the service (but leave it running).
|
||||
*/
|
||||
public void unbind() {
|
||||
public void unbind(Context context) {
|
||||
try {
|
||||
context.unbindService(this);
|
||||
} catch (IllegalArgumentException e) {
|
||||
@@ -148,7 +143,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
*
|
||||
* @param startIfNeeded start the service if needed
|
||||
*/
|
||||
private void bindService(boolean startIfNeeded) {
|
||||
private void bindService(Context context, boolean startIfNeeded) {
|
||||
if (trackRecordingService != null) {
|
||||
// Service is already started and bound.
|
||||
return;
|
||||
@@ -175,7 +170,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
* @param context the context
|
||||
*/
|
||||
public void startConnection(@NonNull Context context) {
|
||||
bindIfStarted();
|
||||
bindIfStarted(context);
|
||||
if (!ServiceUtils.isTrackRecordingServiceRunning(context)) {
|
||||
resetRecordingState(context);
|
||||
}
|
||||
@@ -216,13 +211,13 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
*
|
||||
* @return the id of the marker or -1L if none could be created.
|
||||
*/
|
||||
public long addMarker(Context context, WaypointCreationRequest waypointCreationRequest) {
|
||||
public long addMarker(Context context, String name, String category, String description, String photoUrl) {
|
||||
ITrackRecordingService trackRecordingService = getServiceIfBound();
|
||||
if (trackRecordingService == null) {
|
||||
Log.d(TAG, "Unable to add marker, no track recording service");
|
||||
} else {
|
||||
try {
|
||||
long markerId = trackRecordingService.insertWaypoint(waypointCreationRequest);
|
||||
long markerId = trackRecordingService.insertWaypoint(name, category, description, photoUrl);
|
||||
if (markerId != -1L) {
|
||||
Toast.makeText(context, R.string.marker_add_success, Toast.LENGTH_SHORT).show();
|
||||
return markerId;
|
||||
@@ -266,6 +261,6 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
Log.e(TAG, "Unable to stop recording.", e);
|
||||
}
|
||||
}
|
||||
unbindAndStop();
|
||||
unbindAndStop(context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public class BluetoothLeAdapter extends BaseAdapter {
|
||||
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
||||
//TODO Check if there is a better way to achieve identical look and feel to ListPreference.
|
||||
//Use material design single choice; for old style use: android.R.layout.select_dialog_singlechoice
|
||||
currentView = inflater.inflate(androidx.appcompat.R.layout.select_dialog_singlechoice_material, parent);
|
||||
currentView = inflater.inflate(androidx.appcompat.R.layout.select_dialog_singlechoice_material, null);
|
||||
}
|
||||
|
||||
Device device = devices.get(position);
|
||||
|
||||
@@ -34,10 +34,10 @@ import java.util.Date;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
||||
import de.dennisguse.opentracks.content.DescriptionGenerator;
|
||||
import de.dennisguse.opentracks.content.ShareContentProvider;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.Waypoint;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.Waypoint;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
|
||||
/**
|
||||
@@ -77,7 +77,7 @@ public class IntentUtils {
|
||||
String trackDescription = "";
|
||||
if (trackIds.length == 1) {
|
||||
Track track = new ContentProviderUtils(context).getTrack(trackIds[0]);
|
||||
trackDescription = track == null ? "" : new DescriptionGeneratorImpl(context).generateTrackDescription(track, false);
|
||||
trackDescription = track == null ? "" : new DescriptionGenerator(context).generateTrackDescription(track, false);
|
||||
}
|
||||
|
||||
String action = trackIds.length == 1 ? Intent.ACTION_SEND : Intent.ACTION_SEND_MULTIPLE;
|
||||
|
||||
@@ -22,7 +22,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
|
||||
/**
|
||||
* Utility class for decimating tracks at a given level of precision.
|
||||
@@ -164,6 +164,7 @@ public class LocationUtils {
|
||||
* @param location the location to test
|
||||
* @return true if the location is a valid location.
|
||||
*/
|
||||
//TODO Still needed?
|
||||
public static boolean isValidLocation(Location location) {
|
||||
return location != null
|
||||
&& Math.abs(location.getLatitude()) <= 90
|
||||
|
||||
@@ -154,33 +154,33 @@ public class StringUtils {
|
||||
* Get the formatted distance with unit.
|
||||
*
|
||||
* @param context the context
|
||||
* @param distance the distance
|
||||
* @param distance_m the distance
|
||||
* @param metricUnits true to use metric unit
|
||||
* @return the formatted distance (or null) and it's unit as {@link Pair}
|
||||
*/
|
||||
public static Pair<String, String> getDistanceParts(Context context, double distance, boolean metricUnits) {
|
||||
if (Double.isNaN(distance) || Double.isInfinite(distance)) {
|
||||
public static Pair<String, String> getDistanceParts(Context context, double distance_m, boolean metricUnits) {
|
||||
if (Double.isNaN(distance_m) || Double.isInfinite(distance_m)) {
|
||||
return new Pair<>(null, context.getString(metricUnits ? R.string.unit_meter : R.string.unit_feet));
|
||||
}
|
||||
|
||||
int unitId;
|
||||
if (metricUnits) {
|
||||
if (distance > 500.0) {
|
||||
distance *= UnitConversions.M_TO_KM;
|
||||
if (distance_m > 500.0) {
|
||||
distance_m *= UnitConversions.M_TO_KM;
|
||||
unitId = R.string.unit_kilometer;
|
||||
} else {
|
||||
unitId = R.string.unit_meter;
|
||||
}
|
||||
} else {
|
||||
if (distance * UnitConversions.M_TO_MI > 0.5) {
|
||||
distance *= UnitConversions.M_TO_MI;
|
||||
if (distance_m * UnitConversions.M_TO_MI > 0.5) {
|
||||
distance_m *= UnitConversions.M_TO_MI;
|
||||
unitId = R.string.unit_mile;
|
||||
} else {
|
||||
distance *= UnitConversions.M_TO_FT;
|
||||
distance_m *= UnitConversions.M_TO_FT;
|
||||
unitId = R.string.unit_feet;
|
||||
}
|
||||
}
|
||||
return new Pair<>(formatDecimal(distance), context.getString(unitId));
|
||||
return new Pair<>(formatDecimal(distance_m), context.getString(unitId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -382,11 +382,10 @@ public class StringUtils {
|
||||
String value = context.getString(R.string.value_unknown);
|
||||
String unit = context.getString(metricUnits ? R.string.unit_meter : R.string.unit_feet);
|
||||
if (!Double.isNaN(elevation) && !Double.isInfinite(elevation)) {
|
||||
if (metricUnits) {
|
||||
value = StringUtils.formatDecimal(elevation);
|
||||
} else {
|
||||
value = StringUtils.formatDecimal(elevation * UnitConversions.M_TO_FT);
|
||||
if (!metricUnits) {
|
||||
elevation *= UnitConversions.M_TO_FT;
|
||||
}
|
||||
value = StringUtils.formatDecimal(elevation, 0);
|
||||
}
|
||||
return new Pair<>(value, unit);
|
||||
}
|
||||
|
||||
@@ -19,8 +19,8 @@ package de.dennisguse.opentracks.util;
|
||||
import android.content.Context;
|
||||
|
||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.content.Track;
|
||||
import de.dennisguse.opentracks.content.TracksColumns;
|
||||
import de.dennisguse.opentracks.content.data.Track;
|
||||
import de.dennisguse.opentracks.content.data.TracksColumns;
|
||||
|
||||
/**
|
||||
* Utilities for updating track.
|
||||
|
||||
@@ -33,22 +33,6 @@ limitations under the License.
|
||||
android:text="@string/generic_name" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/marker_edit_statistics_section"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/marker_edit_statistics_name"
|
||||
style="@style/EditNameMarker"
|
||||
android:drawableLeft="@drawable/ic_marker_blue_pushpin"
|
||||
android:hint="@string/generic_name"
|
||||
android:imeOptions="actionDone"
|
||||
android:importantForAutofill="no" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/marker_edit_waypoint_section"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
@@ -214,21 +214,6 @@ limitations under the License.
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
style="@style/StatsSmallValueContainer"
|
||||
android:layout_gravity="start|bottom">
|
||||
|
||||
<TextView
|
||||
style="@style/StatsSmallValue"
|
||||
android:visibility="invisible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/stats_elevation_current_label"
|
||||
style="@style/StatsSmallLabel"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/StatsSmallValueContainer"
|
||||
android:layout_gravity="start|bottom">
|
||||
@@ -242,7 +227,6 @@ limitations under the License.
|
||||
android:id="@+id/stats_elevation_current_unit"
|
||||
style="@style/StatsUnit" />
|
||||
</LinearLayout>
|
||||
|
||||
</TableRow>
|
||||
|
||||
<!-- Minimal elevation -->
|
||||
@@ -278,7 +262,6 @@ limitations under the License.
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:text="@string/stats_min" />
|
||||
|
||||
</LinearLayout>
|
||||
</TableRow>
|
||||
|
||||
|
||||
@@ -14,20 +14,24 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/toolbar" />
|
||||
|
||||
<TabHost
|
||||
android:id="@+id/tackdetail_tabhost"
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/track_detail_activity_tablayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:tabIndicatorColor="@color/holo_orange_dark" />
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
android:id="@+id/track_detail_activity_view_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
<include layout="@layout/track_details_tab" />
|
||||
</TabHost>
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include layout="@layout/track_controller" />
|
||||
</LinearLayout>
|
||||
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Copyright 2013 Google Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TabWidget
|
||||
android:id="@android:id/tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@android:id/tabcontent"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="0" />
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
android:id="@+id/pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1" />
|
||||
</LinearLayout>
|
||||
</merge>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">Flugzeug</string>
|
||||
<string name="activity_type_atv">Quad</string>
|
||||
<string name="activity_type_biking">Fahrrad fahren</string>
|
||||
<string name="activity_type_blimp">Luftschiff</string>
|
||||
<string name="activity_type_boat">Boot</string>
|
||||
<string name="activity_type_climbing">Klettern</string>
|
||||
<string name="activity_type_commercial_airplane">Verkehrsflugzeug</string>
|
||||
<string name="activity_type_cross_country_skiing">Langlauf</string>
|
||||
<string name="activity_type_cycling">Radfahren</string>
|
||||
<string name="activity_type_dirt_bike">Dirt Bike</string>
|
||||
<string name="activity_type_donkey_back_riding">Eselreiten</string>
|
||||
<string name="activity_type_driving">Fahren</string>
|
||||
<string name="activity_type_driving_bus">Busfahren</string>
|
||||
<string name="activity_type_driving_car">Autofahren</string>
|
||||
<string name="activity_type_ferry">Fähre</string>
|
||||
<string name="activity_type_frisbee">Frisbee</string>
|
||||
<string name="activity_type_gliding">Segelfliegen</string>
|
||||
<string name="activity_type_hang_gliding">Drachenfliegen</string>
|
||||
<string name="activity_type_helicopter">Hubschrauber</string>
|
||||
<string name="activity_type_hiking">Wandern</string>
|
||||
<string name="activity_type_horse_back_riding">Reiten</string>
|
||||
<string name="activity_type_hot_air_balloon">Heißluftballon</string>
|
||||
<string name="activity_type_ice_sailing">Eissegeln</string>
|
||||
<string name="activity_type_inline_skating">Inlineskating</string>
|
||||
<string name="activity_type_kayaking">Kajakfahren</string>
|
||||
<string name="activity_type_kite_surfing">Kitesurfen</string>
|
||||
<string name="activity_type_land_sailing">Landsegeln</string>
|
||||
<string name="activity_type_mixed_type">Gemischt</string>
|
||||
<string name="activity_type_motor_bike">Motorrad</string>
|
||||
<string name="activity_type_motor_boating">Motorbootfahren</string>
|
||||
<string name="activity_type_mountain_biking">Mountainbiking</string>
|
||||
<string name="activity_type_off_trail_hiking">Off-Trail-Hiking</string>
|
||||
<string name="activity_type_other">Sonstiges</string>
|
||||
<string name="activity_type_paddling">Paddeln</string>
|
||||
<string name="activity_type_para_gliding">Paragliding</string>
|
||||
<string name="activity_type_rc_airplane">Ferngesteuertes Flugzeug</string>
|
||||
<string name="activity_type_rc_boat">Ferngesteuertes Boot</string>
|
||||
<string name="activity_type_rc_helicopter">Ferngesteuerter Hubschrauber</string>
|
||||
<string name="activity_type_riding">Reiten</string>
|
||||
<string name="activity_type_road_biking">Tourenradfahren</string>
|
||||
<string name="activity_type_roller_skiing">Rollski</string>
|
||||
<string name="activity_type_rowing">Rudern</string>
|
||||
<string name="activity_type_running">Laufen</string>
|
||||
<string name="activity_type_sailing">Segeln</string>
|
||||
<string name="activity_type_seaplane">Wasserflugzeug</string>
|
||||
<string name="activity_type_skate_boarding">Skateboardfahren</string>
|
||||
<string name="activity_type_skating">Schlittschuhlaufen</string>
|
||||
<string name="activity_type_skiing">Skifahren</string>
|
||||
<string name="activity_type_sky_jumping">Sky-Jumping</string>
|
||||
<string name="activity_type_sled">Schlittenfahren</string>
|
||||
<string name="activity_type_snow_boarding">Snowboarden</string>
|
||||
<string name="activity_type_snow_shoeing">Schneeschuhwandern</string>
|
||||
<string name="activity_type_speed_walking">Speed-Walking</string>
|
||||
<string name="activity_type_street_running">Laufen (Straßenuntergrund)</string>
|
||||
<string name="activity_type_surfing">Surfen</string>
|
||||
<string name="activity_type_track_cycling">Bahnradfahren</string>
|
||||
<string name="activity_type_track_running">Laufen (Leichtathletik)</string>
|
||||
<string name="activity_type_trail_hiking">Trail-Hiking</string>
|
||||
<string name="activity_type_trail_running">Geländelauf</string>
|
||||
<string name="activity_type_train">Zug</string>
|
||||
<string name="activity_type_ultimate_frisbee">Ultimate Frisbee</string>
|
||||
<string name="activity_type_unknown">unbekannt</string>
|
||||
<string name="activity_type_wakeboarding">Wakeboarding</string>
|
||||
<string name="activity_type_walking">Walking</string>
|
||||
<string name="activity_type_water_skiing">Wasserskifahren</string>
|
||||
<string name="activity_type_wind_surfing">Windsurfen</string>
|
||||
<string name="description_activity_type">Art der Aktivität: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Durchschnittliches Tempo in Bewegung: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_average_moving_speed">Durchschnittliche Geschwindigkeit in Bewegung: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_average_pace_in_minute">Durchschnittliches Tempo: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_average_speed">Durchschnittliche Geschwindigkeit: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_elevation_gain">Höhenunterschied: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_elevation_imperial">Höhe (ft)</string>
|
||||
<string name="description_elevation_metric">Höhe (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Schnellstes Tempo: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_location_accuracy">Genauigkeit (m)</string>
|
||||
<string name="description_location_altitude">Höhe (m)</string>
|
||||
<string name="description_location_bearing">Peilung (°)</string>
|
||||
<string name="description_location_latitude">Breitengrad (°)</string>
|
||||
<string name="description_location_longitude">Längengrad (°)</string>
|
||||
<string name="description_location_speed">Geschwindigkeit (m/s)</string>
|
||||
<string name="description_max_elevation">Maximale Höhe: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_max_grade">Maximales Gefälle: %1$d %%</string>
|
||||
<string name="description_max_speed">Maximale Geschwindigkeit: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_min_elevation">Minimale Höhe: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_min_grade">Minimales Gefälle: %1$d %%</string>
|
||||
<string name="description_moving_time">Zeit in Bewegung: %1$s</string>
|
||||
<string name="description_pace_imperial">Tempo (min/Meile)</string>
|
||||
<string name="description_pace_metric">Tempo (min/km)</string>
|
||||
<string name="description_recorded_time">Aufgezeichnet: %1$s</string>
|
||||
<string name="description_sensor_cadence">Trittfrequenz (Umdrehungen pro Minute)</string>
|
||||
<string name="description_sensor_heart_rate">Herzfrequenz (Schläge pro Minute)</string>
|
||||
<string name="description_sensor_power">Leistung (W)</string>
|
||||
<string name="description_speed_imperial">Geschwindigkeit (Meile/h)</string>
|
||||
<string name="description_speed_metric">Geschwindigkeit (km/h)</string>
|
||||
<string name="description_time">Zeit</string>
|
||||
<string name="description_total_distance">Gesamtstrecke: %1$.2f km (%2$.1f Meile/n)</string>
|
||||
<string name="description_total_time">Gesamtzeit: %1$s</string>
|
||||
<string name="description_track_point">Punkt</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">Alle als %1$s in %2$s</string>
|
||||
<string name="export_all_title">In externen Speicher exportieren</string>
|
||||
<string name="export_external_storage">Externer Speicher</string>
|
||||
<string name="export_external_storage_error">%1$d von %2$s in %3$s exportiert</string>
|
||||
<string name="export_external_storage_option">als %1$s in %2$s</string>
|
||||
<string name="export_external_storage_progress_message">In %1$s exportieren…</string>
|
||||
<string name="export_external_storage_success">%1$s in %2$s exportiert</string>
|
||||
<string name="export_title">Exportieren in…</string>
|
||||
<string name="external_storage_not_available">Externer Speicher ist nicht verfügbar.</string>
|
||||
<string name="external_storage_not_writable">Externer Speicher ist nicht beschreibbar.</string>
|
||||
<string name="files_few">%1$d Dateien</string>
|
||||
<string name="files_many">%1$d Dateien</string>
|
||||
<string name="files_one">1 Datei</string>
|
||||
<string name="files_other">%1$d Dateien</string>
|
||||
<string name="files_two">2 Dateien</string>
|
||||
<string name="files_zero">0 Dateien</string>
|
||||
<string name="generic_add">Hinzufügen</string>
|
||||
<string name="generic_cancel">Abbrechen</string>
|
||||
<string name="generic_delete_all_confirm_title">Alles löschen?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Ausgewählte Elemente löschen?</string>
|
||||
<string name="generic_description">Beschreibung</string>
|
||||
<string name="generic_description_line">Beschreibung: %1$s</string>
|
||||
<string name="generic_error_title">Fehler</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">Nein</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Pausiert</string>
|
||||
<string name="generic_progress_title">Bitte warten…</string>
|
||||
<string name="generic_recording">Aufzeichnung…</string>
|
||||
<string name="generic_save">Speichern</string>
|
||||
<string name="generic_success_title">Erfolgreich</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Ja</string>
|
||||
<string name="gps_location_access">\"Standortzugriff\"</string>
|
||||
<string name="gps_disabled">GPS ist nicht aktiviert. Tippen Sie hier, um zu %1$s wechseln. Drücken Sie \"Zurück\", um zurückzugehen.</string>
|
||||
<string name="gps_disabled_location_mode">Wählen Sie den Standortmodus für hohe Genauigkeit aus. Tippen Sie hier, um \"%1$s\" zu öffnen. Tippen Sie auf \"Zurück\", um zu dieser Ansicht zurückzukehren.</string>
|
||||
<string name="gps_disabled_my_location">Der aktuelle Standort kann nicht ermittelt werden. Aktivieren Sie mehr Standortquellen unter \"%1$s\" und vergewissern Sie sich, dass der Himmel sichtbar ist. Bitte versuchen Sie es später erneut.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Der aktuelle Standort kann nicht ermittelt werden. Aktivieren Sie den Standortmodus für hohe Genauigkeit unter \"%1$s\" und vergewissern Sie sich, dass der Himmel sichtbar ist. Bitte versuchen Sie es später erneut.</string>
|
||||
<string name="gps_not_found">Das Gerät sendet kein GPS-Signal.</string>
|
||||
<string name="gps_starting">GPS wird gestartet.</string>
|
||||
<string name="gps_starting_error">GPS kann nicht gestartet werden.</string>
|
||||
<string name="gps_stopping">GPS wird beendet.</string>
|
||||
<string name="gps_wait_for_better_signal">Warten auf besseres GPS-Signal</string>
|
||||
<string name="gps_wait_for_signal">Warten auf GPS-Signal</string>
|
||||
<string name="image_application">App</string>
|
||||
<string name="image_arrow">Pfeil</string>
|
||||
<string name="image_marker">Markierung</string>
|
||||
<string name="image_marker_count">Anzahl der Markierungen</string>
|
||||
<string name="image_my_location">Mein Standort</string>
|
||||
<string name="image_pause">Pausieren</string>
|
||||
<string name="image_photo_marker">Fotomarkierung</string>
|
||||
<string name="image_record">Aufzeichnen</string>
|
||||
<string name="image_stop">Beenden</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">%1$d von %2$s aus %3$s importiert</string>
|
||||
<string name="import_no_directory">%1$s ist nicht vorhanden.</string>
|
||||
<string name="import_no_file">Es waren keine Dateien zum Importieren vorhanden. Schließen Sie Ihr Gerät an Ihren Computer an und stellen Sie die zu
|
||||
importierenden Dateien in %1$s.</string>
|
||||
<string name="import_no_file_title">Dateien importieren</string>
|
||||
<string name="import_progress_message">Dateien werden aus %1$s importiert…</string>
|
||||
<string name="import_selection_option">Alle %1$s-Dateien aus %2$s</string>
|
||||
<string name="import_selection_title">Aus externem Speicher importieren</string>
|
||||
<string name="import_success">%1$s aus %2$s importiert</string>
|
||||
<string name="marker_add_error">Es kann keine Markierung eingefügt werden, da kein GPS-Signal verfügbar ist. Bitte versuchen Sie es erneut.</string>
|
||||
<string name="marker_add_success">Markierung wurde eingefügt.</string>
|
||||
<string name="marker_add_canceled">Abgebrochen. Es wurde keine Markierung hinzugefügt.</string>
|
||||
<string name="marker_delete_all_confirm_message">Alle Markierungen für diesen Track werden endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_delete_one_confirm_message">Die Markierung wird endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_delete_one_confirm_title">Markierung löschen?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">Die ausgewählten Markierungen werden endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_label_end">%1$s (Ende)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">%1$d. Markierung</string>
|
||||
<string name="marker_split_name_format">%1$d. Wegpunktmarkierung</string>
|
||||
<string name="marker_title">%1$d von %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Seit letzter Wegpunktmarkierung:</string>
|
||||
<string name="marker_edit_marker_type">Art der Markierung, z. B. Wasserfall</string>
|
||||
<string name="marker_edit_marker_type_hint">Art der Markierung</string>
|
||||
<string name="marker_list_empty_message">Sie haben noch keine Markierungen.</string>
|
||||
<string name="menu_aggregated_statistics">Gesammelte Statistiken</string>
|
||||
<string name="menu_delete">Löschen</string>
|
||||
<string name="menu_delete_all">Alle löschen</string>
|
||||
<string name="menu_edit">Bearbeiten</string>
|
||||
<string name="menu_export">Exportieren</string>
|
||||
<string name="menu_export_all">Alle exportieren</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Hilfe</string>
|
||||
<string name="menu_help_feedback">Hilfe & Feedback</string>
|
||||
<string name="menu_help_forum">Hilfeforum</string>
|
||||
<string name="menu_import_all">Alle importieren</string>
|
||||
<string name="menu_insert_marker">Markierung einfügen</string>
|
||||
<string name="menu_insert_photo">Foto einfügen</string>
|
||||
<string name="menu_map">Karte</string>
|
||||
<string name="menu_markers">Markierungen</string>
|
||||
<string name="menu_play">Wiedergeben</string>
|
||||
<string name="menu_search">Suche</string>
|
||||
<string name="menu_select_all">Alle auswählen</string>
|
||||
<string name="menu_sensor_state">Sensorstatus</string>
|
||||
<string name="menu_settings">Einstellungen</string>
|
||||
<string name="menu_share">Teilen</string>
|
||||
<string name="menu_show_on_map">Auf Karte anzeigen</string>
|
||||
<string name="menu_split_frequency">Wegpunkthäufigkeit</string>
|
||||
<string name="menu_start_gps">GPS aktivieren</string>
|
||||
<string name="menu_stop_gps">GPS deaktivieren</string>
|
||||
<string name="menu_view_photo">Foto ansehen</string>
|
||||
<string name="menu_voice_frequency">Ansagehäufigkeit</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Dienst für Aufzeichnung</string>
|
||||
<string name="search_global_description">Tracks und Markierungen</string>
|
||||
<string name="search_list_empty_message">Keine Tracks oder Markierungen gefunden, die Ihrer Suchanfrage entsprechen</string>
|
||||
<string name="search_list_marker_track_location">Im Track \"%1$s\".</string>
|
||||
<string name="search_voice_prompt">Sprechen Sie den Namen eines Tracks oder einer Markierung.</string>
|
||||
<string name="sensor_state_battery">Akkustatus</string>
|
||||
<string name="sensor_state_cadence">Trittfrequenz</string>
|
||||
<string name="sensor_state_cadence_value">%1$d Umdrehungen pro Minute</string>
|
||||
<string name="sensor_state_connected">Verbunden</string>
|
||||
<string name="sensor_state_connecting">Verbindung wird hergestellt…</string>
|
||||
<string name="sensor_state_disconnected">Nicht verbunden</string>
|
||||
<string name="sensor_state_heart_rate">Herzfrequenz</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d Schläge pro Minute</string>
|
||||
<string name="sensor_state_last_sensor_time">Letzte Sensorzeit</string>
|
||||
<string name="sensor_state_power">Leistung</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Wird gesendet</string>
|
||||
<string name="settings_not_while_recording">Während der Aufzeichnung eines Tracks nicht verfügbar</string>
|
||||
<string name="settings_show">Anzeigen</string>
|
||||
<string name="settings_advanced">Erweitert</string>
|
||||
<string name="settings_chart_by_distance">Nach Strecke</string>
|
||||
<string name="settings_chart_by_time">Nach Zeit</string>
|
||||
<string name="settings_chart_x_axis">x-Achse</string>
|
||||
<string name="settings_recording">Aufzeichnung</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Eine Aufzeichnung nach dem Neustart immer fortsetzen</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Eine Aufzeichnung nach dem Neustart nie fortsetzen</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Eine Aufzeichnung nach dem Neustart fortsetzen, wenn der letzte Standort innerhalb der letzten %1$s aufgezeichnet wurde</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Automat. Fortsetzung</string>
|
||||
<string name="settings_recording_default_activity_title">Standardaktivität</string>
|
||||
<string name="settings_recording_location_frequency_summary">Entfernungs-/Zeitintervall %1$s zwischen zwei Standortaufzeichnungen:</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Ein neues Segment wird erstellt, wenn die Entfernung zwischen zwei Standorten mehr als %1$s beträgt.</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. Entfernung</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Entfernungsintervall aufz.</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Zeitintervall aufz.</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Der Standort wird ignoriert, wenn die Genauigkeit weniger als %1$s beträgt.</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS-Genauigkeit</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Datum (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Datum (lokal)</string>
|
||||
<string name="settings_recording_track_name_number_option">Nummer</string>
|
||||
<string name="settings_recording_track_name_title">Standard-Trackname</string>
|
||||
<string name="settings_reset">Zurücksetzen</string>
|
||||
<string name="settings_reset_confirm_message">Alle Einstellungen werden auf die Standardwerte zurückgesetzt.</string>
|
||||
<string name="settings_reset_confirm_title">Jetzt zurücksetzen?</string>
|
||||
<string name="settings_reset_done">Alle Einstellungen wurden auf ihre Standardwerte zurückgesetzt.</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Trittfrequenz zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Radsensoren zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Herzfrequenz zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Laufsensor zurücksetzen</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth-Pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Die Bluetooth-Einstellungen von Android öffnen, um ein Sensor-Pairing vorzunehmen</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth-Sensor</string>
|
||||
<string name="settings_sensor_connected">Verbunden mit %1$s</string>
|
||||
<string name="settings_stats_coordinate">Breiten-/Längengrad</string>
|
||||
<string name="settings_stats_grade_elevation">Gefälle/Höhe</string>
|
||||
<string name="settings_stats_rate_title">Bevorzugtes Maß</string>
|
||||
<string name="settings_stats_units_imperial">Englisch (mi, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metrisch (km, m)</string>
|
||||
<string name="settings_stats_units_title">Bevorzugte Einheiten</string>
|
||||
<string name="share_track_emails_hint">E-Mail-Adressen</string>
|
||||
<string name="share_track_picker_title">App auswählen</string>
|
||||
<string name="share_track_share_file">Track-Datei teilen</string>
|
||||
<string name="share_track_share_file_body">Dieser Track könnte dich interessieren.\n\nDu kannst ihn dir mit Google Earth oder einer anderen Kartierungssoftware ansehen.\n\n%1$s</string>
|
||||
<string name="share_track_subject">Ich möchte einen Track mit dir teilen</string>
|
||||
<string name="stats_average_moving_pace">Durchschnittl. Bewegungstempo</string>
|
||||
<string name="stats_average_moving_speed">Durchschnittl. Bewegungsgeschwindigkeit</string>
|
||||
<string name="stats_average_pace">Durchschnittstempo</string>
|
||||
<string name="stats_average_speed">Durchschnittsgeschwindigkeit</string>
|
||||
<string name="stats_elevation">Höhe</string>
|
||||
<string name="stats_fastest_pace">Schnellstes Tempo</string>
|
||||
<string name="stats_gain">Anstieg</string>
|
||||
<string name="stats_grade">Gefälle</string>
|
||||
<string name="stats_latitude">Breitengrad</string>
|
||||
<string name="stats_longitude">Längengrad</string>
|
||||
<string name="stats_max">Max.</string>
|
||||
<string name="stats_max_speed">Höchstgeschwin-digkeit</string>
|
||||
<string name="stats_min">Min.</string>
|
||||
<string name="stats_moving_time">Bewegungszeit</string>
|
||||
<string name="stats_pace">Tempo</string>
|
||||
<string name="stats_speed">Geschwindigkeit</string>
|
||||
<string name="stats_distance">Entfernung</string>
|
||||
<string name="stats_total_time">Gesamtzeit</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Der Track wird aufgezeichnet…</string>
|
||||
<string name="track_markers">Markierungen für %1$s</string>
|
||||
<string name="track_delete_one_confirm_message">Der Track und seine Markierungen werden endgültig aus dem Gerät gelöscht.</string>
|
||||
<string name="track_delete_one_confirm_title">Track löschen?</string>
|
||||
<string name="track_delete_multiple_confirm_message">Die ausgewählten Tracks und ihre Markierungen werden endgültig aus dem Gerät gelöscht.</string>
|
||||
<string name="track_delete_progress_message">Löschen…</string>
|
||||
<string name="track_detail_chart_tab">Diagramm</string>
|
||||
<string name="track_detail_stats_tab">Statistik</string>
|
||||
<string name="track_edit_activity_type">Art der Aktivität, z. B. Wandern</string>
|
||||
<string name="track_edit_activity_type_hint">Art der Aktivität</string>
|
||||
<string name="track_edit_new_track_title">Neuer Track</string>
|
||||
<string name="track_list_empty_message">Zeichnen Sie Ihr nächstes Abenteuer hier auf.</string>
|
||||
<string name="track_list_record_error">Die Aufzeichnung kann nicht gestartet werden, da kein GPS-Signal verfügbar ist. Bitte versuchen Sie es erneut.</string>
|
||||
<string name="track_list_record_success">Neuer Track wird aufgezeichnet</string>
|
||||
<string name="track_widget_config_title">Widget-Elemente konfigurieren</string>
|
||||
<string name="tracks_few">%1$d Tracks</string>
|
||||
<string name="tracks_many">%1$d Tracks</string>
|
||||
<string name="tracks_one">1 Track</string>
|
||||
<string name="tracks_other">%1$d Tracks</string>
|
||||
<string name="tracks_two">2 Tracks</string>
|
||||
<string name="tracks_zero">0 Tracks</string>
|
||||
<string name="unit_feet">Fuß</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">Meilen/Std.</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">Min./Meile</string>
|
||||
<string name="value_adapt_accuracy">Genauigkeit anpassen</string>
|
||||
<string name="value_adapt_battery_life">An Akkulaufzeit anpassen</string>
|
||||
<string name="value_always">Immer</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f Meilen</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f Meilen (schlechtes GPS-Signal)</string>
|
||||
<string name="value_integer_feet">%1$d Fuß</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d Fuß (ausgezeichnetes GPS-Signal)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d Fuß (empfohlen)</string>
|
||||
<string name="value_integer_kilobyte">%1$d KB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (ausgezeichnetes GPS-Signal)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (schlechtes GPS-Signal)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (empfohlen)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d Meile/h</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Nie</string>
|
||||
<string name="value_none">Keine</string>
|
||||
<string name="value_off">Aus</string>
|
||||
<string name="value_smallest">Kleinster</string>
|
||||
<string name="value_smallest_recommended">Kleinster (empfohlen)</string>
|
||||
<string name="voice_hours_few">%1$d Stunden</string>
|
||||
<string name="voice_hours_many">%1$d Stunden</string>
|
||||
<string name="voice_hours_one">1 Stunde</string>
|
||||
<string name="voice_hours_other">%1$d Stunden</string>
|
||||
<string name="voice_hours_two">2 Stunden</string>
|
||||
<string name="voice_hours_zero">0 Stunden</string>
|
||||
<string name="voice_minutes_few">%1$d Minuten</string>
|
||||
<string name="voice_minutes_many">%1$d Minuten</string>
|
||||
<string name="voice_minutes_one">1 Minute</string>
|
||||
<string name="voice_minutes_other">%1$d Minuten</string>
|
||||
<string name="voice_minutes_two">2 Minuten</string>
|
||||
<string name="voice_minutes_zero">0 Minuten</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s pro Kilometer</string>
|
||||
<string name="voice_pace_per_mile">%1$s pro Meile</string>
|
||||
<string name="voice_seconds_few">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_many">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_one">1 Sekunde</string>
|
||||
<string name="voice_seconds_other">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_two">2 Sekunden</string>
|
||||
<string name="voice_seconds_zero">0 Sekunden</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 Meile pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 Meilen pro Stunde</string>
|
||||
<string name="voice_template">Meine Tracks: %1$s in %2$s bei %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_many">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_one">Gesamtstrecke: 1 Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_other">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_two">Gesamtstrecke: 2 Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_zero">Gesamtstrecke: 0 Kilometer</string>
|
||||
<string name="voice_total_distance_miles_few">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_many">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_one">Gesamtstrecke: 1 Meile</string>
|
||||
<string name="voice_total_distance_miles_other">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_two">Gesamtstrecke: 2 Meilen</string>
|
||||
<string name="voice_total_distance_miles_zero">Gesamtstrecke: 0 Meilen</string>
|
||||
<string name="voice_total_distance_zero">Die Gesamtstrecke in \"Meine Tracks\" ist null.</string>
|
||||
<string name="waypoint_type_atm">Geldautomat</string>
|
||||
<string name="waypoint_type_bank">Bank</string>
|
||||
<string name="waypoint_type_bar">Bar</string>
|
||||
<string name="waypoint_type_barbecue">Grill</string>
|
||||
<string name="waypoint_type_building">Gebäude</string>
|
||||
<string name="waypoint_type_bus_stop">Bushaltestelle</string>
|
||||
<string name="waypoint_type_cafe">Café</string>
|
||||
<string name="waypoint_type_campfire">Lagerfeuer</string>
|
||||
<string name="waypoint_type_campground">Campingplatz</string>
|
||||
<string name="waypoint_type_church">Kirche</string>
|
||||
<string name="waypoint_type_coffee_house">Kaffeehaus</string>
|
||||
<string name="waypoint_type_convenience_store">Minimarkt</string>
|
||||
<string name="waypoint_type_drinking_water">Trinkwasser</string>
|
||||
<string name="waypoint_type_falling_rocks">Steinschlag</string>
|
||||
<string name="waypoint_type_ferry">Fähre</string>
|
||||
<string name="waypoint_type_fire_place">Kamin</string>
|
||||
<string name="waypoint_type_fire_station">Feuerwache</string>
|
||||
<string name="waypoint_type_fishing">Angeln</string>
|
||||
<string name="waypoint_type_gas_station">Tankstelle</string>
|
||||
<string name="waypoint_type_golf_course">Golfplatz</string>
|
||||
<string name="waypoint_type_grocery_store">Lebensmittelgeschäft</string>
|
||||
<string name="waypoint_type_hair_dresser">Friseur</string>
|
||||
<string name="waypoint_type_harbor">Hafen</string>
|
||||
<string name="waypoint_type_hiking_path">Wanderweg</string>
|
||||
<string name="waypoint_type_hotel">Hotel</string>
|
||||
<string name="waypoint_type_house">Haus</string>
|
||||
<string name="waypoint_type_information">Informationen</string>
|
||||
<string name="waypoint_type_intersection">Kreuzung</string>
|
||||
<string name="waypoint_type_mail_box">Briefkasten</string>
|
||||
<string name="waypoint_type_market">Markt</string>
|
||||
<string name="waypoint_type_meeting_point">Treffpunkt</string>
|
||||
<string name="waypoint_type_opera">Oper</string>
|
||||
<string name="waypoint_type_parking">Parkmöglichkeit</string>
|
||||
<string name="waypoint_type_police_station">Polizeirevier</string>
|
||||
<string name="waypoint_type_post_office">Postamt</string>
|
||||
<string name="waypoint_type_pothole">Schlagloch</string>
|
||||
<string name="waypoint_type_railway_crossing">Bahnübergang</string>
|
||||
<string name="waypoint_type_restaurant">Restaurant</string>
|
||||
<string name="waypoint_type_shopping">Shopping</string>
|
||||
<string name="waypoint_type_sight">Sehenswürdigkeit</string>
|
||||
<string name="waypoint_type_store">Geschäft</string>
|
||||
<string name="waypoint_type_swimming_pool">Swimmingpool</string>
|
||||
<string name="waypoint_type_telephone">Telefon</string>
|
||||
<string name="waypoint_type_theater">Theater</string>
|
||||
<string name="waypoint_type_toilet">Toilette</string>
|
||||
<string name="waypoint_type_tourist_information">Touristeninformation</string>
|
||||
<string name="waypoint_type_tree">Baum</string>
|
||||
<string name="waypoint_type_tunnel">Tunnel</string>
|
||||
<string name="waypoint_type_waterfall">Wasserfall</string>
|
||||
<string name="waypoint_type_water_fountain">Brunnen</string>
|
||||
<string name="waypoint_type_waypoint">Wegpunkt</string>
|
||||
</resources>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">Flugzeug</string>
|
||||
<string name="activity_type_atv">Quad</string>
|
||||
<string name="activity_type_biking">Fahrrad fahren</string>
|
||||
<string name="activity_type_blimp">Luftschiff</string>
|
||||
<string name="activity_type_boat">Boot</string>
|
||||
<string name="activity_type_climbing">Klettern</string>
|
||||
<string name="activity_type_commercial_airplane">Verkehrsflugzeug</string>
|
||||
<string name="activity_type_cross_country_skiing">Langlauf</string>
|
||||
<string name="activity_type_cycling">Radfahren</string>
|
||||
<string name="activity_type_dirt_bike">Dirt Bike</string>
|
||||
<string name="activity_type_donkey_back_riding">Eselreiten</string>
|
||||
<string name="activity_type_driving">Fahren</string>
|
||||
<string name="activity_type_driving_bus">Busfahren</string>
|
||||
<string name="activity_type_driving_car">Autofahren</string>
|
||||
<string name="activity_type_ferry">Fähre</string>
|
||||
<string name="activity_type_frisbee">Frisbee</string>
|
||||
<string name="activity_type_gliding">Segelfliegen</string>
|
||||
<string name="activity_type_hang_gliding">Drachenfliegen</string>
|
||||
<string name="activity_type_helicopter">Hubschrauber</string>
|
||||
<string name="activity_type_hiking">Wandern</string>
|
||||
<string name="activity_type_horse_back_riding">Reiten</string>
|
||||
<string name="activity_type_hot_air_balloon">Heißluftballon</string>
|
||||
<string name="activity_type_ice_sailing">Eissegeln</string>
|
||||
<string name="activity_type_inline_skating">Inlineskating</string>
|
||||
<string name="activity_type_kayaking">Kajakfahren</string>
|
||||
<string name="activity_type_kite_surfing">Kitesurfen</string>
|
||||
<string name="activity_type_land_sailing">Landsegeln</string>
|
||||
<string name="activity_type_mixed_type">Gemischt</string>
|
||||
<string name="activity_type_motor_bike">Motorrad</string>
|
||||
<string name="activity_type_motor_boating">Motorbootfahren</string>
|
||||
<string name="activity_type_mountain_biking">Mountainbiking</string>
|
||||
<string name="activity_type_off_trail_hiking">Off-Trail-Hiking</string>
|
||||
<string name="activity_type_other">Sonstiges</string>
|
||||
<string name="activity_type_paddling">Paddeln</string>
|
||||
<string name="activity_type_para_gliding">Paragliding</string>
|
||||
<string name="activity_type_rc_airplane">Ferngesteuertes Flugzeug</string>
|
||||
<string name="activity_type_rc_boat">Ferngesteuertes Boot</string>
|
||||
<string name="activity_type_rc_helicopter">Ferngesteuerter Hubschrauber</string>
|
||||
<string name="activity_type_riding">Reiten</string>
|
||||
<string name="activity_type_road_biking">Tourenradfahren</string>
|
||||
<string name="activity_type_roller_skiing">Rollski</string>
|
||||
<string name="activity_type_rowing">Rudern</string>
|
||||
<string name="activity_type_running">Laufen</string>
|
||||
<string name="activity_type_sailing">Segeln</string>
|
||||
<string name="activity_type_seaplane">Wasserflugzeug</string>
|
||||
<string name="activity_type_skate_boarding">Skateboardfahren</string>
|
||||
<string name="activity_type_skating">Schlittschuhlaufen</string>
|
||||
<string name="activity_type_skiing">Skifahren</string>
|
||||
<string name="activity_type_sky_jumping">Sky-Jumping</string>
|
||||
<string name="activity_type_sled">Schlittenfahren</string>
|
||||
<string name="activity_type_snow_boarding">Snowboarden</string>
|
||||
<string name="activity_type_snow_shoeing">Schneeschuhwandern</string>
|
||||
<string name="activity_type_speed_walking">Speed-Walking</string>
|
||||
<string name="activity_type_street_running">Laufen (Straßenuntergrund)</string>
|
||||
<string name="activity_type_surfing">Surfen</string>
|
||||
<string name="activity_type_track_cycling">Bahnradfahren</string>
|
||||
<string name="activity_type_track_running">Laufen (Leichtathletik)</string>
|
||||
<string name="activity_type_trail_hiking">Trail-Hiking</string>
|
||||
<string name="activity_type_trail_running">Geländelauf</string>
|
||||
<string name="activity_type_train">Zug</string>
|
||||
<string name="activity_type_ultimate_frisbee">Ultimate Frisbee</string>
|
||||
<string name="activity_type_unknown">unbekannt</string>
|
||||
<string name="activity_type_wakeboarding">Wakeboarding</string>
|
||||
<string name="activity_type_walking">Walking</string>
|
||||
<string name="activity_type_water_skiing">Wasserskifahren</string>
|
||||
<string name="activity_type_wind_surfing">Windsurfen</string>
|
||||
<string name="description_activity_type">Art der Aktivität: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Durchschnittliches Tempo in Bewegung: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_average_moving_speed">Durchschnittliche Geschwindigkeit in Bewegung: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_average_pace_in_minute">Durchschnittliches Tempo: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_average_speed">Durchschnittliche Geschwindigkeit: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_elevation_gain">Höhenunterschied: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_elevation_imperial">Höhe (ft)</string>
|
||||
<string name="description_elevation_metric">Höhe (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Schnellstes Tempo: %1$s min/km (%2$s min/Meile)</string>
|
||||
<string name="description_location_accuracy">Genauigkeit (m)</string>
|
||||
<string name="description_location_altitude">Höhe (m)</string>
|
||||
<string name="description_location_bearing">Peilung (°)</string>
|
||||
<string name="description_location_latitude">Breitengrad (°)</string>
|
||||
<string name="description_location_longitude">Längengrad (°)</string>
|
||||
<string name="description_location_speed">Geschwindigkeit (m/s)</string>
|
||||
<string name="description_max_elevation">Maximale Höhe: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_max_grade">Maximales Gefälle: %1$d %%</string>
|
||||
<string name="description_max_speed">Maximale Geschwindigkeit: %1$.2f km/h (%2$.1f Meile/h)</string>
|
||||
<string name="description_min_elevation">Minimale Höhe: %1$d m (%2$d Fuß)</string>
|
||||
<string name="description_min_grade">Minimales Gefälle: %1$d %%</string>
|
||||
<string name="description_moving_time">Zeit in Bewegung: %1$s</string>
|
||||
<string name="description_pace_imperial">Tempo (min/Meile)</string>
|
||||
<string name="description_pace_metric">Tempo (min/km)</string>
|
||||
<string name="description_recorded_time">Aufgezeichnet: %1$s</string>
|
||||
<string name="description_sensor_cadence">Trittfrequenz (Umdrehungen pro Minute)</string>
|
||||
<string name="description_sensor_heart_rate">Herzfrequenz (Schläge pro Minute)</string>
|
||||
<string name="description_sensor_power">Leistung (W)</string>
|
||||
<string name="description_speed_imperial">Geschwindigkeit (Meile/h)</string>
|
||||
<string name="description_speed_metric">Geschwindigkeit (km/h)</string>
|
||||
<string name="description_time">Zeit</string>
|
||||
<string name="description_total_distance">Gesamtstrecke: %1$.2f km (%2$.1f Meile/n)</string>
|
||||
<string name="description_total_time">Gesamtzeit: %1$s</string>
|
||||
<string name="description_track_point">Punkt</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">Alle als %1$s in %2$s</string>
|
||||
<string name="export_all_title">In externen Speicher exportieren</string>
|
||||
<string name="export_external_storage">Externer Speicher</string>
|
||||
<string name="export_external_storage_error">%1$d von %2$s in %3$s exportiert</string>
|
||||
<string name="export_external_storage_option">als %1$s in %2$s</string>
|
||||
<string name="export_external_storage_progress_message">In %1$s exportieren…</string>
|
||||
<string name="export_external_storage_success">%1$s in %2$s exportiert</string>
|
||||
<string name="export_title">Exportieren in…</string>
|
||||
<string name="external_storage_not_available">Externer Speicher ist nicht verfügbar.</string>
|
||||
<string name="external_storage_not_writable">Externer Speicher ist nicht beschreibbar.</string>
|
||||
<string name="files_few">%1$d Dateien</string>
|
||||
<string name="files_many">%1$d Dateien</string>
|
||||
<string name="files_one">1 Datei</string>
|
||||
<string name="files_other">%1$d Dateien</string>
|
||||
<string name="files_two">2 Dateien</string>
|
||||
<string name="files_zero">0 Dateien</string>
|
||||
<string name="generic_add">Hinzufügen</string>
|
||||
<string name="generic_cancel">Abbrechen</string>
|
||||
<string name="generic_delete_all_confirm_title">Alles löschen?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Ausgewählte Elemente löschen?</string>
|
||||
<string name="generic_description">Beschreibung</string>
|
||||
<string name="generic_description_line">Beschreibung: %1$s</string>
|
||||
<string name="generic_error_title">Fehler</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">Nein</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Pausiert</string>
|
||||
<string name="generic_progress_title">Bitte warten…</string>
|
||||
<string name="generic_recording">Aufzeichnung…</string>
|
||||
<string name="generic_save">Speichern</string>
|
||||
<string name="generic_success_title">Erfolgreich</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Ja</string>
|
||||
<string name="gps_location_access">\"Standortzugriff\"</string>
|
||||
<string name="gps_disabled">GPS ist nicht aktiviert. Tippen Sie hier, um zu %1$s wechseln. Drücken Sie \"Zurück\", um zurückzugehen.</string>
|
||||
<string name="gps_disabled_location_mode">Wählen Sie den Standortmodus für hohe Genauigkeit aus. Tippen Sie hier, um \"%1$s\" zu öffnen. Tippen Sie auf \"Zurück\", um zu dieser Ansicht zurückzukehren.</string>
|
||||
<string name="gps_disabled_my_location">Der aktuelle Standort kann nicht ermittelt werden. Aktivieren Sie mehr Standortquellen unter \"%1$s\" und vergewissern Sie sich, dass der Himmel sichtbar ist. Bitte versuchen Sie es später erneut.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Der aktuelle Standort kann nicht ermittelt werden. Aktivieren Sie den Standortmodus für hohe Genauigkeit unter \"%1$s\" und vergewissern Sie sich, dass der Himmel sichtbar ist. Bitte versuchen Sie es später erneut.</string>
|
||||
<string name="gps_not_found">Das Gerät sendet kein GPS-Signal.</string>
|
||||
<string name="gps_starting">GPS wird gestartet.</string>
|
||||
<string name="gps_starting_error">GPS kann nicht gestartet werden.</string>
|
||||
<string name="gps_stopping">GPS wird beendet.</string>
|
||||
<string name="gps_wait_for_better_signal">Warten auf besseres GPS-Signal</string>
|
||||
<string name="gps_wait_for_signal">Warten auf GPS-Signal</string>
|
||||
<string name="image_application">App</string>
|
||||
<string name="image_arrow">Pfeil</string>
|
||||
<string name="image_marker">Markierung</string>
|
||||
<string name="image_marker_count">Anzahl der Markierungen</string>
|
||||
<string name="image_my_location">Mein Standort</string>
|
||||
<string name="image_pause">Pausieren</string>
|
||||
<string name="image_photo_marker">Fotomarkierung</string>
|
||||
<string name="image_record">Aufzeichnen</string>
|
||||
<string name="image_stop">Beenden</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">%1$d von %2$s aus %3$s importiert</string>
|
||||
<string name="import_no_directory">%1$s ist nicht vorhanden.</string>
|
||||
<string name="import_no_file">Es waren keine Dateien zum Importieren vorhanden. Schließen Sie Ihr Gerät an Ihren Computer an und stellen Sie die zu
|
||||
importierenden Dateien in %1$s.</string>
|
||||
<string name="import_no_file_title">Dateien importieren</string>
|
||||
<string name="import_progress_message">Dateien werden aus %1$s importiert…</string>
|
||||
<string name="import_selection_option">Alle %1$s-Dateien aus %2$s</string>
|
||||
<string name="import_selection_title">Aus externem Speicher importieren</string>
|
||||
<string name="import_success">%1$s aus %2$s importiert</string>
|
||||
<string name="marker_add_error">Es kann keine Markierung eingefügt werden, da kein GPS-Signal verfügbar ist. Bitte versuchen Sie es erneut.</string>
|
||||
<string name="marker_add_success">Markierung wurde eingefügt.</string>
|
||||
<string name="marker_add_canceled">Abgebrochen. Es wurde keine Markierung hinzugefügt.</string>
|
||||
<string name="marker_delete_all_confirm_message">Alle Markierungen für diesen Track werden endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_delete_one_confirm_message">Die Markierung wird endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_delete_one_confirm_title">Markierung löschen?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">Die ausgewählten Markierungen werden endgültig vom Gerät gelöscht.</string>
|
||||
<string name="marker_label_end">%1$s (Ende)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">%1$d. Markierung</string>
|
||||
<string name="marker_split_name_format">%1$d. Wegpunktmarkierung</string>
|
||||
<string name="marker_title">%1$d von %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Seit letzter Wegpunktmarkierung:</string>
|
||||
<string name="marker_edit_marker_type">Art der Markierung, z. B. Wasserfall</string>
|
||||
<string name="marker_edit_marker_type_hint">Art der Markierung</string>
|
||||
<string name="marker_list_empty_message">Sie haben noch keine Markierungen.</string>
|
||||
<string name="menu_aggregated_statistics">Gesammelte Statistiken</string>
|
||||
<string name="menu_delete">Löschen</string>
|
||||
<string name="menu_delete_all">Alle löschen</string>
|
||||
<string name="menu_edit">Bearbeiten</string>
|
||||
<string name="menu_export">Exportieren</string>
|
||||
<string name="menu_export_all">Alle exportieren</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Hilfe</string>
|
||||
<string name="menu_help_feedback">Hilfe & Feedback</string>
|
||||
<string name="menu_help_forum">Hilfeforum</string>
|
||||
<string name="menu_import_all">Alle importieren</string>
|
||||
<string name="menu_insert_marker">Markierung einfügen</string>
|
||||
<string name="menu_insert_photo">Foto einfügen</string>
|
||||
<string name="menu_map">Karte</string>
|
||||
<string name="menu_markers">Markierungen</string>
|
||||
<string name="menu_play">Wiedergeben</string>
|
||||
<string name="menu_search">Suche</string>
|
||||
<string name="menu_select_all">Alle auswählen</string>
|
||||
<string name="menu_sensor_state">Sensorstatus</string>
|
||||
<string name="menu_settings">Einstellungen</string>
|
||||
<string name="menu_share">Teilen</string>
|
||||
<string name="menu_show_on_map">Auf Karte anzeigen</string>
|
||||
<string name="menu_split_frequency">Wegpunkthäufigkeit</string>
|
||||
<string name="menu_start_gps">GPS aktivieren</string>
|
||||
<string name="menu_stop_gps">GPS deaktivieren</string>
|
||||
<string name="menu_view_photo">Foto ansehen</string>
|
||||
<string name="menu_voice_frequency">Ansagehäufigkeit</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Dienst für Aufzeichnung</string>
|
||||
<string name="search_global_description">Tracks und Markierungen</string>
|
||||
<string name="search_list_empty_message">Keine Tracks oder Markierungen gefunden, die Ihrer Suchanfrage entsprechen</string>
|
||||
<string name="search_list_marker_track_location">Im Track \"%1$s\".</string>
|
||||
<string name="search_voice_prompt">Sprechen Sie den Namen eines Tracks oder einer Markierung.</string>
|
||||
<string name="sensor_state_battery">Akkustatus</string>
|
||||
<string name="sensor_state_cadence">Trittfrequenz</string>
|
||||
<string name="sensor_state_cadence_value">%1$d Umdrehungen pro Minute</string>
|
||||
<string name="sensor_state_connected">Verbunden</string>
|
||||
<string name="sensor_state_connecting">Verbindung wird hergestellt…</string>
|
||||
<string name="sensor_state_disconnected">Nicht verbunden</string>
|
||||
<string name="sensor_state_heart_rate">Herzfrequenz</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d Schläge pro Minute</string>
|
||||
<string name="sensor_state_last_sensor_time">Letzte Sensorzeit</string>
|
||||
<string name="sensor_state_power">Leistung</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Wird gesendet</string>
|
||||
<string name="settings_not_while_recording">Während der Aufzeichnung eines Tracks nicht verfügbar</string>
|
||||
<string name="settings_show">Anzeigen</string>
|
||||
<string name="settings_advanced">Erweitert</string>
|
||||
<string name="settings_chart_by_distance">Nach Strecke</string>
|
||||
<string name="settings_chart_by_time">Nach Zeit</string>
|
||||
<string name="settings_chart_x_axis">x-Achse</string>
|
||||
<string name="settings_recording">Aufzeichnung</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Eine Aufzeichnung nach dem Neustart immer fortsetzen</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Eine Aufzeichnung nach dem Neustart nie fortsetzen</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Eine Aufzeichnung nach dem Neustart fortsetzen, wenn der letzte Standort innerhalb der letzten %1$s aufgezeichnet wurde</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Automat. Fortsetzung</string>
|
||||
<string name="settings_recording_default_activity_title">Standardaktivität</string>
|
||||
<string name="settings_recording_location_frequency_summary">Entfernungs-/Zeitintervall %1$s zwischen zwei Standortaufzeichnungen:</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Ein neues Segment wird erstellt, wenn die Entfernung zwischen zwei Standorten mehr als %1$s beträgt.</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. Entfernung</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Entfernungsintervall aufz.</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Zeitintervall aufz.</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Der Standort wird ignoriert, wenn die Genauigkeit weniger als %1$s beträgt.</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS-Genauigkeit</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Datum (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Datum (lokal)</string>
|
||||
<string name="settings_recording_track_name_number_option">Nummer</string>
|
||||
<string name="settings_recording_track_name_title">Standard-Trackname</string>
|
||||
<string name="settings_reset">Zurücksetzen</string>
|
||||
<string name="settings_reset_confirm_message">Alle Einstellungen werden auf die Standardwerte zurückgesetzt.</string>
|
||||
<string name="settings_reset_confirm_title">Jetzt zurücksetzen?</string>
|
||||
<string name="settings_reset_done">Alle Einstellungen wurden auf ihre Standardwerte zurückgesetzt.</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Trittfrequenz zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Radsensoren zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Herzfrequenz zurücksetzen</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Laufsensor zurücksetzen</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth-Pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Die Bluetooth-Einstellungen von Android öffnen, um ein Sensor-Pairing vorzunehmen</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth-Sensor</string>
|
||||
<string name="settings_sensor_connected">Verbunden mit %1$s</string>
|
||||
<string name="settings_stats_coordinate">Breiten-/Längengrad</string>
|
||||
<string name="settings_stats_grade_elevation">Gefälle/Höhe</string>
|
||||
<string name="settings_stats_rate_title">Bevorzugtes Maß</string>
|
||||
<string name="settings_stats_units_imperial">Englisch (mi, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metrisch (km, m)</string>
|
||||
<string name="settings_stats_units_title">Bevorzugte Einheiten</string>
|
||||
<string name="share_track_emails_hint">E-Mail-Adressen</string>
|
||||
<string name="share_track_picker_title">App auswählen</string>
|
||||
<string name="share_track_share_file">Track-Datei teilen</string>
|
||||
<string name="share_track_share_file_body">Dieser Track könnte dich interessieren.\n\nDu kannst ihn dir mit Google Earth oder einer anderen Kartierungssoftware ansehen.\n\n%1$s</string>
|
||||
<string name="share_track_subject">Ich möchte einen Track mit dir teilen</string>
|
||||
<string name="stats_average_moving_pace">Durchschnittl. Bewegungstempo</string>
|
||||
<string name="stats_average_moving_speed">Durchschnittl. Bewegungsgeschwindigkeit</string>
|
||||
<string name="stats_average_pace">Durchschnittstempo</string>
|
||||
<string name="stats_average_speed">Durchschnittsgeschwindigkeit</string>
|
||||
<string name="stats_elevation">Höhe</string>
|
||||
<string name="stats_fastest_pace">Schnellstes Tempo</string>
|
||||
<string name="stats_gain">Anstieg</string>
|
||||
<string name="stats_grade">Gefälle</string>
|
||||
<string name="stats_latitude">Breitengrad</string>
|
||||
<string name="stats_longitude">Längengrad</string>
|
||||
<string name="stats_max">Max.</string>
|
||||
<string name="stats_max_speed">Höchstgeschwin-digkeit</string>
|
||||
<string name="stats_min">Min.</string>
|
||||
<string name="stats_moving_time">Bewegungszeit</string>
|
||||
<string name="stats_pace">Tempo</string>
|
||||
<string name="stats_speed">Geschwindigkeit</string>
|
||||
<string name="stats_distance">Entfernung</string>
|
||||
<string name="stats_total_time">Gesamtzeit</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Der Track wird aufgezeichnet…</string>
|
||||
<string name="track_markers">Markierungen für %1$s</string>
|
||||
<string name="track_delete_one_confirm_message">Der Track und seine Markierungen werden endgültig aus dem Gerät gelöscht.</string>
|
||||
<string name="track_delete_one_confirm_title">Track löschen?</string>
|
||||
<string name="track_delete_multiple_confirm_message">Die ausgewählten Tracks und ihre Markierungen werden endgültig aus dem Gerät gelöscht.</string>
|
||||
<string name="track_delete_progress_message">Löschen…</string>
|
||||
<string name="track_detail_chart_tab">Diagramm</string>
|
||||
<string name="track_detail_stats_tab">Statistik</string>
|
||||
<string name="track_edit_activity_type">Art der Aktivität, z. B. Wandern</string>
|
||||
<string name="track_edit_activity_type_hint">Art der Aktivität</string>
|
||||
<string name="track_edit_new_track_title">Neuer Track</string>
|
||||
<string name="track_list_empty_message">Zeichnen Sie Ihr nächstes Abenteuer hier auf.</string>
|
||||
<string name="track_list_record_error">Die Aufzeichnung kann nicht gestartet werden, da kein GPS-Signal verfügbar ist. Bitte versuchen Sie es erneut.</string>
|
||||
<string name="track_list_record_success">Neuer Track wird aufgezeichnet</string>
|
||||
<string name="track_widget_config_title">Widget-Elemente konfigurieren</string>
|
||||
<string name="tracks_few">%1$d Tracks</string>
|
||||
<string name="tracks_many">%1$d Tracks</string>
|
||||
<string name="tracks_one">1 Track</string>
|
||||
<string name="tracks_other">%1$d Tracks</string>
|
||||
<string name="tracks_two">2 Tracks</string>
|
||||
<string name="tracks_zero">0 Tracks</string>
|
||||
<string name="unit_feet">Fuß</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">Meilen/Std.</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">Min./Meile</string>
|
||||
<string name="value_adapt_accuracy">Genauigkeit anpassen</string>
|
||||
<string name="value_adapt_battery_life">An Akkulaufzeit anpassen</string>
|
||||
<string name="value_always">Immer</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f Meilen</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f Meilen (schlechtes GPS-Signal)</string>
|
||||
<string name="value_integer_feet">%1$d Fuß</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d Fuß (ausgezeichnetes GPS-Signal)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d Fuß (empfohlen)</string>
|
||||
<string name="value_integer_kilobyte">%1$d KB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (ausgezeichnetes GPS-Signal)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (schlechtes GPS-Signal)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (empfohlen)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d Meile/h</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Nie</string>
|
||||
<string name="value_none">Keine</string>
|
||||
<string name="value_off">Aus</string>
|
||||
<string name="value_smallest">Kleinster</string>
|
||||
<string name="value_smallest_recommended">Kleinster (empfohlen)</string>
|
||||
<string name="voice_hours_few">%1$d Stunden</string>
|
||||
<string name="voice_hours_many">%1$d Stunden</string>
|
||||
<string name="voice_hours_one">1 Stunde</string>
|
||||
<string name="voice_hours_other">%1$d Stunden</string>
|
||||
<string name="voice_hours_two">2 Stunden</string>
|
||||
<string name="voice_hours_zero">0 Stunden</string>
|
||||
<string name="voice_minutes_few">%1$d Minuten</string>
|
||||
<string name="voice_minutes_many">%1$d Minuten</string>
|
||||
<string name="voice_minutes_one">1 Minute</string>
|
||||
<string name="voice_minutes_other">%1$d Minuten</string>
|
||||
<string name="voice_minutes_two">2 Minuten</string>
|
||||
<string name="voice_minutes_zero">0 Minuten</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s pro Kilometer</string>
|
||||
<string name="voice_pace_per_mile">%1$s pro Meile</string>
|
||||
<string name="voice_seconds_few">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_many">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_one">1 Sekunde</string>
|
||||
<string name="voice_seconds_other">%1$d Sekunden</string>
|
||||
<string name="voice_seconds_two">2 Sekunden</string>
|
||||
<string name="voice_seconds_zero">0 Sekunden</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 Kilometer pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 Meile pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 Meilen pro Stunde</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 Meilen pro Stunde</string>
|
||||
<string name="voice_template">Meine Tracks: %1$s in %2$s bei %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_many">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_one">Gesamtstrecke: 1 Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_other">Gesamtstrecke: %1$.2f Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_two">Gesamtstrecke: 2 Kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_zero">Gesamtstrecke: 0 Kilometer</string>
|
||||
<string name="voice_total_distance_miles_few">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_many">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_one">Gesamtstrecke: 1 Meile</string>
|
||||
<string name="voice_total_distance_miles_other">Gesamtstrecke: %1$.2f Meilen</string>
|
||||
<string name="voice_total_distance_miles_two">Gesamtstrecke: 2 Meilen</string>
|
||||
<string name="voice_total_distance_miles_zero">Gesamtstrecke: 0 Meilen</string>
|
||||
<string name="voice_total_distance_zero">Die Gesamtstrecke in \"Meine Tracks\" ist null.</string>
|
||||
<string name="waypoint_type_atm">Geldautomat</string>
|
||||
<string name="waypoint_type_bank">Bank</string>
|
||||
<string name="waypoint_type_bar">Bar</string>
|
||||
<string name="waypoint_type_barbecue">Grill</string>
|
||||
<string name="waypoint_type_building">Gebäude</string>
|
||||
<string name="waypoint_type_bus_stop">Bushaltestelle</string>
|
||||
<string name="waypoint_type_cafe">Café</string>
|
||||
<string name="waypoint_type_campfire">Lagerfeuer</string>
|
||||
<string name="waypoint_type_campground">Campingplatz</string>
|
||||
<string name="waypoint_type_church">Kirche</string>
|
||||
<string name="waypoint_type_coffee_house">Kaffeehaus</string>
|
||||
<string name="waypoint_type_convenience_store">Minimarkt</string>
|
||||
<string name="waypoint_type_drinking_water">Trinkwasser</string>
|
||||
<string name="waypoint_type_falling_rocks">Steinschlag</string>
|
||||
<string name="waypoint_type_ferry">Fähre</string>
|
||||
<string name="waypoint_type_fire_place">Kamin</string>
|
||||
<string name="waypoint_type_fire_station">Feuerwache</string>
|
||||
<string name="waypoint_type_fishing">Angeln</string>
|
||||
<string name="waypoint_type_gas_station">Tankstelle</string>
|
||||
<string name="waypoint_type_golf_course">Golfplatz</string>
|
||||
<string name="waypoint_type_grocery_store">Lebensmittelgeschäft</string>
|
||||
<string name="waypoint_type_hair_dresser">Friseur</string>
|
||||
<string name="waypoint_type_harbor">Hafen</string>
|
||||
<string name="waypoint_type_hiking_path">Wanderweg</string>
|
||||
<string name="waypoint_type_hotel">Hotel</string>
|
||||
<string name="waypoint_type_house">Haus</string>
|
||||
<string name="waypoint_type_information">Informationen</string>
|
||||
<string name="waypoint_type_intersection">Kreuzung</string>
|
||||
<string name="waypoint_type_mail_box">Briefkasten</string>
|
||||
<string name="waypoint_type_market">Markt</string>
|
||||
<string name="waypoint_type_meeting_point">Treffpunkt</string>
|
||||
<string name="waypoint_type_opera">Oper</string>
|
||||
<string name="waypoint_type_parking">Parkmöglichkeit</string>
|
||||
<string name="waypoint_type_police_station">Polizeirevier</string>
|
||||
<string name="waypoint_type_post_office">Postamt</string>
|
||||
<string name="waypoint_type_pothole">Schlagloch</string>
|
||||
<string name="waypoint_type_railway_crossing">Bahnübergang</string>
|
||||
<string name="waypoint_type_restaurant">Restaurant</string>
|
||||
<string name="waypoint_type_shopping">Shopping</string>
|
||||
<string name="waypoint_type_sight">Sehenswürdigkeit</string>
|
||||
<string name="waypoint_type_store">Geschäft</string>
|
||||
<string name="waypoint_type_swimming_pool">Swimmingpool</string>
|
||||
<string name="waypoint_type_telephone">Telefon</string>
|
||||
<string name="waypoint_type_theater">Theater</string>
|
||||
<string name="waypoint_type_toilet">Toilette</string>
|
||||
<string name="waypoint_type_tourist_information">Touristeninformation</string>
|
||||
<string name="waypoint_type_tree">Baum</string>
|
||||
<string name="waypoint_type_tunnel">Tunnel</string>
|
||||
<string name="waypoint_type_waterfall">Wasserfall</string>
|
||||
<string name="waypoint_type_water_fountain">Brunnen</string>
|
||||
<string name="waypoint_type_waypoint">Wegpunkt</string>
|
||||
</resources>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">aeroplane</string>
|
||||
<string name="activity_type_atv">ATV</string>
|
||||
<string name="activity_type_biking">biking</string>
|
||||
<string name="activity_type_blimp">airship</string>
|
||||
<string name="activity_type_boat">boat</string>
|
||||
<string name="activity_type_climbing">climbing</string>
|
||||
<string name="activity_type_commercial_airplane">commercial aeroplane</string>
|
||||
<string name="activity_type_cross_country_skiing">Cross-country skiing</string>
|
||||
<string name="activity_type_cycling">cycling</string>
|
||||
<string name="activity_type_dirt_bike">dirt bike</string>
|
||||
<string name="activity_type_donkey_back_riding">donkey riding</string>
|
||||
<string name="activity_type_driving">driving</string>
|
||||
<string name="activity_type_driving_bus">driving bus</string>
|
||||
<string name="activity_type_driving_car">driving car</string>
|
||||
<string name="activity_type_ferry">ferry</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_gliding">gliding</string>
|
||||
<string name="activity_type_hang_gliding">hang gliding</string>
|
||||
<string name="activity_type_helicopter">helicopter</string>
|
||||
<string name="activity_type_hiking">walking</string>
|
||||
<string name="activity_type_horse_back_riding">horse riding</string>
|
||||
<string name="activity_type_hot_air_balloon">hot air balloon</string>
|
||||
<string name="activity_type_ice_sailing">ice sailing</string>
|
||||
<string name="activity_type_inline_skating">inline skating</string>
|
||||
<string name="activity_type_kayaking">kayaking</string>
|
||||
<string name="activity_type_kite_surfing">kite surfing</string>
|
||||
<string name="activity_type_land_sailing">land sailing</string>
|
||||
<string name="activity_type_mixed_type">mixed type</string>
|
||||
<string name="activity_type_motor_bike">motor bike</string>
|
||||
<string name="activity_type_motor_boating">motor boating</string>
|
||||
<string name="activity_type_mountain_biking">mountain biking</string>
|
||||
<string name="activity_type_off_trail_hiking">off-trail walking</string>
|
||||
<string name="activity_type_other">other</string>
|
||||
<string name="activity_type_paddling">canoeing</string>
|
||||
<string name="activity_type_para_gliding">para-gliding</string>
|
||||
<string name="activity_type_rc_airplane">RC aeroplane</string>
|
||||
<string name="activity_type_rc_boat">RC boat</string>
|
||||
<string name="activity_type_rc_helicopter">RC helicopter</string>
|
||||
<string name="activity_type_riding">riding</string>
|
||||
<string name="activity_type_road_biking">road biking</string>
|
||||
<string name="activity_type_roller_skiing">roller skiing</string>
|
||||
<string name="activity_type_rowing">rowing</string>
|
||||
<string name="activity_type_running">running</string>
|
||||
<string name="activity_type_sailing">sailing</string>
|
||||
<string name="activity_type_seaplane">sea plane</string>
|
||||
<string name="activity_type_skate_boarding">skate boarding</string>
|
||||
<string name="activity_type_skating">skating</string>
|
||||
<string name="activity_type_skiing">skiing</string>
|
||||
<string name="activity_type_sky_jumping">sky jumping</string>
|
||||
<string name="activity_type_sled">sledding</string>
|
||||
<string name="activity_type_snow_boarding">snow boarding</string>
|
||||
<string name="activity_type_snow_shoeing">snow shoeing</string>
|
||||
<string name="activity_type_speed_walking">speed walking</string>
|
||||
<string name="activity_type_street_running">street running</string>
|
||||
<string name="activity_type_surfing">surfing</string>
|
||||
<string name="activity_type_track_cycling">track cycling</string>
|
||||
<string name="activity_type_track_running">track running</string>
|
||||
<string name="activity_type_trail_hiking">trail walking</string>
|
||||
<string name="activity_type_trail_running">trail running</string>
|
||||
<string name="activity_type_train">train</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_unknown">unknown</string>
|
||||
<string name="activity_type_wakeboarding">wake boarding</string>
|
||||
<string name="activity_type_walking">walking</string>
|
||||
<string name="activity_type_water_skiing">water skiing</string>
|
||||
<string name="activity_type_wind_surfing">wind surfing</string>
|
||||
<string name="description_activity_type">Activity type: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Average moving pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_moving_speed">Average moving speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_average_pace_in_minute">Average pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_speed">Average speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_elevation_gain">Elevation gain: %1$d m (%2$d ft)</string>
|
||||
<string name="description_elevation_imperial">Elevation (ft)</string>
|
||||
<string name="description_elevation_metric">Elevation (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Fastest pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_location_accuracy">Accuracy (m)</string>
|
||||
<string name="description_location_altitude">Altitude (m)</string>
|
||||
<string name="description_location_bearing">Bearing (deg)</string>
|
||||
<string name="description_location_latitude">Latitude (deg)</string>
|
||||
<string name="description_location_longitude">Longitude (deg)</string>
|
||||
<string name="description_location_speed">Speed (m/s)</string>
|
||||
<string name="description_max_elevation">Max elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_max_grade">Max grade: %1$d %%</string>
|
||||
<string name="description_max_speed">Max speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_min_elevation">Min elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_min_grade">Min grade: %1$d %%</string>
|
||||
<string name="description_moving_time">Moving time: %1$s</string>
|
||||
<string name="description_pace_imperial">Pace (min/mi)</string>
|
||||
<string name="description_pace_metric">Pace (min/km)</string>
|
||||
<string name="description_recorded_time">Recorded: %1$s</string>
|
||||
<string name="description_sensor_cadence">Cadence (rpm)</string>
|
||||
<string name="description_sensor_heart_rate">Heart rate (bpm)</string>
|
||||
<string name="description_sensor_power">Power (W)</string>
|
||||
<string name="description_speed_imperial">Speed (mph)</string>
|
||||
<string name="description_speed_metric">Speed (km/h)</string>
|
||||
<string name="description_time">Time</string>
|
||||
<string name="description_total_distance">Total distance: %1$.2f km (%2$.1f mi)</string>
|
||||
<string name="description_total_time">Total time: %1$s</string>
|
||||
<string name="description_track_point">Point</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">All as %1$s to %2$s</string>
|
||||
<string name="export_all_title">Export to external storage</string>
|
||||
<string name="export_external_storage">External storage</string>
|
||||
<string name="export_external_storage_error">Exported %1$d of %2$s to %3$s</string>
|
||||
<string name="export_external_storage_option">as %1$s to %2$s</string>
|
||||
<string name="export_external_storage_progress_message">Exporting to %1$s…</string>
|
||||
<string name="export_external_storage_success">Exported %1$s to %2$s</string>
|
||||
<string name="export_title">Export to…</string>
|
||||
<string name="external_storage_not_available">External storage not available</string>
|
||||
<string name="external_storage_not_writable">External storage not writable</string>
|
||||
<string name="files_few">%1$d files</string>
|
||||
<string name="files_many">%1$d files</string>
|
||||
<string name="files_one">1 file</string>
|
||||
<string name="files_other">%1$d files</string>
|
||||
<string name="files_two">2 files</string>
|
||||
<string name="files_zero">0 files</string>
|
||||
<string name="generic_add">Add</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_delete_all_confirm_title">Delete all?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Delete selected?</string>
|
||||
<string name="generic_description">Description</string>
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_error_title">Error</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">No</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_progress_title">Please wait…</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_success_title">Success</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Yes</string>
|
||||
<string name="gps_location_access">\'Location access\'</string>
|
||||
<string name="gps_disabled">GPS not enabled. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_location_mode">Select high-accuracy location mode. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_my_location">Current location cannot be determined. Enable more location sources at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Current location cannot be determined. Select the high-accuracy location mode at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_not_found">No GPS found on the device</string>
|
||||
<string name="gps_starting">Starting GPS</string>
|
||||
<string name="gps_starting_error">Unable to start GPS</string>
|
||||
<string name="gps_stopping">Stopping GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Waiting for a better GPS signal</string>
|
||||
<string name="gps_wait_for_signal">Waiting for GPS signal</string>
|
||||
<string name="image_application">Application</string>
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</string>
|
||||
<string name="image_my_location">My Location</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Photo marker</string>
|
||||
<string name="image_record">Record</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">Imported %1$d of %2$s from %3$s</string>
|
||||
<string name="import_no_directory">%1$s does not exist</string>
|
||||
<string name="import_no_file">There were no files to import. Connect your device to your computer and place the files to be imported in %1$s.</string>
|
||||
<string name="import_no_file_title">Import files</string>
|
||||
<string name="import_progress_message">Importing from %1$s…</string>
|
||||
<string name="import_selection_option">All %1$s from %2$s</string>
|
||||
<string name="import_selection_title">Import from external storage</string>
|
||||
<string name="import_success">Imported %1$s from %2$s</string>
|
||||
<string name="marker_add_error">Unable to insert a marker. No GPS signal. Try again.</string>
|
||||
<string name="marker_add_success">A marker was inserted</string>
|
||||
<string name="marker_add_canceled">Cancelled, no marker added</string>
|
||||
<string name="marker_delete_all_confirm_message">All markers for this track will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_message">The marker will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_title">Delete marker?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">The selected markers will be permanently deleted from the device</string>
|
||||
<string name="marker_label_end">%1$s (End)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_split_name_format">Split %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Since last split marker:</string>
|
||||
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
|
||||
<string name="marker_edit_marker_type_hint">Marker type</string>
|
||||
<string name="marker_list_empty_message">You don\'t have any markers</string>
|
||||
<string name="menu_aggregated_statistics">Aggregated stats</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
<string name="menu_delete_all">Delete all</string>
|
||||
<string name="menu_edit">Edit</string>
|
||||
<string name="menu_export">Export</string>
|
||||
<string name="menu_export_all">Export all</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_help_feedback">Help & feedback</string>
|
||||
<string name="menu_help_forum">Help forum</string>
|
||||
<string name="menu_import_all">Import all</string>
|
||||
<string name="menu_insert_marker">Insert marker</string>
|
||||
<string name="menu_insert_photo">Insert photo</string>
|
||||
<string name="menu_map">Map</string>
|
||||
<string name="menu_markers">Markers</string>
|
||||
<string name="menu_play">Play</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_select_all">Select all</string>
|
||||
<string name="menu_sensor_state">Sensor state</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="menu_share">Share</string>
|
||||
<string name="menu_show_on_map">Show on map</string>
|
||||
<string name="menu_split_frequency">Split frequency</string>
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="menu_view_photo">View photo</string>
|
||||
<string name="menu_voice_frequency">Voice frequency</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Recording service</string>
|
||||
<string name="search_global_description">Tracks and markers</string>
|
||||
<string name="search_list_empty_message">No tracks or markers matched your search</string>
|
||||
<string name="search_list_marker_track_location">In track ‘%1$s’.</string>
|
||||
<string name="search_voice_prompt">Say the name of a track or marker</string>
|
||||
<string name="sensor_state_battery">Battery level</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_connected">Connected</string>
|
||||
<string name="sensor_state_connecting">Connecting</string>
|
||||
<string name="sensor_state_disconnected">Disconnected</string>
|
||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_last_sensor_time">Last sensor time</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Sending</string>
|
||||
<string name="settings_not_while_recording">Not available while recording a track</string>
|
||||
<string name="settings_show">Show</string>
|
||||
<string name="settings_advanced">Advanced</string>
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<string name="settings_chart_x_axis">X axis</string>
|
||||
<string name="settings_recording">Recording</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Always resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Never resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Resume a recording after reboot if the last recorded location was within the last %1$s</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Auto-resume</string>
|
||||
<string name="settings_recording_default_activity_title">Default activity type</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. distance</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Recording distance interval</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Recording time interval</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Location is ignored if its accuracy is less than %1$s</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS accuracy</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Date (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_reset">Reset</string>
|
||||
<string name="settings_reset_confirm_message">All settings will be reverted to default values.</string>
|
||||
<string name="settings_reset_confirm_title">Reset now?</string>
|
||||
<string name="settings_reset_done">All settings have been reverted to default values</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Reset bike cadence</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Reset combined bike</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Reset heart rate</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Reset foot pod</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Open Android\'s Bluetooth settings to pair a sensor</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth sensor</string>
|
||||
<string name="settings_sensor_connected">Connected to %1$s</string>
|
||||
<string name="settings_stats_coordinate">Latitude/Longitude</string>
|
||||
<string name="settings_stats_grade_elevation">Grade/elevation</string>
|
||||
<string name="settings_stats_rate_title">Preferred rate</string>
|
||||
<string name="settings_stats_units_imperial">Imperial (miles, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Preferred units</string>
|
||||
<string name="share_track_emails_hint">Email addresses</string>
|
||||
<string name="share_track_picker_title">Select an application</string>
|
||||
<string name="share_track_share_file">Share track file</string>
|
||||
<string name="share_track_share_file_body">I think you might be interested in this track.\n\nTo view this track, use Google Earth or other
|
||||
mapping software.\n\n%1$s</string>
|
||||
<string name="share_track_subject">I would like to share a track with you</string>
|
||||
<string name="stats_average_moving_pace">Avg. moving pace</string>
|
||||
<string name="stats_average_moving_speed">Avg. moving speed</string>
|
||||
<string name="stats_average_pace">Avg. pace</string>
|
||||
<string name="stats_average_speed">Avg. speed</string>
|
||||
<string name="stats_elevation">Elevation</string>
|
||||
<string name="stats_fastest_pace">Fastest pace</string>
|
||||
<string name="stats_gain">Gain</string>
|
||||
<string name="stats_grade">Grade</string>
|
||||
<string name="stats_latitude">Latitude</string>
|
||||
<string name="stats_longitude">Longitude</string>
|
||||
<string name="stats_max">Max</string>
|
||||
<string name="stats_max_speed">Max. speed</string>
|
||||
<string name="stats_min">Min</string>
|
||||
<string name="stats_moving_time">Moving time</string>
|
||||
<string name="stats_pace">Pace</string>
|
||||
<string name="stats_speed">Speed</string>
|
||||
<string name="stats_distance">Distance</string>
|
||||
<string name="stats_total_time">Total time</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Recording your track…</string>
|
||||
<string name="track_markers">%1$s Markers</string>
|
||||
<string name="track_delete_one_confirm_message">The track and its markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_one_confirm_title">Delete track?</string>
|
||||
<string name="track_delete_multiple_confirm_message">The selected tracks and their markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_progress_message">Deleting…</string>
|
||||
<string name="track_detail_chart_tab">Chart</string>
|
||||
<string name="track_detail_stats_tab">Stats</string>
|
||||
<string name="track_edit_activity_type">Activity type (e.g. walking)</string>
|
||||
<string name="track_edit_activity_type_hint">Activity type</string>
|
||||
<string name="track_edit_new_track_title">New Track</string>
|
||||
<string name="track_list_empty_message">Start recording your next adventure here</string>
|
||||
<string name="track_list_record_error">Unable to start recording. No GPS signal. Try again.</string>
|
||||
<string name="track_list_record_success">Now recording a new track</string>
|
||||
<string name="track_widget_config_title">Configure Widget Items</string>
|
||||
<string name="tracks_few">%1$d tracks</string>
|
||||
<string name="tracks_many">%1$d tracks</string>
|
||||
<string name="tracks_one">1 track</string>
|
||||
<string name="tracks_other">%1$d tracks</string>
|
||||
<string name="tracks_two">2 tracks</string>
|
||||
<string name="tracks_zero">0 tracks</string>
|
||||
<string name="unit_feet">ft</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">mi/h</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">min/mi</string>
|
||||
<string name="value_adapt_accuracy">Adapt for accuracy</string>
|
||||
<string name="value_adapt_battery_life">Adapt for battery life</string>
|
||||
<string name="value_always">Always</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f mi</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f mi (poor GPS)</string>
|
||||
<string name="value_integer_feet">%1$d ft</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d ft (excellent GPS)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d ft (recommended)</string>
|
||||
<string name="value_integer_kilobyte">%1$d kB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (excellent GPS)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (poor GPS)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (recommended)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d mph</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Never</string>
|
||||
<string name="value_none">None</string>
|
||||
<string name="value_off">Off</string>
|
||||
<string name="value_smallest">Smallest</string>
|
||||
<string name="value_smallest_recommended">Smallest (recommended)</string>
|
||||
<string name="voice_hours_few">%1$d hours</string>
|
||||
<string name="voice_hours_many">%1$d hours</string>
|
||||
<string name="voice_hours_one">1 hour</string>
|
||||
<string name="voice_hours_other">%1$d hours</string>
|
||||
<string name="voice_hours_two">2 hours</string>
|
||||
<string name="voice_hours_zero">0 hours</string>
|
||||
<string name="voice_minutes_few">%1$d minutes</string>
|
||||
<string name="voice_minutes_many">%1$d minutes</string>
|
||||
<string name="voice_minutes_one">1 minute</string>
|
||||
<string name="voice_minutes_other">%1$d minutes</string>
|
||||
<string name="voice_minutes_two">2 minutes</string>
|
||||
<string name="voice_minutes_zero">0 minutes</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometre</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mile</string>
|
||||
<string name="voice_seconds_few">%1$d seconds</string>
|
||||
<string name="voice_seconds_many">%1$d seconds</string>
|
||||
<string name="voice_seconds_one">1 second</string>
|
||||
<string name="voice_seconds_other">%1$d seconds</string>
|
||||
<string name="voice_seconds_two">2 seconds</string>
|
||||
<string name="voice_seconds_zero">0 seconds</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 kilometre per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 kilometres per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 mile per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 miles per hour</string>
|
||||
<string name="voice_template">OpenTracks %1$s in %2$s at %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_many">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_one">total distance 1 kilometre</string>
|
||||
<string name="voice_total_distance_kilometers_other">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_two">total distance 2 kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_zero">total distance 0 kilometres</string>
|
||||
<string name="voice_total_distance_miles_few">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_many">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_one">total distance 1 mile</string>
|
||||
<string name="voice_total_distance_miles_other">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_two">total distance 2 miles</string>
|
||||
<string name="voice_total_distance_miles_zero">total distance 0 miles</string>
|
||||
<string name="voice_total_distance_zero">OpenTracks total distance zero.</string>
|
||||
<string name="waypoint_type_atm">Cashpoint</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar/pub</string>
|
||||
<string name="waypoint_type_barbecue">barbecue</string>
|
||||
<string name="waypoint_type_building">building</string>
|
||||
<string name="waypoint_type_bus_stop">bus stop</string>
|
||||
<string name="waypoint_type_cafe">cafe</string>
|
||||
<string name="waypoint_type_campfire">camp fire</string>
|
||||
<string name="waypoint_type_campground">Campsites</string>
|
||||
<string name="waypoint_type_church">church</string>
|
||||
<string name="waypoint_type_coffee_house">cafe</string>
|
||||
<string name="waypoint_type_convenience_store">corner shops</string>
|
||||
<string name="waypoint_type_drinking_water">drinking water</string>
|
||||
<string name="waypoint_type_falling_rocks">falling rocks</string>
|
||||
<string name="waypoint_type_ferry">ferry</string>
|
||||
<string name="waypoint_type_fire_place">fireplace</string>
|
||||
<string name="waypoint_type_fire_station">fire station</string>
|
||||
<string name="waypoint_type_fishing">fishing</string>
|
||||
<string name="waypoint_type_gas_station">petrol station</string>
|
||||
<string name="waypoint_type_golf_course">golf course</string>
|
||||
<string name="waypoint_type_grocery_store">grocers</string>
|
||||
<string name="waypoint_type_hair_dresser">hair dresser</string>
|
||||
<string name="waypoint_type_harbor">harbour</string>
|
||||
<string name="waypoint_type_hiking_path">footpath</string>
|
||||
<string name="waypoint_type_hotel">hotel</string>
|
||||
<string name="waypoint_type_house">house</string>
|
||||
<string name="waypoint_type_information">information</string>
|
||||
<string name="waypoint_type_intersection">intersection</string>
|
||||
<string name="waypoint_type_mail_box">post box</string>
|
||||
<string name="waypoint_type_market">market</string>
|
||||
<string name="waypoint_type_meeting_point">meeting point</string>
|
||||
<string name="waypoint_type_opera">opera</string>
|
||||
<string name="waypoint_type_parking">parking</string>
|
||||
<string name="waypoint_type_police_station">police station</string>
|
||||
<string name="waypoint_type_post_office">post office</string>
|
||||
<string name="waypoint_type_pothole">pothole</string>
|
||||
<string name="waypoint_type_railway_crossing">railway crossing</string>
|
||||
<string name="waypoint_type_restaurant">restaurant</string>
|
||||
<string name="waypoint_type_shopping">shopping</string>
|
||||
<string name="waypoint_type_sight">sight</string>
|
||||
<string name="waypoint_type_store">shop</string>
|
||||
<string name="waypoint_type_swimming_pool">swimming pool</string>
|
||||
<string name="waypoint_type_telephone">telephone</string>
|
||||
<string name="waypoint_type_theater">theatre</string>
|
||||
<string name="waypoint_type_toilet">toilet</string>
|
||||
<string name="waypoint_type_tourist_information">tourist information</string>
|
||||
<string name="waypoint_type_tree">tree</string>
|
||||
<string name="waypoint_type_tunnel">tunnel</string>
|
||||
<string name="waypoint_type_waterfall">waterfall</string>
|
||||
<string name="waypoint_type_water_fountain">water fountain</string>
|
||||
<string name="waypoint_type_waypoint">waypoint</string>
|
||||
</resources>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">aeroplane</string>
|
||||
<string name="activity_type_atv">ATV</string>
|
||||
<string name="activity_type_biking">biking</string>
|
||||
<string name="activity_type_blimp">airship</string>
|
||||
<string name="activity_type_boat">boat</string>
|
||||
<string name="activity_type_climbing">climbing</string>
|
||||
<string name="activity_type_commercial_airplane">commercial aeroplane</string>
|
||||
<string name="activity_type_cross_country_skiing">Cross-country skiing</string>
|
||||
<string name="activity_type_cycling">cycling</string>
|
||||
<string name="activity_type_dirt_bike">dirt bike</string>
|
||||
<string name="activity_type_donkey_back_riding">donkey riding</string>
|
||||
<string name="activity_type_driving">driving</string>
|
||||
<string name="activity_type_driving_bus">driving bus</string>
|
||||
<string name="activity_type_driving_car">driving car</string>
|
||||
<string name="activity_type_ferry">ferry</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_gliding">gliding</string>
|
||||
<string name="activity_type_hang_gliding">hang gliding</string>
|
||||
<string name="activity_type_helicopter">helicopter</string>
|
||||
<string name="activity_type_hiking">walking</string>
|
||||
<string name="activity_type_horse_back_riding">horse riding</string>
|
||||
<string name="activity_type_hot_air_balloon">hot air balloon</string>
|
||||
<string name="activity_type_ice_sailing">ice sailing</string>
|
||||
<string name="activity_type_inline_skating">inline skating</string>
|
||||
<string name="activity_type_kayaking">kayaking</string>
|
||||
<string name="activity_type_kite_surfing">kite surfing</string>
|
||||
<string name="activity_type_land_sailing">land sailing</string>
|
||||
<string name="activity_type_mixed_type">mixed type</string>
|
||||
<string name="activity_type_motor_bike">motor bike</string>
|
||||
<string name="activity_type_motor_boating">motor boating</string>
|
||||
<string name="activity_type_mountain_biking">mountain biking</string>
|
||||
<string name="activity_type_off_trail_hiking">off-trail walking</string>
|
||||
<string name="activity_type_other">other</string>
|
||||
<string name="activity_type_paddling">canoeing</string>
|
||||
<string name="activity_type_para_gliding">para-gliding</string>
|
||||
<string name="activity_type_rc_airplane">RC aeroplane</string>
|
||||
<string name="activity_type_rc_boat">RC boat</string>
|
||||
<string name="activity_type_rc_helicopter">RC helicopter</string>
|
||||
<string name="activity_type_riding">riding</string>
|
||||
<string name="activity_type_road_biking">road biking</string>
|
||||
<string name="activity_type_roller_skiing">roller skiing</string>
|
||||
<string name="activity_type_rowing">rowing</string>
|
||||
<string name="activity_type_running">running</string>
|
||||
<string name="activity_type_sailing">sailing</string>
|
||||
<string name="activity_type_seaplane">sea plane</string>
|
||||
<string name="activity_type_skate_boarding">skate boarding</string>
|
||||
<string name="activity_type_skating">skating</string>
|
||||
<string name="activity_type_skiing">skiing</string>
|
||||
<string name="activity_type_sky_jumping">sky jumping</string>
|
||||
<string name="activity_type_sled">sledding</string>
|
||||
<string name="activity_type_snow_boarding">snow boarding</string>
|
||||
<string name="activity_type_snow_shoeing">snow shoeing</string>
|
||||
<string name="activity_type_speed_walking">speed walking</string>
|
||||
<string name="activity_type_street_running">street running</string>
|
||||
<string name="activity_type_surfing">surfing</string>
|
||||
<string name="activity_type_track_cycling">track cycling</string>
|
||||
<string name="activity_type_track_running">track running</string>
|
||||
<string name="activity_type_trail_hiking">trail walking</string>
|
||||
<string name="activity_type_trail_running">trail running</string>
|
||||
<string name="activity_type_train">train</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_unknown">unknown</string>
|
||||
<string name="activity_type_wakeboarding">wake boarding</string>
|
||||
<string name="activity_type_walking">walking</string>
|
||||
<string name="activity_type_water_skiing">water skiing</string>
|
||||
<string name="activity_type_wind_surfing">wind surfing</string>
|
||||
<string name="description_activity_type">Activity type: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Average moving pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_moving_speed">Average moving speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_average_pace_in_minute">Average pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_speed">Average speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_elevation_gain">Elevation gain: %1$d m (%2$d ft)</string>
|
||||
<string name="description_elevation_imperial">Elevation (ft)</string>
|
||||
<string name="description_elevation_metric">Elevation (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Fastest pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_location_accuracy">Accuracy (m)</string>
|
||||
<string name="description_location_altitude">Altitude (m)</string>
|
||||
<string name="description_location_bearing">Bearing (deg)</string>
|
||||
<string name="description_location_latitude">Latitude (deg)</string>
|
||||
<string name="description_location_longitude">Longitude (deg)</string>
|
||||
<string name="description_location_speed">Speed (m/s)</string>
|
||||
<string name="description_max_elevation">Max elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_max_grade">Max grade: %1$d %%</string>
|
||||
<string name="description_max_speed">Max speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_min_elevation">Min elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_min_grade">Min grade: %1$d %%</string>
|
||||
<string name="description_moving_time">Moving time: %1$s</string>
|
||||
<string name="description_pace_imperial">Pace (min/mi)</string>
|
||||
<string name="description_pace_metric">Pace (min/km)</string>
|
||||
<string name="description_recorded_time">Recorded: %1$s</string>
|
||||
<string name="description_sensor_cadence">Cadence (rpm)</string>
|
||||
<string name="description_sensor_heart_rate">Heart rate (bpm)</string>
|
||||
<string name="description_sensor_power">Power (W)</string>
|
||||
<string name="description_speed_imperial">Speed (mph)</string>
|
||||
<string name="description_speed_metric">Speed (km/h)</string>
|
||||
<string name="description_time">Time</string>
|
||||
<string name="description_total_distance">Total distance: %1$.2f km (%2$.1f mi)</string>
|
||||
<string name="description_total_time">Total time: %1$s</string>
|
||||
<string name="description_track_point">Point</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">All as %1$s to %2$s</string>
|
||||
<string name="export_all_title">Export to external storage</string>
|
||||
<string name="export_external_storage">External storage</string>
|
||||
<string name="export_external_storage_error">Exported %1$d of %2$s to %3$s</string>
|
||||
<string name="export_external_storage_option">as %1$s to %2$s</string>
|
||||
<string name="export_external_storage_progress_message">Exporting to %1$s…</string>
|
||||
<string name="export_external_storage_success">Exported %1$s to %2$s</string>
|
||||
<string name="export_title">Export to…</string>
|
||||
<string name="external_storage_not_available">External storage not available</string>
|
||||
<string name="external_storage_not_writable">External storage not writable</string>
|
||||
<string name="files_few">%1$d files</string>
|
||||
<string name="files_many">%1$d files</string>
|
||||
<string name="files_one">1 file</string>
|
||||
<string name="files_other">%1$d files</string>
|
||||
<string name="files_two">2 files</string>
|
||||
<string name="files_zero">0 files</string>
|
||||
<string name="generic_add">Add</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_delete_all_confirm_title">Delete all?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Delete selected?</string>
|
||||
<string name="generic_description">Description</string>
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_error_title">Error</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">No</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_progress_title">Please wait…</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_success_title">Success</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Yes</string>
|
||||
<string name="gps_location_access">\'Location access\'</string>
|
||||
<string name="gps_disabled">GPS not enabled. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_location_mode">Select high-accuracy location mode. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_my_location">Current location cannot be determined. Enable more location sources at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Current location cannot be determined. Select the high-accuracy location mode at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_not_found">No GPS found on the device</string>
|
||||
<string name="gps_starting">Starting GPS</string>
|
||||
<string name="gps_starting_error">Unable to start GPS</string>
|
||||
<string name="gps_stopping">Stopping GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Waiting for a better GPS signal</string>
|
||||
<string name="gps_wait_for_signal">Waiting for GPS signal</string>
|
||||
<string name="image_application">Application</string>
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</string>
|
||||
<string name="image_my_location">My Location</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Photo marker</string>
|
||||
<string name="image_record">Record</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">Imported %1$d of %2$s from %3$s</string>
|
||||
<string name="import_no_directory">%1$s does not exist</string>
|
||||
<string name="import_no_file">There were no files to import. Connect your device to your computer and place the files to be imported in %1$s.</string>
|
||||
<string name="import_no_file_title">Import files</string>
|
||||
<string name="import_progress_message">Importing from %1$s…</string>
|
||||
<string name="import_selection_option">All %1$s from %2$s</string>
|
||||
<string name="import_selection_title">Import from external storage</string>
|
||||
<string name="import_success">Imported %1$s from %2$s</string>
|
||||
<string name="marker_add_error">Unable to insert a marker. No GPS signal. Try again.</string>
|
||||
<string name="marker_add_success">A marker was inserted</string>
|
||||
<string name="marker_add_canceled">Cancelled, no marker added</string>
|
||||
<string name="marker_delete_all_confirm_message">All markers for this track will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_message">The marker will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_title">Delete marker?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">The selected markers will be permanently deleted from the device</string>
|
||||
<string name="marker_label_end">%1$s (End)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_split_name_format">Split %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Since last split marker:</string>
|
||||
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
|
||||
<string name="marker_edit_marker_type_hint">Marker type</string>
|
||||
<string name="marker_list_empty_message">You don\'t have any markers</string>
|
||||
<string name="menu_aggregated_statistics">Aggregated stats</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
<string name="menu_delete_all">Delete all</string>
|
||||
<string name="menu_edit">Edit</string>
|
||||
<string name="menu_export">Export</string>
|
||||
<string name="menu_export_all">Export all</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_help_feedback">Help & feedback</string>
|
||||
<string name="menu_help_forum">Help forum</string>
|
||||
<string name="menu_import_all">Import all</string>
|
||||
<string name="menu_insert_marker">Insert marker</string>
|
||||
<string name="menu_insert_photo">Insert photo</string>
|
||||
<string name="menu_map">Map</string>
|
||||
<string name="menu_markers">Markers</string>
|
||||
<string name="menu_play">Play</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_select_all">Select all</string>
|
||||
<string name="menu_sensor_state">Sensor state</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="menu_share">Share</string>
|
||||
<string name="menu_show_on_map">Show on map</string>
|
||||
<string name="menu_split_frequency">Split frequency</string>
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="menu_view_photo">View photo</string>
|
||||
<string name="menu_voice_frequency">Voice frequency</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Recording service</string>
|
||||
<string name="search_global_description">Tracks and markers</string>
|
||||
<string name="search_list_empty_message">No tracks or markers matched your search</string>
|
||||
<string name="search_list_marker_track_location">In track ‘%1$s’.</string>
|
||||
<string name="search_voice_prompt">Say the name of a track or marker</string>
|
||||
<string name="sensor_state_battery">Battery level</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_connected">Connected</string>
|
||||
<string name="sensor_state_connecting">Connecting</string>
|
||||
<string name="sensor_state_disconnected">Disconnected</string>
|
||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_last_sensor_time">Last sensor time</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Sending</string>
|
||||
<string name="settings_not_while_recording">Not available while recording a track</string>
|
||||
<string name="settings_show">Show</string>
|
||||
<string name="settings_advanced">Advanced</string>
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<string name="settings_chart_x_axis">X axis</string>
|
||||
<string name="settings_recording">Recording</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Always resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Never resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Resume a recording after reboot if the last recorded location was within the last %1$s</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Auto-resume</string>
|
||||
<string name="settings_recording_default_activity_title">Default activity type</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. distance</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Recording distance interval</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Recording time interval</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Location is ignored if its accuracy is less than %1$s</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS accuracy</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Date (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_reset">Reset</string>
|
||||
<string name="settings_reset_confirm_message">All settings will be reverted to default values.</string>
|
||||
<string name="settings_reset_confirm_title">Reset now?</string>
|
||||
<string name="settings_reset_done">All settings have been reverted to default values</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Reset bike cadence</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Reset combined bike</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Reset heart rate</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Reset foot pod</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Open Android\'s Bluetooth settings to pair a sensor</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth sensor</string>
|
||||
<string name="settings_sensor_connected">Connected to %1$s</string>
|
||||
<string name="settings_stats_coordinate">Latitude/Longitude</string>
|
||||
<string name="settings_stats_grade_elevation">Grade/elevation</string>
|
||||
<string name="settings_stats_rate_title">Preferred rate</string>
|
||||
<string name="settings_stats_units_imperial">Imperial (miles, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Preferred units</string>
|
||||
<string name="share_track_emails_hint">Email addresses</string>
|
||||
<string name="share_track_picker_title">Select an application</string>
|
||||
<string name="share_track_share_file">Share track file</string>
|
||||
<string name="share_track_share_file_body">I think you might be interested in this track.\n\nTo view this track, use Google Earth or other
|
||||
mapping software.\n\n%1$s</string>
|
||||
<string name="share_track_subject">I would like to share a track with you</string>
|
||||
<string name="stats_average_moving_pace">Avg. moving pace</string>
|
||||
<string name="stats_average_moving_speed">Avg. moving speed</string>
|
||||
<string name="stats_average_pace">Avg. pace</string>
|
||||
<string name="stats_average_speed">Avg. speed</string>
|
||||
<string name="stats_elevation">Elevation</string>
|
||||
<string name="stats_fastest_pace">Fastest pace</string>
|
||||
<string name="stats_gain">Gain</string>
|
||||
<string name="stats_grade">Grade</string>
|
||||
<string name="stats_latitude">Latitude</string>
|
||||
<string name="stats_longitude">Longitude</string>
|
||||
<string name="stats_max">Max</string>
|
||||
<string name="stats_max_speed">Max. speed</string>
|
||||
<string name="stats_min">Min</string>
|
||||
<string name="stats_moving_time">Moving time</string>
|
||||
<string name="stats_pace">Pace</string>
|
||||
<string name="stats_speed">Speed</string>
|
||||
<string name="stats_distance">Distance</string>
|
||||
<string name="stats_total_time">Total time</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Recording your track…</string>
|
||||
<string name="track_markers">%1$s Markers</string>
|
||||
<string name="track_delete_one_confirm_message">The track and its markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_one_confirm_title">Delete track?</string>
|
||||
<string name="track_delete_multiple_confirm_message">The selected tracks and their markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_progress_message">Deleting…</string>
|
||||
<string name="track_detail_chart_tab">Chart</string>
|
||||
<string name="track_detail_stats_tab">Stats</string>
|
||||
<string name="track_edit_activity_type">Activity type (e.g. walking)</string>
|
||||
<string name="track_edit_activity_type_hint">Activity type</string>
|
||||
<string name="track_edit_new_track_title">New Track</string>
|
||||
<string name="track_list_empty_message">Start recording your next adventure here</string>
|
||||
<string name="track_list_record_error">Unable to start recording. No GPS signal. Try again.</string>
|
||||
<string name="track_list_record_success">Now recording a new track</string>
|
||||
<string name="track_widget_config_title">Configure Widget Items</string>
|
||||
<string name="tracks_few">%1$d tracks</string>
|
||||
<string name="tracks_many">%1$d tracks</string>
|
||||
<string name="tracks_one">1 track</string>
|
||||
<string name="tracks_other">%1$d tracks</string>
|
||||
<string name="tracks_two">2 tracks</string>
|
||||
<string name="tracks_zero">0 tracks</string>
|
||||
<string name="unit_feet">ft</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">mi/h</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">min/mi</string>
|
||||
<string name="value_adapt_accuracy">Adapt for accuracy</string>
|
||||
<string name="value_adapt_battery_life">Adapt for battery life</string>
|
||||
<string name="value_always">Always</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f mi</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f mi (poor GPS)</string>
|
||||
<string name="value_integer_feet">%1$d ft</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d ft (excellent GPS)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d ft (recommended)</string>
|
||||
<string name="value_integer_kilobyte">%1$d kB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (excellent GPS)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (poor GPS)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (recommended)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d mph</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Never</string>
|
||||
<string name="value_none">None</string>
|
||||
<string name="value_off">Off</string>
|
||||
<string name="value_smallest">Smallest</string>
|
||||
<string name="value_smallest_recommended">Smallest (recommended)</string>
|
||||
<string name="voice_hours_few">%1$d hours</string>
|
||||
<string name="voice_hours_many">%1$d hours</string>
|
||||
<string name="voice_hours_one">1 hour</string>
|
||||
<string name="voice_hours_other">%1$d hours</string>
|
||||
<string name="voice_hours_two">2 hours</string>
|
||||
<string name="voice_hours_zero">0 hours</string>
|
||||
<string name="voice_minutes_few">%1$d minutes</string>
|
||||
<string name="voice_minutes_many">%1$d minutes</string>
|
||||
<string name="voice_minutes_one">1 minute</string>
|
||||
<string name="voice_minutes_other">%1$d minutes</string>
|
||||
<string name="voice_minutes_two">2 minutes</string>
|
||||
<string name="voice_minutes_zero">0 minutes</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometre</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mile</string>
|
||||
<string name="voice_seconds_few">%1$d seconds</string>
|
||||
<string name="voice_seconds_many">%1$d seconds</string>
|
||||
<string name="voice_seconds_one">1 second</string>
|
||||
<string name="voice_seconds_other">%1$d seconds</string>
|
||||
<string name="voice_seconds_two">2 seconds</string>
|
||||
<string name="voice_seconds_zero">0 seconds</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 kilometre per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 kilometres per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 mile per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 miles per hour</string>
|
||||
<string name="voice_template">OpenTracks %1$s in %2$s at %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_many">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_one">total distance 1 kilometre</string>
|
||||
<string name="voice_total_distance_kilometers_other">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_two">total distance 2 kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_zero">total distance 0 kilometres</string>
|
||||
<string name="voice_total_distance_miles_few">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_many">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_one">total distance 1 mile</string>
|
||||
<string name="voice_total_distance_miles_other">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_two">total distance 2 miles</string>
|
||||
<string name="voice_total_distance_miles_zero">total distance 0 miles</string>
|
||||
<string name="voice_total_distance_zero">OpenTracks total distance zero.</string>
|
||||
<string name="waypoint_type_atm">Cashpoint</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar/pub</string>
|
||||
<string name="waypoint_type_barbecue">barbecue</string>
|
||||
<string name="waypoint_type_building">building</string>
|
||||
<string name="waypoint_type_bus_stop">bus stop</string>
|
||||
<string name="waypoint_type_cafe">cafe</string>
|
||||
<string name="waypoint_type_campfire">camp fire</string>
|
||||
<string name="waypoint_type_campground">Campsites</string>
|
||||
<string name="waypoint_type_church">church</string>
|
||||
<string name="waypoint_type_coffee_house">cafe</string>
|
||||
<string name="waypoint_type_convenience_store">corner shops</string>
|
||||
<string name="waypoint_type_drinking_water">drinking water</string>
|
||||
<string name="waypoint_type_falling_rocks">falling rocks</string>
|
||||
<string name="waypoint_type_ferry">ferry</string>
|
||||
<string name="waypoint_type_fire_place">fireplace</string>
|
||||
<string name="waypoint_type_fire_station">fire station</string>
|
||||
<string name="waypoint_type_fishing">fishing</string>
|
||||
<string name="waypoint_type_gas_station">petrol station</string>
|
||||
<string name="waypoint_type_golf_course">golf course</string>
|
||||
<string name="waypoint_type_grocery_store">grocers</string>
|
||||
<string name="waypoint_type_hair_dresser">hair dresser</string>
|
||||
<string name="waypoint_type_harbor">harbour</string>
|
||||
<string name="waypoint_type_hiking_path">footpath</string>
|
||||
<string name="waypoint_type_hotel">hotel</string>
|
||||
<string name="waypoint_type_house">house</string>
|
||||
<string name="waypoint_type_information">information</string>
|
||||
<string name="waypoint_type_intersection">intersection</string>
|
||||
<string name="waypoint_type_mail_box">post box</string>
|
||||
<string name="waypoint_type_market">market</string>
|
||||
<string name="waypoint_type_meeting_point">meeting point</string>
|
||||
<string name="waypoint_type_opera">opera</string>
|
||||
<string name="waypoint_type_parking">parking</string>
|
||||
<string name="waypoint_type_police_station">police station</string>
|
||||
<string name="waypoint_type_post_office">post office</string>
|
||||
<string name="waypoint_type_pothole">pothole</string>
|
||||
<string name="waypoint_type_railway_crossing">railway crossing</string>
|
||||
<string name="waypoint_type_restaurant">restaurant</string>
|
||||
<string name="waypoint_type_shopping">shopping</string>
|
||||
<string name="waypoint_type_sight">sight</string>
|
||||
<string name="waypoint_type_store">shop</string>
|
||||
<string name="waypoint_type_swimming_pool">swimming pool</string>
|
||||
<string name="waypoint_type_telephone">telephone</string>
|
||||
<string name="waypoint_type_theater">theatre</string>
|
||||
<string name="waypoint_type_toilet">toilet</string>
|
||||
<string name="waypoint_type_tourist_information">tourist information</string>
|
||||
<string name="waypoint_type_tree">tree</string>
|
||||
<string name="waypoint_type_tunnel">tunnel</string>
|
||||
<string name="waypoint_type_waterfall">waterfall</string>
|
||||
<string name="waypoint_type_water_fountain">water fountain</string>
|
||||
<string name="waypoint_type_waypoint">waypoint</string>
|
||||
</resources>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">aeroplane</string>
|
||||
<string name="activity_type_atv">ATV</string>
|
||||
<string name="activity_type_biking">biking</string>
|
||||
<string name="activity_type_blimp">airship</string>
|
||||
<string name="activity_type_boat">boat</string>
|
||||
<string name="activity_type_climbing">climbing</string>
|
||||
<string name="activity_type_commercial_airplane">commercial aeroplane</string>
|
||||
<string name="activity_type_cross_country_skiing">Cross-country skiing</string>
|
||||
<string name="activity_type_cycling">cycling</string>
|
||||
<string name="activity_type_dirt_bike">dirt bike</string>
|
||||
<string name="activity_type_donkey_back_riding">donkey riding</string>
|
||||
<string name="activity_type_driving">driving</string>
|
||||
<string name="activity_type_driving_bus">driving bus</string>
|
||||
<string name="activity_type_driving_car">driving car</string>
|
||||
<string name="activity_type_ferry">ferry</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_gliding">gliding</string>
|
||||
<string name="activity_type_hang_gliding">hang gliding</string>
|
||||
<string name="activity_type_helicopter">helicopter</string>
|
||||
<string name="activity_type_hiking">walking</string>
|
||||
<string name="activity_type_horse_back_riding">horse riding</string>
|
||||
<string name="activity_type_hot_air_balloon">hot air balloon</string>
|
||||
<string name="activity_type_ice_sailing">ice sailing</string>
|
||||
<string name="activity_type_inline_skating">inline skating</string>
|
||||
<string name="activity_type_kayaking">kayaking</string>
|
||||
<string name="activity_type_kite_surfing">kite surfing</string>
|
||||
<string name="activity_type_land_sailing">land sailing</string>
|
||||
<string name="activity_type_mixed_type">mixed type</string>
|
||||
<string name="activity_type_motor_bike">motor bike</string>
|
||||
<string name="activity_type_motor_boating">motor boating</string>
|
||||
<string name="activity_type_mountain_biking">mountain biking</string>
|
||||
<string name="activity_type_off_trail_hiking">off-trail walking</string>
|
||||
<string name="activity_type_other">other</string>
|
||||
<string name="activity_type_paddling">canoeing</string>
|
||||
<string name="activity_type_para_gliding">para-gliding</string>
|
||||
<string name="activity_type_rc_airplane">RC aeroplane</string>
|
||||
<string name="activity_type_rc_boat">RC boat</string>
|
||||
<string name="activity_type_rc_helicopter">RC helicopter</string>
|
||||
<string name="activity_type_riding">riding</string>
|
||||
<string name="activity_type_road_biking">road biking</string>
|
||||
<string name="activity_type_roller_skiing">roller skiing</string>
|
||||
<string name="activity_type_rowing">rowing</string>
|
||||
<string name="activity_type_running">running</string>
|
||||
<string name="activity_type_sailing">sailing</string>
|
||||
<string name="activity_type_seaplane">sea plane</string>
|
||||
<string name="activity_type_skate_boarding">skate boarding</string>
|
||||
<string name="activity_type_skating">skating</string>
|
||||
<string name="activity_type_skiing">skiing</string>
|
||||
<string name="activity_type_sky_jumping">sky jumping</string>
|
||||
<string name="activity_type_sled">sledding</string>
|
||||
<string name="activity_type_snow_boarding">snow boarding</string>
|
||||
<string name="activity_type_snow_shoeing">snow shoeing</string>
|
||||
<string name="activity_type_speed_walking">speed walking</string>
|
||||
<string name="activity_type_street_running">street running</string>
|
||||
<string name="activity_type_surfing">surfing</string>
|
||||
<string name="activity_type_track_cycling">track cycling</string>
|
||||
<string name="activity_type_track_running">track running</string>
|
||||
<string name="activity_type_trail_hiking">trail walking</string>
|
||||
<string name="activity_type_trail_running">trail running</string>
|
||||
<string name="activity_type_train">train</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_unknown">unknown</string>
|
||||
<string name="activity_type_wakeboarding">wake boarding</string>
|
||||
<string name="activity_type_walking">walking</string>
|
||||
<string name="activity_type_water_skiing">water skiing</string>
|
||||
<string name="activity_type_wind_surfing">wind surfing</string>
|
||||
<string name="description_activity_type">Activity type: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Average moving pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_moving_speed">Average moving speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_average_pace_in_minute">Average pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_speed">Average speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_elevation_gain">Elevation gain: %1$d m (%2$d ft)</string>
|
||||
<string name="description_elevation_imperial">Elevation (ft)</string>
|
||||
<string name="description_elevation_metric">Elevation (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Fastest pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_location_accuracy">Accuracy (m)</string>
|
||||
<string name="description_location_altitude">Altitude (m)</string>
|
||||
<string name="description_location_bearing">Bearing (deg)</string>
|
||||
<string name="description_location_latitude">Latitude (deg)</string>
|
||||
<string name="description_location_longitude">Longitude (deg)</string>
|
||||
<string name="description_location_speed">Speed (m/s)</string>
|
||||
<string name="description_max_elevation">Max elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_max_grade">Max grade: %1$d %%</string>
|
||||
<string name="description_max_speed">Max speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_min_elevation">Min elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_min_grade">Min grade: %1$d %%</string>
|
||||
<string name="description_moving_time">Moving time: %1$s</string>
|
||||
<string name="description_pace_imperial">Pace (min/mi)</string>
|
||||
<string name="description_pace_metric">Pace (min/km)</string>
|
||||
<string name="description_recorded_time">Recorded: %1$s</string>
|
||||
<string name="description_sensor_cadence">Cadence (rpm)</string>
|
||||
<string name="description_sensor_heart_rate">Heart rate (bpm)</string>
|
||||
<string name="description_sensor_power">Power (W)</string>
|
||||
<string name="description_speed_imperial">Speed (mph)</string>
|
||||
<string name="description_speed_metric">Speed (km/h)</string>
|
||||
<string name="description_time">Time</string>
|
||||
<string name="description_total_distance">Total distance: %1$.2f km (%2$.1f mi)</string>
|
||||
<string name="description_total_time">Total time: %1$s</string>
|
||||
<string name="description_track_point">Point</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">All as %1$s to %2$s</string>
|
||||
<string name="export_all_title">Export to external storage</string>
|
||||
<string name="export_external_storage">External storage</string>
|
||||
<string name="export_external_storage_error">Exported %1$d of %2$s to %3$s</string>
|
||||
<string name="export_external_storage_option">as %1$s to %2$s</string>
|
||||
<string name="export_external_storage_progress_message">Exporting to %1$s…</string>
|
||||
<string name="export_external_storage_success">Exported %1$s to %2$s</string>
|
||||
<string name="export_title">Export to…</string>
|
||||
<string name="external_storage_not_available">External storage not available</string>
|
||||
<string name="external_storage_not_writable">External storage not writable</string>
|
||||
<string name="files_few">%1$d files</string>
|
||||
<string name="files_many">%1$d files</string>
|
||||
<string name="files_one">1 file</string>
|
||||
<string name="files_other">%1$d files</string>
|
||||
<string name="files_two">2 files</string>
|
||||
<string name="files_zero">0 files</string>
|
||||
<string name="generic_add">Add</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_delete_all_confirm_title">Delete all?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Delete selected?</string>
|
||||
<string name="generic_description">Description</string>
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_error_title">Error</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">No</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_progress_title">Please wait…</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_success_title">Success</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Yes</string>
|
||||
<string name="gps_location_access">\'Location access\'</string>
|
||||
<string name="gps_disabled">GPS not enabled. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_location_mode">Select high-accuracy location mode. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_my_location">Current location cannot be determined. Enable more location sources at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Current location cannot be determined. Select the high-accuracy location mode at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_not_found">No GPS found on the device</string>
|
||||
<string name="gps_starting">Starting GPS</string>
|
||||
<string name="gps_starting_error">Unable to start GPS</string>
|
||||
<string name="gps_stopping">Stopping GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Waiting for a better GPS signal</string>
|
||||
<string name="gps_wait_for_signal">Waiting for GPS signal</string>
|
||||
<string name="image_application">Application</string>
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</string>
|
||||
<string name="image_my_location">My Location</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Photo marker</string>
|
||||
<string name="image_record">Record</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">Imported %1$d of %2$s from %3$s</string>
|
||||
<string name="import_no_directory">%1$s does not exist</string>
|
||||
<string name="import_no_file">There were no files to import. Connect your device to your computer and place the files to be imported in %1$s.</string>
|
||||
<string name="import_no_file_title">Import files</string>
|
||||
<string name="import_progress_message">Importing from %1$s…</string>
|
||||
<string name="import_selection_option">All %1$s from %2$s</string>
|
||||
<string name="import_selection_title">Import from external storage</string>
|
||||
<string name="import_success">Imported %1$s from %2$s</string>
|
||||
<string name="marker_add_error">Unable to insert a marker. No GPS signal. Try again.</string>
|
||||
<string name="marker_add_success">A marker was inserted</string>
|
||||
<string name="marker_add_canceled">Cancelled, no marker added</string>
|
||||
<string name="marker_delete_all_confirm_message">All markers for this track will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_message">The marker will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_title">Delete marker?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">The selected markers will be permanently deleted from the device</string>
|
||||
<string name="marker_label_end">%1$s (End)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_split_name_format">Split %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Since last split marker:</string>
|
||||
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
|
||||
<string name="marker_edit_marker_type_hint">Marker type</string>
|
||||
<string name="marker_list_empty_message">You don\'t have any markers</string>
|
||||
<string name="menu_aggregated_statistics">Aggregated stats</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
<string name="menu_delete_all">Delete all</string>
|
||||
<string name="menu_edit">Edit</string>
|
||||
<string name="menu_export">Export</string>
|
||||
<string name="menu_export_all">Export all</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_help_feedback">Help & feedback</string>
|
||||
<string name="menu_help_forum">Help forum</string>
|
||||
<string name="menu_import_all">Import all</string>
|
||||
<string name="menu_insert_marker">Insert marker</string>
|
||||
<string name="menu_insert_photo">Insert photo</string>
|
||||
<string name="menu_map">Map</string>
|
||||
<string name="menu_markers">Markers</string>
|
||||
<string name="menu_play">Play</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_select_all">Select all</string>
|
||||
<string name="menu_sensor_state">Sensor state</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="menu_share">Share</string>
|
||||
<string name="menu_show_on_map">Show on map</string>
|
||||
<string name="menu_split_frequency">Split frequency</string>
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="menu_view_photo">View photo</string>
|
||||
<string name="menu_voice_frequency">Voice frequency</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Recording service</string>
|
||||
<string name="search_global_description">Tracks and markers</string>
|
||||
<string name="search_list_empty_message">No tracks or markers matched your search</string>
|
||||
<string name="search_list_marker_track_location">In track ‘%1$s’.</string>
|
||||
<string name="search_voice_prompt">Say the name of a track or marker</string>
|
||||
<string name="sensor_state_battery">Battery level</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_connected">Connected</string>
|
||||
<string name="sensor_state_connecting">Connecting</string>
|
||||
<string name="sensor_state_disconnected">Disconnected</string>
|
||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_last_sensor_time">Last sensor time</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Sending</string>
|
||||
<string name="settings_not_while_recording">Not available while recording a track</string>
|
||||
<string name="settings_show">Show</string>
|
||||
<string name="settings_advanced">Advanced</string>
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<string name="settings_chart_x_axis">X axis</string>
|
||||
<string name="settings_recording">Recording</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Always resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Never resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Resume a recording after reboot if the last recorded location was within the last %1$s</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Auto-resume</string>
|
||||
<string name="settings_recording_default_activity_title">Default activity type</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. distance</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Recording distance interval</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Recording time interval</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Location is ignored if its accuracy is less than %1$s</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS accuracy</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Date (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_reset">Reset</string>
|
||||
<string name="settings_reset_confirm_message">All settings will be reverted to default values.</string>
|
||||
<string name="settings_reset_confirm_title">Reset now?</string>
|
||||
<string name="settings_reset_done">All settings have been reverted to default values</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Reset bike cadence</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Reset combined bike</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Reset heart rate</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Reset foot pod</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Open Android\'s Bluetooth settings to pair a sensor</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth sensor</string>
|
||||
<string name="settings_sensor_connected">Connected to %1$s</string>
|
||||
<string name="settings_stats_coordinate">Latitude/Longitude</string>
|
||||
<string name="settings_stats_grade_elevation">Grade/elevation</string>
|
||||
<string name="settings_stats_rate_title">Preferred rate</string>
|
||||
<string name="settings_stats_units_imperial">Imperial (miles, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Preferred units</string>
|
||||
<string name="share_track_emails_hint">Email addresses</string>
|
||||
<string name="share_track_picker_title">Select an application</string>
|
||||
<string name="share_track_share_file">Share track file</string>
|
||||
<string name="share_track_share_file_body">I think you might be interested in this track.\n\nTo view this track, use Google Earth or other
|
||||
mapping software.\n\n%1$s</string>
|
||||
<string name="share_track_subject">I would like to share a track with you</string>
|
||||
<string name="stats_average_moving_pace">Avg. moving pace</string>
|
||||
<string name="stats_average_moving_speed">Avg. moving speed</string>
|
||||
<string name="stats_average_pace">Avg. pace</string>
|
||||
<string name="stats_average_speed">Avg. speed</string>
|
||||
<string name="stats_elevation">Elevation</string>
|
||||
<string name="stats_fastest_pace">Fastest pace</string>
|
||||
<string name="stats_gain">Gain</string>
|
||||
<string name="stats_grade">Grade</string>
|
||||
<string name="stats_latitude">Latitude</string>
|
||||
<string name="stats_longitude">Longitude</string>
|
||||
<string name="stats_max">Max</string>
|
||||
<string name="stats_max_speed">Max. speed</string>
|
||||
<string name="stats_min">Min</string>
|
||||
<string name="stats_moving_time">Moving time</string>
|
||||
<string name="stats_pace">Pace</string>
|
||||
<string name="stats_speed">Speed</string>
|
||||
<string name="stats_distance">Distance</string>
|
||||
<string name="stats_total_time">Total time</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Recording your track…</string>
|
||||
<string name="track_markers">%1$s Markers</string>
|
||||
<string name="track_delete_one_confirm_message">The track and its markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_one_confirm_title">Delete track?</string>
|
||||
<string name="track_delete_multiple_confirm_message">The selected tracks and their markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_progress_message">Deleting…</string>
|
||||
<string name="track_detail_chart_tab">Chart</string>
|
||||
<string name="track_detail_stats_tab">Stats</string>
|
||||
<string name="track_edit_activity_type">Activity type (e.g. walking)</string>
|
||||
<string name="track_edit_activity_type_hint">Activity type</string>
|
||||
<string name="track_edit_new_track_title">New Track</string>
|
||||
<string name="track_list_empty_message">Start recording your next adventure here</string>
|
||||
<string name="track_list_record_error">Unable to start recording. No GPS signal. Try again.</string>
|
||||
<string name="track_list_record_success">Now recording a new track</string>
|
||||
<string name="track_widget_config_title">Configure Widget Items</string>
|
||||
<string name="tracks_few">%1$d tracks</string>
|
||||
<string name="tracks_many">%1$d tracks</string>
|
||||
<string name="tracks_one">1 track</string>
|
||||
<string name="tracks_other">%1$d tracks</string>
|
||||
<string name="tracks_two">2 tracks</string>
|
||||
<string name="tracks_zero">0 tracks</string>
|
||||
<string name="unit_feet">ft</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">mi/h</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">min/mi</string>
|
||||
<string name="value_adapt_accuracy">Adapt for accuracy</string>
|
||||
<string name="value_adapt_battery_life">Adapt for battery life</string>
|
||||
<string name="value_always">Always</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f mi</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f mi (poor GPS)</string>
|
||||
<string name="value_integer_feet">%1$d ft</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d ft (excellent GPS)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d ft (recommended)</string>
|
||||
<string name="value_integer_kilobyte">%1$d kB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (excellent GPS)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (poor GPS)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (recommended)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d mph</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Never</string>
|
||||
<string name="value_none">None</string>
|
||||
<string name="value_off">Off</string>
|
||||
<string name="value_smallest">Smallest</string>
|
||||
<string name="value_smallest_recommended">Smallest (recommended)</string>
|
||||
<string name="voice_hours_few">%1$d hours</string>
|
||||
<string name="voice_hours_many">%1$d hours</string>
|
||||
<string name="voice_hours_one">1 hour</string>
|
||||
<string name="voice_hours_other">%1$d hours</string>
|
||||
<string name="voice_hours_two">2 hours</string>
|
||||
<string name="voice_hours_zero">0 hours</string>
|
||||
<string name="voice_minutes_few">%1$d minutes</string>
|
||||
<string name="voice_minutes_many">%1$d minutes</string>
|
||||
<string name="voice_minutes_one">1 minute</string>
|
||||
<string name="voice_minutes_other">%1$d minutes</string>
|
||||
<string name="voice_minutes_two">2 minutes</string>
|
||||
<string name="voice_minutes_zero">0 minutes</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometre</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mile</string>
|
||||
<string name="voice_seconds_few">%1$d seconds</string>
|
||||
<string name="voice_seconds_many">%1$d seconds</string>
|
||||
<string name="voice_seconds_one">1 second</string>
|
||||
<string name="voice_seconds_other">%1$d seconds</string>
|
||||
<string name="voice_seconds_two">2 seconds</string>
|
||||
<string name="voice_seconds_zero">0 seconds</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 kilometre per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 kilometres per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 mile per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 miles per hour</string>
|
||||
<string name="voice_template">OpenTracks %1$s in %2$s at %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_many">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_one">total distance 1 kilometre</string>
|
||||
<string name="voice_total_distance_kilometers_other">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_two">total distance 2 kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_zero">total distance 0 kilometres</string>
|
||||
<string name="voice_total_distance_miles_few">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_many">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_one">total distance 1 mile</string>
|
||||
<string name="voice_total_distance_miles_other">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_two">total distance 2 miles</string>
|
||||
<string name="voice_total_distance_miles_zero">total distance 0 miles</string>
|
||||
<string name="voice_total_distance_zero">OpenTracks total distance zero.</string>
|
||||
<string name="waypoint_type_atm">Cashpoint</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar/pub</string>
|
||||
<string name="waypoint_type_barbecue">barbecue</string>
|
||||
<string name="waypoint_type_building">building</string>
|
||||
<string name="waypoint_type_bus_stop">bus stop</string>
|
||||
<string name="waypoint_type_cafe">cafe</string>
|
||||
<string name="waypoint_type_campfire">camp fire</string>
|
||||
<string name="waypoint_type_campground">Campsites</string>
|
||||
<string name="waypoint_type_church">church</string>
|
||||
<string name="waypoint_type_coffee_house">cafe</string>
|
||||
<string name="waypoint_type_convenience_store">corner shops</string>
|
||||
<string name="waypoint_type_drinking_water">drinking water</string>
|
||||
<string name="waypoint_type_falling_rocks">falling rocks</string>
|
||||
<string name="waypoint_type_ferry">ferry</string>
|
||||
<string name="waypoint_type_fire_place">fireplace</string>
|
||||
<string name="waypoint_type_fire_station">fire station</string>
|
||||
<string name="waypoint_type_fishing">fishing</string>
|
||||
<string name="waypoint_type_gas_station">petrol station</string>
|
||||
<string name="waypoint_type_golf_course">golf course</string>
|
||||
<string name="waypoint_type_grocery_store">grocers</string>
|
||||
<string name="waypoint_type_hair_dresser">hair dresser</string>
|
||||
<string name="waypoint_type_harbor">harbour</string>
|
||||
<string name="waypoint_type_hiking_path">footpath</string>
|
||||
<string name="waypoint_type_hotel">hotel</string>
|
||||
<string name="waypoint_type_house">house</string>
|
||||
<string name="waypoint_type_information">information</string>
|
||||
<string name="waypoint_type_intersection">intersection</string>
|
||||
<string name="waypoint_type_mail_box">post box</string>
|
||||
<string name="waypoint_type_market">market</string>
|
||||
<string name="waypoint_type_meeting_point">meeting point</string>
|
||||
<string name="waypoint_type_opera">opera</string>
|
||||
<string name="waypoint_type_parking">parking</string>
|
||||
<string name="waypoint_type_police_station">police station</string>
|
||||
<string name="waypoint_type_post_office">post office</string>
|
||||
<string name="waypoint_type_pothole">pothole</string>
|
||||
<string name="waypoint_type_railway_crossing">railway crossing</string>
|
||||
<string name="waypoint_type_restaurant">restaurant</string>
|
||||
<string name="waypoint_type_shopping">shopping</string>
|
||||
<string name="waypoint_type_sight">sight</string>
|
||||
<string name="waypoint_type_store">shop</string>
|
||||
<string name="waypoint_type_swimming_pool">swimming pool</string>
|
||||
<string name="waypoint_type_telephone">telephone</string>
|
||||
<string name="waypoint_type_theater">theatre</string>
|
||||
<string name="waypoint_type_toilet">toilet</string>
|
||||
<string name="waypoint_type_tourist_information">tourist information</string>
|
||||
<string name="waypoint_type_tree">tree</string>
|
||||
<string name="waypoint_type_tunnel">tunnel</string>
|
||||
<string name="waypoint_type_waterfall">waterfall</string>
|
||||
<string name="waypoint_type_water_fountain">water fountain</string>
|
||||
<string name="waypoint_type_waypoint">waypoint</string>
|
||||
</resources>
|
||||
@@ -1,453 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">airplane</string>
|
||||
<string name="activity_type_atv">ATV</string>
|
||||
<string name="activity_type_biking">biking</string>
|
||||
<string name="activity_type_blimp">blimp</string>
|
||||
<string name="activity_type_boat">boat</string>
|
||||
<string name="activity_type_climbing">climbing</string>
|
||||
<string name="activity_type_commercial_airplane">commercial airplane</string>
|
||||
<string name="activity_type_cross_country_skiing">cross-country skiing</string>
|
||||
<string name="activity_type_cycling">cycling</string>
|
||||
<string name="activity_type_dirt_bike">dirt bike</string>
|
||||
<string name="activity_type_donkey_back_riding">donkey back riding</string>
|
||||
<string name="activity_type_driving">driving</string>
|
||||
<string name="activity_type_driving_bus">driving bus</string>
|
||||
<string name="activity_type_driving_car">driving car</string>
|
||||
<string name="activity_type_ferry">ferry</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_gliding">gliding</string>
|
||||
<string name="activity_type_hang_gliding">hang gliding</string>
|
||||
<string name="activity_type_helicopter">helicopter</string>
|
||||
<string name="activity_type_hiking">hiking</string>
|
||||
<string name="activity_type_horse_back_riding">horse back riding</string>
|
||||
<string name="activity_type_hot_air_balloon">hot air balloon</string>
|
||||
<string name="activity_type_ice_sailing">ice sailing</string>
|
||||
<string name="activity_type_inline_skating">inline skating</string>
|
||||
<string name="activity_type_kayaking">kayaking</string>
|
||||
<string name="activity_type_kite_surfing">kite surfing</string>
|
||||
<string name="activity_type_land_sailing">land sailing</string>
|
||||
<string name="activity_type_mixed_type">mixed type</string>
|
||||
<string name="activity_type_motor_bike">motor bike</string>
|
||||
<string name="activity_type_motor_boating">motor boating</string>
|
||||
<string name="activity_type_mountain_biking">mountain biking</string>
|
||||
<string name="activity_type_off_trail_hiking">off trail hiking</string>
|
||||
<string name="activity_type_other">other</string>
|
||||
<string name="activity_type_paddling">paddling</string>
|
||||
<string name="activity_type_para_gliding">para gliding</string>
|
||||
<string name="activity_type_rc_airplane">RC airplane</string>
|
||||
<string name="activity_type_rc_boat">RC boat</string>
|
||||
<string name="activity_type_rc_helicopter">RC helicopter</string>
|
||||
<string name="activity_type_riding">riding</string>
|
||||
<string name="activity_type_road_biking">road biking</string>
|
||||
<string name="activity_type_roller_skiing">roller skiing</string>
|
||||
<string name="activity_type_rowing">rowing</string>
|
||||
<string name="activity_type_running">running</string>
|
||||
<string name="activity_type_sailing">sailing</string>
|
||||
<string name="activity_type_seaplane">seaplane</string>
|
||||
<string name="activity_type_skate_boarding">skate boarding</string>
|
||||
<string name="activity_type_skating">skating</string>
|
||||
<string name="activity_type_skiing">skiing</string>
|
||||
<string name="activity_type_sky_jumping">sky jumping</string>
|
||||
<string name="activity_type_sled">sled</string>
|
||||
<string name="activity_type_snow_boarding">snow boarding</string>
|
||||
<string name="activity_type_snow_shoeing">snow shoeing</string>
|
||||
<string name="activity_type_speed_walking">speed walking</string>
|
||||
<string name="activity_type_street_running">street running</string>
|
||||
<string name="activity_type_surfing">surfing</string>
|
||||
<string name="activity_type_track_cycling">track cycling</string>
|
||||
<string name="activity_type_track_running">track running</string>
|
||||
<string name="activity_type_trail_hiking">trail hiking</string>
|
||||
<string name="activity_type_trail_running">trail running</string>
|
||||
<string name="activity_type_train">train</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_unknown">unknown</string>
|
||||
<string name="activity_type_wakeboarding">wakeboarding</string>
|
||||
<string name="activity_type_walking">walking</string>
|
||||
<string name="activity_type_water_skiing">water skiing</string>
|
||||
<string name="activity_type_wind_surfing">wind surfing</string>
|
||||
<string name="description_activity_type">Activity type: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Average moving pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_moving_speed">Average moving speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_average_pace_in_minute">Average pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_speed">Average speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_elevation_gain">Elevation gain: %1$d m (%2$d ft)</string>
|
||||
<string name="description_elevation_imperial">Elevation (ft)</string>
|
||||
<string name="description_elevation_metric">Elevation (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Fastest pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_location_accuracy">Accuracy (m)</string>
|
||||
<string name="description_location_altitude">Altitude (m)</string>
|
||||
<string name="description_location_bearing">Bearing (deg)</string>
|
||||
<string name="description_location_latitude">Latitude (deg)</string>
|
||||
<string name="description_location_longitude">Longitude (deg)</string>
|
||||
<string name="description_location_speed">Speed (m/s)</string>
|
||||
<string name="description_max_elevation">Max elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_max_grade">Max grade: %1$d %%</string>
|
||||
<string name="description_max_speed">Max speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_min_elevation">Min elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_min_grade">Min grade: %1$d %%</string>
|
||||
<string name="description_moving_time">Moving time: %1$s</string>
|
||||
<string name="description_pace_imperial">Pace (min/mi)</string>
|
||||
<string name="description_pace_metric">Pace (min/km)</string>
|
||||
<string name="description_recorded_time">Recorded: %1$s</string>
|
||||
<string name="description_sensor_cadence">Cadence (rpm)</string>
|
||||
<string name="description_sensor_heart_rate">Heart rate (bpm)</string>
|
||||
<string name="description_sensor_power">Power (W)</string>
|
||||
<string name="description_speed_imperial">Speed (mi/hr)</string>
|
||||
<string name="description_speed_metric">Speed (km/hr)</string>
|
||||
<string name="description_time">Time</string>
|
||||
<string name="description_total_distance">Total distance: %1$.2f km (%2$.1f mi)</string>
|
||||
<string name="description_total_time">Total time: %1$s</string>
|
||||
<string name="description_track_point">Point</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">All as %1$s to %2$s</string>
|
||||
<string name="export_all_title">Export to external storage</string>
|
||||
<string name="export_external_storage">External storage</string>
|
||||
<string name="export_external_storage_error">Exported %1$d of %2$s to %3$s</string>
|
||||
<string name="export_external_storage_option">as %1$s to %2$s</string>
|
||||
<string name="export_external_storage_progress_message">Exporting to %1$s…</string>
|
||||
<string name="export_external_storage_success">Exported %1$s to %2$s</string>
|
||||
<string name="export_title">Export to…</string>
|
||||
<string name="external_storage_not_available">External storage not available</string>
|
||||
<string name="external_storage_not_writable">External storage not writable</string>
|
||||
<string name="files_few">%1$d files</string>
|
||||
<string name="files_many">%1$d files</string>
|
||||
<string name="files_one">1 file</string>
|
||||
<string name="files_other">%1$d files</string>
|
||||
<string name="files_two">2 files</string>
|
||||
<string name="files_zero">0 files</string>
|
||||
<string name="generic_add">Add</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_delete_all_confirm_title">Delete all?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Delete selected?</string>
|
||||
<string name="generic_description">Description</string>
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_error_title">Error</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">No</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_progress_title">Please wait…</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_success_title">Success</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Yes</string>
|
||||
<string name="gps_location_access">‘Location access’</string>
|
||||
<string name="gps_disabled">GPS not enabled. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_location_mode">Select high-accuracy location mode. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_my_location">Current location cannot be determined. Enable more location sources at %1$s & make sure the
|
||||
sky is visible. Try again later.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Current location cannot be determined. Select the high-accuracy location mode at %1$s & make
|
||||
sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_not_found">No GPS is found on the device</string>
|
||||
<string name="gps_starting">Starting GPS</string>
|
||||
<string name="gps_starting_error">Unable to start GPS</string>
|
||||
<string name="gps_stopping">Stopping GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Waiting for a better GPS signal</string>
|
||||
<string name="gps_wait_for_signal">Waiting for GPS signal</string>
|
||||
<string name="image_application">Application</string>
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</string>
|
||||
<string name="image_my_location">My Location</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Photo marker</string>
|
||||
<string name="image_record">Record</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">Imported %1$d of %2$s from %3$s</string>
|
||||
<string name="import_no_directory">%1$s does not exist</string>
|
||||
<string name="import_no_file">There were no files to import. Connect your device to your computer and place the files to
|
||||
import in %1$s.</string>
|
||||
<string name="import_no_file_title">Import files</string>
|
||||
<string name="import_progress_message">Importing from %1$s…</string>
|
||||
<string name="import_selection_option">All %1$s from %2$s</string>
|
||||
<string name="import_selection_title">Import from external storage</string>
|
||||
<string name="import_success">Imported %1$s from %2$s</string>
|
||||
<string name="marker_add_error">Unable to insert a marker. No GPS signal. Try again.</string>
|
||||
<string name="marker_add_success">A marker was inserted</string>
|
||||
<string name="marker_add_canceled">Canceled, no marker added</string>
|
||||
<string name="marker_delete_all_confirm_message">All markers for this track will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_message">The marker will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_title">Delete marker?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">The selected markers will be permanently deleted from the device</string>
|
||||
<string name="marker_label_end">%1$s (End)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_split_name_format">Split %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Since last split marker:</string>
|
||||
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
|
||||
<string name="marker_edit_marker_type_hint">Marker type</string>
|
||||
<string name="marker_list_empty_message">You don\'t have any markers</string>
|
||||
<string name="menu_aggregated_statistics">Aggregated stats</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
<string name="menu_delete_all">Delete all</string>
|
||||
<string name="menu_edit">Edit</string>
|
||||
<string name="menu_export">Export</string>
|
||||
<string name="menu_export_all">Export all</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_help_feedback">Help & feedback</string>
|
||||
<string name="menu_help_forum">Help forum</string>
|
||||
<string name="menu_import_all">Import all</string>
|
||||
<string name="menu_insert_marker">Insert marker</string>
|
||||
<string name="menu_insert_photo">Insert photo</string>
|
||||
<string name="menu_map">Map</string>
|
||||
<string name="menu_markers">Markers</string>
|
||||
<string name="menu_play">Play</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_select_all">Select all</string>
|
||||
<string name="menu_sensor_state">Sensor state</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="menu_share">Share</string>
|
||||
<string name="menu_show_on_map">Show on map</string>
|
||||
<string name="menu_split_frequency">Split frequency</string>
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="menu_view_photo">View photo</string>
|
||||
<string name="menu_voice_frequency">Voice frequency</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Recording service</string>
|
||||
<string name="search_global_description">Tracks and markers</string>
|
||||
<string name="search_list_empty_message">No tracks or markers matched your search</string>
|
||||
<string name="search_list_marker_track_location">In track ‘%1$s’.</string>
|
||||
<string name="search_voice_prompt">Speak the name of a track or marker</string>
|
||||
<string name="sensor_state_battery">Battery level</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_connected">Connected</string>
|
||||
<string name="sensor_state_connecting">Connecting</string>
|
||||
<string name="sensor_state_disconnected">Disconnected</string>
|
||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_last_sensor_time">Last sensor time</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Sending</string>
|
||||
<string name="settings_not_while_recording">Not available while recording a track</string>
|
||||
<string name="settings_show">Show</string>
|
||||
<string name="settings_advanced">Advanced</string>
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<string name="settings_chart_x_axis">X axis</string>
|
||||
<string name="settings_recording">Recording</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Always resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Never resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Resume a recording after reboot if the last recorded location was within the last %1$s</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Auto-resume</string>
|
||||
<string name="settings_recording_default_activity_title">Default activity type</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max distance</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Recording distance interval</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Recording time interval</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Location is ignored if its accuracy is less than %1$s</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS accuracy</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Date (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_reset">Reset</string>
|
||||
<string name="settings_reset_confirm_message">All settings will be reverted to the default values.</string>
|
||||
<string name="settings_reset_confirm_title">Reset now?</string>
|
||||
<string name="settings_reset_done">All settings have been reverted to the default values</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Reset bike cadence</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Reset combined bike</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Reset heart rate</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Reset foot pod</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Open Android\'s Bluetooth settings to pair a sensor</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth sensor</string>
|
||||
<string name="settings_sensor_connected">Connected to %1$s</string>
|
||||
<string name="settings_stats_coordinate">Latitude/Longitude</string>
|
||||
<string name="settings_stats_grade_elevation">Grade/Elevation</string>
|
||||
<string name="settings_stats_rate_title">Preferred rate</string>
|
||||
<string name="settings_stats_units_imperial">Imperial (mi, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Preferred units</string>
|
||||
<string name="share_track_emails_hint">Email addresses</string>
|
||||
<string name="share_track_picker_title">Select an application</string>
|
||||
<string name="share_track_share_file">Share track file</string>
|
||||
<string name="share_track_share_file_body">I think you might be interested in this track.\n\nTo view this track, use Google Earth or other
|
||||
mapping software.\n\n%1$s</string>
|
||||
<string name="share_track_subject">I would like to share a track with you</string>
|
||||
<string name="stats_average_moving_pace">Avg moving pace</string>
|
||||
<string name="stats_average_moving_speed">Avg moving speed</string>
|
||||
<string name="stats_average_pace">Avg pace</string>
|
||||
<string name="stats_average_speed">Avg speed</string>
|
||||
<string name="stats_elevation">Elevation</string>
|
||||
<string name="stats_fastest_pace">Fastest pace</string>
|
||||
<string name="stats_gain">Gain</string>
|
||||
<string name="stats_grade">Grade</string>
|
||||
<string name="stats_latitude">Latitude</string>
|
||||
<string name="stats_longitude">Longitude</string>
|
||||
<string name="stats_max">Max</string>
|
||||
<string name="stats_max_speed">Max speed</string>
|
||||
<string name="stats_min">Min</string>
|
||||
<string name="stats_moving_time">Moving time</string>
|
||||
<string name="stats_pace">Pace</string>
|
||||
<string name="stats_speed">Speed</string>
|
||||
<string name="stats_distance">Distance</string>
|
||||
<string name="stats_total_time">Total time</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Recording your track…</string>
|
||||
<string name="track_markers">%1$s Markers</string>
|
||||
<string name="track_delete_one_confirm_message">The track and its markers will be permanently deleted from the device.</string>
|
||||
<string name="track_delete_one_confirm_title">Delete track?</string>
|
||||
<string name="track_delete_multiple_confirm_message">The selected tracks and their markers will be permanently deleted from the device.</string>
|
||||
<string name="track_delete_progress_message">Deleting…</string>
|
||||
<string name="track_detail_chart_tab">Chart</string>
|
||||
<string name="track_detail_stats_tab">Stats</string>
|
||||
<string name="track_edit_activity_type">Activity type (e.g. hiking)</string>
|
||||
<string name="track_edit_activity_type_hint">Activity type</string>
|
||||
<string name="track_edit_new_track_title">New Track</string>
|
||||
<string name="track_list_empty_message">Start recording your next adventure here</string>
|
||||
<string name="track_list_record_error">Unable to start recording. No GPS signal. Try again.</string>
|
||||
<string name="track_list_record_success">Now recording a new track</string>
|
||||
<string name="track_widget_config_title">Configure Widget Items</string>
|
||||
<string name="tracks_few">%1$d tracks</string>
|
||||
<string name="tracks_many">%1$d tracks</string>
|
||||
<string name="tracks_one">1 track</string>
|
||||
<string name="tracks_other">%1$d tracks</string>
|
||||
<string name="tracks_two">2 tracks</string>
|
||||
<string name="tracks_zero">0 tracks</string>
|
||||
<string name="unit_feet">ft</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">mi/h</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">min/mi</string>
|
||||
<string name="value_adapt_accuracy">Adapt for accuracy</string>
|
||||
<string name="value_adapt_battery_life">Adapt for battery life</string>
|
||||
<string name="value_always">Always</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f mi</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f mi (poor GPS)</string>
|
||||
<string name="value_integer_feet">%1$d ft</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d ft (excellent GPS)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d ft (recommended)</string>
|
||||
<string name="value_integer_kilobyte">%1$d kB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (excellent GPS)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (poor GPS)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (recommended)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d mi/h</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Never</string>
|
||||
<string name="value_none">None</string>
|
||||
<string name="value_off">Off</string>
|
||||
<string name="value_smallest">Smallest</string>
|
||||
<string name="value_smallest_recommended">Smallest (recommended)</string>
|
||||
<string name="voice_hours_few">%1$d hours</string>
|
||||
<string name="voice_hours_many">%1$d hours</string>
|
||||
<string name="voice_hours_one">1 hour</string>
|
||||
<string name="voice_hours_other">%1$d hours</string>
|
||||
<string name="voice_hours_two">2 hours</string>
|
||||
<string name="voice_hours_zero">0 hours</string>
|
||||
<string name="voice_minutes_few">%1$d minutes</string>
|
||||
<string name="voice_minutes_many">%1$d minutes</string>
|
||||
<string name="voice_minutes_one">1 minute</string>
|
||||
<string name="voice_minutes_other">%1$d minutes</string>
|
||||
<string name="voice_minutes_two">2 minutes</string>
|
||||
<string name="voice_minutes_zero">0 minutes</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometer</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mile</string>
|
||||
<string name="voice_seconds_few">%1$d seconds</string>
|
||||
<string name="voice_seconds_many">%1$d seconds</string>
|
||||
<string name="voice_seconds_one">1 second</string>
|
||||
<string name="voice_seconds_other">%1$d seconds</string>
|
||||
<string name="voice_seconds_two">2 seconds</string>
|
||||
<string name="voice_seconds_zero">0 seconds</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f kilometers per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f kilometers per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 kilometer per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f kilometers per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 kilometers per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 kilometers per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 mile per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 miles per hour</string>
|
||||
<string name="voice_template">OpenTracks %1$s in %2$s at %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">total distance %1$.2f kilometers</string>
|
||||
<string name="voice_total_distance_kilometers_many">total distance %1$.2f kilometers</string>
|
||||
<string name="voice_total_distance_kilometers_one">total distance 1 kilometer</string>
|
||||
<string name="voice_total_distance_kilometers_other">total distance %1$.2f kilometers</string>
|
||||
<string name="voice_total_distance_kilometers_two">total distance 2 kilometers</string>
|
||||
<string name="voice_total_distance_kilometers_zero">total distance 0 kilometers</string>
|
||||
<string name="voice_total_distance_miles_few">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_many">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_one">total distance 1 mile</string>
|
||||
<string name="voice_total_distance_miles_other">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_two">total distance 2 miles</string>
|
||||
<string name="voice_total_distance_miles_zero">total distance 0 miles</string>
|
||||
<string name="voice_total_distance_zero">OpenTracks total distance zero.</string>
|
||||
<string name="waypoint_type_atm">ATM</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar</string>
|
||||
<string name="waypoint_type_barbecue">barbecue</string>
|
||||
<string name="waypoint_type_building">building</string>
|
||||
<string name="waypoint_type_bus_stop">bus stop</string>
|
||||
<string name="waypoint_type_cafe">cafe</string>
|
||||
<string name="waypoint_type_campfire">campfire</string>
|
||||
<string name="waypoint_type_campground">campground</string>
|
||||
<string name="waypoint_type_church">church</string>
|
||||
<string name="waypoint_type_coffee_house">coffee house</string>
|
||||
<string name="waypoint_type_convenience_store">convenience store</string>
|
||||
<string name="waypoint_type_drinking_water">drinking water</string>
|
||||
<string name="waypoint_type_falling_rocks">falling rocks</string>
|
||||
<string name="waypoint_type_ferry">ferry</string>
|
||||
<string name="waypoint_type_fire_place">fire place</string>
|
||||
<string name="waypoint_type_fire_station">fire station</string>
|
||||
<string name="waypoint_type_fishing">fishing</string>
|
||||
<string name="waypoint_type_gas_station">gas station</string>
|
||||
<string name="waypoint_type_golf_course">golf course</string>
|
||||
<string name="waypoint_type_grocery_store">grocery store</string>
|
||||
<string name="waypoint_type_hair_dresser">hair dresser</string>
|
||||
<string name="waypoint_type_harbor">harbor</string>
|
||||
<string name="waypoint_type_hiking_path">hiking path</string>
|
||||
<string name="waypoint_type_hotel">hotel</string>
|
||||
<string name="waypoint_type_house">house</string>
|
||||
<string name="waypoint_type_information">information</string>
|
||||
<string name="waypoint_type_intersection">intersection</string>
|
||||
<string name="waypoint_type_mail_box">mail box</string>
|
||||
<string name="waypoint_type_market">market</string>
|
||||
<string name="waypoint_type_meeting_point">meeting point</string>
|
||||
<string name="waypoint_type_opera">opera</string>
|
||||
<string name="waypoint_type_parking">parking</string>
|
||||
<string name="waypoint_type_police_station">police station</string>
|
||||
<string name="waypoint_type_post_office">post office</string>
|
||||
<string name="waypoint_type_pothole">pothole</string>
|
||||
<string name="waypoint_type_railway_crossing">railway crossing</string>
|
||||
<string name="waypoint_type_restaurant">restaurant</string>
|
||||
<string name="waypoint_type_shopping">shopping</string>
|
||||
<string name="waypoint_type_sight">sight</string>
|
||||
<string name="waypoint_type_store">store</string>
|
||||
<string name="waypoint_type_swimming_pool">swimming pool</string>
|
||||
<string name="waypoint_type_telephone">telephone</string>
|
||||
<string name="waypoint_type_theater">theater</string>
|
||||
<string name="waypoint_type_toilet">toilet</string>
|
||||
<string name="waypoint_type_tourist_information">tourist information</string>
|
||||
<string name="waypoint_type_tree">tree</string>
|
||||
<string name="waypoint_type_tunnel">tunnel</string>
|
||||
<string name="waypoint_type_waterfall">waterfall</string>
|
||||
<string name="waypoint_type_water_fountain">water fountain</string>
|
||||
<string name="waypoint_type_waypoint">waypoint</string>
|
||||
</resources>
|
||||
@@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">aeroplane</string>
|
||||
<string name="activity_type_atv">ATV</string>
|
||||
<string name="activity_type_biking">biking</string>
|
||||
<string name="activity_type_blimp">airship</string>
|
||||
<string name="activity_type_boat">boat</string>
|
||||
<string name="activity_type_climbing">climbing</string>
|
||||
<string name="activity_type_commercial_airplane">commercial aeroplane</string>
|
||||
<string name="activity_type_cross_country_skiing">Cross-country skiing</string>
|
||||
<string name="activity_type_cycling">cycling</string>
|
||||
<string name="activity_type_dirt_bike">dirt bike</string>
|
||||
<string name="activity_type_donkey_back_riding">donkey riding</string>
|
||||
<string name="activity_type_driving">driving</string>
|
||||
<string name="activity_type_driving_bus">driving bus</string>
|
||||
<string name="activity_type_driving_car">driving car</string>
|
||||
<string name="activity_type_ferry">ferry</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_gliding">gliding</string>
|
||||
<string name="activity_type_hang_gliding">hang gliding</string>
|
||||
<string name="activity_type_helicopter">helicopter</string>
|
||||
<string name="activity_type_hiking">walking</string>
|
||||
<string name="activity_type_horse_back_riding">horse riding</string>
|
||||
<string name="activity_type_hot_air_balloon">hot air balloon</string>
|
||||
<string name="activity_type_ice_sailing">ice sailing</string>
|
||||
<string name="activity_type_inline_skating">inline skating</string>
|
||||
<string name="activity_type_kayaking">kayaking</string>
|
||||
<string name="activity_type_kite_surfing">kite surfing</string>
|
||||
<string name="activity_type_land_sailing">land sailing</string>
|
||||
<string name="activity_type_mixed_type">mixed type</string>
|
||||
<string name="activity_type_motor_bike">motor bike</string>
|
||||
<string name="activity_type_motor_boating">motor boating</string>
|
||||
<string name="activity_type_mountain_biking">mountain biking</string>
|
||||
<string name="activity_type_off_trail_hiking">off-trail walking</string>
|
||||
<string name="activity_type_other">other</string>
|
||||
<string name="activity_type_paddling">canoeing</string>
|
||||
<string name="activity_type_para_gliding">para-gliding</string>
|
||||
<string name="activity_type_rc_airplane">RC aeroplane</string>
|
||||
<string name="activity_type_rc_boat">RC boat</string>
|
||||
<string name="activity_type_rc_helicopter">RC helicopter</string>
|
||||
<string name="activity_type_riding">riding</string>
|
||||
<string name="activity_type_road_biking">road biking</string>
|
||||
<string name="activity_type_roller_skiing">roller skiing</string>
|
||||
<string name="activity_type_rowing">rowing</string>
|
||||
<string name="activity_type_running">running</string>
|
||||
<string name="activity_type_sailing">sailing</string>
|
||||
<string name="activity_type_seaplane">sea plane</string>
|
||||
<string name="activity_type_skate_boarding">skate boarding</string>
|
||||
<string name="activity_type_skating">skating</string>
|
||||
<string name="activity_type_skiing">skiing</string>
|
||||
<string name="activity_type_sky_jumping">sky jumping</string>
|
||||
<string name="activity_type_sled">sledding</string>
|
||||
<string name="activity_type_snow_boarding">snow boarding</string>
|
||||
<string name="activity_type_snow_shoeing">snow shoeing</string>
|
||||
<string name="activity_type_speed_walking">speed walking</string>
|
||||
<string name="activity_type_street_running">street running</string>
|
||||
<string name="activity_type_surfing">surfing</string>
|
||||
<string name="activity_type_track_cycling">track cycling</string>
|
||||
<string name="activity_type_track_running">track running</string>
|
||||
<string name="activity_type_trail_hiking">trail walking</string>
|
||||
<string name="activity_type_trail_running">trail running</string>
|
||||
<string name="activity_type_train">train</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_unknown">unknown</string>
|
||||
<string name="activity_type_wakeboarding">wake boarding</string>
|
||||
<string name="activity_type_walking">walking</string>
|
||||
<string name="activity_type_water_skiing">water skiing</string>
|
||||
<string name="activity_type_wind_surfing">wind surfing</string>
|
||||
<string name="description_activity_type">Activity type: %1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">Average moving pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_moving_speed">Average moving speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_average_pace_in_minute">Average pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_average_speed">Average speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_elevation_gain">Elevation gain: %1$d m (%2$d ft)</string>
|
||||
<string name="description_elevation_imperial">Elevation (ft)</string>
|
||||
<string name="description_elevation_metric">Elevation (m)</string>
|
||||
<string name="description_fastest_pace_in_minute">Fastest pace: %1$s min/km (%2$s min/mi)</string>
|
||||
<string name="description_location_accuracy">Accuracy (m)</string>
|
||||
<string name="description_location_altitude">Altitude (m)</string>
|
||||
<string name="description_location_bearing">Bearing (deg)</string>
|
||||
<string name="description_location_latitude">Latitude (deg)</string>
|
||||
<string name="description_location_longitude">Longitude (deg)</string>
|
||||
<string name="description_location_speed">Speed (m/s)</string>
|
||||
<string name="description_max_elevation">Max elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_max_grade">Max grade: %1$d %%</string>
|
||||
<string name="description_max_speed">Max speed: %1$.2f km/h (%2$.1f mi/h)</string>
|
||||
<string name="description_min_elevation">Min elevation: %1$d m (%2$d ft)</string>
|
||||
<string name="description_min_grade">Min grade: %1$d %%</string>
|
||||
<string name="description_moving_time">Moving time: %1$s</string>
|
||||
<string name="description_pace_imperial">Pace (min/mi)</string>
|
||||
<string name="description_pace_metric">Pace (min/km)</string>
|
||||
<string name="description_recorded_time">Recorded: %1$s</string>
|
||||
<string name="description_sensor_cadence">Cadence (rpm)</string>
|
||||
<string name="description_sensor_heart_rate">Heart rate (bpm)</string>
|
||||
<string name="description_sensor_power">Power (W)</string>
|
||||
<string name="description_speed_imperial">Speed (mph)</string>
|
||||
<string name="description_speed_metric">Speed (km/h)</string>
|
||||
<string name="description_time">Time</string>
|
||||
<string name="description_total_distance">Total distance: %1$.2f km (%2$.1f mi)</string>
|
||||
<string name="description_total_time">Total time: %1$s</string>
|
||||
<string name="description_track_point">Point</string>
|
||||
<string name="description_track_segment">Segment</string>
|
||||
<string name="export_all_option">All as %1$s to %2$s</string>
|
||||
<string name="export_all_title">Export to external storage</string>
|
||||
<string name="export_external_storage">External storage</string>
|
||||
<string name="export_external_storage_error">Exported %1$d of %2$s to %3$s</string>
|
||||
<string name="export_external_storage_option">as %1$s to %2$s</string>
|
||||
<string name="export_external_storage_progress_message">Exporting to %1$s…</string>
|
||||
<string name="export_external_storage_success">Exported %1$s to %2$s</string>
|
||||
<string name="export_title">Export to…</string>
|
||||
<string name="external_storage_not_available">External storage not available</string>
|
||||
<string name="external_storage_not_writable">External storage not writable</string>
|
||||
<string name="files_few">%1$d files</string>
|
||||
<string name="files_many">%1$d files</string>
|
||||
<string name="files_one">1 file</string>
|
||||
<string name="files_other">%1$d files</string>
|
||||
<string name="files_two">2 files</string>
|
||||
<string name="files_zero">0 files</string>
|
||||
<string name="generic_add">Add</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_delete_all_confirm_title">Delete all?</string>
|
||||
<string name="generic_delete_selected_confirm_title">Delete selected?</string>
|
||||
<string name="generic_description">Description</string>
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_error_title">Error</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_no">No</string>
|
||||
<string name="generic_ok">OK</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_progress_title">Please wait…</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_success_title">Success</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
<string name="generic_yes">Yes</string>
|
||||
<string name="gps_location_access">\'Location access\'</string>
|
||||
<string name="gps_disabled">GPS not enabled. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_location_mode">Select high-accuracy location mode. Tap here to go to %1$s. Press the back button to return.</string>
|
||||
<string name="gps_disabled_my_location">Current location cannot be determined. Enable more location sources at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_disabled_my_location_location_mode">Current location cannot be determined. Select the high-accuracy location mode at %1$s and make sure the sky is visible. Try again later.</string>
|
||||
<string name="gps_not_found">No GPS found on the device</string>
|
||||
<string name="gps_starting">Starting GPS</string>
|
||||
<string name="gps_starting_error">Unable to start GPS</string>
|
||||
<string name="gps_stopping">Stopping GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Waiting for a better GPS signal</string>
|
||||
<string name="gps_wait_for_signal">Waiting for GPS signal</string>
|
||||
<string name="image_application">Application</string>
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</string>
|
||||
<string name="image_my_location">My Location</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Photo marker</string>
|
||||
<string name="image_record">Record</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
<string name="image_track">Track</string>
|
||||
<string name="import_error">Imported %1$d of %2$s from %3$s</string>
|
||||
<string name="import_no_directory">%1$s does not exist</string>
|
||||
<string name="import_no_file">There were no files to import. Connect your device to your computer and place the files to be imported in %1$s.</string>
|
||||
<string name="import_no_file_title">Import files</string>
|
||||
<string name="import_progress_message">Importing from %1$s…</string>
|
||||
<string name="import_selection_option">All %1$s from %2$s</string>
|
||||
<string name="import_selection_title">Import from external storage</string>
|
||||
<string name="import_success">Imported %1$s from %2$s</string>
|
||||
<string name="marker_add_error">Unable to insert a marker. No GPS signal. Try again.</string>
|
||||
<string name="marker_add_success">A marker was inserted</string>
|
||||
<string name="marker_add_canceled">Cancelled, no marker added</string>
|
||||
<string name="marker_delete_all_confirm_message">All markers for this track will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_message">The marker will be permanently deleted from the device</string>
|
||||
<string name="marker_delete_one_confirm_title">Delete marker?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">The selected markers will be permanently deleted from the device</string>
|
||||
<string name="marker_label_end">%1$s (End)</string>
|
||||
<string name="marker_label_start">%1$s (Start)</string>
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_split_name_format">Split %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</string>
|
||||
<string name="marker_detail_statistics_title">Since last split marker:</string>
|
||||
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
|
||||
<string name="marker_edit_marker_type_hint">Marker type</string>
|
||||
<string name="marker_list_empty_message">You don\'t have any markers</string>
|
||||
<string name="menu_aggregated_statistics">Aggregated stats</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
<string name="menu_delete_all">Delete all</string>
|
||||
<string name="menu_edit">Edit</string>
|
||||
<string name="menu_export">Export</string>
|
||||
<string name="menu_export_all">Export all</string>
|
||||
<string name="menu_feedback">Feedback</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_help_feedback">Help & feedback</string>
|
||||
<string name="menu_help_forum">Help forum</string>
|
||||
<string name="menu_import_all">Import all</string>
|
||||
<string name="menu_insert_marker">Insert marker</string>
|
||||
<string name="menu_insert_photo">Insert photo</string>
|
||||
<string name="menu_map">Map</string>
|
||||
<string name="menu_markers">Markers</string>
|
||||
<string name="menu_play">Play</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_select_all">Select all</string>
|
||||
<string name="menu_sensor_state">Sensor state</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="menu_share">Share</string>
|
||||
<string name="menu_show_on_map">Show on map</string>
|
||||
<string name="menu_split_frequency">Split frequency</string>
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="menu_view_photo">View photo</string>
|
||||
<string name="menu_voice_frequency">Voice frequency</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">Recording service</string>
|
||||
<string name="search_global_description">Tracks and markers</string>
|
||||
<string name="search_list_empty_message">No tracks or markers matched your search</string>
|
||||
<string name="search_list_marker_track_location">In track ‘%1$s’.</string>
|
||||
<string name="search_voice_prompt">Say the name of a track or marker</string>
|
||||
<string name="sensor_state_battery">Battery level</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_connected">Connected</string>
|
||||
<string name="sensor_state_connecting">Connecting</string>
|
||||
<string name="sensor_state_disconnected">Disconnected</string>
|
||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_last_sensor_time">Last sensor time</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">Sending</string>
|
||||
<string name="settings_not_while_recording">Not available while recording a track</string>
|
||||
<string name="settings_show">Show</string>
|
||||
<string name="settings_advanced">Advanced</string>
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<string name="settings_chart_x_axis">X axis</string>
|
||||
<string name="settings_recording">Recording</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">Always resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">Never resume a recording after reboot</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">Resume a recording after reboot if the last recorded location was within the last %1$s</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">Auto-resume</string>
|
||||
<string name="settings_recording_default_activity_title">Default activity type</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
|
||||
<string name="settings_recording_max_recording_distance_title">Max. distance</string>
|
||||
<string name="settings_recording_min_recording_distance_title">Recording distance interval</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Recording time interval</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Location is ignored if its accuracy is less than %1$s</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS accuracy</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">Date (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_reset">Reset</string>
|
||||
<string name="settings_reset_confirm_message">All settings will be reverted to default values.</string>
|
||||
<string name="settings_reset_confirm_title">Reset now?</string>
|
||||
<string name="settings_reset_done">All settings have been reverted to default values</string>
|
||||
<string name="settings_sensor">Sensor</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">Reset bike cadence</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">Reset combined bike</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">Reset heart rate</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">Reset foot pod</string>
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">Bluetooth pairing</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">Open Android\'s Bluetooth settings to pair a sensor</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">Bluetooth sensor</string>
|
||||
<string name="settings_sensor_connected">Connected to %1$s</string>
|
||||
<string name="settings_stats_coordinate">Latitude/Longitude</string>
|
||||
<string name="settings_stats_grade_elevation">Grade/elevation</string>
|
||||
<string name="settings_stats_rate_title">Preferred rate</string>
|
||||
<string name="settings_stats_units_imperial">Imperial (miles, ft)</string>
|
||||
<string name="settings_stats_units_metric">Metric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Preferred units</string>
|
||||
<string name="share_track_emails_hint">Email addresses</string>
|
||||
<string name="share_track_picker_title">Select an application</string>
|
||||
<string name="share_track_share_file">Share track file</string>
|
||||
<string name="share_track_share_file_body">I think you might be interested in this track.\n\nTo view this track, use Google Earth or other
|
||||
mapping software.\n\n%1$s</string>
|
||||
<string name="share_track_subject">I would like to share a track with you</string>
|
||||
<string name="stats_average_moving_pace">Avg. moving pace</string>
|
||||
<string name="stats_average_moving_speed">Avg. moving speed</string>
|
||||
<string name="stats_average_pace">Avg. pace</string>
|
||||
<string name="stats_average_speed">Avg. speed</string>
|
||||
<string name="stats_elevation">Elevation</string>
|
||||
<string name="stats_fastest_pace">Fastest pace</string>
|
||||
<string name="stats_gain">Gain</string>
|
||||
<string name="stats_grade">Grade</string>
|
||||
<string name="stats_latitude">Latitude</string>
|
||||
<string name="stats_longitude">Longitude</string>
|
||||
<string name="stats_max">Max</string>
|
||||
<string name="stats_max_speed">Max. speed</string>
|
||||
<string name="stats_min">Min</string>
|
||||
<string name="stats_moving_time">Moving time</string>
|
||||
<string name="stats_pace">Pace</string>
|
||||
<string name="stats_speed">Speed</string>
|
||||
<string name="stats_distance">Distance</string>
|
||||
<string name="stats_total_time">Total time</string>
|
||||
<string name="track_name_format">Track %1$d</string>
|
||||
<string name="track_record_notification">Recording your track…</string>
|
||||
<string name="track_markers">%1$s Markers</string>
|
||||
<string name="track_delete_one_confirm_message">The track and its markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_one_confirm_title">Delete track?</string>
|
||||
<string name="track_delete_multiple_confirm_message">The selected tracks and their markers will be deleted permanently from the device.</string>
|
||||
<string name="track_delete_progress_message">Deleting…</string>
|
||||
<string name="track_detail_chart_tab">Chart</string>
|
||||
<string name="track_detail_stats_tab">Stats</string>
|
||||
<string name="track_edit_activity_type">Activity type (e.g. walking)</string>
|
||||
<string name="track_edit_activity_type_hint">Activity type</string>
|
||||
<string name="track_edit_new_track_title">New Track</string>
|
||||
<string name="track_list_empty_message">Start recording your next adventure here</string>
|
||||
<string name="track_list_record_error">Unable to start recording. No GPS signal. Try again.</string>
|
||||
<string name="track_list_record_success">Now recording a new track</string>
|
||||
<string name="track_widget_config_title">Configure Widget Items</string>
|
||||
<string name="tracks_few">%1$d tracks</string>
|
||||
<string name="tracks_many">%1$d tracks</string>
|
||||
<string name="tracks_one">1 track</string>
|
||||
<string name="tracks_other">%1$d tracks</string>
|
||||
<string name="tracks_two">2 tracks</string>
|
||||
<string name="tracks_zero">0 tracks</string>
|
||||
<string name="unit_feet">ft</string>
|
||||
<string name="unit_kilometer">km</string>
|
||||
<string name="unit_kilometer_per_hour">km/h</string>
|
||||
<string name="unit_meter">m</string>
|
||||
<string name="unit_mile">mi</string>
|
||||
<string name="unit_mile_per_hour">mi/h</string>
|
||||
<string name="unit_minute_per_kilometer">min/km</string>
|
||||
<string name="unit_minute_per_mile">min/mi</string>
|
||||
<string name="value_adapt_accuracy">Adapt for accuracy</string>
|
||||
<string name="value_adapt_battery_life">Adapt for battery life</string>
|
||||
<string name="value_always">Always</string>
|
||||
<string name="value_float_feet">%1$.2f ft</string>
|
||||
<string name="value_float_kilometer">%1$.2f km</string>
|
||||
<string name="value_float_meter">%1$.2f m</string>
|
||||
<string name="value_float_mile">%1$.2f mi</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f mi (poor GPS)</string>
|
||||
<string name="value_integer_feet">%1$d ft</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d ft (excellent GPS)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d ft (recommended)</string>
|
||||
<string name="value_integer_kilobyte">%1$d kB</string>
|
||||
<string name="value_integer_kilometer">%1$d km</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d km/h</string>
|
||||
<string name="value_integer_megabyte">%1$d MB</string>
|
||||
<string name="value_integer_meter">%1$d m</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d m (excellent GPS)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d m (poor GPS)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d m (recommended)</string>
|
||||
<string name="value_integer_mile">%1$d mi</string>
|
||||
<string name="value_integer_mile_hour">%1$d mph</string>
|
||||
<string name="value_integer_minute">%1$d min</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d s</string>
|
||||
<string name="value_never">Never</string>
|
||||
<string name="value_none">None</string>
|
||||
<string name="value_off">Off</string>
|
||||
<string name="value_smallest">Smallest</string>
|
||||
<string name="value_smallest_recommended">Smallest (recommended)</string>
|
||||
<string name="voice_hours_few">%1$d hours</string>
|
||||
<string name="voice_hours_many">%1$d hours</string>
|
||||
<string name="voice_hours_one">1 hour</string>
|
||||
<string name="voice_hours_other">%1$d hours</string>
|
||||
<string name="voice_hours_two">2 hours</string>
|
||||
<string name="voice_hours_zero">0 hours</string>
|
||||
<string name="voice_minutes_few">%1$d minutes</string>
|
||||
<string name="voice_minutes_many">%1$d minutes</string>
|
||||
<string name="voice_minutes_one">1 minute</string>
|
||||
<string name="voice_minutes_other">%1$d minutes</string>
|
||||
<string name="voice_minutes_two">2 minutes</string>
|
||||
<string name="voice_minutes_zero">0 minutes</string>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometre</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mile</string>
|
||||
<string name="voice_seconds_few">%1$d seconds</string>
|
||||
<string name="voice_seconds_many">%1$d seconds</string>
|
||||
<string name="voice_seconds_one">1 second</string>
|
||||
<string name="voice_seconds_other">%1$d seconds</string>
|
||||
<string name="voice_seconds_two">2 seconds</string>
|
||||
<string name="voice_seconds_zero">0 seconds</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">1 kilometre per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">%1$.1f kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">2 kilometres per hour</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">0 kilometres per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_few">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_many">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_one">1 mile per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_other">%1$.1f miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_two">2 miles per hour</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">0 miles per hour</string>
|
||||
<string name="voice_template">OpenTracks %1$s in %2$s at %3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_many">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_one">total distance 1 kilometre</string>
|
||||
<string name="voice_total_distance_kilometers_other">total distance %1$.2f kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_two">total distance 2 kilometres</string>
|
||||
<string name="voice_total_distance_kilometers_zero">total distance 0 kilometres</string>
|
||||
<string name="voice_total_distance_miles_few">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_many">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_one">total distance 1 mile</string>
|
||||
<string name="voice_total_distance_miles_other">total distance %1$.2f miles</string>
|
||||
<string name="voice_total_distance_miles_two">total distance 2 miles</string>
|
||||
<string name="voice_total_distance_miles_zero">total distance 0 miles</string>
|
||||
<string name="voice_total_distance_zero">OpenTracks total distance zero.</string>
|
||||
<string name="waypoint_type_atm">Cashpoint</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar/pub</string>
|
||||
<string name="waypoint_type_barbecue">barbecue</string>
|
||||
<string name="waypoint_type_building">building</string>
|
||||
<string name="waypoint_type_bus_stop">bus stop</string>
|
||||
<string name="waypoint_type_cafe">cafe</string>
|
||||
<string name="waypoint_type_campfire">camp fire</string>
|
||||
<string name="waypoint_type_campground">Campsites</string>
|
||||
<string name="waypoint_type_church">church</string>
|
||||
<string name="waypoint_type_coffee_house">cafe</string>
|
||||
<string name="waypoint_type_convenience_store">corner shops</string>
|
||||
<string name="waypoint_type_drinking_water">drinking water</string>
|
||||
<string name="waypoint_type_falling_rocks">falling rocks</string>
|
||||
<string name="waypoint_type_ferry">ferry</string>
|
||||
<string name="waypoint_type_fire_place">fireplace</string>
|
||||
<string name="waypoint_type_fire_station">fire station</string>
|
||||
<string name="waypoint_type_fishing">fishing</string>
|
||||
<string name="waypoint_type_gas_station">petrol station</string>
|
||||
<string name="waypoint_type_golf_course">golf course</string>
|
||||
<string name="waypoint_type_grocery_store">grocers</string>
|
||||
<string name="waypoint_type_hair_dresser">hair dresser</string>
|
||||
<string name="waypoint_type_harbor">harbour</string>
|
||||
<string name="waypoint_type_hiking_path">footpath</string>
|
||||
<string name="waypoint_type_hotel">hotel</string>
|
||||
<string name="waypoint_type_house">house</string>
|
||||
<string name="waypoint_type_information">information</string>
|
||||
<string name="waypoint_type_intersection">intersection</string>
|
||||
<string name="waypoint_type_mail_box">post box</string>
|
||||
<string name="waypoint_type_market">market</string>
|
||||
<string name="waypoint_type_meeting_point">meeting point</string>
|
||||
<string name="waypoint_type_opera">opera</string>
|
||||
<string name="waypoint_type_parking">parking</string>
|
||||
<string name="waypoint_type_police_station">police station</string>
|
||||
<string name="waypoint_type_post_office">post office</string>
|
||||
<string name="waypoint_type_pothole">pothole</string>
|
||||
<string name="waypoint_type_railway_crossing">railway crossing</string>
|
||||
<string name="waypoint_type_restaurant">restaurant</string>
|
||||
<string name="waypoint_type_shopping">shopping</string>
|
||||
<string name="waypoint_type_sight">sight</string>
|
||||
<string name="waypoint_type_store">shop</string>
|
||||
<string name="waypoint_type_swimming_pool">swimming pool</string>
|
||||
<string name="waypoint_type_telephone">telephone</string>
|
||||
<string name="waypoint_type_theater">theatre</string>
|
||||
<string name="waypoint_type_toilet">toilet</string>
|
||||
<string name="waypoint_type_tourist_information">tourist information</string>
|
||||
<string name="waypoint_type_tree">tree</string>
|
||||
<string name="waypoint_type_tunnel">tunnel</string>
|
||||
<string name="waypoint_type_waterfall">waterfall</string>
|
||||
<string name="waypoint_type_water_fountain">water fountain</string>
|
||||
<string name="waypoint_type_waypoint">waypoint</string>
|
||||
</resources>
|
||||
@@ -1,453 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_type_airplane">坐飞机</string>
|
||||
<string name="activity_type_atv">全地形越野</string>
|
||||
<string name="activity_type_biking">自行车</string>
|
||||
<string name="activity_type_blimp">小型飞艇游览</string>
|
||||
<string name="activity_type_boat">船</string>
|
||||
<string name="activity_type_climbing">攀岩</string>
|
||||
<string name="activity_type_commercial_airplane">乘坐民航机</string>
|
||||
<string name="activity_type_cross_country_skiing">越野滑雪</string>
|
||||
<string name="activity_type_cycling">骑自行车</string>
|
||||
<string name="activity_type_dirt_bike">泥地骑行</string>
|
||||
<string name="activity_type_donkey_back_riding">骑驴</string>
|
||||
<string name="activity_type_driving">开车</string>
|
||||
<string name="activity_type_driving_bus">驾驶巴士</string>
|
||||
<string name="activity_type_driving_car">开车</string>
|
||||
<string name="activity_type_ferry">轮渡</string>
|
||||
<string name="activity_type_frisbee">飞盘运动</string>
|
||||
<string name="activity_type_gliding">滑翔</string>
|
||||
<string name="activity_type_hang_gliding">滑翔翼运动</string>
|
||||
<string name="activity_type_helicopter">乘坐直升机</string>
|
||||
<string name="activity_type_hiking">徒步</string>
|
||||
<string name="activity_type_horse_back_riding">骑马</string>
|
||||
<string name="activity_type_hot_air_balloon">热气球游览</string>
|
||||
<string name="activity_type_ice_sailing">冰上帆船</string>
|
||||
<string name="activity_type_inline_skating">直排轮滑</string>
|
||||
<string name="activity_type_kayaking">皮划艇</string>
|
||||
<string name="activity_type_kite_surfing">风筝冲浪</string>
|
||||
<string name="activity_type_land_sailing">陆地帆船</string>
|
||||
<string name="activity_type_mixed_type">混合型</string>
|
||||
<string name="activity_type_motor_bike">骑摩托车</string>
|
||||
<string name="activity_type_motor_boating">摩托艇运动</string>
|
||||
<string name="activity_type_mountain_biking">山地自行车</string>
|
||||
<string name="activity_type_off_trail_hiking">越野徒步</string>
|
||||
<string name="activity_type_other">其他</string>
|
||||
<string name="activity_type_paddling">划船</string>
|
||||
<string name="activity_type_para_gliding">滑翔伞运动</string>
|
||||
<string name="activity_type_rc_airplane">遥控飞机</string>
|
||||
<string name="activity_type_rc_boat">遥控船</string>
|
||||
<string name="activity_type_rc_helicopter">遥控直升机</string>
|
||||
<string name="activity_type_riding">乘骑</string>
|
||||
<string name="activity_type_road_biking">公路自行车</string>
|
||||
<string name="activity_type_roller_skiing">旱地滑雪</string>
|
||||
<string name="activity_type_rowing">赛艇</string>
|
||||
<string name="activity_type_running">跑步</string>
|
||||
<string name="activity_type_sailing">帆船</string>
|
||||
<string name="activity_type_seaplane">坐水上飞机</string>
|
||||
<string name="activity_type_skate_boarding">滑板运动</string>
|
||||
<string name="activity_type_skating">滑冰</string>
|
||||
<string name="activity_type_skiing">滑雪</string>
|
||||
<string name="activity_type_sky_jumping">跳伞</string>
|
||||
<string name="activity_type_sled">坐雪橇</string>
|
||||
<string name="activity_type_snow_boarding">单板滑雪</string>
|
||||
<string name="activity_type_snow_shoeing">雪地健行</string>
|
||||
<string name="activity_type_speed_walking">快步走</string>
|
||||
<string name="activity_type_street_running">上街跑</string>
|
||||
<string name="activity_type_surfing">冲浪</string>
|
||||
<string name="activity_type_track_cycling">场地自行车</string>
|
||||
<string name="activity_type_track_running">场地跑</string>
|
||||
<string name="activity_type_trail_hiking">沿小路徒步</string>
|
||||
<string name="activity_type_trail_running">越野跑</string>
|
||||
<string name="activity_type_train">坐火车</string>
|
||||
<string name="activity_type_ultimate_frisbee">极限飞盘</string>
|
||||
<string name="activity_type_unknown">未知</string>
|
||||
<string name="activity_type_wakeboarding">尾波滑水</string>
|
||||
<string name="activity_type_walking">步行</string>
|
||||
<string name="activity_type_water_skiing">划水</string>
|
||||
<string name="activity_type_wind_surfing">帆板运动</string>
|
||||
<string name="description_activity_type">活动类型:%1$s</string>
|
||||
<string name="description_average_moving_pace_in_minute">平均移动步速:%1$s分钟/公里(%2$s分钟/英里)</string>
|
||||
<string name="description_average_moving_speed">平均移动速度:%1$.2f 公里/小时(%2$.1f 英里/小时)</string>
|
||||
<string name="description_average_pace_in_minute">平均步速:%1$s分钟/公里(%2$s分钟/英里)</string>
|
||||
<string name="description_average_speed">平均时速:%1$.2f 公里/小时(%2$.1f 英里/小时)</string>
|
||||
<string name="description_elevation_gain">海拔升高:%1$d 米(%2$d 英尺)</string>
|
||||
<string name="description_elevation_imperial">海拔(英尺)</string>
|
||||
<string name="description_elevation_metric">海拔(米)</string>
|
||||
<string name="description_fastest_pace_in_minute">最快步速:%1$s分钟/公里(%2$s分钟/英里)</string>
|
||||
<string name="description_location_accuracy">精度(米)</string>
|
||||
<string name="description_location_altitude">海拔高度(米)</string>
|
||||
<string name="description_location_bearing">导向(度)</string>
|
||||
<string name="description_location_latitude">纬度(度)</string>
|
||||
<string name="description_location_longitude">经度(度)</string>
|
||||
<string name="description_location_speed">速度(米/秒)</string>
|
||||
<string name="description_max_elevation">最高海拔:%1$d 米(%2$d 英尺)</string>
|
||||
<string name="description_max_grade">最大坡度:%1$d %%</string>
|
||||
<string name="description_max_speed">最高限速:%1$.2f 公里/小时(%2$.1f 英里/小时)</string>
|
||||
<string name="description_min_elevation">最低海拔:%1$d 米(%2$d 英尺)</string>
|
||||
<string name="description_min_grade">最小坡度:%1$d %%</string>
|
||||
<string name="description_moving_time">移动时间:%1$s</string>
|
||||
<string name="description_pace_imperial">步速(分钟/英里)</string>
|
||||
<string name="description_pace_metric">步速(分钟/公里)</string>
|
||||
<string name="description_recorded_time">记录时间:%1$s</string>
|
||||
<string name="description_sensor_cadence">蹬踏频率(转数/分钟)</string>
|
||||
<string name="description_sensor_heart_rate">心率(次/分钟)</string>
|
||||
<string name="description_sensor_power">功率(瓦)</string>
|
||||
<string name="description_speed_imperial">速度(英里/小时)</string>
|
||||
<string name="description_speed_metric">速度(公里/小时)</string>
|
||||
<string name="description_time">时间</string>
|
||||
<string name="description_total_distance">总距离:%1$.2f 公里(%2$.1f 英里)</string>
|
||||
<string name="description_total_time">总时间:%1$s</string>
|
||||
<string name="description_track_point">点</string>
|
||||
<string name="description_track_segment">路段</string>
|
||||
<string name="export_all_option">全部以 %1$s 格式导出到 %2$s</string>
|
||||
<string name="export_all_title">导出到外部存储设备</string>
|
||||
<string name="export_external_storage">外部存储设备</string>
|
||||
<string name="export_external_storage_error">已将%1$d条路线(共%2$s条)导出到%3$s</string>
|
||||
<string name="export_external_storage_option">以 %1$s 格式导出到 %2$s</string>
|
||||
<string name="export_external_storage_progress_message">正在导出到 %1$s…</string>
|
||||
<string name="export_external_storage_success">已将%1$s导出到%2$s</string>
|
||||
<string name="export_title">导出到…</string>
|
||||
<string name="external_storage_not_available">外部存储设备不可用</string>
|
||||
<string name="external_storage_not_writable">外部存储设备无法写入</string>
|
||||
<string name="files_few">%1$d个文件</string>
|
||||
<string name="files_many">%1$d个文件</string>
|
||||
<string name="files_one">1个文件</string>
|
||||
<string name="files_other">%1$d个文件</string>
|
||||
<string name="files_two">2个文件</string>
|
||||
<string name="files_zero">0个文件</string>
|
||||
<string name="generic_add">添加</string>
|
||||
<string name="generic_cancel">取消</string>
|
||||
<string name="generic_delete_all_confirm_title">全部删除?</string>
|
||||
<string name="generic_delete_selected_confirm_title">删除所选项?</string>
|
||||
<string name="generic_description">说明</string>
|
||||
<string name="generic_description_line">说明:%1$s</string>
|
||||
<string name="generic_error_title">错误</string>
|
||||
<string name="generic_name">名称</string>
|
||||
<string name="generic_name_line">名称:%1$s</string>
|
||||
<string name="generic_no">否</string>
|
||||
<string name="generic_ok">确定</string>
|
||||
<string name="generic_paused">已暂停</string>
|
||||
<string name="generic_progress_title">请稍候…</string>
|
||||
<string name="generic_recording">正在记录…</string>
|
||||
<string name="generic_save">保存</string>
|
||||
<string name="generic_success_title">成功</string>
|
||||
<string name="generic_tracks">路线</string>
|
||||
<string name="generic_yes">是</string>
|
||||
<string name="gps_location_access">‘位置信息使用权’</string>
|
||||
<string name="gps_disabled">GPS 未启用,请点按此处转至 %1$s。按“后退”按钮返回。</string>
|
||||
<string name="gps_disabled_location_mode">请选择高准确度位置信息模式。点按这里可转至%1$s,按后退按钮可返回。</string>
|
||||
<string name="gps_disabled_my_location">无法确定当前位置。请进入%1$s启用更多位置来源,并确保
|
||||
您看得到天空。请稍后再试。</string>
|
||||
<string name="gps_disabled_my_location_location_mode">无法确定当前位置。请进入%1$s选择高准确度位置信息模式,并确保
|
||||
您看得到天空。请稍后再试。</string>
|
||||
<string name="gps_not_found">设备上找不到GPS</string>
|
||||
<string name="gps_starting">正在启动GPS</string>
|
||||
<string name="gps_starting_error">无法启动GPS</string>
|
||||
<string name="gps_stopping">正在关闭GPS</string>
|
||||
<string name="gps_wait_for_better_signal">正在等待更好的GPS信号</string>
|
||||
<string name="gps_wait_for_signal">正在等待GPS信号</string>
|
||||
<string name="image_application">应用</string>
|
||||
<string name="image_arrow">箭头</string>
|
||||
<string name="image_marker">标记</string>
|
||||
<string name="image_marker_count">标记数</string>
|
||||
<string name="image_my_location">我的位置</string>
|
||||
<string name="image_pause">暂停</string>
|
||||
<string name="image_photo_marker">照片标记</string>
|
||||
<string name="image_record">记录</string>
|
||||
<string name="image_stop">停止</string>
|
||||
<string name="image_track">跟踪</string>
|
||||
<string name="import_error">从%3$s导入了%2$s中的%1$d个</string>
|
||||
<string name="import_no_directory">%1$s不存在</string>
|
||||
<string name="import_no_file">没有可以导入的文件。请将设备连接到计算机,然后将要导入的文件
|
||||
放入 %1$s。</string>
|
||||
<string name="import_no_file_title">导入文件</string>
|
||||
<string name="import_progress_message">正在从 %1$s 导入…</string>
|
||||
<string name="import_selection_option">%2$s 中的所有 %1$s</string>
|
||||
<string name="import_selection_title">从外部存储设备导入</string>
|
||||
<string name="import_success">已从%2$s导入%1$s</string>
|
||||
<string name="marker_add_error">无法插入标记,无 GPS 信号。请重试。</string>
|
||||
<string name="marker_add_success">已插入标记</string>
|
||||
<string name="marker_add_canceled">已取消,未添加标记</string>
|
||||
<string name="marker_delete_all_confirm_message">此路线的所有标记都将永久地从设备中删除</string>
|
||||
<string name="marker_delete_one_confirm_message">标记将永久地从设备中删除</string>
|
||||
<string name="marker_delete_one_confirm_title">删除标记?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">所选标记将永久地从设备中删除</string>
|
||||
<string name="marker_label_end">%1$s(终点)</string>
|
||||
<string name="marker_label_start">%1$s(起点)</string>
|
||||
<string name="marker_name_format">标记 %1$d</string>
|
||||
<string name="marker_split_name_format">分割标记 %1$d</string>
|
||||
<string name="marker_title">第%1$d个(共%2$d个)</string>
|
||||
<string name="marker_detail_statistics_title">上一个分割标记之后的数据:</string>
|
||||
<string name="marker_edit_marker_type">标记类型(如瀑布)</string>
|
||||
<string name="marker_edit_marker_type_hint">标记类型</string>
|
||||
<string name="marker_list_empty_message">您没有任何标记</string>
|
||||
<string name="menu_aggregated_statistics">汇总统计数据</string>
|
||||
<string name="menu_delete">删除</string>
|
||||
<string name="menu_delete_all">全部删除</string>
|
||||
<string name="menu_edit">修改</string>
|
||||
<string name="menu_export">导出</string>
|
||||
<string name="menu_export_all">全部导出</string>
|
||||
<string name="menu_feedback">反馈</string>
|
||||
<string name="menu_help">帮助</string>
|
||||
<string name="menu_help_feedback">帮助与反馈</string>
|
||||
<string name="menu_help_forum">帮助论坛</string>
|
||||
<string name="menu_import_all">全部导入</string>
|
||||
<string name="menu_insert_marker">插入标记</string>
|
||||
<string name="menu_insert_photo">插入照片</string>
|
||||
<string name="menu_map">地图</string>
|
||||
<string name="menu_markers">标记</string>
|
||||
<string name="menu_play">播放</string>
|
||||
<string name="menu_search">搜索</string>
|
||||
<string name="menu_select_all">全选</string>
|
||||
<string name="menu_sensor_state">传感器状态</string>
|
||||
<string name="menu_settings">设置</string>
|
||||
<string name="menu_share">分享</string>
|
||||
<string name="menu_show_on_map">在地图上显示</string>
|
||||
<string name="menu_split_frequency">分割频率</string>
|
||||
<string name="menu_start_gps">启动 GPS</string>
|
||||
<string name="menu_stop_gps">关闭 GPS</string>
|
||||
<string name="menu_view_photo">查看照片</string>
|
||||
<string name="menu_voice_frequency">语音提示频率</string>
|
||||
<string name="app_name">OpenTracks</string>
|
||||
<string name="recording_service">记录服务</string>
|
||||
<string name="search_global_description">路线和标记</string>
|
||||
<string name="search_list_empty_message">没有与您的搜索相符的路线或标记</string>
|
||||
<string name="search_list_marker_track_location">位于“%1$s”路线。</string>
|
||||
<string name="search_voice_prompt">说出路线或标记的名称</string>
|
||||
<string name="sensor_state_battery">电池电量</string>
|
||||
<string name="sensor_state_cadence">蹬车频率</string>
|
||||
<string name="sensor_state_cadence_value">%1$d RPM</string>
|
||||
<string name="sensor_state_connected">已连接</string>
|
||||
<string name="sensor_state_connecting">正在连接</string>
|
||||
<string name="sensor_state_disconnected">已断开连接</string>
|
||||
<string name="sensor_state_heart_rate">心率</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d BPM</string>
|
||||
<string name="sensor_state_last_sensor_time">最后传感时间</string>
|
||||
<string name="sensor_state_power">功率</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_state_sending">发送中</string>
|
||||
<string name="settings_not_while_recording">记录路线时不可用</string>
|
||||
<string name="settings_show">显示</string>
|
||||
<string name="settings_advanced">高级</string>
|
||||
<string name="settings_chart_by_distance">按距离</string>
|
||||
<string name="settings_chart_by_time">按时间</string>
|
||||
<string name="settings_chart_x_axis">X 轴</string>
|
||||
<string name="settings_recording">记录</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_always_summary">重启后一律继续记录</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_never_summary">重启后一律不再继续记录</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_summary">如果最后的位置记录发生在距离现在%1$s的范围内,则在重启后继续记录</string>
|
||||
<string name="settings_recording_auto_resume_track_timeout_title">自动继续</string>
|
||||
<string name="settings_recording_default_activity_title">默认活动类型</string>
|
||||
<string name="settings_recording_location_frequency_summary">每隔%1$s记录一次位置</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">如果两个位置之间的距离超过%1$s,则创建新的路段</string>
|
||||
<string name="settings_recording_max_recording_distance_title">最大距离</string>
|
||||
<string name="settings_recording_min_recording_distance_title">记录距离间隔</string>
|
||||
<string name="settings_recording_min_recording_interval_title">记录时间间隔</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">如果位置的精度小于%1$s,则忽略该位置</string>
|
||||
<string name="settings_recording_min_required_accuracy_title">GPS 精度</string>
|
||||
<string name="settings_recording_track_name_date_iso_8601_option">日期 (ISO 8601)</string>
|
||||
<string name="settings_recording_track_name_date_local_option">日期(本地)</string>
|
||||
<string name="settings_recording_track_name_number_option">编号</string>
|
||||
<string name="settings_recording_track_name_title">默认路线名称</string>
|
||||
<string name="settings_reset">重置</string>
|
||||
<string name="settings_reset_confirm_message">所有设置都将恢复为默认值。</string>
|
||||
<string name="settings_reset_confirm_title">立即重置?</string>
|
||||
<string name="settings_reset_done">所有设置都已恢复为默认值</string>
|
||||
<string name="settings_sensor">传感器</string>
|
||||
<string name="settings_sensor_ant_reset_bike_cadence_sensor">重置蹬车频率</string>
|
||||
<string name="settings_sensor_ant_reset_combined_bike_sensor">重置组合的自行车</string>
|
||||
<string name="settings_sensor_ant_reset_heart_rate_monitor">重置心率</string>
|
||||
<string name="settings_sensor_ant_reset_speed_distance_monitor">重置计步器</string>
|
||||
<string name="settings_sensor_bluetooth">蓝牙</string>
|
||||
<string name="settings_sensor_bluetooth_pairing">蓝牙配对</string>
|
||||
<string name="settings_sensor_bluetooth_pairing_summary">打开 Android 的蓝牙设置以配对传感器</string>
|
||||
<string name="settings_sensor_bluetooth_sensor">蓝牙传感器</string>
|
||||
<string name="settings_sensor_connected">已连接至 %1$s</string>
|
||||
<string name="settings_stats_coordinate">纬度/经度</string>
|
||||
<string name="settings_stats_grade_elevation">坡度/海拔</string>
|
||||
<string name="settings_stats_rate_title">首选速率</string>
|
||||
<string name="settings_stats_units_imperial">英制(英里、英尺)</string>
|
||||
<string name="settings_stats_units_metric">公制(公里、米)</string>
|
||||
<string name="settings_stats_units_title">首选单位</string>
|
||||
<string name="share_track_emails_hint">电子邮件地址</string>
|
||||
<string name="share_track_picker_title">选择应用:</string>
|
||||
<string name="share_track_share_file">分享路线文件</string>
|
||||
<string name="share_track_share_file_body">您可能会对此路线感兴趣。\n\n要查看此路线,请使用 Google 地图或其他
|
||||
地图软件。\n\n%1$s</string>
|
||||
<string name="share_track_subject">我要与您分享路线</string>
|
||||
<string name="stats_average_moving_pace">平均移动步速</string>
|
||||
<string name="stats_average_moving_speed">平均移动速度</string>
|
||||
<string name="stats_average_pace">平均步速</string>
|
||||
<string name="stats_average_speed">平均速度</string>
|
||||
<string name="stats_elevation">海拔</string>
|
||||
<string name="stats_fastest_pace">最快步速</string>
|
||||
<string name="stats_gain">爬高</string>
|
||||
<string name="stats_grade">坡度</string>
|
||||
<string name="stats_latitude">纬度</string>
|
||||
<string name="stats_longitude">经度</string>
|
||||
<string name="stats_max">最大值</string>
|
||||
<string name="stats_max_speed">最高速度</string>
|
||||
<string name="stats_min">最小值</string>
|
||||
<string name="stats_moving_time">移动时间</string>
|
||||
<string name="stats_pace">步速</string>
|
||||
<string name="stats_speed">速度</string>
|
||||
<string name="stats_distance">距离</string>
|
||||
<string name="stats_total_time">总时间</string>
|
||||
<string name="track_name_format">路线 %1$d</string>
|
||||
<string name="track_record_notification">正在记录路线…</string>
|
||||
<string name="track_markers">%1$s标记</string>
|
||||
<string name="track_delete_one_confirm_message">系统将从设备中永久删除路线及其标记。</string>
|
||||
<string name="track_delete_one_confirm_title">删除路线?</string>
|
||||
<string name="track_delete_multiple_confirm_message">系统将从设备中永久删除选定的路线及其标记。</string>
|
||||
<string name="track_delete_progress_message">正在删除…</string>
|
||||
<string name="track_detail_chart_tab">图表</string>
|
||||
<string name="track_detail_stats_tab">统计信息</string>
|
||||
<string name="track_edit_activity_type">活动类型(如徒步)</string>
|
||||
<string name="track_edit_activity_type_hint">活动类型</string>
|
||||
<string name="track_edit_new_track_title">新路线</string>
|
||||
<string name="track_list_empty_message">在这里开始记录您的新冒险</string>
|
||||
<string name="track_list_record_error">无法开始记录,无 GPS 信号。请重试。</string>
|
||||
<string name="track_list_record_success">现在开始记录新线路</string>
|
||||
<string name="track_widget_config_title">配置小工具项</string>
|
||||
<string name="tracks_few">%1$d条路线</string>
|
||||
<string name="tracks_many">%1$d条路线</string>
|
||||
<string name="tracks_one">1条路线</string>
|
||||
<string name="tracks_other">%1$d条路线</string>
|
||||
<string name="tracks_two">2条路线</string>
|
||||
<string name="tracks_zero">0条路线</string>
|
||||
<string name="unit_feet">英尺</string>
|
||||
<string name="unit_kilometer">公里</string>
|
||||
<string name="unit_kilometer_per_hour">公里/小时</string>
|
||||
<string name="unit_meter">米</string>
|
||||
<string name="unit_mile">英里</string>
|
||||
<string name="unit_mile_per_hour">英里/小时</string>
|
||||
<string name="unit_minute_per_kilometer">分钟/公里</string>
|
||||
<string name="unit_minute_per_mile">分钟/英里</string>
|
||||
<string name="value_adapt_accuracy">适应精度</string>
|
||||
<string name="value_adapt_battery_life">视电池电量而定</string>
|
||||
<string name="value_always">一律启用</string>
|
||||
<string name="value_float_feet">%1$.2f 英尺</string>
|
||||
<string name="value_float_kilometer">%1$.2f 公里</string>
|
||||
<string name="value_float_meter">%1$.2f 米</string>
|
||||
<string name="value_float_mile">%1$.2f 英里</string>
|
||||
<string name="value_float_mile_poor_gps">%1$.1f 英里(GPS 信号差)</string>
|
||||
<string name="value_integer_feet">%1$d 英尺</string>
|
||||
<string name="value_integer_feet_excellent_gps">%1$d 英尺(GPS 信号极佳)</string>
|
||||
<string name="value_integer_feet_recommended">%1$d 英尺(推荐)</string>
|
||||
<string name="value_integer_kilobyte">%1$dKB</string>
|
||||
<string name="value_integer_kilometer">%1$d 公里</string>
|
||||
<string name="value_integer_kilometer_hour">%1$d 公里/小时</string>
|
||||
<string name="value_integer_megabyte">%1$dMB</string>
|
||||
<string name="value_integer_meter">%1$d 米</string>
|
||||
<string name="value_integer_meter_excellent_gps">%1$d 米(GPS 信号极佳)</string>
|
||||
<string name="value_integer_meter_poor_gps">%1$d 米(GPS 信号差)</string>
|
||||
<string name="value_integer_meter_recommended">%1$d 米(推荐)</string>
|
||||
<string name="value_integer_mile">%1$d 英里</string>
|
||||
<string name="value_integer_mile_hour">%1$d 英里/小时</string>
|
||||
<string name="value_integer_minute">%1$d 分钟</string>
|
||||
<string name="value_integer_percent">%1$d %%</string>
|
||||
<string name="value_integer_second">%1$d 秒</string>
|
||||
<string name="value_never">从不使用</string>
|
||||
<string name="value_none">无</string>
|
||||
<string name="value_off">关闭</string>
|
||||
<string name="value_smallest">最小</string>
|
||||
<string name="value_smallest_recommended">最小(建议)</string>
|
||||
<string name="voice_hours_few">%1$d 小时</string>
|
||||
<string name="voice_hours_many">%1$d 小时</string>
|
||||
<string name="voice_hours_one">1 小时</string>
|
||||
<string name="voice_hours_other">%1$d 小时</string>
|
||||
<string name="voice_hours_two">2 小时</string>
|
||||
<string name="voice_hours_zero">0 小时</string>
|
||||
<string name="voice_minutes_few">%1$d 分钟</string>
|
||||
<string name="voice_minutes_many">%1$d 分钟</string>
|
||||
<string name="voice_minutes_one">1 分钟</string>
|
||||
<string name="voice_minutes_other">%1$d 分钟</string>
|
||||
<string name="voice_minutes_two">2 分钟</string>
|
||||
<string name="voice_minutes_zero">0 分钟</string>
|
||||
<string name="voice_pace_per_kilometer">每公里 %1$s</string>
|
||||
<string name="voice_pace_per_mile">每英里 %1$s</string>
|
||||
<string name="voice_seconds_few">%1$d 秒</string>
|
||||
<string name="voice_seconds_many">%1$d 秒</string>
|
||||
<string name="voice_seconds_one">1 秒</string>
|
||||
<string name="voice_seconds_other">%1$d 秒</string>
|
||||
<string name="voice_seconds_two">2 秒</string>
|
||||
<string name="voice_seconds_zero">0 秒</string>
|
||||
<string name="voice_speed_kilometers_per_hour_few">每小时 %1$.1f 公里</string>
|
||||
<string name="voice_speed_kilometers_per_hour_many">每小时 %1$.1f 公里</string>
|
||||
<string name="voice_speed_kilometers_per_hour_one">每小时 1 公里</string>
|
||||
<string name="voice_speed_kilometers_per_hour_other">每小时 %1$.1f 公里</string>
|
||||
<string name="voice_speed_kilometers_per_hour_two">每小时 2 公里</string>
|
||||
<string name="voice_speed_kilometers_per_hour_zero">每小时 0 公里</string>
|
||||
<string name="voice_speed_miles_per_hour_few">每小时 %1$.1f 英里</string>
|
||||
<string name="voice_speed_miles_per_hour_many">每小时 %1$.1f 英里</string>
|
||||
<string name="voice_speed_miles_per_hour_one">每小时 1 英里</string>
|
||||
<string name="voice_speed_miles_per_hour_other">每小时 %1$.1f 英里</string>
|
||||
<string name="voice_speed_miles_per_hour_two">每小时 2 英里</string>
|
||||
<string name="voice_speed_miles_per_hour_zero">每小时 0 英里</string>
|
||||
<string name="voice_template">“我的足迹”距离:%1$s;时间:%2$s;速度:%3$s</string>
|
||||
<string name="voice_total_distance_kilometers_few">总距离 %1$.2f 公里</string>
|
||||
<string name="voice_total_distance_kilometers_many">总距离 %1$.2f 公里</string>
|
||||
<string name="voice_total_distance_kilometers_one">总距离 1 公里</string>
|
||||
<string name="voice_total_distance_kilometers_other">总距离 %1$.2f 公里</string>
|
||||
<string name="voice_total_distance_kilometers_two">总距离 2 公里</string>
|
||||
<string name="voice_total_distance_kilometers_zero">总距离 0 公里</string>
|
||||
<string name="voice_total_distance_miles_few">总距离 %1$.2f 英里</string>
|
||||
<string name="voice_total_distance_miles_many">总距离 %1$.2f 英里</string>
|
||||
<string name="voice_total_distance_miles_one">总距离 1 英里</string>
|
||||
<string name="voice_total_distance_miles_other">总距离 %1$.2f 英里</string>
|
||||
<string name="voice_total_distance_miles_two">总距离 2 英里</string>
|
||||
<string name="voice_total_distance_miles_zero">总距离 0 英里</string>
|
||||
<string name="voice_total_distance_zero">“我的足迹”总距离为零。</string>
|
||||
<string name="waypoint_type_atm">自动取款机</string>
|
||||
<string name="waypoint_type_bank">银行</string>
|
||||
<string name="waypoint_type_bar">酒吧</string>
|
||||
<string name="waypoint_type_barbecue">烧烤</string>
|
||||
<string name="waypoint_type_building">建筑物</string>
|
||||
<string name="waypoint_type_bus_stop">公交车站</string>
|
||||
<string name="waypoint_type_cafe">咖啡馆</string>
|
||||
<string name="waypoint_type_campfire">营火</string>
|
||||
<string name="waypoint_type_campground">露营地</string>
|
||||
<string name="waypoint_type_church">教堂</string>
|
||||
<string name="waypoint_type_coffee_house">咖啡屋</string>
|
||||
<string name="waypoint_type_convenience_store">便利店</string>
|
||||
<string name="waypoint_type_drinking_water">直饮水</string>
|
||||
<string name="waypoint_type_falling_rocks">滚落的岩石</string>
|
||||
<string name="waypoint_type_ferry">轮渡</string>
|
||||
<string name="waypoint_type_fire_place">壁炉</string>
|
||||
<string name="waypoint_type_fire_station">消防局</string>
|
||||
<string name="waypoint_type_fishing">钓鱼</string>
|
||||
<string name="waypoint_type_gas_station">加油站</string>
|
||||
<string name="waypoint_type_golf_course">高尔夫球场</string>
|
||||
<string name="waypoint_type_grocery_store">杂货店</string>
|
||||
<string name="waypoint_type_hair_dresser">理发师</string>
|
||||
<string name="waypoint_type_harbor">港口</string>
|
||||
<string name="waypoint_type_hiking_path">徒步路线</string>
|
||||
<string name="waypoint_type_hotel">宾馆</string>
|
||||
<string name="waypoint_type_house">房屋</string>
|
||||
<string name="waypoint_type_information">信息</string>
|
||||
<string name="waypoint_type_intersection">交叉路口</string>
|
||||
<string name="waypoint_type_mail_box">邮箱</string>
|
||||
<string name="waypoint_type_market">市场</string>
|
||||
<string name="waypoint_type_meeting_point">汇合点</string>
|
||||
<string name="waypoint_type_opera">剧院</string>
|
||||
<string name="waypoint_type_parking">停车场</string>
|
||||
<string name="waypoint_type_police_station">警察局</string>
|
||||
<string name="waypoint_type_post_office">邮局</string>
|
||||
<string name="waypoint_type_pothole">坑洞</string>
|
||||
<string name="waypoint_type_railway_crossing">铁路道口</string>
|
||||
<string name="waypoint_type_restaurant">餐馆</string>
|
||||
<string name="waypoint_type_shopping">购物</string>
|
||||
<string name="waypoint_type_sight">景点</string>
|
||||
<string name="waypoint_type_store">商店</string>
|
||||
<string name="waypoint_type_swimming_pool">游泳池</string>
|
||||
<string name="waypoint_type_telephone">电话</string>
|
||||
<string name="waypoint_type_theater">影剧院</string>
|
||||
<string name="waypoint_type_toilet">厕所</string>
|
||||
<string name="waypoint_type_tourist_information">旅游信息</string>
|
||||
<string name="waypoint_type_tree">树</string>
|
||||
<string name="waypoint_type_tunnel">隧道</string>
|
||||
<string name="waypoint_type_waterfall">瀑布</string>
|
||||
<string name="waypoint_type_water_fountain">喷泉</string>
|
||||
<string name="waypoint_type_waypoint">路标</string>
|
||||
</resources>
|
||||
@@ -17,7 +17,10 @@ limitations under the License.
|
||||
<string name="app_web_url" translatable="false">https://github.com/dennisguse/opentracks</string>
|
||||
|
||||
<!-- List here all used libraries (will be shown in the about activity -->
|
||||
<string name="third_party_libraries" translatable="false"><a href="https://developer.android.com/topic/libraries/support-library/">Google\'s androidX support</a> (Apache License, Version 2.0)</string>
|
||||
<string name="third_party_libraries" translatable="false">
|
||||
<a href="https://developer.android.com/topic/libraries/support-library/">Google\'s androidX support</a> (Apache License, Version 2.0) \n
|
||||
<a href="https://github.com/material-components/material-components-android">Material Components for Android</a> (Apache License, Version 2.0)
|
||||
</string>
|
||||
|
||||
<string name="marker_statistics_icon_url" translatable="false">http://maps.google.com/mapfiles/ms/micons/ylw-pushpin.png</string>
|
||||
<string name="marker_waypoint_icon_url" translatable="false">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string>
|
||||
|
||||
Reference in New Issue
Block a user