Compare commits

...

19 Commits

Author SHA1 Message Date
Dennis Guse 594a34980b Release: v4.14.0 2024-10-04 07:32:25 +02:00
dependabot[bot] 95b070bb58 Bump com.android.tools.build:gradle from 8.6.1 to 8.7.0
Bumps com.android.tools.build:gradle from 8.6.1 to 8.7.0.

---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 23:06:26 +02:00
dependabot[bot] 66e3f000e9 Bump org.mockito:mockito-android from 5.14.0 to 5.14.1
Bumps [org.mockito:mockito-android](https://github.com/mockito/mockito) from 5.14.0 to 5.14.1.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.14.0...v5.14.1)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 07:01:27 +02:00
dependabot[bot] 1a381562e5 Bump org.mockito:mockito-android from 5.13.0 to 5.14.0
Bumps [org.mockito:mockito-android](https://github.com/mockito/mockito) from 5.13.0 to 5.14.0.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.13.0...v5.14.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 17:03:58 +02:00
josé m b72bd60586 Translated using Weblate (Galician)
Currently translated at 18.1% (26 of 143 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/gl/
2024-09-29 16:42:59 +02:00
jakobend 4e9c27af6f Translated using Weblate (German)
Currently translated at 99.8% (531 of 532 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/de/
2024-09-29 16:42:58 +02:00
ovl-1 1638fab0df Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.7% (4 of 143 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/nb_NO/
2024-09-29 16:42:57 +02:00
Patrick Santa Maria e3cba91bf1 Translated using Weblate (Corsican)
Currently translated at 99.6% (530 of 532 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/co/
2024-09-29 16:42:57 +02:00
Stephan Paternotte bf1746fcd1 Translated using Weblate (Dutch)
Currently translated at 100.0% (143 of 143 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/nl/
2024-09-29 16:42:56 +02:00
Aindriú Mac Giolla Eoin d19ca3851c Translated using Weblate (Irish)
Currently translated at 100.0% (143 of 143 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/ga/
2024-09-29 16:42:55 +02:00
Fjuro 1b868bd71d Translated using Weblate (Czech)
Currently translated at 100.0% (143 of 143 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/cs/
2024-09-29 16:42:54 +02:00
Fjuro d8bcbcc183 Translated using Weblate (Czech)
Currently translated at 100.0% (532 of 532 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/cs/
2024-09-29 16:42:54 +02:00
Aindriú Mac Giolla Eoin 294cbc12ef Translated using Weblate (Irish)
Currently translated at 99.8% (531 of 532 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ga/
2024-09-29 16:42:53 +02:00
gallegonovato 1d2abf07bf Translated using Weblate (Spanish)
Currently translated at 7.7% (11 of 142 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/es/
2024-09-29 16:42:52 +02:00
Ghost of Sparta 86dfa5df67 Translated using Weblate (Hungarian)
Currently translated at 99.8% (531 of 532 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/hu/
2024-09-29 16:42:51 +02:00
Dennis Guse ed70b0d982 Upgrade to Gradlew 8.10.2 2024-09-29 16:42:37 +02:00
dependabot[bot] 0afe4c5149 Bump com.android.tools.build:gradle from 8.6.0 to 8.6.1
Bumps com.android.tools.build:gradle from 8.6.0 to 8.6.1.

---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-18 07:13:10 +02:00
Dennis Guse 2e7a3b7465 Use AltitudeConverterCompat instead of custom solution.
Fixes #1920.
2024-09-14 16:05:32 +02:00
Dennis Guse ca92666176 Target Android 14/API34.
Fixes #1955.
2024-09-08 13:51:41 +02:00
24 changed files with 329 additions and 38524 deletions
+7 -6
View File
@@ -6,7 +6,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.6.0' classpath 'com.android.tools.build:gradle:8.7.0'
} }
} }
@@ -51,7 +51,7 @@ android {
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17
} }
compileSdk 34 compileSdk 35
buildFeatures { buildFeatures {
viewBinding true viewBinding true
@@ -64,13 +64,13 @@ android {
defaultConfig { defaultConfig {
applicationId "de.dennisguse.opentracks" applicationId "de.dennisguse.opentracks"
versionCode 5870 versionCode 5889
versionName "v4.13.1" versionName "v4.14.0"
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\"" buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
minSdk 26 minSdk 26
targetSdk 34 targetSdk 35
testInstrumentationRunner "de.dennisguse.opentracks.TestRunner" testInstrumentationRunner "de.dennisguse.opentracks.TestRunner"
testInstrumentationRunnerArguments clearPackageData: 'true' testInstrumentationRunnerArguments clearPackageData: 'true'
@@ -136,13 +136,14 @@ dependencies {
implementation 'androidx.core:core:1.13.1' implementation 'androidx.core:core:1.13.1'
implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.core:core-splashscreen:1.0.1'
implementation 'androidx.mediarouter:mediarouter:1.7.0' implementation 'androidx.mediarouter:mediarouter:1.7.0'
implementation 'androidx.core:core-location-altitude:1.0.0-alpha02'
androidTestImplementation 'androidx.test:core:1.6.1' androidTestImplementation 'androidx.test:core:1.6.1'
androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.2' androidTestImplementation 'androidx.test:runner:1.6.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation 'org.mockito:mockito-android:5.13.0' androidTestImplementation 'org.mockito:mockito-android:5.14.1'
androidTestUtil 'androidx.test:orchestrator:1.5.0' androidTestUtil 'androidx.test:orchestrator:1.5.0'
} }
@@ -0,0 +1,9 @@
v4.13.1: OpenTracks
Změny:
- Kalendář agregovaných statistik využívá regionální preference (Android 14+)
Opravy chyb:
- KML 2.3: standardizovaný název pole pro srdeční tep
- Seznam stop: stav nahrávání nebyl správně aktualizován
- Opravy rozhraní související s Material 3
@@ -0,0 +1,7 @@
v4.14.0: OpenTracks
Changes:
- Use Androidx' EGM2008 data (instead of bundling our custom solution).
Developer:
- Target Android15/ SDK35
@@ -0,0 +1,15 @@
v3.0.0: OpenTracks
Primer lanzamiento de OpenTracks (es decir, una bifurcación de MyTracks)
Cambios:
- Cambio de nombre de MyTracks a OpenTracks
- Se agregó un sensor de frecuencia cardíaca Bluetooth LE
- Se eliminaron todas las funciones que requieren acceso a Internet.
- Se eliminó la integración de Google Maps
- Se eliminó el uso de los servicios de Google Play.
- Se eliminaron los sensores ANT+
- Se eliminaron los sensores clásicos de Bluetooth.
- Se eliminó Protobuf
- Se eliminaron la estimación de calorías y la estimación de actividad.
- Se eliminó la API del servicio MyTracks (es decir, no hay integración con otras aplicaciones)
@@ -0,0 +1,15 @@
v4.13.0: OpenTracks
Athruithe:
- Is féidir marcóirí a chruthú trí API Poiblí
Ligeann sé seo a chruthú Marcóirí ag aon suíomh agus tar éis taifeadadh.
Míbhuntáiste: Ní thaispeántar marcóirí sna léaráidí a thuilleadh.
TABHAIR FAOI DEARA: Tacaíonn OSMDashboard leis an API seo tar éis leagan: v4.1.0
Ceartúchán Bug:
- Ba cheart go mbeadh socrú gníomhaíochta réamhshocraithe ina anuas
- Ar ais saighead nach bhfuil ag obair i socruithe
- Léiríonn an lipéad le haghaidh siúil as cosán anois "siúlóid as cosán"
Forbróir:
- Úsáid Post in ionad Suíomh Android
@@ -0,0 +1,9 @@
v4.13.1: OpenTracks
Athruithe:
- Úsáideann féilire staitisticí comhiomlánaithe roghanna réigiúnacha (Android 14+)
Ceartúchán Bug:
- KML 2.3: bain úsáid as ainm réimse caighdeánaithe le haghaidh ráta croí
- Liosta rianta: níor nuashonraíodh stádas taifeadta i gceart
- Ceartúcháin Chomhéadain a bhaineann le hábhar3
@@ -0,0 +1,8 @@
v4.12.4: OpenTracks
Cambios:
- Anuncios: pódense omitir as unidades de medida
- Anuncios: engadida a potencia durante a volta no ciclismo
Arranxo:
- fallo ao eliminar marcadores na lista
@@ -0,0 +1,8 @@
v4.12.5: OpenTracks
Arranxos:
- detección correcta do movemento.
Estragouse na v4.9.0 ao engdir detección da pausa. Mira #1756.
Cambios:
- Soporte para Retroceso Predictivo
@@ -0,0 +1,9 @@
v4.13.1: OpenTracks
Cambios:
- O calendario con estatísticas acumuladas segue os axustes rexionais (Android 14+)
Arranxos:
- KML 2.3: usa o nome de campo estándar para frecuencia cardíaca
- Lista de rutas: non se actualizaba correctamente o estado da gravación
- Arranxos na IU relacionados con Material3
@@ -1,11 +1,14 @@
OpenTracks er en app for opptak av sportsaktivitet som respekterer ditt personvern. OpenTracks er en app for opptak av sportsaktivitet som respekterer personvernet ditt.
Funksjoner: Funksjoner:
* Sportsporing: Registrer dine sports- og utendørsaktiviteter * Registrer dine sports- og utendørsaktiviteter
* Bilder og markører: Marker interessante steder under sporing * Bilder og markører: Marker interessante steder underveis
* Total stigning og nedstigning: via barometersensor * Total stigning og nedstigning: via barometersensor
* Høyde vist i EGM2008 (over havnivå); eksportert som WGS84 * Høyde vist i EGM2008 (over havnivå); eksportert som WGS84
* Talemeldinger * Talemeldinger
* Støtter Blåtann LE-sensorer: puls, hastighet og distanse (sykling), kadens (sykling) og wattmåler (sykling) * Støtter Blåtann LE-sensorer: puls, hastighet og distanse (sykling), kadens (sykling) og wattmåler (sykling)
* Eksport av data: Enten som KMZ (inkl. bilder), KML eller GPX * Eksport av data: Enten som KMZ (inkl. bilder), KML eller GPX
* Ingen internettilgang: Internett brukes ikke * Ingen internettilgang: Internett brukes ikke
* Mørkt og lyst tema, respekterer systeminnstillingene
En åpen kildekode-app uten reklame.
@@ -0,0 +1,9 @@
v4.13.1: OpenTracks
Veranderingen:
- Geaggregeerde statistieken calender 'gebruikt regionale voorkeuren (Android 14 +)
Bugfix:
- KML 2.3: gebruik gestandaardiseerde veldnaam voor hartslag
- Tracklijst: opnamestatus is niet correct bijgewerkt
- Material3 gerelateerde UI-fixes
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
Vendored
+1 -1
View File
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@@ -0,0 +1,148 @@
package de.dennisguse.opentracks.services.handlers;
import static org.junit.Assert.assertEquals;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.IOException;
import java.time.Instant;
import de.dennisguse.opentracks.data.models.TrackPoint;
/**
* Expectation is EGM2008 from <a href="https://geographiclib.sourceforge.io/">GeographicLib</a>] EGM2008 5minute undulation data.
*/
@RunWith(JUnit4.class)
public class AltitudeCorrectionManagerTest {
private static final double MAX_ERROR = 0.4;
private final Context context = ApplicationProvider.getApplicationContext();
@Test
public void data_Northpole() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(90);
trackPoint.setLongitude(0.1);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(-14.8980, trackPoint.getAltitude().toM(), 2 * MAX_ERROR); //TODO For some reason, the Northpole is more off.
}
@Test
public void data_Southpole() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(0);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_Southpole2() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(180);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_Southpole3() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(-180);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_0() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(0);
trackPoint.setLongitude(0);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(-17.2260, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_Berlin_Germany_() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(52.530644);
trackPoint.setLongitude(13.383068);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(-39.4865, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_Seattle_USA() {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(47.63153);
trackPoint.setLongitude(-122.30938);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(22.99, trackPoint.getAltitude().toM(), MAX_ERROR);
}
@Test
public void data_MaxUndulation() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-8.417);
trackPoint.setLongitude(147.367);
trackPoint.setAltitude(0);
// when
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
// then
assertEquals(-85.824, trackPoint.getAltitude().toM(), MAX_ERROR);
}
}
@@ -1,247 +0,0 @@
package de.dennisguse.opentracks.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import de.dennisguse.opentracks.data.models.TrackPoint;
@RunWith(JUnit4.class)
public class EGM2008UtilsTest {
private static final double MAX_BILINEAR_ERROR = 0.478;
private final Context context = ApplicationProvider.getApplicationContext();
@Test
public void fileVerification() throws IOException {
// given
int expectedLength = 18671444;
int expectedHeaderLength = 404;
String expectedHeader = """
P5
# Geoid file in PGM format for the GeographicLib::Geoid class
# Description WGS84 EGM2008, 5-minute grid
# URL http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008
# DateTime 2009-08-29 18:45:00
# MaxBilinearError 0.478
# RMSBilinearError 0.012
# MaxCubicError 0.294
# RMSCubicError 0.005
# Offset -108
# Scale 0.003
# Origin 90N 0E
# AREA_OR_POINT Point
# Vertical_Datum WGS84
4320 2161
65535
""";
// when
try (InputStream inputStream = context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA)) {
assertEquals(expectedLength, inputStream.available());
InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.US_ASCII);
char[] data = new char[expectedHeaderLength];
int length = reader.read(data);
// then
assertEquals(expectedHeaderLength, length);
assertEquals(expectedHeader, new String(data));
}
}
@Test
public void data_Northpole() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(90);
trackPoint.setLongitude(0.1);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(-14.8980, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_Southpole() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(0);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_Southpole2() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(180);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_Southpole3() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(-180);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_0() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(0);
trackPoint.setLongitude(0);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(-17.2260, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_Berlin_Germany_() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(52.530644);
trackPoint.setLongitude(13.383068);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(-39.4865, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_Berlin_Germany_Caching() throws IOException {
// given
TrackPoint trackPoint1 = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint1.setLatitude(52.530644);
trackPoint1.setLongitude(13.383068);
trackPoint1.setAltitude(0);
TrackPoint trackPoint2 = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint2.setLatitude(52.530000);
trackPoint2.setLongitude(13.380000);
trackPoint2.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint1.getLocation());
// then
assertNotEquals(altitude_egm2008.correctAltitude(trackPoint1.getLocation()).toM(), altitude_egm2008.correctAltitude(trackPoint2.getLocation()).toM(), 0.0001);
}
@Test
public void data_Seattle_USA() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(47.63153);
trackPoint.setLongitude(-122.30938);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(22.99, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void data_MaxUndulation() throws IOException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(-8.417);
trackPoint.setLongitude(147.367);
trackPoint.setAltitude(0);
// when
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
// then
assertEquals(-85.824, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
}
@Test
public void getIndices() {
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
trackPoint.setLatitude(90);
trackPoint.setLongitude(0);
assertEquals(new EGM2008Utils.Indices(0, 0), EGM2008Utils.getIndices(trackPoint.getLocation()));
trackPoint.setLatitude(0);
trackPoint.setLongitude(0);
assertEquals(new EGM2008Utils.Indices(1080, 0), EGM2008Utils.getIndices(trackPoint.getLocation()));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(180);
assertEquals(new EGM2008Utils.Indices(2160, 4320 / 2), EGM2008Utils.getIndices(trackPoint.getLocation()));
trackPoint.setLatitude(-90);
trackPoint.setLongitude(-180);
assertEquals(new EGM2008Utils.Indices(2160, 2160), EGM2008Utils.getIndices(trackPoint.getLocation()));
}
@Test
public void getUndulationRaw_ok() throws IOException {
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA))) {
assertEquals(40966, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(0, 0)));
assertEquals(41742, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(1081, 0)));
assertEquals(25950, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(2160, 4319)));
}
}
@Test(expected = EOFException.class)
public void getUndulationRaw_error() throws IOException {
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA))) {
assertEquals(0, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(2161, 4320)), 0.01);
}
}
}
@@ -33,6 +33,7 @@ import java.util.Optional;
* Time is created using the {@link de.dennisguse.opentracks.services.handlers.MonotonicClock}, because system time jump backwards. * Time is created using the {@link de.dennisguse.opentracks.services.handlers.MonotonicClock}, because system time jump backwards.
* GPS time is ignored as for non-GPS events, we could not create timestamps. * GPS time is ignored as for non-GPS events, we could not create timestamps.
*/ */
//TODO Should be a record (with final properties)
public class TrackPoint { public class TrackPoint {
private static final Duration MAX_LOCATION_AGE = Duration.ofMinutes(1); private static final Duration MAX_LOCATION_AGE = Duration.ofMinutes(1);
@@ -2,15 +2,15 @@ package de.dennisguse.opentracks.services.handlers;
import android.content.Context; import android.content.Context;
import android.location.Location; import android.location.Location;
import android.location.altitude.AltitudeConverter;
import android.os.Build;
import android.util.Log; import android.util.Log;
import androidx.core.location.LocationCompat;
import androidx.core.location.altitude.AltitudeConverterCompat;
import java.io.IOException; import java.io.IOException;
import de.dennisguse.opentracks.data.models.Altitude; import de.dennisguse.opentracks.data.models.Altitude;
import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.util.EGM2008Utils;
/** /**
* More infos regarding Android 34's <a href="https://issuetracker.google.com/issues/195660815#comment1">AltitudeConverter</a>. * More infos regarding Android 34's <a href="https://issuetracker.google.com/issues/195660815#comment1">AltitudeConverter</a>.
@@ -19,52 +19,28 @@ public class AltitudeCorrectionManager {
private static final String TAG = AltitudeCorrectionManager.class.getSimpleName(); private static final String TAG = AltitudeCorrectionManager.class.getSimpleName();
private AltitudeConverter altitudeConverter;
private final EGM2008Internal altitudeConverterFallback;
public AltitudeCorrectionManager() {
this.altitudeConverterFallback = new EGM2008Internal();
this.altitudeConverter = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ? new AltitudeConverter() : null;
}
public void correctAltitude(Context context, TrackPoint trackPoint) { public void correctAltitude(Context context, TrackPoint trackPoint) {
if (!trackPoint.hasLocation() || !trackPoint.hasAltitude()) { if (!trackPoint.hasLocation() || !trackPoint.hasAltitude()) {
return; return;
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && altitudeConverter != null) {
// TODO The following is doing IO and should not be done in main thread.
// AltitudeConverterCompat uses internally a RoomDatabase that cannot be access from main thread and thus fails on version <= 34.
Thread t = new Thread(() -> {
try { try {
Location loc = trackPoint.getLocation(); Location loc = trackPoint.getLocation();
altitudeConverter.addMslAltitudeToLocation(context, loc); AltitudeConverterCompat.addMslAltitudeToLocation(context, loc);
trackPoint.setAltitude(Altitude.EGM2008.of(loc.getMslAltitudeMeters())); trackPoint.setAltitude(Altitude.EGM2008.of(LocationCompat.getMslAltitudeMeters(loc)));
return;
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, "Android's AltitudeConverter crashed; falling back to internal."); Log.w(TAG, "Android's AltitudeConverterCompat failed with " + e.getMessage());
altitudeConverter = null;
// Should we fallback
}
} }
});
t.start();
altitudeConverterFallback.correctAltitude(context, trackPoint);
}
private static class EGM2008Internal {
private static final String TAG = EGM2008Internal.class.getSimpleName();
private EGM2008Utils.EGM2008Correction egm2008Correction;
public void correctAltitude(Context context, TrackPoint trackPoint) {
if (egm2008Correction == null || !egm2008Correction.canCorrect(trackPoint.getLocation())) {
try { try {
egm2008Correction = EGM2008Utils.createCorrection(context, trackPoint.getLocation()); t.join(); // wait for thread to finish
} catch (IOException e) { } catch (InterruptedException e) {
Log.e(TAG, "Could not load altitude correction for " + trackPoint, e); Log.w(TAG, "Android's AltitudeConverterCompat failed with " + e.getMessage());
return;
}
}
trackPoint.setAltitude(egm2008Correction.correctAltitude(trackPoint.getLocation()));
} }
} }
} }
@@ -1,156 +0,0 @@
package de.dennisguse.opentracks.util;
import android.content.Context;
import android.location.Location;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import java.io.DataInputStream;
import java.io.IOException;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Altitude;
/**
* Converts WGS84 altitude to EGM2008 (should be close to height above sea level).
* <p>
* Uses <a href="https://geographiclib.sourceforge.io/">GeographicLib</a>] EGM2008 5minute undulation data.
* <a href="https://geographiclib.sourceforge.io/html/geoid.html">...</a>
* <p>
* File starts at 90N, 0E (North pole) and is encoded in parallel bands as unsigned shorts.
*/
public class EGM2008Utils {
static final int EGM2008_5_DATA = R.raw.egm2008_5;
private static final int HEADER_LENGTH = 404;
private static final int RESOLUTION_IN_MINUTES = 60 / 5;
private static final int LATITUDE_CORRECTION = 360 * RESOLUTION_IN_MINUTES;
private EGM2008Utils() {
}
public static EGM2008Correction createCorrection(Context context, Location location) throws IOException {
Indices indices = getIndices(location);
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008_5_DATA))) {
return new EGM2008Correction(indices, dataInputStream);
}
}
@VisibleForTesting
static int getUndulationRaw(DataInputStream dataInputStream, Indices indices) throws IOException {
dataInputStream.reset();
int absoluteIndex = indices.getAbsoluteIndex();
return getUndulationRaw(dataInputStream, absoluteIndex);
}
private static int getUndulationRaw(DataInputStream dataInputStream, int undulationIndex) throws IOException {
dataInputStream.reset();
int index = HEADER_LENGTH + undulationIndex * 2; //byte size is 2
long ignored = dataInputStream.skip(index);
return dataInputStream.readUnsignedShort();
}
@VisibleForTesting
static Indices getIndices(Location location) {
double latitude = -location.getLatitude() + 90;
int latitudeIndex = (int) (latitude * RESOLUTION_IN_MINUTES);
double longitude;
if (location.getLongitude() >= 0) {
longitude = location.getLongitude();
} else {
longitude = 360 + location.getLongitude();
}
int longitudeIndex = (int) (longitude * RESOLUTION_IN_MINUTES);
if (longitudeIndex >= 360 * RESOLUTION_IN_MINUTES) {
longitudeIndex = 0;
}
return new Indices(latitudeIndex, longitudeIndex);
}
public static class EGM2008Correction {
protected final Indices indices;
protected final int v00;
protected final int v10;
protected final int v01;
protected final int v11;
private EGM2008Correction(Indices indices, DataInputStream dataInputStream) throws IOException {
this.indices = indices;
v00 = getUndulationRaw(dataInputStream, indices);
if (!isSouthPole()) {
v10 = getUndulationRaw(dataInputStream, indices.offset(0, 1));
v01 = getUndulationRaw(dataInputStream, indices.offset(1, 0));
v11 = getUndulationRaw(dataInputStream, indices.offset(1, 1));
} else {
v10 = 0;
v01 = 0;
v11 = 0;
}
}
public boolean canCorrect(@NonNull Location location) {
return indices.getAbsoluteIndex() == getIndices(location).getAbsoluteIndex();
}
public Altitude.EGM2008 correctAltitude(@NonNull Location location) {
if (!canCorrect(location))
throw new RuntimeException("Undulation data not loaded for this location.");
if (!location.hasAltitude())
throw new RuntimeException("Location has no altitude");
double undulationRaw;
if (isSouthPole()) {
// No bilinear interpolation on South Pole (not worth the time)
undulationRaw = v00;
} else {
double fLongitude = location.getLongitude() * RESOLUTION_IN_MINUTES -
(int) (location.getLongitude() * RESOLUTION_IN_MINUTES);
double fLatitude = (-location.getLatitude() + 90) * RESOLUTION_IN_MINUTES
- (int) ((-location.getLatitude() + 90) * RESOLUTION_IN_MINUTES);
// Bilinear interpolation (optimized; taken from GeopgrahicLib/Geoid.cpp)
double
a = (1 - fLongitude) * v00 + fLongitude * v01,
b = (1 - fLongitude) * v10 + fLongitude * v11;
undulationRaw = (1 - fLatitude) * a + fLatitude * b;
}
// Bilinear interpolation (not optimized)
//undulationRaw = v00 * (1 - fLongitude) * (1 - fLatitude)
// + v10 * fLongitude * (1 - fLatitude)
// + v01 * (1 - fLongitude) * fLatitude
// + v11 * fLongitude * fLatitude;
double h = 0.003 * undulationRaw - 108;
return Altitude.EGM2008.of(location.getAltitude() - h);
}
private boolean isSouthPole() {
return indices.latitudeIndex == 2160;
}
}
@VisibleForTesting
record Indices(int latitudeIndex, int longitudeIndex) {
Indices offset(int latitudeOffset, int longitudeOffset) {
return new Indices(latitudeIndex + latitudeOffset, longitudeIndex + longitudeOffset);
}
int getAbsoluteIndex() {
return latitudeIndex * LATITUDE_CORRECTION + longitudeIndex;
}
}
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -277,7 +277,7 @@
<string name="settings_import_export_title">Impurtazione è espurtazione</string> <string name="settings_import_export_title">Impurtazione è espurtazione</string>
<string name="settings_reset_summary">Reinizià i parametri à i valori predefiniti</string> <string name="settings_reset_summary">Reinizià i parametri à i valori predefiniti</string>
<string name="settings_export_filename_title">Furmatu di u nome di schedariu</string> <string name="settings_export_filename_title">Furmatu di u nome di schedariu</string>
<string name="settings_chart_by_distance">Secondu à a distenza</string> <string name="settings_chart_by_distance">Secondu à a distanza</string>
<string name="settings_chart_by_time">Secondu à a durata</string> <string name="settings_chart_by_time">Secondu à a durata</string>
<string name="settings_ui_dynamic_colors_summary">Impiegà i culori dinamichi definiti da l’utilizatore (solu Android 12è più ; richiede un rilanciu manuale)</string> <string name="settings_ui_dynamic_colors_summary">Impiegà i culori dinamichi definiti da l’utilizatore (solu Android 12è più ; richiede un rilanciu manuale)</string>
<string name="settings_recording_customize_layout_title">Persunalizà u vostru accunciamentu d’arregistramentu</string> <string name="settings_recording_customize_layout_title">Persunalizà u vostru accunciamentu d’arregistramentu</string>
+1
View File
@@ -609,4 +609,5 @@ limitations under the License.
<string name="settings_announcements_lap_power">Výkon kola</string> <string name="settings_announcements_lap_power">Výkon kola</string>
<string name="power_x_watt">Výkon {x, plural, =1 {1 watt} few {# watty} other {# wattů} }</string> <string name="power_x_watt">Výkon {x, plural, =1 {1 watt} few {# watty} other {# wattů} }</string>
<string name="create_marker_error">Nepodařilo se vytvořit značku. Zkuste to znovu.</string> <string name="create_marker_error">Nepodařilo se vytvořit značku. Zkuste to znovu.</string>
<string name="empty">" "</string>
</resources> </resources>
+34 -34
View File
@@ -15,11 +15,11 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--><resources> --><resources>
<string name="about_preference_title">Über OpenTracks</string> <string name="about_preference_title">Über OpenTracks</string>
<string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die Ihre Privatsphäre respektiert.</string> <string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die deine Privatsphäre respektiert.</string>
<string name="about_url">Projekt-Website: <a href="%1$s">%1$s</a></string> <string name="about_url">Projekt-Website: <a href="%1$s">%1$s</a></string>
<string name="about_version_name">Version Name: %1$s</string> <string name="about_version_name">Versionsname: %1$s</string>
<string name="about_version_code">Version Code: %1$d</string> <string name="about_version_code">Versionscode: %1$d</string>
<string name="about_history">OpenTracks ist ein Fork von <a href="https://code.google.com/archive/p/mytracks/"><i>Google\'s MyTracks</i></a> (2016 eingestellt).</string> <string name="about_history">OpenTracks ist ein Fork von <a href="https://code.google.com/archive/p/mytracks/"><i>Google MyTracks</i></a> (das 2016 eingestellt wurde).</string>
<string name="about_libraries">Bibliotheken</string> <string name="about_libraries">Bibliotheken</string>
<!-- Help --> <!-- Help -->
<string name="help_feature_title">OpenTracks hat die folgenden Funktionen:</string> <string name="help_feature_title">OpenTracks hat die folgenden Funktionen:</string>
@@ -30,38 +30,37 @@ limitations under the License.
\n* arbeitet vollständig offline \n* arbeitet vollständig offline
\n* Tracks auf einer Karte anzeigen (siehe unten)</string> \n* Tracks auf einer Karte anzeigen (siehe unten)</string>
<string name="help_track_map_title">Wie wird ein Track auf einer Karte angezeigt?</string> <string name="help_track_map_title">Wie wird ein Track auf einer Karte angezeigt?</string>
<string name="help_track_map_content"> Verwende das kleine Kartensymbol. <string name="help_track_map_content"> \u0020Verwende das kleine Kartensymbol.
\n a) (Live-Aktualisierungen) Installiere <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a>. \na) (Live-Aktualisierungen) Installiere <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a> zur Verfügung. Tatsächlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann.
\n zur Verfügung. Eigentlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann. \nb) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). Genauer ausgedrückt muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen. \u0020</string>
\n b) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). In der Tat muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen. </string> <string name="help_storage_pictures_title">Wie speichert OpenTracks Fotos, die als Markierungen aufgenommen wurden?</string>
<string name="help_storage_pictures_title">Wie speichert OpenTracks Bilder, die als Markierungen aufgenommen wurden?</string>
<string name="help_storage_pictures_content">Diese werden App-intern gespeichert (d.h. nur innerhalb von OpenTracks zugänglich).</string> <string name="help_storage_pictures_content">Diese werden App-intern gespeichert (d.h. nur innerhalb von OpenTracks zugänglich).</string>
<string name="help_track_export_title">Wie kann ich aufgezeichnete Tracks exportieren/teilen?</string> <string name="help_track_export_title">Wie kann ich aufgezeichnete Tracks exportieren/teilen?</string>
<string name="help_track_export_content"> Tracks können aus den Einstellungen als KMZ, KML oder GPX exportiert werden. KMZ/KML alle Daten; GPX nur Standorte. Tracks, die über das Symbol <i>Teilen Icon</i> freigegeben werden, werden als KMZ freigegeben. </string> <string name="help_track_export_content"> Tracks können aus den Einstellungen als KMZ, KML oder GPX exportiert werden. KMZ/KML alle Daten; GPX nur Standorte. Tracks, die über das Symbol <i>Teilen</i> freigegeben werden, werden als KMZ freigegeben. </string>
<string name="help_data_google_play_services_title">Benötigt/benutzt OpenTracks den Google Play Service?</string> <string name="help_data_google_play_services_title">Benötigt/benutzt OpenTracks den Google Play Service?</string>
<string name="help_recording_title">Wie zeichnet OpenTracks Daten auf?</string> <string name="help_recording_title">Wie zeichnet OpenTracks Daten auf?</string>
<string name="help_recording_content"> <string name="help_recording_content">
OpenTracks verwendet den GPS-Sensor des Geräts, um den Standort kontinuierlich aufzuzeichnen. OpenTracks verwendet den GPS-Sensor des Geräts, um den Standort kontinuierlich aufzuzeichnen.
Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), kann OpenTracks nichts dagegen unternehmen.</string> Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), kann OpenTracks nichts dagegen unternehmen.</string>
<string name="help_data_storage_title">Wie speichert OpenTracks Sensordaten?</string> <string name="help_data_storage_title">Wie speichert OpenTracks Sensordaten?</string>
<string name="help_data_storage_content"> Sensordaten werden pro aufgezeichneter Stelle gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Ort gespeichert wird. Wenn Du still stehst oder du dich in geschlossenen Räumen aufhälst, werden keine Sensordaten aufgezeichnet (aber angezeigt) </string> <string name="help_data_storage_content"> Sensordaten werden pro aufgezeichnetem Standort gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Standort gespeichert wird. Wenn Du still stehst oder dich in geschlossenen Räumen aufhältst, werden keine Sensordaten aufgezeichnet (aber angezeigt). </string>
<string name="help_gps_troubleshooting_title">OpenTracks zeichnet keine Standorte auf?</string> <string name="help_gps_troubleshooting_title">OpenTracks zeichnet keine Standorte auf?</string>
<string name="help_gps_troubleshooting_content"> Was Du tun kannst: <string name="help_gps_troubleshooting_content"> \u0020Was Du tun kannst:
\n a) prüfen, ob GPS aktiviert ist, \na) prüfen, ob GPS aktiviert ist,
\n b) den GPS-Empfang verbessern (z.B. ins Freie gehen), \nb) den GPS-Empfang verbessern (z.B. ins Freie gehen),
\n c) mit der <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App das GPS testen, und \nc) mit der <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App das GPS testen, und
\n d) Energiesparen deaktivieren. \nd) Energiesparen deaktivieren.
\n \n
\n Wenn das alles nicht hilft, melde bitte einen Fehler. </string> \nWenn das alles nicht hilft, melde bitte einen Fehler. \u0020</string>
<string name="help_support_title">Wie kann ich OpenTracks unterstützen?</string> <string name="help_support_title">Wie kann ich OpenTracks unterstützen?</string>
<string name="help_support_content"> Du kannst: <string name="help_support_content"> \u0020Du kannst:
\n a) über OpenTracks reden, \na) auf OpenTracks aufmerksam machen,
\n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Merkmale vorschlagen</a>, \nb) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Funktionen vorschlagen</a>,
\n c) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Fehler melden</a>, \nc) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Fehler melden</a>,
\n d) Hilfe bei der Software-Entwicklung, \nd) bei der Software-Entwicklung helfen,
\n e) kaufen in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>, \ne) es im <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a> kaufen,
\n f) spenden, und \nf) spenden, und
\n g) das tun, was Deiner Meinung nach OpenTracks hilft </string> \ng) das tun, was OpenTracks Deiner Meinung nach hilft. \u0020</string>
<string name="open_track_as_trackfileformat">Als %1$s öffnen</string> <string name="open_track_as_trackfileformat">Als %1$s öffnen</string>
<!-- Activity Type --> <!-- Activity Type -->
<string name="activity_type_airplane">Flugzeug</string> <string name="activity_type_airplane">Flugzeug</string>
@@ -174,8 +173,8 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="generic_tracks">Strecken</string> <string name="generic_tracks">Strecken</string>
<!-- Gps --> <!-- Gps -->
<string name="gps_starting">GPS wird gestartet</string> <string name="gps_starting">GPS wird gestartet</string>
<string name="gps_wait_for_better_signal">Warten auf besseres GPS-Signal</string> <string name="gps_wait_for_better_signal">Warte auf besseres GPS-Signal</string>
<string name="gps_wait_for_signal">Warten auf GPS-Signal</string> <string name="gps_wait_for_signal">Warte auf GPS-Signal</string>
<!-- Image --> <!-- Image -->
<string name="image_arrow">Pfeil</string> <string name="image_arrow">Pfeil</string>
<string name="image_marker_count">Anzahl der Markierungen</string> <string name="image_marker_count">Anzahl der Markierungen</string>
@@ -428,7 +427,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="activity_type_escooter">E-Scooter</string> <string name="activity_type_escooter">E-Scooter</string>
<string name="import_unsupported_format">Nicht unterstütztes Dateiformat</string> <string name="import_unsupported_format">Nicht unterstütztes Dateiformat</string>
<plurals name="generic_completed_with_errors"> <plurals name="generic_completed_with_errors">
<item quantity="one">Abgeschlossen mit einem fehler</item> <item quantity="one">Abgeschlossen mit einem Fehler</item>
<item quantity="other">Abgeschlossen mit %1$d Fehlern</item> <item quantity="other">Abgeschlossen mit %1$d Fehlern</item>
</plurals> </plurals>
<string name="import_error_info">%1$s: %2$s</string> <string name="import_error_info">%1$s: %2$s</string>
@@ -462,7 +461,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="track_pace_notification">Tempo: %1$s</string> <string name="track_pace_notification">Tempo: %1$s</string>
<string name="menu_voice_rate">Sprachgeschwindigkeit</string> <string name="menu_voice_rate">Sprachgeschwindigkeit</string>
<string name="import_prevent_reimport">Du hast re-import von Tracks verhindern aktiviert</string> <string name="import_prevent_reimport">Du hast re-import von Tracks verhindern aktiviert</string>
<string name="about_third_party_data">Daten von Drittherstellern</string> <string name="about_third_party_data">Daten von Drittanbietern</string>
<string name="sensor_state_heart_rate_max">Maximaler Herzfrequenz</string> <string name="sensor_state_heart_rate_max">Maximaler Herzfrequenz</string>
<string name="track_delete_not_recording">Dieser Track kann nicht gelöscht werden, da er gerade aufgezeichnet wird.</string> <string name="track_delete_not_recording">Dieser Track kann nicht gelöscht werden, da er gerade aufgezeichnet wird.</string>
<string name="interval_list_empty_message">Es gibt noch keine Intervalle</string> <string name="interval_list_empty_message">Es gibt noch keine Intervalle</string>
@@ -561,17 +560,17 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="no_compatible_file_manager_installed">Kein kompatibler Dateimanager installiert</string> <string name="no_compatible_file_manager_installed">Kein kompatibler Dateimanager installiert</string>
<string name="aggregated_stats_filter_no_results">Es gibt keine Aktivitäten für diesen Filter</string> <string name="aggregated_stats_filter_no_results">Es gibt keine Aktivitäten für diesen Filter</string>
<string name="settings_announcements_summary">Zeit, Entfernung, Sprachgeschwindigkeit</string> <string name="settings_announcements_summary">Zeit, Entfernung, Sprachgeschwindigkeit</string>
<string name="generic_dismiss">Ablehnen</string> <string name="generic_dismiss">Verwerfen</string>
<string name="settings_defaults_summary">Bevorzugte Einheiten, Standard Aktivität, Standard Trackbezeichnung</string> <string name="settings_defaults_summary">Bevorzugte Einheiten, Standard Aktivität, Standard Trackbezeichnung</string>
<string name="settings_layout_reset_confirm_title">Deine Layouts zurücksetzen\?</string> <string name="settings_layout_reset_confirm_title">Deine Layouts zurücksetzen\?</string>
<string name="settings_layout_reset">Individuelle Layouts zurücksetzen</string> <string name="settings_layout_reset">Individuelle Layouts zurücksetzen</string>
<string name="settings_layout_reset_done">Alle Layout-Einstellungen wurden auf ihre Standardwerte zurückgesetzt</string> <string name="settings_layout_reset_done">Alle Layout-Einstellungen wurden auf ihre Standardwerte zurückgesetzt</string>
<string name="settings_all_reset">Zurücksetzen</string> <string name="settings_all_reset">Zurücksetzen</string>
<string name="field_remove_from_layout">Entfernen</string> <string name="field_remove_from_layout">Entfernen</string>
<string name="error_crash_title">%1$s abgestürzt</string> <string name="error_crash_title">%1$s ist abgestürzt</string>
<string name="share_crash_report">Teile Absturzbericht</string> <string name="share_crash_report">Absturzbericht teilen</string>
<string name="always">Immer</string> <string name="always">Immer</string>
<string name="select_show_on_map_behavior">Wähle \"Zeige auf Karte\" Verhalten</string> <string name="select_show_on_map_behavior">Wähle \"Zeige auf Karte\"-Verhalten</string>
<string name="settings_open_tracks_summary">Alles über das OpenTracks-Projekt</string> <string name="settings_open_tracks_summary">Alles über das OpenTracks-Projekt</string>
<string name="settings_layout_reset_confirm_message">Alle Layout-Einstellungen werden auf die Standardwerte zurückgesetzt. Aufzeichnungen werden nicht vom Gerät gelöscht.</string> <string name="settings_layout_reset_confirm_message">Alle Layout-Einstellungen werden auf die Standardwerte zurückgesetzt. Aufzeichnungen werden nicht vom Gerät gelöscht.</string>
<string name="report_bug">Fehler melden</string> <string name="report_bug">Fehler melden</string>
@@ -588,7 +587,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="no_compatible_gallery_installed">Keine kompatible Bildergalerie Anwendung installiert</string> <string name="no_compatible_gallery_installed">Keine kompatible Bildergalerie Anwendung installiert</string>
<string name="show_on_dashboard_not_installed">Es ist keine Anwendung installiert, die die OpenTracks Dashboard API unterstützt.</string> <string name="show_on_dashboard_not_installed">Es ist keine Anwendung installiert, die die OpenTracks Dashboard API unterstützt.</string>
<string name="location_latitude_longitude">%1$s, %2$s</string> <string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="show_on_map_format_ask">Frag</string> <string name="show_on_map_format_ask">Nachfragen</string>
<string name="settings_stats_units_nautical">Nautisches Maß (NM, ft)</string> <string name="settings_stats_units_nautical">Nautisches Maß (NM, ft)</string>
<string name="unit_minute_per_nautical_mile">min/NM</string> <string name="unit_minute_per_nautical_mile">min/NM</string>
<string name="voice_on_device_speaker_title">Verwende den Lautsprecher des Gerätes</string> <string name="voice_on_device_speaker_title">Verwende den Lautsprecher des Gerätes</string>
@@ -646,4 +645,5 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="voiceIdle">Untätig werden.</string> <string name="voiceIdle">Untätig werden.</string>
<string name="voice_announce_lap_power_key">StimmeAnkündigungLapPower</string> <string name="voice_announce_lap_power_key">StimmeAnkündigungLapPower</string>
<string name="settings_announcements_lap_power">Rundenleistung</string> <string name="settings_announcements_lap_power">Rundenleistung</string>
<string name="create_marker_error">Die Markierung konnte nicht erstellt werden. Versuchen Sie es erneut.</string>
</resources> </resources>
+8 -8
View File
@@ -15,13 +15,13 @@
<string name="help_recording_title">Conas a thaifeadann OpenTracks sonraí\?</string> <string name="help_recording_title">Conas a thaifeadann OpenTracks sonraí\?</string>
<string name="help_data_storage_title">Conas a stórálann OpenTracks sonraí braiteora\?</string> <string name="help_data_storage_title">Conas a stórálann OpenTracks sonraí braiteora\?</string>
<string name="help_recording_content">OpenTracks úsáideann an braiteoir GPS an fheiste chun an suíomh a thaifeadadh go leanúnach. Má thuairiscíonn an gléas GPS sonraí míchruinne (m.sh., suíomh, luas, ingearchló), Ní féidir Le OpenTracks aon rud a dhéanamh faoi.</string> <string name="help_recording_content">OpenTracks úsáideann an braiteoir GPS an fheiste chun an suíomh a thaifeadadh go leanúnach. Má thuairiscíonn an gléas GPS sonraí míchruinne (m.sh., suíomh, luas, ingearchló), Ní féidir Le OpenTracks aon rud a dhéanamh faoi.</string>
<string name="help_gps_troubleshooting_content"> Cad is féidir leat a dhéanamh: <string name="help_gps_troubleshooting_content"> \u0020Cad is féidir leat a dhéanamh:
\n a) seiceáil an bhfuil GPS cumasaithe, \n a) seiceáil an bhfuil GPS cumasaithe,
\n b) feabhas a chur ar fáiltiú GPS (e.g., dul amuigh faoin AER), \n b) feabhas a chur ar fáiltiú GPS (e.g., dul amuigh faoin AER),
\n c) seiceáil le <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">gpstest</a> app, agus \n c) seiceáil le <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">gpstest</a> app, agus
\n d) díchumasaigh coigilt cumhachta. \n d) díchumasaigh coigilt cumhachta.
\n \n
\n Mura gcabhraíonn gach rud le do thoil tuairiscigh fabht. </string> \nMura gcabhraíonn gach rud le do thoil tuairiscigh fabht. \u0020</string>
<string name="open_track_as_trackfileformat">Oscail mar %1$s</string> <string name="open_track_as_trackfileformat">Oscail mar %1$s</string>
<string name="activity_type_airplane">eitleán</string> <string name="activity_type_airplane">eitleán</string>
<string name="activity_type_biking">rothaíocht</string> <string name="activity_type_biking">rothaíocht</string>
@@ -331,10 +331,10 @@
<string name="settings_gps_summary">Eatramh ama, Fad-eatramh, Fad Max, Cruinneas</string> <string name="settings_gps_summary">Eatramh ama, Fad-eatramh, Fad Max, Cruinneas</string>
<string name="about_description"><i>Open Tracks</i> is iarratas rianaithe spóirt go n-urramaíonn go hiomlán do phríobháideacht.</string> <string name="about_description"><i>Open Tracks</i> is iarratas rianaithe spóirt go n-urramaíonn go hiomlán do phríobháideacht.</string>
<string name="help_track_export_content"> Is féidir rianta a easpórtáil ó na Socruithe mar KMZ, KML, nó GPX. na sonraí go léir KMZ/KML; Suíomhanna GPX amháin. Roinntear rianta a roinntear tríd an <i>deilbhín comhroinnte</i> mar KMZ. </string> <string name="help_track_export_content"> Is féidir rianta a easpórtáil ó na Socruithe mar KMZ, KML, nó GPX. na sonraí go léir KMZ/KML; Suíomhanna GPX amháin. Roinntear rianta a roinntear tríd an <i>deilbhín comhroinnte</i> mar KMZ. </string>
<string name="help_track_map_content">" Bain úsáid as an deilbhín léarscáile beag. <string name="help_track_map_content"> \u0020Bain úsáid as an deilbhín léarscáile beag.
\n a) (nuashonraithe beo) Suiteáil &lt;a href=\"https://github.com/OpenTracksApp/OSMDashboard\"&gt;OSMDashboard&lt;/a&gt;. Soláthraíonn sé léarscáileanna ar líne nó as líne trí &lt;a href=\"https://www.openstreetmap.org\"&gt;OpenStreetMap&lt;/a&gt;. \n a) (nuashonraithe beo) Suiteáil <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. Soláthraíonn sé léarscáileanna ar líne nó as líne trí <a href="https://www.openstreetmap.org">OpenStreetMap</a>.
\n I ndáiríre, is aip ar leith é OSMDashboard nach féidir ach rochtain a fháil (go sealadach) ar shonraí na rianta atá le taispeáint. \n I ndáiríre, is aip ar leith é OSMDashboard nach féidir ach rochtain a fháil (go sealadach) ar shonraí na rianta atá le taispeáint.
\n b) Trí ghnáthfheidhmchlár léarscáile (m.sh., &lt;a href=\"http://osmand.net/\"&gt;OsmAnd&lt;/a&gt; agus &lt;a href=\"https://maps.me/\"&gt;MAPS.ME&lt; /a&gt;). Ní mór do na haipeanna seo tacú le formáid comhaid KMZ (suíomhanna agus stampaí ama amháin). Go deimhin, caithfidh aip tacaíocht a thabhairt do &lt;i&gt;ACTION_VIEW&lt;/i&gt; le MIME &lt;i&gt;application/vnd.google-earth.kmz&lt;/i&gt;. "</string> \n b) Trí ghnáthfheidhmchlár léarscáile (m.sh., <a href="http://osmand.net/">OsmAnd</a> agus <a href="https://maps.me/">MAPS.ME</a>). Ní mór do na haipeanna seo tacú le formáid comhaid KMZ (suíomhanna agus stampaí ama amháin). Go deimhin, caithfidh aip tacaíocht a thabhairt do <i>ACTION_VIEW</i> le MIME <i>application/vnd.google-earth.kmz</i>. \u0020</string>
<string name="activity_type_ultimate_frisbee">frisbee deiridh</string> <string name="activity_type_ultimate_frisbee">frisbee deiridh</string>
<string name="description_total_time">Am iomlán: %1$s</string> <string name="description_total_time">Am iomlán: %1$s</string>
<string name="activity_type_inline_skating">scátáil inlíne</string> <string name="activity_type_inline_skating">scátáil inlíne</string>
@@ -364,14 +364,14 @@
<string name="always">I gcónaí</string> <string name="always">I gcónaí</string>
<string name="show_on_dashboard_not_installed">Níl aon fheidhmchlár a thacaíonn le OpenTracks Dashboard API suiteáilte.</string> <string name="show_on_dashboard_not_installed">Níl aon fheidhmchlár a thacaíonn le OpenTracks Dashboard API suiteáilte.</string>
<string name="share_image_body">Sílim go mb\'fhéidir go mbeadh suim agat san íomhá seo.</string> <string name="share_image_body">Sílim go mb\'fhéidir go mbeadh suim agat san íomhá seo.</string>
<string name="help_support_content"> You can: <string name="help_support_content"> \u0020You can:
\n a) spread the word about OpenTracks, \n a) spread the word about OpenTracks,
\n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">propose features</a>, \n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">propose features</a>,
\n c) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">report bugs</a>, \nc) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">report bugs</a>,
\n d) help in software development, \n d) help in software development,
\n e) buy in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>, \n e) buy in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
\n f) donate, and \n f) donate, and
\n g) do whatever you think helps OpenTracks. </string> \n g) do whatever you think helps OpenTracks. \u0020</string>
<string name="settings_public_api_disabled_toast">Tá OpenTracks Public API díchumasaithe: is féidir é a chumasú sna socruithe.</string> <string name="settings_public_api_disabled_toast">Tá OpenTracks Public API díchumasaithe: is féidir é a chumasú sna socruithe.</string>
<string name="stats_altitude">Airde</string> <string name="stats_altitude">Airde</string>
<string name="stats_coordinates">Domhanleithead/Domhanfhad</string> <string name="stats_coordinates">Domhanleithead/Domhanfhad</string>
+10 -7
View File
@@ -393,7 +393,7 @@ limitations under the License.
<string name="menu_insert_gallery_img">Galériakép beillesztése</string> <string name="menu_insert_gallery_img">Galériakép beillesztése</string>
<string name="menu_resume_track">Nyomvonal folytatása</string> <string name="menu_resume_track">Nyomvonal folytatása</string>
<string name="import_parser_error">Értelmezőhiba: %1$s</string> <string name="import_parser_error">Értelmezőhiba: %1$s</string>
<string name="help_data_storage_content"> \u0020Az érzékelőadatok rögzített helyenként vannak tárolva. A pulzusszám-érzékelőre vonatkoztatva ez azt jelenti, hogy csak <i>egy</i> pulzusszámmérés kerül tárolásra helyenként. Ha Ön mozdulatlanul áll vagy beltérben tartózkodik, akkor nem kerülnek rögzítésre az érzékelőadatai (de megjelennek). \u0020</string> <string name="help_data_storage_content"> Az érzékelőadatok rögzített helyenként vannak tárolva. A pulzusszám-érzékelőre vonatkoztatva ez azt jelenti, hogy csak <i>egy</i> pulzusszámmérés kerül tárolásra helyenként. Ha Ön mozdulatlanul áll vagy beltérben tartózkodik, akkor nem kerülnek rögzítésre az érzékelőadatai (de megjelennek). </string>
<string name="help_support_content"> \u0020Ezeket teheti meg: <string name="help_support_content"> \u0020Ezeket teheti meg:
\n \u0020a) terjesztheti az OpenTracks hírét, \n \u0020a) terjesztheti az OpenTracks hírét,
\n \u0020b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">funkciókat javasolhat</a>, \n \u0020b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">funkciókat javasolhat</a>,
@@ -417,7 +417,7 @@ limitations under the License.
<string name="share_image_subject">Szeretnék megosztani veletek egy képet</string> <string name="share_image_subject">Szeretnék megosztani veletek egy képet</string>
<string name="share_image_body">Azt hiszem, ez a kép érdekelhet.</string> <string name="share_image_body">Azt hiszem, ez a kép érdekelhet.</string>
<string name="help_recording_title">Hogyan veszi fel az OpenTracks az adatokat?</string> <string name="help_recording_title">Hogyan veszi fel az OpenTracks az adatokat?</string>
<string name="help_track_export_content"> \u0020A nyomvonalak KMZ, KML vagy GPX formátumban exportálhatók a Beállításokból. KMZ/KML minden adat; GPX csak a helyszínek. \u0020A <i>megosztás ikonon</i> keresztül megosztott nyomvonalak KMZ formátumban kerülnek megosztásra. \u0020</string> <string name="help_track_export_content"> A nyomvonalak KMZ, KML vagy GPX formátumban exportálhatók a Beállításokból. KMZ/KML minden adat; GPX csak a helyszínek. A <i>megosztás ikonon</i> keresztül megosztott nyomvonalak KMZ formátumban kerülnek megosztásra. </string>
<string name="help_track_map_content"> \u0020Használja a kis térkép ikont. <string name="help_track_map_content"> \u0020Használja a kis térkép ikont.
\n \u0020a) \u0020(élő frissítések) Telepítse a <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. \u0020Ez online vagy offline térképeket biztosít a <a href="https://www.openstreetmap.org">OpenStreetMap</a> segítségével. \n \u0020a) \u0020(élő frissítések) Telepítse a <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. \u0020Ez online vagy offline térképeket biztosít a <a href="https://www.openstreetmap.org">OpenStreetMap</a> segítségével.
\n \u0020Valójában az OSMDashboard egy különálló alkalmazás, amely csak a megjelenítendő nyomvonal(ak) adataihoz fér hozzá (ideiglenesen). \u0020 \n \u0020Valójában az OSMDashboard egy különálló alkalmazás, amely csak a megjelenítendő nyomvonal(ak) adataihoz fér hozzá (ideiglenesen). \u0020
@@ -425,11 +425,11 @@ limitations under the License.
<string name="about_description">Az <i>OpenTracks</i> egy sportkövető alkalmazás, amely teljes mértékben tiszteletben tartja az Ön adatvédelmét.</string> <string name="about_description">Az <i>OpenTracks</i> egy sportkövető alkalmazás, amely teljes mértékben tiszteletben tartja az Ön adatvédelmét.</string>
<string name="about_history">Az OpenTracks a <a href="https://code.google.com/archive/p/mytracks/"><i>Google MyTracks</i></a> (2016-ban megszűnt) elágazása.</string> <string name="about_history">Az OpenTracks a <a href="https://code.google.com/archive/p/mytracks/"><i>Google MyTracks</i></a> (2016-ban megszűnt) elágazása.</string>
<string name="help_feature_content">* GPS nyomvonalak létrehozása <string name="help_feature_content">* GPS nyomvonalak létrehozása
\n * szívritmus-érzékelő használata (csak Bluetooth LE) \n* szívritmus-érzékelő használata (csak Bluetooth LE)
\n * hangbejelentések (idő vagy távolság alapján) \n* hangbejelentések (idő vagy távolság alapján)
\n * jelölések létrehozása (képekkel együtt) \n* jelölések létrehozása (képekkel együtt)
\n * teljes offline működés \n* teljes offline működés
\n * nyomvonalak megjelenítése a térképen (lásd lentebb)</string> \n* nyomvonalak megjelenítése a térképen (lásd lentebb)</string>
<string name="about_third_party_data">Harmadik féltől származó adatok</string> <string name="about_third_party_data">Harmadik féltől származó adatok</string>
<string name="menu_voice_rate">Beszédhang sebessége</string> <string name="menu_voice_rate">Beszédhang sebessége</string>
<string name="track_delete_not_recording">Ez a nyomvonal nem törölhető, mivel jelenleg is felveszi.</string> <string name="track_delete_not_recording">Ez a nyomvonal nem törölhető, mivel jelenleg is felveszi.</string>
@@ -601,4 +601,7 @@ limitations under the License.
<string name="voiceSpeed">{n,number,#.0}</string> <string name="voiceSpeed">{n,number,#.0}</string>
<string name="settings_announcements_lap_power">Kör teljesítmény</string> <string name="settings_announcements_lap_power">Kör teljesítmény</string>
<string name="create_marker_error">Nem sikerült jelölőt létrehozni. Próbálja újra.</string> <string name="create_marker_error">Nem sikerült jelölőt létrehozni. Próbálja újra.</string>
<string name="voiceDistance">{n, plural, =1 {1 } other {{n,number,#.0}} }</string>
<string name="voice_announce_lap_power_key">voiceAnnounceLapPower</string>
<string name="power_x_watt">Teljesítmény {x, plural, =1 {1 watt} other {# watts} }</string>
</resources> </resources>