forked from upstream-mirrors/OpenTracks
Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ae2a97576b | |||
| 3e830a086e | |||
| 618a1df3ea | |||
| 90cfc67c59 | |||
| cecc586868 | |||
| f956e7fab3 | |||
| 128b95cd83 | |||
| 895a5c2b2a | |||
| 91ce5cf8d7 | |||
| a283464331 | |||
| 1c3a2bd2e4 | |||
| 0b326a77c2 | |||
| d68008941e | |||
| b822d05a78 | |||
| 74bfed768c | |||
| ebfcce6d8d | |||
| d97d8f85e4 | |||
| 37c2c5029e | |||
| 105ff89fd8 | |||
| 0ac033106c | |||
| 21ec9fc568 | |||
| 2e3a7a31d4 | |||
| ecd7405a8c | |||
| 28abe360cb | |||
| 9cf88c00b0 | |||
| 8bbde4aacd | |||
| 00351136f2 | |||
| 30b85bd215 | |||
| 14b705b43e | |||
| 31fc0adabc | |||
| 1714da5d3b | |||
| 6ae47b5e01 | |||
| df8e4c2e2e | |||
| 6f9fa3719a | |||
| b9014c7219 | |||
| d44ab44620 | |||
| bcffe05744 | |||
| ed60734868 | |||
| e314ff8f43 | |||
| 1108684d06 | |||
| 6c0033c107 | |||
| 8a3e50ef9b | |||
| 05b572253e | |||
| f755a086cd | |||
| b0605323da | |||
| 585c2234eb | |||
| c5d7ea4245 | |||
| 281cd8a861 | |||
| 36400c8ad0 | |||
| fb00f697c5 | |||
| f529726218 | |||
| 059f3d8f43 | |||
| cae716925f | |||
| d29ee6da3d | |||
| 033b5211ea | |||
| 5f4f5baba4 | |||
| 4421046556 | |||
| 30482d5a34 | |||
| f12094c953 | |||
| c5147e7664 | |||
| 03b66bc6a2 | |||
| 7b40f2c949 | |||
| 785a922d03 | |||
| 5d2414977b |
+1
-1
@@ -2,4 +2,4 @@
|
||||
|
||||
liberapay: OpenTracks
|
||||
github: [rgmf, pstorch, dennisguse]
|
||||
custom: https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore
|
||||
custom: [ https://liberapay.com/OpenTracks, https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore ]
|
||||
|
||||
@@ -9,7 +9,6 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
|
||||
<th>Free (F-Droid)</th>
|
||||
<th>Free (Nightly for F-Droid)</th>
|
||||
<th>Donations</th>
|
||||
<th>Translations</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
@@ -27,47 +26,26 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
|
||||
<img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg" height="45" align="middle">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://weblate.bubu1.eu/engage/OpenTracks/">
|
||||
<img src="https://weblate.bubu1.eu/widgets/OpenTracks/-/opentracks/svg-badge.svg" alt="Translation status" />
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img alt="OpenTracks version published on F-Droid" src="https://img.shields.io/f-droid/v/de.dennisguse.opentracks.svg" align="middle" >
|
||||
</td>
|
||||
<td></td>
|
||||
<td align="center">
|
||||
<a href="bitcoin:bc1qckpls3lpjlcpyxzm66hcy65hnesas9zgacy6yc">
|
||||
<img alt="bitcoin:bc1qckpls3lpjlcpyxzm66hcy65hnesas9zgacy6yc" src="promotion/donations-bitcoin.png" height="90" align="middle">
|
||||
</a>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td align="center">
|
||||
<a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">
|
||||
<img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png" height="60" align="middle">
|
||||
</a>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td align="center">
|
||||
<a href="https://www.amazon.de/dp/B09K2KNQ7X/">
|
||||
<img alt="Get it on Amazon App Store" src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-white.png" height="40" align="middle">
|
||||
</a>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<a href="https://weblate.bubu1.eu/engage/OpenTracks/">
|
||||
<img src="https://weblate.bubu1.eu/widgets/OpenTracks/-/opentracks/horizontal-auto.svg" alt="Translation status" />
|
||||
</a>
|
||||
|
||||
## Screenshots
|
||||
|
||||
<div>
|
||||
<img width="23%" src="fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot1.png">
|
||||
<img width="23%" src="fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot2.png">
|
||||
@@ -130,7 +108,7 @@ The API can be invoked by sending an explicit Intent to start an activity.
|
||||
|
||||
`Class`:
|
||||
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording`
|
||||
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StopRecording`
|
||||
* **Stop a recording:** `de.dennisguse.opentracks.publicapi.StopRecording`
|
||||
|
||||
For testing via adb: `adb shell am start -n "package/class"`
|
||||
|
||||
|
||||
+6
-6
@@ -6,7 +6,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.2.0'
|
||||
classpath 'com.android.tools.build:gradle:7.2.1'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,8 +59,8 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "de.dennisguse.opentracks"
|
||||
versionCode 4874
|
||||
versionName "v4.0.0"
|
||||
versionCode 4938
|
||||
versionName "v4.0.2"
|
||||
|
||||
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
|
||||
|
||||
@@ -119,10 +119,10 @@ android {
|
||||
dependencies {
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||
|
||||
implementation 'androidx.appcompat:appcompat:1.4.1'
|
||||
implementation 'androidx.appcompat:appcompat:1.4.2'
|
||||
implementation 'androidx.preference:preference:1.2.0'
|
||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||
implementation 'com.google.android.material:material:1.6.0'
|
||||
implementation 'com.google.android.material:material:1.6.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
|
||||
androidTestImplementation 'androidx.test:core:1.4.0'
|
||||
@@ -130,7 +130,7 @@ dependencies {
|
||||
androidTestImplementation 'androidx.test:rules:1.4.0'
|
||||
androidTestImplementation 'androidx.test:runner:1.4.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
androidTestImplementation 'org.mockito:mockito-android:4.5.1'
|
||||
androidTestImplementation 'org.mockito:mockito-android:4.6.1'
|
||||
|
||||
androidTestUtil 'androidx.test:orchestrator:1.4.1'
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
v4.0.1: OpenTracks
|
||||
|
||||
Changes:
|
||||
- Voice announcements are now configurable
|
||||
- Fullscreen mode now also hides Android's navigation bar
|
||||
- Connection to BLE sensors should now be faster
|
||||
- Allow to reset settings while recording
|
||||
- Allow to change import/export settings while recording
|
||||
- KML/KMZ: do not use icons to be loaded from Google
|
||||
|
||||
Bugfix:
|
||||
- TrackStoppedActivity now works on smaller screens
|
||||
- Requests permissions on track list
|
||||
@@ -0,0 +1,10 @@
|
||||
v4.0.2: OpenTracks
|
||||
|
||||
Changes:
|
||||
- Add nautical miles
|
||||
- Settings can be reset while recording
|
||||
|
||||
Bugfix:
|
||||
- Voice announcement rounding
|
||||
- Chart: elevation was weirdly smoothed
|
||||
- Export was not checking if file exists
|
||||
@@ -0,0 +1,11 @@
|
||||
v3.20.2 : OpenTracks
|
||||
|
||||
Changements :
|
||||
- Le gain et la perte d'altitude sont des entiers au lieu de floats
|
||||
- Demander la permission avant d'utiliser Bluetooth par un message Toast
|
||||
|
||||
Correction d'un bug :
|
||||
- Définir FLAG_IMMUTABLE pour PendingIntents pour éviter un crash sur Android 12
|
||||
- Le capteur de cadence renvoie 0 au lieu de None lorsque l'utilisateur ne pédale pas.
|
||||
- Le capteur de vitesse renvoie 0 au lieu de la dernière vitesse connue quand c'est arrêté
|
||||
- Avec les capteurs, le temps de déplacement s'arrête lorsqu'il n'est pas en mouvement
|
||||
@@ -7,5 +7,11 @@ Fonctionnalités :
|
||||
* Dénivelé positif et négatif: via capteur de pression barométrique
|
||||
* Synthèse vocale
|
||||
* Prise en charge des capteurs Bluetooth LE : rythme cardiaque, vitesse et distance (vélo), cadence de pédalage (vélo), et capteur de puissance (vélo)
|
||||
* Export : export des traces au format KMZ (photos incluses), KML ou GPX
|
||||
* Export : export des traces au format KMZ (photos incluses), KML ou GPX
|
||||
* Pas d'accès internet requis : Internet n'est pas nécessaire pour le fonctionnement de l'application
|
||||
* Thème sombre ou claire, avec le respect des paramètres du système
|
||||
* Pas de publicités
|
||||
|
||||
Logiciel Open Source
|
||||
Vous pouvez utiliser, étudier, changer et partager le code source.
|
||||
Licence Apache 2.0
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -5,6 +5,7 @@ import static androidx.test.espresso.Espresso.onData;
|
||||
import static androidx.test.espresso.Espresso.onView;
|
||||
import static androidx.test.espresso.Espresso.pressBack;
|
||||
import static androidx.test.espresso.action.ViewActions.click;
|
||||
import static androidx.test.espresso.action.ViewActions.longClick;
|
||||
import static androidx.test.espresso.action.ViewActions.scrollTo;
|
||||
import static androidx.test.espresso.assertion.ViewAssertions.matches;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||
@@ -14,7 +15,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
||||
import static org.hamcrest.Matchers.allOf;
|
||||
import static org.hamcrest.Matchers.anything;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.childAtPosition;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.veryLongTouch;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.waitFor;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.withListSize;
|
||||
|
||||
@@ -55,149 +55,33 @@ public class EspressoDeleteTrackTest {
|
||||
@Rule
|
||||
public GrantPermissionRule mGrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
|
||||
private MyIdlingResource idlingResource;
|
||||
|
||||
@Before
|
||||
public void registerIntentServiceIdlingResource() {
|
||||
Instrumentation instrumentation
|
||||
= InstrumentationRegistry.getInstrumentation();
|
||||
idlingResource = new MyIdlingResource(instrumentation.getTargetContext());
|
||||
IdlingRegistry.getInstance().register(idlingResource);
|
||||
}
|
||||
|
||||
@After
|
||||
public void unregisterIntentServiceIdlingResource() {
|
||||
IdlingRegistry.getInstance().unregister(idlingResource);
|
||||
}
|
||||
|
||||
@Ignore("Test fails permanently")
|
||||
@Deprecated
|
||||
@Test
|
||||
public void espressoDeleteTrackTest() {
|
||||
int countBefore;
|
||||
// TrackListActivity: start recording
|
||||
onView(withId(R.id.track_list_fab_action)).perform(click());
|
||||
|
||||
{
|
||||
// TrackListActivity: start recording
|
||||
ViewInteraction trackControllerRecordButton = onView(withId(R.id.track_list_fab_action));
|
||||
trackControllerRecordButton.perform(click());
|
||||
}
|
||||
// TrackRecordingActivity
|
||||
onView(withId(R.id.track_recording_fab_action))
|
||||
// wait; stay recording
|
||||
.perform(waitFor(5000))
|
||||
// stop;
|
||||
.perform(longClick());
|
||||
|
||||
{
|
||||
// TrackRecordingActivity
|
||||
ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action));
|
||||
|
||||
// wait; stay recording
|
||||
trackControllerStopButton.perform(waitFor(5000));
|
||||
|
||||
// stop;
|
||||
trackControllerStopButton.perform(veryLongTouch(1600));
|
||||
}
|
||||
|
||||
// back
|
||||
pressBack();
|
||||
|
||||
// get number of items before deleting a track
|
||||
countBefore = numberOfItemsListView();
|
||||
// TrackStoppedActivity
|
||||
onView(withId(R.id.finish_button)).perform(click());
|
||||
|
||||
// select track
|
||||
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(veryLongTouch(5000));
|
||||
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(longClick());
|
||||
|
||||
// open menu and delete selected track
|
||||
ViewInteraction overflowMenuButton = onView(
|
||||
allOf(withContentDescription("More options"),
|
||||
childAtPosition(
|
||||
childAtPosition(
|
||||
withId(R.id.bottom_app_bar),
|
||||
2),
|
||||
2),
|
||||
isDisplayed()));
|
||||
overflowMenuButton.perform(click());
|
||||
onView(allOf(withContentDescription("More options"), isDisplayed()))
|
||||
.perform(click());
|
||||
|
||||
ViewInteraction appCompatTextView = onView(
|
||||
allOf(withId(R.id.title), withText("Delete"),
|
||||
childAtPosition(
|
||||
childAtPosition(
|
||||
withId(R.id.content),
|
||||
0),
|
||||
0),
|
||||
isDisplayed()));
|
||||
appCompatTextView.perform(click());
|
||||
onView(withText("Delete")).perform(click());
|
||||
|
||||
ViewInteraction appCompatButton = onView(
|
||||
allOf(withId(android.R.id.button1), withText("Yes"),
|
||||
childAtPosition(
|
||||
childAtPosition(
|
||||
withId(R.id.buttonPanel),
|
||||
0),
|
||||
3)));
|
||||
appCompatButton.perform(scrollTo(), click());
|
||||
onView(withText("OK")).perform(click());
|
||||
|
||||
// check number of items after delete
|
||||
onView(withId(R.id.track_list)).check(ViewAssertions.matches(withListSize(countBefore - 1)));
|
||||
}
|
||||
|
||||
|
||||
private int numberOfItemsListView() {
|
||||
final int[] counts = new int[1];
|
||||
onView(withId(R.id.track_list)).check(matches(new TypeSafeMatcher<View>() {
|
||||
@Override
|
||||
public boolean matchesSafely(View view) {
|
||||
ListView listView = (ListView) view;
|
||||
|
||||
counts[0] = listView.getCount();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void describeTo(Description description) {
|
||||
}
|
||||
}));
|
||||
|
||||
return counts[0];
|
||||
}
|
||||
|
||||
|
||||
private static class MyIdlingResource implements IdlingResource {
|
||||
|
||||
private final Context context;
|
||||
private ResourceCallback resourceCallback;
|
||||
|
||||
public MyIdlingResource(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return MyIdlingResource.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerIdleTransitionCallback(IdlingResource.ResourceCallback resourceCallback) {
|
||||
this.resourceCallback = resourceCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIdleNow() {
|
||||
boolean idle = !isDeleteServiceRunning();
|
||||
if (idle && resourceCallback != null) {
|
||||
resourceCallback.onTransitionToIdle();
|
||||
}
|
||||
return idle;
|
||||
}
|
||||
|
||||
private boolean isDeleteServiceRunning() {
|
||||
ActivityManager manager =
|
||||
(ActivityManager) context.getSystemService(
|
||||
Context.ACTIVITY_SERVICE);
|
||||
for (ActivityManager.RunningServiceInfo info :
|
||||
manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (TrackDeleteService.class.getName().equals(
|
||||
info.service.getClassName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// tracklist is empty now
|
||||
onView(allOf(withText("Start recording your next adventure here"), isDisplayed()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,26 +4,22 @@ import static androidx.test.espresso.Espresso.onData;
|
||||
import static androidx.test.espresso.Espresso.onView;
|
||||
import static androidx.test.espresso.action.ViewActions.click;
|
||||
import static androidx.test.espresso.action.ViewActions.longClick;
|
||||
import static androidx.test.espresso.action.ViewActions.scrollTo;
|
||||
import static androidx.test.espresso.assertion.ViewAssertions.matches;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withId;
|
||||
import static org.hamcrest.Matchers.allOf;
|
||||
import static org.hamcrest.Matchers.anything;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.selectTabAtIndex;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.waitFor;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.test.espresso.UiController;
|
||||
import androidx.test.espresso.ViewAction;
|
||||
import androidx.test.espresso.ViewInteraction;
|
||||
import androidx.test.espresso.action.MotionEvents;
|
||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.LargeTest;
|
||||
import androidx.test.rule.GrantPermissionRule;
|
||||
|
||||
import org.hamcrest.Matcher;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -53,7 +49,7 @@ public class EspressoUITest {
|
||||
.perform(longClick());
|
||||
|
||||
// TrackStoppedActivity: resume
|
||||
onView(withId(R.id.resume_button))
|
||||
onView(allOf(withId(R.id.resume_button), isClickable()))
|
||||
.perform(click());
|
||||
|
||||
// TrackRecordingActivity: wait and then stop
|
||||
@@ -93,7 +89,7 @@ public class EspressoUITest {
|
||||
tabLayout.perform(waitFor(1000));
|
||||
|
||||
// stop
|
||||
trackControllerStopButton.perform(veryLongTouch(1600));
|
||||
trackControllerStopButton.perform(longClick());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,36 +97,6 @@ public class EspressoUITest {
|
||||
@Test
|
||||
public void selectAndDeleteTrack() {
|
||||
onView(withId(R.id.track_list)).check(matches(isDisplayed()));
|
||||
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(veryLongTouch(2000));
|
||||
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(longClick());
|
||||
}
|
||||
|
||||
private static ViewAction veryLongTouch(final int duration_ms) {
|
||||
return new ViewAction() {
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Perform long touch.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Matcher<View> getConstraints() {
|
||||
return isDisplayed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform(UiController uiController, final View view) {
|
||||
// Get view absolute position
|
||||
int[] location = new int[2];
|
||||
view.getLocationOnScreen(location);
|
||||
|
||||
// Offset coordinates by view position
|
||||
float[] coordinates = new float[]{location[0] + 1, location[1] + 1};
|
||||
|
||||
// Send down event, pause, and send up
|
||||
MotionEvent down = MotionEvents.sendDown(uiController, coordinates, new float[]{1f, 1f}).down;
|
||||
uiController.loopMainThreadForAtLeast(duration_ms);
|
||||
MotionEvents.sendUp(uiController, down, coordinates);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class ChartPointTest {
|
||||
statistics.setTotalTime(Duration.ofSeconds(1000));
|
||||
|
||||
// when
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), Altitude.EGM2008.of(0), false, UnitSystem.IMPERIAL);
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), false, UnitSystem.IMPERIAL);
|
||||
|
||||
// then
|
||||
assertEquals(1000000, (long) point.getTimeOrDistance());
|
||||
@@ -40,7 +40,7 @@ public class ChartPointTest {
|
||||
statistics.setTotalDistance(Distance.of(1000));
|
||||
|
||||
// when
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), Altitude.EGM2008.of(0), true, UnitSystem.METRIC);
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), true, UnitSystem.METRIC);
|
||||
|
||||
// then
|
||||
assertEquals(1, (long) point.getTimeOrDistance());
|
||||
@@ -50,9 +50,11 @@ public class ChartPointTest {
|
||||
public void create_get_altitude_speed_and_pace() {
|
||||
// given
|
||||
TrackStatistics statistics = new TrackStatistics();
|
||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
|
||||
.setAltitude(Altitude.EGM2008.of(50));
|
||||
|
||||
// when
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
|
||||
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
||||
|
||||
// then
|
||||
assertEquals(50, point.getAltitude(), 0.01);
|
||||
@@ -64,9 +66,10 @@ public class ChartPointTest {
|
||||
public void create_sensorNotAvailable() {
|
||||
// given
|
||||
TrackStatistics statistics = new TrackStatistics();
|
||||
|
||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
|
||||
.setAltitude(Altitude.EGM2008.of(50));
|
||||
// when
|
||||
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
|
||||
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
||||
|
||||
// then
|
||||
assertNull(point.getHeartRate());
|
||||
@@ -77,15 +80,16 @@ public class ChartPointTest {
|
||||
@Test
|
||||
public void create_sensorAvailable() {
|
||||
// given
|
||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint();
|
||||
trackPoint.setHeartRate(100f);
|
||||
trackPoint.setCadence(101f);
|
||||
trackPoint.setPower(102f);
|
||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
|
||||
.setAltitude(Altitude.EGM2008.of(50))
|
||||
.setHeartRate(100f)
|
||||
.setCadence(101f)
|
||||
.setPower(102f);
|
||||
|
||||
TrackStatistics statistics = new TrackStatistics();
|
||||
|
||||
// when
|
||||
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
|
||||
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
||||
|
||||
// then
|
||||
assertEquals(100.0, point.getHeartRate(), 0.01);
|
||||
|
||||
@@ -47,6 +47,7 @@ public class ChartValueSeriesTest {
|
||||
new int[]{1, 100, 1000},
|
||||
R.string.description_altitude_metric,
|
||||
R.string.description_altitude_imperial,
|
||||
R.string.description_altitude_imperial,
|
||||
R.color.chart_altitude_fill,
|
||||
R.color.chart_altitude_border,
|
||||
15,
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.junit.runner.RunWith;
|
||||
|
||||
import de.dennisguse.opentracks.settings.UnitSystem;
|
||||
|
||||
//TODO Parametrized tests
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class DistanceFormatterTest {
|
||||
|
||||
@@ -42,4 +43,17 @@ public class DistanceFormatterTest {
|
||||
// A small number in imperial
|
||||
assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFormatDistance_nautical() {
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(2)
|
||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||
.build(context);
|
||||
|
||||
// A large number in nautical
|
||||
assertEquals("2.70 NM", formatter.formatDistance(Distance.of(5000)));
|
||||
// A small number in nautical
|
||||
assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100)));
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import org.junit.runner.RunWith;
|
||||
|
||||
import de.dennisguse.opentracks.settings.UnitSystem;
|
||||
|
||||
//TODO Use make parametrized tests?
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class SpeedFormatterTest {
|
||||
|
||||
@@ -39,12 +40,22 @@ public class SpeedFormatterTest {
|
||||
.setReportSpeedOrPace(false)
|
||||
.build(context);
|
||||
|
||||
// assertEquals("TODO", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||
// assertEquals("TODO", formatter.getSpeedParts(Speed.of(3.33)).first);
|
||||
|
||||
assertEquals("8:02", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||
assertEquals("min/mi", formatter.getSpeedParts(Speed.zero()).second);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSpeedParts_pace_nautical() {
|
||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||
.setDecimalCount(2)
|
||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||
.setReportSpeedOrPace(false)
|
||||
.build(context);
|
||||
|
||||
assertEquals("9:14", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||
assertEquals("min/NM", formatter.getSpeedParts(Speed.zero()).second);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSpeedParts_speed_metric() {
|
||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||
@@ -69,6 +80,18 @@ public class SpeedFormatterTest {
|
||||
assertEquals("mph", formatter.getSpeedParts(Speed.zero()).second);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSpeedParts_speed_nautical() {
|
||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||
.setDecimalCount(2)
|
||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||
.setReportSpeedOrPace(true)
|
||||
.build(context);
|
||||
|
||||
assertEquals("6.5", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||
assertEquals("kn", formatter.getSpeedParts(Speed.zero()).second);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFormatSpeed() {
|
||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||
|
||||
+2
-2
@@ -163,10 +163,10 @@ public class ExportImportTest {
|
||||
|
||||
trackPointCreator.setClock("2020-02-02T02:02:06Z");
|
||||
trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context, null, trackPointCreator));
|
||||
service.pauseCurrentTrack();
|
||||
service.endCurrentTrack();
|
||||
|
||||
trackPointCreator.setClock("2020-02-02T02:02:20Z");
|
||||
service.resumeCurrentTrack();
|
||||
service.resumeTrack(trackId);
|
||||
|
||||
sendLocation(trackPointCreator, "2020-02-02T02:02:21Z", 3, 14.002, 10, 13, 15, 10, 0);
|
||||
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ import de.dennisguse.opentracks.stats.TrackStatistics;
|
||||
* Test that legacy KML/GPX formats can still be imported.
|
||||
*/
|
||||
@RunWith(JUnit4.class)
|
||||
public class GPXImportTest {
|
||||
public class GPXTrackImporterTest {
|
||||
|
||||
private final Context context = ApplicationProvider.getApplicationContext();
|
||||
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
|
||||
+1
-1
@@ -31,7 +31,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||
* Test that legacy KML/GPX formats can still be imported.
|
||||
*/
|
||||
@RunWith(JUnit4.class)
|
||||
public class KMLImportTest {
|
||||
public class KMLTrackImporterTest {
|
||||
|
||||
private final Context context = ApplicationProvider.getApplicationContext();
|
||||
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
|
||||
+2
-2
@@ -159,7 +159,7 @@ public class TrackRecordingServiceTestRecording {
|
||||
// when
|
||||
String pauseTime = "2020-02-02T02:02:03Z";
|
||||
trackPointCreator.setClock(pauseTime);
|
||||
service.pauseCurrentTrack();
|
||||
service.endCurrentTrack();
|
||||
|
||||
// then
|
||||
assertEquals(new TrackStatistics(startTime, pauseTime, 0, 1, 0, 0, 0f, 0f)
|
||||
@@ -205,7 +205,7 @@ public class TrackRecordingServiceTestRecording {
|
||||
|
||||
String pauseTime = "2020-02-02T02:02:03Z";
|
||||
trackPointCreator.setClock(pauseTime);
|
||||
service.pauseCurrentTrack();
|
||||
service.endCurrentTrack();
|
||||
|
||||
// when
|
||||
trackPointCreator.setClock("2020-02-02T02:02:04Z");
|
||||
|
||||
+19
-32
@@ -143,7 +143,7 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
@MediumTest
|
||||
@Test
|
||||
public void recording_startPauseStopResume_no_data() throws InterruptedException {
|
||||
public void recording_startStopResume_no_data() throws InterruptedException {
|
||||
// given
|
||||
assertFalse(service.isRecording());
|
||||
|
||||
@@ -153,31 +153,19 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
// then
|
||||
assertTrue(service.isRecording());
|
||||
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
|
||||
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
|
||||
|
||||
service.endCurrentTrack();
|
||||
|
||||
// when
|
||||
service.pauseCurrentTrack();
|
||||
service.resumeTrack(trackId);
|
||||
Thread.sleep(1000);
|
||||
|
||||
// then
|
||||
assertTrue(service.isRecording());
|
||||
assertTrue(service.isPaused());
|
||||
assertEquals(new RecordingStatus(trackId, true), service.getRecordingStatusObservable().getValue());
|
||||
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue()); //TODO The GPS is kept in pause, right? Might be a bug.
|
||||
|
||||
|
||||
// when
|
||||
service.resumeCurrentTrack();
|
||||
Thread.sleep(1000);
|
||||
|
||||
// then
|
||||
assertTrue(service.isRecording());
|
||||
assertFalse(service.isPaused());
|
||||
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
|
||||
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
|
||||
|
||||
@@ -188,7 +176,6 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
// then
|
||||
assertFalse(service.isRecording());
|
||||
assertFalse(service.isPaused());
|
||||
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
|
||||
@@ -200,8 +187,7 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
// then
|
||||
assertTrue(service.isRecording());
|
||||
assertFalse(service.isPaused());
|
||||
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
|
||||
Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening
|
||||
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
|
||||
@@ -209,29 +195,31 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
@MediumTest
|
||||
@Test
|
||||
public void invalidStateChanges() throws InterruptedException {
|
||||
public void cannotResume_non_existing_track() throws InterruptedException {
|
||||
// given
|
||||
assertFalse(service.isRecording());
|
||||
|
||||
// when
|
||||
service.pauseCurrentTrack();
|
||||
Thread.sleep(2000);
|
||||
|
||||
// then
|
||||
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
|
||||
|
||||
|
||||
// when
|
||||
service.resumeCurrentTrack();
|
||||
Thread.sleep(1000);
|
||||
service.resumeTrack(new Track.Id(-1));
|
||||
|
||||
// then
|
||||
assertFalse(service.isRecording());
|
||||
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
|
||||
}
|
||||
|
||||
@MediumTest
|
||||
@Test
|
||||
public void cannotEnd_without_starting() throws InterruptedException {
|
||||
// given
|
||||
assertFalse(service.isRecording());
|
||||
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
|
||||
|
||||
// when
|
||||
service.endCurrentTrack();
|
||||
@@ -257,8 +245,7 @@ public class TrackRecordingServiceTestStateMachine {
|
||||
|
||||
// then
|
||||
assertTrue(service.isRecording());
|
||||
assertFalse(service.isPaused());
|
||||
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
|
||||
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
|
||||
Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening
|
||||
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
|
||||
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
|
||||
|
||||
+87
-2
@@ -42,7 +42,13 @@ public class VoiceAnnouncementUtilsTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
contentProviderUtils = new ContentProviderUtils(context);
|
||||
PreferencesUtils.setVoiceAnnounceHeartRate(false);
|
||||
|
||||
PreferencesUtils.setVoiceAnnounceLapHeartRate(false);
|
||||
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
|
||||
PreferencesUtils.setVoiceAnnounceTotalDistance(true);
|
||||
PreferencesUtils.setVoiceAnnounceMovingTime(true);
|
||||
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(true);
|
||||
PreferencesUtils.setVoiceAnnounceLapSpeedPace(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -61,6 +67,54 @@ public class VoiceAnnouncementUtilsTest {
|
||||
assertEquals("Total distance 20.00 kilometers. 1 hour 5 minutes 10 seconds. Speed 18.4 kilometers per hour.", announcement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_metric_speed_rounding_check() {
|
||||
TrackStatistics stats = new TrackStatistics();
|
||||
stats.setTotalDistance(Distance.of(20000));
|
||||
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
|
||||
stats.setMovingTime(Duration.ofHours(1).plusSeconds(1));
|
||||
stats.setMaxSpeed(Speed.of(100));
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.00 kilometers. 1 hour 1 second. Speed 20.0 kilometers per hour.", announcement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_metric_distance_rounding_check() {
|
||||
TrackStatistics stats = new TrackStatistics();
|
||||
stats.setTotalDistance(Distance.of(19999));
|
||||
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
|
||||
stats.setMovingTime(Duration.ofHours(1));
|
||||
stats.setMaxSpeed(Speed.of(100));
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.00 kilometers. 1 hour. Speed 20.0 kilometers per hour.", announcement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_metric_distance_rounding_check_two() {
|
||||
TrackStatistics stats = new TrackStatistics();
|
||||
stats.setTotalDistance(Distance.of(19990));
|
||||
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
|
||||
stats.setMovingTime(Duration.ofHours(1));
|
||||
stats.setMaxSpeed(Speed.of(100));
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 19.99 kilometers. 1 hour. Speed 20.0 kilometers per hour.", announcement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_withInterval_metric_speed() {
|
||||
// given
|
||||
@@ -199,7 +253,8 @@ public class VoiceAnnouncementUtilsTest {
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_heart_rate_and_sensor_statistics() {
|
||||
PreferencesUtils.setVoiceAnnounceHeartRate(true);
|
||||
PreferencesUtils.setVoiceAnnounceAverageHeartRate(true);
|
||||
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
|
||||
|
||||
int numberOfPoints = 1000;
|
||||
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
|
||||
@@ -221,4 +276,34 @@ public class VoiceAnnouncementUtilsTest {
|
||||
// then
|
||||
assertEquals("Total distance 14.21 kilometers. 16 minutes 39 seconds. Speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnouncement_only_lap_heart_rate() {
|
||||
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
|
||||
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
|
||||
PreferencesUtils.setVoiceAnnounceTotalDistance(false);
|
||||
PreferencesUtils.setVoiceAnnounceMovingTime(false);
|
||||
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(false);
|
||||
PreferencesUtils.setVoiceAnnounceLapSpeedPace(false);
|
||||
|
||||
int numberOfPoints = 1000;
|
||||
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
|
||||
Track.Id trackId = trackWithStats.first;
|
||||
TrackStatistics stats = trackWithStats.second;
|
||||
IntervalStatistics.Interval lastInterval;
|
||||
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) {
|
||||
assertEquals(trackPointIterator.getCount(), numberOfPoints);
|
||||
IntervalStatistics intervalStatistics = new IntervalStatistics(Distance.of(1000));
|
||||
intervalStatistics.addTrackPoints(trackPointIterator);
|
||||
lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1);
|
||||
}
|
||||
|
||||
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
|
||||
|
||||
// then
|
||||
assertEquals(" Current heart rate 133 bpm.", announcement);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ public class TrackStatisticsUpdaterTest {
|
||||
assertEquals(Duration.ofSeconds(9), statistics.getMovingTime());
|
||||
|
||||
assertEquals(2.5, statistics.getMinAltitude(), 0.01);
|
||||
assertEquals(28.75, statistics.getMaxAltitude(), 0.01);
|
||||
assertEquals(32.5, statistics.getMaxAltitude(), 0.01);
|
||||
assertEquals(36, statistics.getTotalAltitudeGain(), 0.01);
|
||||
assertEquals(36, statistics.getTotalAltitudeLoss(), 0.01);
|
||||
|
||||
|
||||
+2
-2
@@ -3,10 +3,10 @@ package de.dennisguse.opentracks.ui.customRecordingLayout;
|
||||
|
||||
import static androidx.test.espresso.Espresso.onView;
|
||||
import static androidx.test.espresso.action.ViewActions.click;
|
||||
import static androidx.test.espresso.action.ViewActions.longClick;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withId;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static de.dennisguse.opentracks.util.EspressoUtils.veryLongTouch;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
@@ -51,7 +51,7 @@ public class EspressoCustomLayoutTest {
|
||||
|
||||
// stop recording
|
||||
ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action));
|
||||
trackControllerStopButton.perform(veryLongTouch(1600));
|
||||
trackControllerStopButton.perform(longClick());
|
||||
}
|
||||
|
||||
private static class RecyclerViewItemCountAssertion implements ViewAssertion {
|
||||
|
||||
@@ -1,21 +1,14 @@
|
||||
package de.dennisguse.opentracks.util;
|
||||
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withId;
|
||||
import static androidx.test.espresso.util.TreeIterables.breadthFirstViewTraversal;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.test.espresso.PerformException;
|
||||
import androidx.test.espresso.UiController;
|
||||
import androidx.test.espresso.ViewAction;
|
||||
import androidx.test.espresso.action.MotionEvents;
|
||||
import androidx.test.espresso.util.HumanReadables;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
@@ -23,8 +16,6 @@ import org.hamcrest.Description;
|
||||
import org.hamcrest.Matcher;
|
||||
import org.hamcrest.TypeSafeMatcher;
|
||||
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
public class EspressoUtils {
|
||||
|
||||
public static Matcher<View> childAtPosition(
|
||||
@@ -80,76 +71,6 @@ public class EspressoUtils {
|
||||
};
|
||||
}
|
||||
|
||||
public static ViewAction veryLongTouch(final int duration_ms) {
|
||||
return new ViewAction() {
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Perform long touch.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Matcher<View> getConstraints() {
|
||||
return isDisplayed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform(UiController uiController, final View view) {
|
||||
// Get view absolute position
|
||||
int[] location = new int[2];
|
||||
view.getLocationOnScreen(location);
|
||||
|
||||
// Offset coordinates by view position
|
||||
float[] coordinates = new float[]{location[0] + 1, location[1] + 1};
|
||||
|
||||
// Send down event, pause, and send up
|
||||
MotionEvent down = MotionEvents.sendDown(uiController, coordinates, new float[]{1f, 1f}).down;
|
||||
uiController.loopMainThreadForAtLeast(duration_ms);
|
||||
MotionEvents.sendUp(uiController, down, coordinates);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static ViewAction waitId(final int viewId, final long millis) {
|
||||
return new ViewAction() {
|
||||
@Override
|
||||
public Matcher<View> getConstraints() {
|
||||
return isRoot();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "wait for a specific view with id <" + viewId + "> during " + millis + " millis.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform(final UiController uiController, final View view) {
|
||||
uiController.loopMainThreadUntilIdle();
|
||||
final long startTime = System.currentTimeMillis();
|
||||
final long endTime = startTime + millis;
|
||||
final Matcher<View> viewMatcher = withId(viewId);
|
||||
|
||||
do {
|
||||
for (View child : breadthFirstViewTraversal(view)) {
|
||||
// found view with required ID
|
||||
if (viewMatcher.matches(child)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
uiController.loopMainThreadForAtLeast(50);
|
||||
}
|
||||
while (System.currentTimeMillis() < endTime);
|
||||
|
||||
// timeout happens
|
||||
throw new PerformException.Builder()
|
||||
.withActionDescription(this.getDescription())
|
||||
.withViewDescription(HumanReadables.describe(view))
|
||||
.withCause(new TimeoutException())
|
||||
.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static ViewAction selectTabAtIndex(final int index) {
|
||||
return new ViewAction() {
|
||||
@Override
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package de.dennisguse.opentracks.util;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@RunWith(JUnit4.class)
|
||||
public class ExportUtilsTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testIsExportFileExists_exists() {
|
||||
// given
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String format = "kmz";
|
||||
List<String> fileNames = new ArrayList<>();
|
||||
fileNames.add(uuid.toString().substring(0, 8) + "_name.gpx");
|
||||
fileNames.add(uuid.toString().substring(0, 8) + "_other name name.kmz");
|
||||
|
||||
// when
|
||||
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
|
||||
|
||||
// then
|
||||
assertTrue(exists);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsExportFileExists_not_exists1() {
|
||||
// given
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String format = "gpx";
|
||||
List<String> fileNames = new ArrayList<>();
|
||||
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_name.gpx");
|
||||
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_other name name.gpx");
|
||||
|
||||
// when
|
||||
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
|
||||
|
||||
// then
|
||||
assertFalse(exists);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsExportFileExists_not_exists2() {
|
||||
// given
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String format = "kmz";
|
||||
List<String> fileNames = new ArrayList<>();
|
||||
fileNames.add(uuid.toString().substring(0, 8) + "_name.gpx");
|
||||
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_other name name.gpx");
|
||||
|
||||
// when
|
||||
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
|
||||
|
||||
// then
|
||||
assertFalse(exists);
|
||||
}
|
||||
}
|
||||
@@ -347,23 +347,6 @@ limitations under the License.
|
||||
<activity android:name=".settings.SettingsCustomLayoutListActivity" />
|
||||
<activity android:name=".settings.SettingsCustomLayoutEditActivity" />
|
||||
|
||||
<activity
|
||||
android:name=".share.ShowOnMapProxyActivity$KML"
|
||||
android:exported="true">
|
||||
<intent-filter android:label="@string/open_track_as_KML">
|
||||
<action android:name="Intent.OpenTracks-Dashboard" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".share.ShowOnMapProxyActivity$GPX"
|
||||
android:exported="true">
|
||||
<intent-filter android:label="@string/open_track_as_GPX">
|
||||
<action android:name="Intent.OpenTracks-Dashboard" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ShowErrorActivity"
|
||||
android:excludeFromRecents="true"
|
||||
|
||||
@@ -88,11 +88,14 @@ public abstract class AbstractTrackDeleteActivity extends AbstractActivity imple
|
||||
if (deleteStatus.isFinished() && trackDeleteServiceConnection != null) {
|
||||
trackDeleteServiceConnection.unbind(this);
|
||||
trackDeleteServiceConnection = null;
|
||||
onDeleteFinished();
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void onDeleteConfirmed();
|
||||
|
||||
protected abstract void onDeleteFinished();
|
||||
|
||||
protected abstract Track.Id getRecordingTrackId();
|
||||
|
||||
@Override
|
||||
|
||||
@@ -70,6 +70,7 @@ import de.dennisguse.opentracks.ui.util.ActivityUtils;
|
||||
import de.dennisguse.opentracks.ui.util.ListItemUtils;
|
||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||
import de.dennisguse.opentracks.util.IntentUtils;
|
||||
import de.dennisguse.opentracks.util.PermissionUtils;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||
|
||||
@@ -163,6 +164,8 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
||||
super.onCreate(savedInstanceState);
|
||||
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
||||
|
||||
requestRequiredPermissions();
|
||||
|
||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback);
|
||||
|
||||
viewBinding.trackList.setEmptyView(viewBinding.trackListEmptyView);
|
||||
@@ -259,6 +262,16 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
||||
loadData(getIntent());
|
||||
}
|
||||
|
||||
private void requestRequiredPermissions() {
|
||||
if (!PermissionUtils.hasGPSPermission(this)) {
|
||||
PermissionUtils.requestGPSPermission(this, null, () -> Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_SHORT).show());
|
||||
}
|
||||
|
||||
if (!PermissionUtils.hasBluetoothPermissions(this)) {
|
||||
PermissionUtils.requestBluetoothPermission(this, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
@@ -432,6 +445,11 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDeleteFinished() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected Track.Id getRecordingTrackId() {
|
||||
@@ -472,7 +490,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
||||
}
|
||||
|
||||
if (itemId == R.id.list_context_menu_show_on_map) {
|
||||
IntentDashboardUtils.startDashboard(this, false, trackIds);
|
||||
IntentDashboardUtils.showTrackOnMap(this, false, trackIds);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
|
||||
}
|
||||
|
||||
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
||||
IntentDashboardUtils.startDashboard(this, false, trackId);
|
||||
IntentDashboardUtils.showTrackOnMap(this, false, trackId);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -244,6 +244,11 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
|
||||
runOnUiThread(this::finish);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDeleteFinished() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the {@link TrackDataHub}.
|
||||
*/
|
||||
|
||||
@@ -11,11 +11,16 @@ import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.WindowInsetsController;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||
@@ -131,8 +136,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
||||
viewBinding.trackDetailActivityViewPager.setCurrentItem(savedInstanceState.getInt(CURRENT_TAB_TAG_KEY));
|
||||
}
|
||||
|
||||
requestGPSPermissions();
|
||||
|
||||
viewBinding.trackRecordingFabAction.setImageResource(R.drawable.ic_baseline_stop_24);
|
||||
viewBinding.trackRecordingFabAction.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.opentracks_secondary_color));
|
||||
viewBinding.trackRecordingFabAction.setBackgroundColor(getResources().getColor(R.color.opentracks_secondary_color));
|
||||
@@ -185,9 +188,20 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
||||
}
|
||||
|
||||
private void setFullscreenPolicy() {
|
||||
boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen();
|
||||
boolean fullscreen = PreferencesUtils.shouldUseFullscreen();
|
||||
|
||||
if (keepScreenOn) {
|
||||
WindowInsetsControllerCompat windowInsetsController = ViewCompat.getWindowInsetsController(getWindow().getDecorView());
|
||||
if (windowInsetsController != null) {
|
||||
windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
|
||||
if (fullscreen) {
|
||||
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars());
|
||||
} else {
|
||||
windowInsetsController.show(WindowInsetsCompat.Type.systemBars());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (fullscreen) {
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
} else {
|
||||
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
@@ -256,7 +270,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
||||
IntentDashboardUtils.startDashboard(this, true, trackId);
|
||||
IntentDashboardUtils.showTrackOnMap(this, true, trackId);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -371,14 +385,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
||||
setScreenOnPolicy();
|
||||
}
|
||||
|
||||
private void requestGPSPermissions() {
|
||||
if (PermissionUtils.hasGPSPermission(this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
PermissionUtils.requestGPSPermission(this, null, () -> Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_SHORT).show());
|
||||
}
|
||||
|
||||
private void onGpsStatusChanged(GpsStatusValue gpsStatusValue) {
|
||||
if (gpsStatusValue.isGpsStarted() && snackbar != null && snackbar.isShown()) {
|
||||
snackbar.dismiss();
|
||||
|
||||
@@ -15,13 +15,14 @@ import de.dennisguse.opentracks.databinding.TrackStoppedBinding;
|
||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment;
|
||||
import de.dennisguse.opentracks.util.ExportUtils;
|
||||
import de.dennisguse.opentracks.util.IntentUtils;
|
||||
import de.dennisguse.opentracks.util.StringUtils;
|
||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||
import de.dennisguse.opentracks.util.TrackUtils;
|
||||
|
||||
public class TrackStoppedActivity extends AbstractActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
||||
public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
||||
|
||||
private static final String TAG = TrackStoppedActivity.class.getSimpleName();
|
||||
|
||||
@@ -31,6 +32,8 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
|
||||
|
||||
private Track.Id trackId;
|
||||
|
||||
private boolean isDiscarding = false;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@@ -44,26 +47,26 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
|
||||
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
|
||||
Track track = contentProviderUtils.getTrack(trackId);
|
||||
|
||||
viewBinding.fields.trackEditName.setText(track.getName());
|
||||
viewBinding.trackEditName.setText(track.getName());
|
||||
|
||||
viewBinding.fields.trackEditActivityType.setText(track.getCategory());
|
||||
viewBinding.trackEditActivityType.setText(track.getCategory());
|
||||
|
||||
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
|
||||
viewBinding.fields.trackEditActivityType.setAdapter(adapter);
|
||||
viewBinding.fields.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position))));
|
||||
viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
viewBinding.trackEditActivityType.setAdapter(adapter);
|
||||
viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position))));
|
||||
viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (!hasFocus) {
|
||||
setActivityTypeIcon(TrackIconUtils.getIconValue(
|
||||
TrackStoppedActivity.this, viewBinding.fields.trackEditActivityType.getText().toString()));
|
||||
TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString()));
|
||||
}
|
||||
});
|
||||
|
||||
String iconValue = track.getIcon();
|
||||
|
||||
setActivityTypeIcon(iconValue);
|
||||
viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.fields.trackEditActivityType.getText().toString()));
|
||||
viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.trackEditActivityType.getText().toString()));
|
||||
|
||||
viewBinding.fields.trackEditDescription.setText(track.getDescription());
|
||||
viewBinding.trackEditDescription.setText(track.getDescription());
|
||||
|
||||
viewBinding.time.setText(StringUtils.formatElapsedTime(track.getTrackStatistics().getMovingTime()));
|
||||
|
||||
@@ -87,20 +90,23 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
|
||||
}
|
||||
|
||||
viewBinding.finishButton.setOnClickListener(v -> {
|
||||
TrackUtils.updateTrack(TrackStoppedActivity.this, track, viewBinding.fields.trackEditName.getText().toString(),
|
||||
viewBinding.fields.trackEditActivityType.getText().toString(), viewBinding.fields.trackEditDescription.getText().toString(),
|
||||
TrackUtils.updateTrack(TrackStoppedActivity.this, track, viewBinding.trackEditName.getText().toString(),
|
||||
viewBinding.trackEditActivityType.getText().toString(), viewBinding.trackEditDescription.getText().toString(),
|
||||
contentProviderUtils);
|
||||
ExportUtils.postWorkoutExport(this, trackId);
|
||||
finish();
|
||||
});
|
||||
|
||||
viewBinding.resumeButton.setOnClickListener(v -> {
|
||||
resumeTrackAndFinish();
|
||||
});
|
||||
viewBinding.resumeButton.setOnClickListener(v -> resumeTrackAndFinish());
|
||||
|
||||
viewBinding.discardButton.setOnClickListener(v -> ConfirmDeleteDialogFragment.showDialog(getSupportFragmentManager(), trackId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (isDiscarding) {
|
||||
return;
|
||||
}
|
||||
super.onBackPressed();
|
||||
resumeTrackAndFinish();
|
||||
}
|
||||
@@ -112,13 +118,13 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
|
||||
}
|
||||
|
||||
private void setActivityTypeIcon(String iconValue) {
|
||||
viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
|
||||
viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChooseActivityTypeDone(String iconValue) {
|
||||
setActivityTypeIcon(iconValue);
|
||||
viewBinding.fields.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue)));
|
||||
viewBinding.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue)));
|
||||
}
|
||||
|
||||
private void resumeTrackAndFinish() {
|
||||
@@ -134,4 +140,22 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
|
||||
finish();
|
||||
}).startAndBind(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDeleteConfirmed() {
|
||||
isDiscarding = true;
|
||||
viewBinding.loadingLayout.loadingText.setText(getString(R.string.track_discarding));
|
||||
viewBinding.contentLinearLayout.setVisibility(View.GONE);
|
||||
viewBinding.loadingLayout.loadingIndeterminate.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDeleteFinished() {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Track.Id getRecordingTrackId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,9 +188,9 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
|
||||
}
|
||||
}
|
||||
|
||||
public void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed, Altitude smoothedAltitude) {
|
||||
public void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed) {
|
||||
if (isResumed()) {
|
||||
ChartPoint point = new ChartPoint(trackStatistics, trackPoint, smoothedSpeed, smoothedAltitude, chartByDistance, viewBinding.chartView.getUnitSystem());
|
||||
ChartPoint point = new ChartPoint(trackStatistics, trackPoint, smoothedSpeed, chartByDistance, viewBinding.chartView.getUnitSystem());
|
||||
pendingPoints.add(point);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,15 +29,15 @@ public class ChartPoint {
|
||||
this.altitude = altitude;
|
||||
}
|
||||
|
||||
public ChartPoint(@NonNull TrackStatistics trackStatistics, @NonNull TrackPoint trackPoint, Speed smoothedSpeed, Altitude smoothedAltitude, boolean chartByDistance, UnitSystem unitSystem) {
|
||||
public ChartPoint(@NonNull TrackStatistics trackStatistics, @NonNull TrackPoint trackPoint, Speed smoothedSpeed, boolean chartByDistance, UnitSystem unitSystem) {
|
||||
if (chartByDistance) {
|
||||
timeOrDistance = trackStatistics.getTotalDistance().toKM_Miles(unitSystem);
|
||||
} else {
|
||||
timeOrDistance = trackStatistics.getTotalTime().toMillis();
|
||||
}
|
||||
|
||||
if (smoothedAltitude != null) {
|
||||
altitude = Distance.of(smoothedAltitude.toM()).toM_FT(unitSystem);
|
||||
if (trackPoint.hasAltitude()) {
|
||||
altitude = Distance.of(trackPoint.getAltitude().toM()).toM_FT(unitSystem);
|
||||
}
|
||||
|
||||
if (smoothedSpeed != null) {
|
||||
|
||||
@@ -44,6 +44,7 @@ abstract class ChartValueSeries {
|
||||
private final int[] intervalValues;
|
||||
private final int metricTitleId;
|
||||
private final int imperialTitleId;
|
||||
private final int nauticalTitleId;
|
||||
private final Paint fillPaint;
|
||||
private final Paint strokePaint;
|
||||
private final Paint titlePaint;
|
||||
@@ -57,24 +58,13 @@ abstract class ChartValueSeries {
|
||||
private int maxMarkerValue = interval * ChartView.Y_AXIS_INTERVALS;
|
||||
private boolean enabled = true;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param context the context
|
||||
* @param absoluteMin the absolute min value
|
||||
* @param absoluteMax the absolute max value
|
||||
* @param intervalValues the list of interval values
|
||||
* @param metricTitleId the metric title id
|
||||
* @param imperialTitleId the imperial title id
|
||||
* @param fillColor the fill color
|
||||
* @param strokeColor the stroke color
|
||||
*/
|
||||
ChartValueSeries(Context context, int absoluteMin, int absoluteMax, int[] intervalValues, int metricTitleId, int imperialTitleId, int fillColor, int strokeColor, int fontSizeSmall, int fontSizeMedium) {
|
||||
ChartValueSeries(Context context, int absoluteMin, int absoluteMax, int[] intervalValues, int metricTitleId, int imperialTitleId, int nauticalTitleId, int fillColor, int strokeColor, int fontSizeSmall, int fontSizeMedium) {
|
||||
this.absoluteMin = absoluteMin;
|
||||
this.absoluteMax = absoluteMax;
|
||||
this.intervalValues = intervalValues;
|
||||
this.metricTitleId = metricTitleId;
|
||||
this.imperialTitleId = imperialTitleId;
|
||||
this.nauticalTitleId = nauticalTitleId;
|
||||
|
||||
fillPaint = new Paint();
|
||||
fillPaint.setStyle(Style.FILL);
|
||||
@@ -224,39 +214,27 @@ abstract class ChartValueSeries {
|
||||
return metricTitleId;
|
||||
case IMPERIAL:
|
||||
return imperialTitleId;
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return nauticalTitleId;
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the title paint.
|
||||
*/
|
||||
Paint getTitlePaint() {
|
||||
return titlePaint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the marker paint.
|
||||
*/
|
||||
Paint getMarkerPaint() {
|
||||
return markerPaint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the largest marker.
|
||||
*/
|
||||
String getLargestMarker() {
|
||||
String minMarker = numberFormat.format(getMinMarkerValue());
|
||||
String maxMarker = numberFormat.format(getMaxMarkerValue());
|
||||
return minMarker.length() >= maxMarker.length() ? minMarker : maxMarker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a marker value.
|
||||
*
|
||||
* @param value the value
|
||||
*/
|
||||
String formatMarker(int value) {
|
||||
return numberFormat.format(value);
|
||||
}
|
||||
|
||||
@@ -203,6 +203,7 @@ public class ChartView extends View {
|
||||
new int[]{5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000},
|
||||
R.string.description_altitude_metric,
|
||||
R.string.description_altitude_imperial,
|
||||
R.string.description_altitude_imperial,
|
||||
R.color.chart_altitude_fill,
|
||||
R.color.chart_altitude_border,
|
||||
fontSizeSmall,
|
||||
@@ -224,6 +225,7 @@ public class ChartView extends View {
|
||||
new int[]{1, 5, 10, 20, 50, 100},
|
||||
R.string.description_speed_metric,
|
||||
R.string.description_speed_imperial,
|
||||
R.string.description_speed_nautical,
|
||||
R.color.chart_speed_fill,
|
||||
R.color.chart_speed_border,
|
||||
fontSizeSmall,
|
||||
@@ -246,6 +248,7 @@ public class ChartView extends View {
|
||||
new int[]{1, 2, 5, 10, 15, 20, 30, 60, 120},
|
||||
R.string.description_pace_metric,
|
||||
R.string.description_pace_imperial,
|
||||
R.string.description_pace_nautical,
|
||||
R.color.chart_pace_fill,
|
||||
R.color.chart_pace_border,
|
||||
fontSizeSmall,
|
||||
@@ -268,6 +271,7 @@ public class ChartView extends View {
|
||||
new int[]{25, 50},
|
||||
R.string.description_sensor_heart_rate,
|
||||
R.string.description_sensor_heart_rate,
|
||||
R.string.description_sensor_heart_rate,
|
||||
R.color.chart_heart_rate_fill,
|
||||
R.color.chart_heart_rate_border,
|
||||
fontSizeSmall,
|
||||
@@ -289,6 +293,7 @@ public class ChartView extends View {
|
||||
new int[]{5, 10, 25, 50},
|
||||
R.string.description_sensor_cadence,
|
||||
R.string.description_sensor_cadence,
|
||||
R.string.description_sensor_cadence,
|
||||
R.color.chart_cadence_fill,
|
||||
R.color.chart_cadence_border,
|
||||
fontSizeSmall,
|
||||
@@ -309,6 +314,7 @@ public class ChartView extends View {
|
||||
new int[]{5, 50, 100, 200},
|
||||
R.string.description_sensor_power,
|
||||
R.string.description_sensor_power,
|
||||
R.string.description_sensor_power,
|
||||
R.color.chart_power_fill,
|
||||
R.color.chart_power_border,
|
||||
fontSizeSmall,
|
||||
@@ -732,6 +738,8 @@ public class ChartView extends View {
|
||||
return context.getString(R.string.unit_kilometer);
|
||||
case IMPERIAL:
|
||||
return context.getString(R.string.unit_mile);
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return context.getString(R.string.unit_nautical_mile);
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ public class TrackDataHub {
|
||||
// Also include the last point if the selected track is not recording.
|
||||
if ((localNumLoadedTrackPoints % samplingFrequency == 0) || (trackPointId == lastTrackPointId && !isSelectedTrackRecording())) {
|
||||
for (Listener trackDataListener : listeners) {
|
||||
trackDataListener.onSampledInTrackPoint(trackPoint, currentUpdater.getTrackStatistics(), currentUpdater.getSmoothedSpeed(), currentUpdater.getSmoothedAltitude());
|
||||
trackDataListener.onSampledInTrackPoint(trackPoint, currentUpdater.getTrackStatistics(), currentUpdater.getSmoothedSpeed());
|
||||
}
|
||||
} else {
|
||||
for (Listener trackDataListener : listeners) {
|
||||
@@ -432,7 +432,7 @@ public class TrackDataHub {
|
||||
*
|
||||
* @param trackPoint the trackPoint
|
||||
*/
|
||||
default void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed, @Nullable Altitude smoothedAltitude_m) {
|
||||
default void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed) {
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,6 +29,10 @@ public class Distance {
|
||||
return of(distance_mile * UnitConversions.MI_TO_M);
|
||||
}
|
||||
|
||||
public static Distance ofNauticalMile(double distance_mile) {
|
||||
return of(distance_mile * UnitConversions.NAUTICAL_MILE_TO_M);
|
||||
}
|
||||
|
||||
public static Distance ofKilometer(double distance_km) {
|
||||
return of(distance_km * UnitConversions.KM_TO_M);
|
||||
}
|
||||
@@ -51,6 +55,8 @@ public class Distance {
|
||||
return Distance.ofKilometer(1);
|
||||
case IMPERIAL:
|
||||
return Distance.ofMile(1);
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return Distance.ofNauticalMile(1);
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
@@ -114,12 +120,18 @@ public class Distance {
|
||||
return toKM() * UnitConversions.KM_TO_MI;
|
||||
}
|
||||
|
||||
public double toNauticalMiles() {
|
||||
return toKM() * UnitConversions.KM_TO_NAUTICAL_MILE;
|
||||
}
|
||||
|
||||
public double toKM_Miles(UnitSystem unitSystem) {
|
||||
switch (unitSystem) {
|
||||
case METRIC:
|
||||
return toKM();
|
||||
case IMPERIAL:
|
||||
return toMI();
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return toNauticalMiles();
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
@@ -129,6 +141,7 @@ public class Distance {
|
||||
switch (unitSystem) {
|
||||
case METRIC:
|
||||
return toM();
|
||||
case NAUTICAL_IMPERIAL:
|
||||
case IMPERIAL:
|
||||
return toFT();
|
||||
default:
|
||||
|
||||
@@ -46,6 +46,7 @@ public class DistanceFormatter {
|
||||
case METRIC:
|
||||
return new Pair<>(null, resources.getString(R.string.unit_meter));
|
||||
case IMPERIAL:
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return new Pair<>(null, resources.getString(R.string.unit_feet));
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
@@ -65,6 +66,12 @@ public class DistanceFormatter {
|
||||
} else {
|
||||
return new Pair<>(StringUtils.formatDecimal(distance.toFT(), decimalCount), resources.getString(R.string.unit_feet));
|
||||
}
|
||||
case NAUTICAL_IMPERIAL:
|
||||
if (distance.greaterThan(Distance.ofNauticalMile(0.5))) {
|
||||
return new Pair<>(StringUtils.formatDecimal(distance.toNauticalMiles(), decimalCount), resources.getString(R.string.unit_nautical_mile));
|
||||
} else {
|
||||
return new Pair<>(StringUtils.formatDecimal(distance.toFT(), decimalCount), resources.getString(R.string.unit_feet));
|
||||
}
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
|
||||
@@ -93,6 +93,10 @@ public class Speed {
|
||||
return toKMH() * UnitConversions.KM_TO_MI;
|
||||
}
|
||||
|
||||
public double toKnots() {
|
||||
return toKMH() * UnitConversions.KM_TO_NAUTICAL_MILE;
|
||||
}
|
||||
|
||||
public Duration toPace(UnitSystem unitSystem) {
|
||||
if (isZero()) {
|
||||
return Duration.ofSeconds(0);
|
||||
@@ -106,6 +110,9 @@ public class Speed {
|
||||
case IMPERIAL:
|
||||
distance *= UnitConversions.M_TO_MI;
|
||||
break;
|
||||
case NAUTICAL_IMPERIAL:
|
||||
distance *= UnitConversions.M_TO_NAUTICAL_MILE;
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
@@ -119,6 +126,8 @@ public class Speed {
|
||||
return toKMH();
|
||||
case IMPERIAL:
|
||||
return toMPH();
|
||||
case NAUTICAL_IMPERIAL:
|
||||
return toKnots();
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@ public class SpeedFormatter {
|
||||
case IMPERIAL:
|
||||
unitId = reportSpeedOrPace ? R.string.unit_mile_per_hour : R.string.unit_minute_per_mile;
|
||||
break;
|
||||
case NAUTICAL_IMPERIAL:
|
||||
unitId = reportSpeedOrPace ? R.string.unit_knots : R.string.unit_minute_per_nautical_mile;
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public class TrackPoint {
|
||||
private Double longitude;
|
||||
private Distance horizontalAccuracy;
|
||||
private Distance verticalAccuracy;
|
||||
private Altitude altitude;
|
||||
private Altitude altitude; //TODO use Altitude.WGS84
|
||||
private Speed speed;
|
||||
private Float bearing;
|
||||
private Distance sensorDistance;
|
||||
|
||||
@@ -53,6 +53,9 @@ public class UnitConversions {
|
||||
public static final double M_TO_MI = M_TO_KM * KM_TO_MI;
|
||||
// multiplication factor to convert meters to feet
|
||||
public static final double M_TO_FT = M_TO_MI * MI_TO_FT;
|
||||
public static final double NAUTICAL_MILE_TO_M = 1852.0;
|
||||
public static final double M_TO_NAUTICAL_MILE = 1 / NAUTICAL_MILE_TO_M;
|
||||
public static final double KM_TO_NAUTICAL_MILE = 1000 * M_TO_NAUTICAL_MILE;
|
||||
// multiplication factor to convert meters per second to kilometers per hour
|
||||
public static final double MPS_TO_KMH = M_TO_KM / (S_TO_MIN * MIN_TO_HR);
|
||||
// multiplication factor to convert miles to km
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package de.dennisguse.opentracks.io.file;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||
@@ -128,6 +134,23 @@ public enum TrackFileFormat {
|
||||
this.preferenceId = preferenceId;
|
||||
}
|
||||
|
||||
public static Map<String, String> toPreferenceIdLabelMap(final Resources resources, final TrackFileFormat ... trackFileFormats) {
|
||||
Map<String, String> preferenceIdLabelMap = new LinkedHashMap<>(trackFileFormats.length);
|
||||
for (TrackFileFormat trackFileFormat : trackFileFormats) {
|
||||
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
|
||||
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
|
||||
preferenceIdLabelMap.put(trackFileFormat.getPreferenceId(), String.format("%s (%s)", trackFileFormatUpperCase, resources.getString(photoMessageId)));
|
||||
}
|
||||
return preferenceIdLabelMap;
|
||||
}
|
||||
|
||||
public static TrackFileFormat valueOfPreferenceId(final String preferenceId) {
|
||||
return Arrays.stream(values())
|
||||
.filter(trackFileFormat -> trackFileFormat.getPreferenceId().equals(preferenceId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the mime type for each format.
|
||||
*/
|
||||
|
||||
@@ -39,6 +39,7 @@ import de.dennisguse.opentracks.data.tables.TracksColumns;
|
||||
import de.dennisguse.opentracks.databinding.ExportActivityBinding;
|
||||
import de.dennisguse.opentracks.io.file.ErrorListDialog;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||
import de.dennisguse.opentracks.util.ExportUtils;
|
||||
import de.dennisguse.opentracks.util.FileUtils;
|
||||
|
||||
@@ -234,7 +235,7 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
|
||||
* @param conflictResolution conflict resolution to be applied if needed.
|
||||
*/
|
||||
private void export(Track track, int conflictResolution) {
|
||||
boolean fileExists = ExportUtils.isExportFileExists(track.getUuid(), trackFileFormat.getExtension(), directoryFiles);
|
||||
boolean fileExists = exportFileExists(track);
|
||||
|
||||
if (fileExists && conflictResolution == CONFLICT_NONE) {
|
||||
conflict(track);
|
||||
@@ -250,6 +251,11 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
|
||||
export(track, autoConflict);
|
||||
}
|
||||
|
||||
private boolean exportFileExists(Track track) {
|
||||
String filename = PreferencesUtils.getTrackFileformatGenerator().format(track, trackFileFormat);
|
||||
return directoryFiles.stream().anyMatch(filename::equals);
|
||||
}
|
||||
|
||||
private void setConflictVisibility(int visibility) {
|
||||
viewBinding.exportProgressAlertIcon.setVisibility(visibility);
|
||||
viewBinding.exportProgressAlertMsg.setVisibility(visibility);
|
||||
@@ -315,7 +321,7 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
|
||||
public void onExportSuccess(Track.Id trackId) {
|
||||
Track track = contentProviderUtils.getTrack(trackId);
|
||||
|
||||
if (ExportUtils.isExportFileExists(track.getUuid(), trackFileFormat.getExtension(), directoryFiles)) {
|
||||
if (exportFileExists(track)) {
|
||||
trackExportOverwrittenCount++;
|
||||
} else {
|
||||
trackExportSuccessCount++;
|
||||
|
||||
@@ -68,9 +68,6 @@ public class KMLTrackExporter implements TrackExporter {
|
||||
public static final String EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL = "accuracy_horizontal";
|
||||
public static final String EXTENDED_DATA_TYPE_ACCURACY_VERTICAL = "accuracy_vertical";
|
||||
|
||||
private static final String MARKER_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
|
||||
private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
|
||||
|
||||
private static final NumberFormat SENSOR_DATA_FORMAT = NumberFormat.getInstance(Locale.US);
|
||||
|
||||
static {
|
||||
@@ -536,7 +533,7 @@ public class KMLTrackExporter implements TrackExporter {
|
||||
printWriter.println("<LineStyle><color>7f0000ff</color><width>4</width></LineStyle>");
|
||||
printWriter.println("<IconStyle>");
|
||||
printWriter.println("<scale>1.3</scale>");
|
||||
printWriter.println("<Icon><href>" + TRACK_ICON + "</href></Icon>");
|
||||
printWriter.println("<Icon />");
|
||||
printWriter.println("</IconStyle>");
|
||||
printWriter.println("</Style>");
|
||||
}
|
||||
@@ -546,9 +543,7 @@ public class KMLTrackExporter implements TrackExporter {
|
||||
*/
|
||||
private void writePlacemarkerStyle() {
|
||||
printWriter.println("<Style id=\"" + KMLTrackExporter.MARKER_STYLE + "\"><IconStyle>");
|
||||
printWriter.println("<scale>1.3</scale>");
|
||||
printWriter.println("<Icon><href>" + KMLTrackExporter.MARKER_ICON + "</href></Icon>");
|
||||
printWriter.println("<hotSpot x=\"" + 20 + "\" y=\"" + 2 + "\" xunits=\"pixels\" yunits=\"pixels\"/>");
|
||||
printWriter.println("<Icon />");
|
||||
printWriter.println("</IconStyle></Style>");
|
||||
}
|
||||
|
||||
|
||||
@@ -136,9 +136,9 @@ public abstract class BluetoothConnectionManager<DataType> {
|
||||
Log.d(TAG, "Connecting to: " + device);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
bluetoothGatt = device.connectGatt(context, true, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, this.observer.getHandler());
|
||||
bluetoothGatt = device.connectGatt(context, false, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, this.observer.getHandler());
|
||||
} else {
|
||||
bluetoothGatt = device.connectGatt(context, true, connectCallback);
|
||||
bluetoothGatt = device.connectGatt(context, false, connectCallback);
|
||||
}
|
||||
SensorData<?> sensorData = createEmptySensorData(bluetoothGatt.getDevice().getAddress());
|
||||
observer.onChanged(sensorData);
|
||||
|
||||
@@ -9,12 +9,10 @@ import de.dennisguse.opentracks.data.models.Track;
|
||||
|
||||
public class RecordingStatus {
|
||||
private final Track.Id trackId;
|
||||
private final boolean paused;
|
||||
|
||||
@VisibleForTesting
|
||||
RecordingStatus(Track.Id trackId, boolean paused) {
|
||||
RecordingStatus(Track.Id trackId) {
|
||||
this.trackId = trackId;
|
||||
this.paused = paused;
|
||||
}
|
||||
|
||||
public Track.Id getTrackId() {
|
||||
@@ -25,24 +23,12 @@ public class RecordingStatus {
|
||||
return trackId != null;
|
||||
}
|
||||
|
||||
public boolean isPaused() {
|
||||
return paused;
|
||||
}
|
||||
|
||||
public boolean isRecordingAndNotPaused() {
|
||||
return isRecording() && !isPaused();
|
||||
}
|
||||
|
||||
static RecordingStatus notRecording() {
|
||||
return new RecordingStatus(null, false);
|
||||
return new RecordingStatus(null);
|
||||
}
|
||||
|
||||
static RecordingStatus record(@NonNull Track.Id trackId) {
|
||||
return new RecordingStatus(trackId, false);
|
||||
}
|
||||
|
||||
RecordingStatus pause() {
|
||||
return new RecordingStatus(getTrackId(), true);
|
||||
return new RecordingStatus(trackId);
|
||||
}
|
||||
|
||||
public RecordingStatus stop() {
|
||||
@@ -54,7 +40,6 @@ public class RecordingStatus {
|
||||
public String toString() {
|
||||
return "RecordingStatus{" +
|
||||
"trackId=" + trackId +
|
||||
", paused=" + paused +
|
||||
'}';
|
||||
}
|
||||
|
||||
@@ -63,11 +48,11 @@ public class RecordingStatus {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
RecordingStatus that = (RecordingStatus) o;
|
||||
return paused == that.paused && Objects.equals(trackId, that.trackId);
|
||||
return Objects.equals(trackId, that.trackId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(trackId, paused);
|
||||
return Objects.hash(trackId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,25 +82,23 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang
|
||||
return trackId;
|
||||
}
|
||||
|
||||
//TODO Handle non-existing trackId? Start a new track or exception?
|
||||
void resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPointCreator trackPointCreator) {
|
||||
/**
|
||||
* @return if the recording could be started.
|
||||
*/
|
||||
boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPointCreator trackPointCreator) {
|
||||
trackId = resumeTrackId;
|
||||
Track track = contentProviderUtils.getTrack(trackId);
|
||||
if (track == null) {
|
||||
Log.e(TAG, "Ignore resumeTrack. Track " + trackId.getId() + " does not exists.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
|
||||
onNewTrackPoint(trackPointCreator.createSegmentStartManual());
|
||||
|
||||
reset();
|
||||
}
|
||||
|
||||
void pause(TrackPointCreator trackPointCreator) {
|
||||
insertTrackPoint(trackPointCreator.createSegmentEnd(), true);
|
||||
|
||||
reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
void end(TrackPointCreator trackPointCreator) {
|
||||
|
||||
@@ -30,7 +30,6 @@ import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.data.models.Distance;
|
||||
import de.dennisguse.opentracks.data.models.Marker;
|
||||
import de.dennisguse.opentracks.data.models.Track;
|
||||
@@ -178,23 +177,16 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
|
||||
public void resumeTrack(Track.Id trackId) {
|
||||
trackPointCreator.reset();
|
||||
trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator);
|
||||
if (!trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator)) {
|
||||
Log.w(TAG, "Cannot resume a non-existing track.");
|
||||
return;
|
||||
}
|
||||
|
||||
updateRecordingStatus(RecordingStatus.record(trackId));
|
||||
|
||||
startRecording();
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
|
||||
public void resumeCurrentTrack() {
|
||||
if (!isRecording() || !isPaused()) {
|
||||
Log.w(TAG, "Ignore resumeCurrentTrack. Not recording or not paused.");
|
||||
return;
|
||||
}
|
||||
|
||||
resumeTrack(recordingStatus.getTrackId());
|
||||
}
|
||||
|
||||
private void startRecording() {
|
||||
// Update instance variables
|
||||
handler.postDelayed(updateRecordingData, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
|
||||
@@ -222,46 +214,18 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
return;
|
||||
}
|
||||
|
||||
// Need to remember the recordingTrackId before setting it to null
|
||||
boolean wasPause = isPaused();
|
||||
Track.Id trackId = recordingStatus.getTrackId();
|
||||
|
||||
// Set recording status
|
||||
updateRecordingStatus(STATUS_DEFAULT);
|
||||
|
||||
if (!wasPause) {
|
||||
trackRecordingManager.end(trackPointCreator);
|
||||
}
|
||||
|
||||
endRecording(true);
|
||||
trackRecordingManager.end(trackPointCreator);
|
||||
endRecording();
|
||||
|
||||
stopSelf();
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
|
||||
public void pauseCurrentTrack() {
|
||||
if (!isRecording() || isPaused()) {
|
||||
Log.w(TAG, "Ignore pauseCurrentTrack. Not recording or paused.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Set recording status
|
||||
updateRecordingStatus(recordingStatus.pause());
|
||||
|
||||
trackRecordingManager.pause(trackPointCreator);
|
||||
|
||||
endRecording(false);
|
||||
|
||||
notificationManager.updateContent(getString(R.string.generic_paused));
|
||||
}
|
||||
|
||||
private void endRecording(boolean trackStopped) {
|
||||
private void endRecording() {
|
||||
stopUpdateRecordingData();
|
||||
if (!trackStopped) {
|
||||
updateRecordingDataWhileRecording();
|
||||
} else {
|
||||
recordingDataObservable.postValue(NOT_RECORDING);
|
||||
}
|
||||
recordingDataObservable.postValue(NOT_RECORDING);
|
||||
|
||||
voiceAnnouncementManager.stop();
|
||||
|
||||
@@ -289,8 +253,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
|
||||
@Override
|
||||
public boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
|
||||
if (!isRecording() || isPaused()) {
|
||||
Log.w(TAG, "Ignore newTrackPoint. Not recording or paused.");
|
||||
if (!isRecording()) {
|
||||
Log.w(TAG, "Ignore newTrackPoint. Not recording.");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -323,7 +287,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
}
|
||||
|
||||
public Marker.Id insertMarker(String name, String category, String description, String photoUrl) {
|
||||
if (!isRecording() || isPaused()) {
|
||||
if (!isRecording()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -398,9 +362,4 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
public boolean isRecording() {
|
||||
return recordingStatus.isRecording();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public boolean isPaused() {
|
||||
return recordingStatus.isPaused();
|
||||
}
|
||||
}
|
||||
@@ -167,17 +167,6 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
setTrackRecordingService(null);
|
||||
}
|
||||
|
||||
public void resumeTrack() {
|
||||
if (trackRecordingService != null) {
|
||||
trackRecordingService.resumeCurrentTrack();
|
||||
}
|
||||
}
|
||||
public void pauseTrack() {
|
||||
if (trackRecordingService != null) {
|
||||
trackRecordingService.pauseCurrentTrack();
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Marker.Id addMarker(Context context, String name, String category, String description, String photoUrl) {
|
||||
TrackRecordingService trackRecordingService = getServiceIfBound();
|
||||
|
||||
@@ -181,8 +181,10 @@ public class VoiceAnnouncement {
|
||||
|
||||
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), unitSystem, isReportSpeed, lastInterval, sensorStatistics);
|
||||
|
||||
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
|
||||
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
|
||||
if (announcement.length() > 0) {
|
||||
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
|
||||
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
|
||||
+69
-59
@@ -1,7 +1,12 @@
|
||||
package de.dennisguse.opentracks.services.announcement;
|
||||
|
||||
import static android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceHeartRate;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageHeartRate;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageSpeedPace;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapHeartRate;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapSpeedPace;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceTotalDistance;
|
||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceMovingTime;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.Spannable;
|
||||
@@ -52,68 +57,68 @@ class VoiceAnnouncementUtils {
|
||||
unitDistanceTTS = "mile";
|
||||
unitSpeedTTS = "mile per hour";
|
||||
break;
|
||||
case NAUTICAL_IMPERIAL:
|
||||
perUnitStringId = R.string.voice_per_nautical_mile;
|
||||
distanceId = R.plurals.voiceDistanceNauticalMiles;
|
||||
speedId = R.plurals.voiceSpeedMKnots;
|
||||
unitDistanceTTS = "nautical mile";
|
||||
unitSpeedTTS = "knots";
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
|
||||
double distanceInUnit = distance.toKM_Miles(unitSystem);
|
||||
|
||||
builder.append(context.getString(R.string.total_distance));
|
||||
long distanceIntegerPart = (long) distanceInUnit;
|
||||
// Extract the decimal part
|
||||
String distanceFractionalPart = String.format("%.2f", (distanceInUnit - distanceIntegerPart)).substring(2);
|
||||
// Units should always be english singular for TTS.
|
||||
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceIntegerPart, distanceFractionalPart, unitDistanceTTS);
|
||||
// Punctuation helps introduce natural pauses in TTS
|
||||
builder.append(".");
|
||||
if (shouldVoiceAnnounceTotalDistance()) {
|
||||
builder.append(context.getString(R.string.total_distance));
|
||||
// Units should always be english singular for TTS.
|
||||
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceInUnit, 2, unitDistanceTTS);
|
||||
// Punctuation helps introduce natural pauses in TTS
|
||||
builder.append(".");
|
||||
}
|
||||
if (distance.isZero()) {
|
||||
return builder;
|
||||
}
|
||||
|
||||
// Announce time
|
||||
Duration movingTime = trackStatistics.getMovingTime();
|
||||
if (!movingTime.isZero()) {
|
||||
if (shouldVoiceAnnounceMovingTime() && !movingTime.isZero()) {
|
||||
appendDuration(context, builder, movingTime);
|
||||
builder.append(".");
|
||||
}
|
||||
|
||||
if (isReportSpeed) {
|
||||
double speedInUnit = distancePerTime.to(unitSystem);
|
||||
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.speed));
|
||||
long speedIntegerPart = (long) speedInUnit;
|
||||
// Extract the decimal part
|
||||
String speedFractionalPart = String.format("%.1f", (speedInUnit - speedIntegerPart)).substring(2);
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedIntegerPart, speedFractionalPart, unitSpeedTTS);
|
||||
builder.append(".");
|
||||
|
||||
if (currentDistancePerTime != null) {
|
||||
if (shouldVoiceAnnounceAverageSpeedPace()) {
|
||||
double speedInUnit = distancePerTime.to(unitSystem);
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.speed));
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedInUnit, 1, unitSpeedTTS);
|
||||
builder.append(".");
|
||||
}
|
||||
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
|
||||
double currentDistancePerTimeInUnit = currentDistancePerTime.to(unitSystem);
|
||||
|
||||
if (currentDistancePerTimeInUnit > 0) {
|
||||
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.lap_speed));
|
||||
long currentDistanceIntegerPart = (long) currentDistancePerTimeInUnit;
|
||||
// Extract the decimal part
|
||||
String currentDistanceFractionalPart = String.format("%.1f", (currentDistancePerTimeInUnit - currentDistanceIntegerPart)).substring(2);
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(currentDistancePerTimeInUnit), currentDistancePerTimeInUnit), currentDistanceIntegerPart, currentDistanceFractionalPart, unitSpeedTTS);
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(currentDistancePerTimeInUnit), currentDistancePerTimeInUnit), currentDistancePerTimeInUnit, 1, unitSpeedTTS);
|
||||
builder.append(".");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Duration time = distancePerTime.toPace(unitSystem);
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.pace));
|
||||
appendDuration(context, builder, time);
|
||||
builder.append(" ")
|
||||
.append(context.getString(perUnitStringId))
|
||||
.append(".");
|
||||
if (shouldVoiceAnnounceAverageSpeedPace()) {
|
||||
Duration time = distancePerTime.toPace(unitSystem);
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.pace));
|
||||
appendDuration(context, builder, time);
|
||||
builder.append(" ")
|
||||
.append(context.getString(perUnitStringId))
|
||||
.append(".");
|
||||
}
|
||||
|
||||
Duration currentTime = currentDistancePerTime != null ? currentDistancePerTime.toPace(unitSystem) : Duration.ofMillis(0);
|
||||
if (!currentTime.isZero()) {
|
||||
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
|
||||
Duration currentTime = currentDistancePerTime.toPace(unitSystem);
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.lap_time));
|
||||
appendDuration(context, builder, currentTime);
|
||||
@@ -123,24 +128,21 @@ class VoiceAnnouncementUtils {
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldVoiceAnnounceHeartRate()) {
|
||||
if (sensorStatistics != null && sensorStatistics.hasHeartRate()) {
|
||||
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
|
||||
if (shouldVoiceAnnounceAverageHeartRate() && sensorStatistics != null && sensorStatistics.hasHeartRate()) {
|
||||
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
|
||||
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.average_heart_rate));
|
||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
|
||||
builder.append(".");
|
||||
}
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.average_heart_rate));
|
||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
|
||||
builder.append(".");
|
||||
}
|
||||
if (shouldVoiceAnnounceLapHeartRate() && currentInterval != null && currentInterval.hasAverageHeartRate()) {
|
||||
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
|
||||
|
||||
if (currentInterval != null && currentInterval.hasAverageHeartRate()) {
|
||||
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
|
||||
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.current_heart_rate));
|
||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
|
||||
builder.append(".");
|
||||
}
|
||||
builder.append(" ")
|
||||
.append(context.getString(R.string.current_heart_rate));
|
||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
|
||||
builder.append(".");
|
||||
}
|
||||
|
||||
return builder;
|
||||
@@ -156,26 +158,34 @@ class VoiceAnnouncementUtils {
|
||||
int seconds = (int) (duration.getSeconds() % 60);
|
||||
|
||||
if (hours > 0) {
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceHours, hours, hours), hours, null, "hour");
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceHours, hours, hours), hours, 0, "hour");
|
||||
}
|
||||
if (minutes > 0) {
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceMinutes, minutes, minutes), minutes, null, "minute");
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceMinutes, minutes, minutes), minutes, 0, "minute");
|
||||
}
|
||||
if (seconds > 0 || duration.isZero()) {
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceSeconds, seconds, seconds), seconds, null, "second");
|
||||
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceSeconds, seconds, seconds), seconds, 0, "second");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Speaks as: 98.14 [UNIT] - ninety eight point one four [UNIT with correct plural form]
|
||||
*
|
||||
* @param number The number to speak
|
||||
* @param precision The number of decimal places to announce
|
||||
*/
|
||||
private static void appendDecimalUnit(@NonNull SpannableStringBuilder builder, @NonNull String localizedText, long integerPart, @Nullable String fractionalPart, @NonNull String unit) {
|
||||
private static void appendDecimalUnit(@NonNull SpannableStringBuilder builder, @NonNull String localizedText, double number, int precision, @NonNull String unit) {
|
||||
TtsSpan.MeasureBuilder measureBuilder = new TtsSpan.MeasureBuilder()
|
||||
.setUnit(unit);
|
||||
|
||||
if (fractionalPart == null) {
|
||||
measureBuilder.setNumber(integerPart);
|
||||
if (precision == 0) {
|
||||
measureBuilder.setNumber((long)number);
|
||||
} else {
|
||||
// Round before extracting integral and decimal parts
|
||||
double roundedNumber = Math.round(Math.pow(10, precision) * number) / Math.pow(10.0, precision);
|
||||
long integerPart = (long) roundedNumber;
|
||||
// Extract the decimal part
|
||||
String fractionalPart = String.format("%." + precision + "f", (roundedNumber - integerPart)).substring(2);
|
||||
measureBuilder.setIntegerPart(integerPart)
|
||||
.setFractionalPart(fractionalPart);
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ public class DefaultsSettingsFragment extends PreferenceFragmentCompat implement
|
||||
entriesId = R.array.stats_rate_metric_options;
|
||||
break;
|
||||
case IMPERIAL:
|
||||
case NAUTICAL_IMPERIAL:
|
||||
entriesId = R.array.stats_rate_imperial_options;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -9,7 +9,7 @@ import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
@@ -46,27 +46,15 @@ public class ImportExportSettingsFragment extends PreferenceFragmentCompat {
|
||||
}
|
||||
|
||||
private void setExportTrackFileFormatOptions() {
|
||||
final TrackFileFormat[] trackFileFormats = {
|
||||
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(),
|
||||
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
|
||||
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||
TrackFileFormat.GPX,
|
||||
TrackFileFormat.CSV
|
||||
};
|
||||
String[] entries = new String[trackFileFormats.length];
|
||||
String[] entryValues = new String[trackFileFormats.length];
|
||||
|
||||
for (int i = 0; i < entries.length; i++) {
|
||||
TrackFileFormat trackFileFormat = trackFileFormats[i];
|
||||
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
|
||||
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
|
||||
entries[i] = String.format("%s (%s)", trackFileFormatUpperCase, getString(photoMessageId));
|
||||
entryValues[i] = trackFileFormat.getPreferenceId();
|
||||
}
|
||||
|
||||
TrackFileFormat.CSV);
|
||||
ListPreference listPreference = findPreference(getString(R.string.export_trackfileformat_key));
|
||||
listPreference.setEntries(entries);
|
||||
listPreference.setEntryValues(entryValues);
|
||||
listPreference.setEntries(options.values().toArray(new String[0]));
|
||||
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
|
||||
}
|
||||
|
||||
private void setExportDirectorySummary() {
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
@@ -13,20 +14,10 @@ import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||
|
||||
public class MainSettingsFragment extends PreferenceFragmentCompat {
|
||||
|
||||
private static final String TAG = MainSettingsFragment.class.getSimpleName();
|
||||
|
||||
private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT;
|
||||
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||
private final TrackRecordingServiceConnection.Callback bindServiceCallback =
|
||||
(service, unused) -> service.getRecordingStatusObservable()
|
||||
.observe(MainSettingsFragment.this, this::onRecordingStatusChanged);
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||
addPreferencesFromResource(R.xml.settings);
|
||||
|
||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindServiceCallback);
|
||||
|
||||
findPreference(getString(R.string.settings_defaults_key)).setOnPreferenceClickListener(preference -> {
|
||||
((SettingsActivity) getActivity()).openScreen(getString(R.string.settings_defaults_key));
|
||||
return true;
|
||||
@@ -69,20 +60,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
trackRecordingServiceConnection.bind(getContext());
|
||||
updatePrefsDependOnRecording();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
trackRecordingServiceConnection.unbind(getContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisplayPreferenceDialog(Preference preference) {
|
||||
public void onDisplayPreferenceDialog(@NonNull Preference preference) {
|
||||
DialogFragment dialogFragment = null;
|
||||
|
||||
if (preference instanceof ResetDialogPreference) {
|
||||
@@ -97,24 +75,4 @@ public class MainSettingsFragment extends PreferenceFragmentCompat {
|
||||
|
||||
super.onDisplayPreferenceDialog(preference);
|
||||
}
|
||||
|
||||
private void onRecordingStatusChanged(RecordingStatus status) {
|
||||
this.recordingStatus = status;
|
||||
if (isAdded()) {
|
||||
updatePrefsDependOnRecording();
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePrefsDependOnRecording() {
|
||||
Preference importExportPreference = findPreference(getString(R.string.settings_import_export_key));
|
||||
Preference resetPreference = findPreference(getString(R.string.settings_reset_key));
|
||||
|
||||
boolean isRecording = recordingStatus.isRecording();
|
||||
|
||||
importExportPreference.setSummary(isRecording ? getString(R.string.settings_not_while_recording) : getString(R.string.settings_import_export_summary));
|
||||
importExportPreference.setEnabled(!isRecording);
|
||||
|
||||
resetPreference.setSummary(isRecording ? getString(R.string.settings_not_while_recording) : getString(R.string.settings_reset_summary));
|
||||
resetPreference.setEnabled(!isRecording);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
|
||||
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
|
||||
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout;
|
||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||
|
||||
/**
|
||||
@@ -213,7 +214,6 @@ public class PreferencesUtils {
|
||||
//TODO Check if actually needed or can be superseeded by a flexible default in getUnit()
|
||||
public static void applyDefaultUnit() {
|
||||
if (getString(R.string.stats_units_key, "").equals("")) {
|
||||
|
||||
if (!Locale.US.equals(Locale.getDefault())) {
|
||||
setUnit(UnitSystem.METRIC);
|
||||
} else {
|
||||
@@ -323,7 +323,7 @@ public class PreferencesUtils {
|
||||
UnitSystem unitSystem = getUnitSystem();
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setDecimalCount(1)
|
||||
.setUnit(unitSystem)
|
||||
.build(resources);
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
@@ -342,13 +342,58 @@ public class PreferencesUtils {
|
||||
return getFloat(R.string.voice_speed_rate_key, DEFAULT);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceHeartRate() {
|
||||
return getBoolean(R.string.voice_announce_heart_rate_key, false);
|
||||
public static boolean shouldVoiceAnnounceTotalDistance() {
|
||||
return getBoolean(R.string.voice_announce_total_distance_key, true);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceHeartRate(boolean value) {
|
||||
setBoolean(R.string.voice_announce_heart_rate_key, value);
|
||||
public static void setVoiceAnnounceTotalDistance(boolean value) {
|
||||
setBoolean(R.string.voice_announce_total_distance_key, value);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceMovingTime() {
|
||||
return getBoolean(R.string.voice_announce_moving_time_key, true);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceMovingTime(boolean value) {
|
||||
setBoolean(R.string.voice_announce_moving_time_key, value);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceAverageSpeedPace() {
|
||||
return getBoolean(R.string.voice_announce_average_speed_pace_key, true);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceAverageSpeedPace(boolean value) {
|
||||
setBoolean(R.string.voice_announce_average_speed_pace_key, value);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceLapSpeedPace() {
|
||||
return getBoolean(R.string.voice_announce_lap_speed_pace_key, true);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceLapSpeedPace(boolean value) {
|
||||
setBoolean(R.string.voice_announce_lap_speed_pace_key, value);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceLapHeartRate() {
|
||||
return getBoolean(R.string.voice_announce_lap_heart_rate_key, false);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceLapHeartRate(boolean value) {
|
||||
setBoolean(R.string.voice_announce_lap_heart_rate_key, value);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnounceAverageHeartRate() {
|
||||
return getBoolean(R.string.voice_announce_average_heart_rate_key, false);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static void setVoiceAnnounceAverageHeartRate(boolean value) {
|
||||
setBoolean(R.string.voice_announce_average_heart_rate_key, value);
|
||||
}
|
||||
|
||||
public static Distance getRecordingDistanceInterval() {
|
||||
@@ -372,7 +417,7 @@ public class PreferencesUtils {
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setUnit(unitSystem)
|
||||
.setDecimalCount(0)
|
||||
.setDecimalCount(1)
|
||||
.build(resources);
|
||||
for (int i = 0; i < entryValues.length; i++) {
|
||||
int value = Integer.parseInt(entryValues[i]);
|
||||
@@ -388,6 +433,7 @@ public class PreferencesUtils {
|
||||
}
|
||||
break;
|
||||
case IMPERIAL:
|
||||
case NAUTICAL_IMPERIAL:
|
||||
if (value == recordingDistanceIntervalDefault) {
|
||||
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
|
||||
} else {
|
||||
@@ -415,7 +461,7 @@ public class PreferencesUtils {
|
||||
UnitSystem unitSystem = getUnitSystem();
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setDecimalCount(1)
|
||||
.setUnit(unitSystem)
|
||||
.build(resources);
|
||||
for (int i = 0; i < entryValues.length; i++) {
|
||||
@@ -432,6 +478,7 @@ public class PreferencesUtils {
|
||||
}
|
||||
break;
|
||||
case IMPERIAL:
|
||||
case NAUTICAL_IMPERIAL:
|
||||
if (value == maxRecordingDistanceDefault) {
|
||||
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
|
||||
} else {
|
||||
@@ -487,7 +534,7 @@ public class PreferencesUtils {
|
||||
UnitSystem unitSystem = getUnitSystem();
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setDecimalCount(1)
|
||||
.setUnit(unitSystem)
|
||||
.build(resources);
|
||||
|
||||
@@ -509,6 +556,7 @@ public class PreferencesUtils {
|
||||
}
|
||||
break;
|
||||
case IMPERIAL:
|
||||
case NAUTICAL_IMPERIAL:
|
||||
if (value == recordingGPSAccuracyDefault) {
|
||||
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
|
||||
} else if (value == recordingGPSAccuracyExcellent) {
|
||||
@@ -560,6 +608,14 @@ public class PreferencesUtils {
|
||||
entries[i] = resources.getString(R.string.value_float_mile_hour, valueMPH);
|
||||
}
|
||||
break;
|
||||
case NAUTICAL_IMPERIAL:
|
||||
double valueKnots = Speed.ofKMH(value).toKnots();
|
||||
if (value == idleSpeedDefault) {
|
||||
entries[i] = resources.getString(R.string.value_float_knots_recommended, valueKnots);
|
||||
} else {
|
||||
entries[i] = resources.getString(R.string.value_float_knots, valueKnots);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Not implemented");
|
||||
}
|
||||
@@ -761,4 +817,13 @@ public class PreferencesUtils {
|
||||
public static void clear() {
|
||||
sharedPreferences.edit().clear().commit();
|
||||
}
|
||||
|
||||
public static void setShowOnMapFormat(final String showOnMapFormat) {
|
||||
setString(R.string.show_on_map_format_key, showOnMapFormat);
|
||||
}
|
||||
|
||||
public static String getShowOnMapFormat() {
|
||||
return getString(R.string.show_on_map_format_key, IntentDashboardUtils.PREFERENCE_ID_ASK);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@ import de.dennisguse.opentracks.R;
|
||||
|
||||
public enum UnitSystem {
|
||||
METRIC(R.string.stats_units_metric),
|
||||
IMPERIAL(R.string.stats_units_imperial);
|
||||
IMPERIAL(R.string.stats_units_imperial),
|
||||
NAUTICAL_IMPERIAL(R.string.stats_units_nautical); // Nautical miles with feet
|
||||
|
||||
private final int preferenceIdentifier;
|
||||
|
||||
|
||||
@@ -5,10 +5,15 @@ import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||
|
||||
public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
||||
|
||||
@@ -28,6 +33,8 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
||||
startActivity(intent);
|
||||
return true;
|
||||
});
|
||||
|
||||
setShowOnMapFormatOptions();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,4 +71,14 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
||||
|
||||
super.onDisplayPreferenceDialog(preference);
|
||||
}
|
||||
|
||||
private void setShowOnMapFormatOptions() {
|
||||
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
|
||||
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, getString(R.string.show_on_dashboard));
|
||||
options.put(IntentDashboardUtils.PREFERENCE_ID_ASK, getString(R.string.show_on_map_format_ask));
|
||||
ListPreference listPreference = findPreference(getString(R.string.show_on_map_format_key));
|
||||
listPreference.setEntries(options.values().toArray(new String[0]));
|
||||
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
package de.dennisguse.opentracks.share;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.data.ShareContentProvider;
|
||||
import de.dennisguse.opentracks.data.models.Track;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||
|
||||
/**
|
||||
* Used to convert IntentDashboardUtils.startDashboard-requests into {@link TrackFileFormat}.
|
||||
*/
|
||||
public abstract class ShowOnMapProxyActivity extends AppCompatActivity {
|
||||
|
||||
private final TrackFileFormat trackFileFormat;
|
||||
|
||||
protected ShowOnMapProxyActivity(TrackFileFormat trackFileFormat) {
|
||||
this.trackFileFormat = trackFileFormat;
|
||||
}
|
||||
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
Set<Track.Id> trackIds = IntentDashboardUtils.extractTrackIdsFromIntent(getIntent());
|
||||
|
||||
showTrackfileFormat(this, trackFileFormat, trackIds);
|
||||
|
||||
finish();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send intent to show tracks on a map (needs an another app) as KMZ.
|
||||
*
|
||||
* @param context the context
|
||||
* @param trackIds the track ids
|
||||
*/
|
||||
private static void showTrackfileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
|
||||
if (trackIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
|
||||
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
|
||||
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
|
||||
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
|
||||
}
|
||||
|
||||
public static class KML extends ShowOnMapProxyActivity {
|
||||
public KML() {
|
||||
super(TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA);
|
||||
}
|
||||
}
|
||||
|
||||
public static class GPX extends ShowOnMapProxyActivity {
|
||||
public GPX() {
|
||||
super(TrackFileFormat.GPX);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package de.dennisguse.opentracks.stats;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import de.dennisguse.opentracks.data.models.Altitude;
|
||||
|
||||
public class AltitudeRingBuffer extends RingBuffer<Altitude> {
|
||||
|
||||
private Altitude firstAltitude;
|
||||
|
||||
AltitudeRingBuffer(int size) {
|
||||
super(size);
|
||||
}
|
||||
|
||||
AltitudeRingBuffer(RingBuffer<Altitude> toCopy) {
|
||||
super(toCopy);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected Number from(Altitude object) {
|
||||
if (firstAltitude == null) {
|
||||
firstAltitude = object;
|
||||
}
|
||||
return object.toM();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Altitude to(double object) {
|
||||
return firstAltitude.replace(object);
|
||||
}
|
||||
}
|
||||
@@ -41,12 +41,6 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||
*/
|
||||
public class TrackStatisticsUpdater {
|
||||
|
||||
/**
|
||||
* The number of altitude readings to smooth to get a somewhat accurate signal.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
private static final int ALTITUDE_SMOOTHING_FACTOR = 25;
|
||||
|
||||
/**
|
||||
* The number of speed reading to smooth to get a somewhat accurate signal.
|
||||
*/
|
||||
@@ -63,7 +57,6 @@ public class TrackStatisticsUpdater {
|
||||
|
||||
private final TrackStatistics trackStatistics;
|
||||
|
||||
private final AltitudeRingBuffer altitudeBuffer;
|
||||
private final SpeedRingBuffer speedBuffer;
|
||||
private float averageHeartRateBPM;
|
||||
private Duration totalHeartRateDuration = Duration.ZERO;
|
||||
@@ -86,7 +79,6 @@ public class TrackStatisticsUpdater {
|
||||
this.trackStatistics = trackStatistics;
|
||||
this.currentSegment = new TrackStatistics();
|
||||
|
||||
altitudeBuffer = new AltitudeRingBuffer(ALTITUDE_SMOOTHING_FACTOR);
|
||||
speedBuffer = new SpeedRingBuffer(SPEED_SMOOTHING_FACTOR);
|
||||
resetAverageHeartRate();
|
||||
}
|
||||
@@ -95,7 +87,6 @@ public class TrackStatisticsUpdater {
|
||||
this.currentSegment = new TrackStatistics(toCopy.currentSegment);
|
||||
this.trackStatistics = new TrackStatistics(toCopy.trackStatistics);
|
||||
|
||||
this.altitudeBuffer = new AltitudeRingBuffer(toCopy.altitudeBuffer);
|
||||
this.speedBuffer = new SpeedRingBuffer(toCopy.speedBuffer);
|
||||
|
||||
this.lastTrackPoint = toCopy.lastTrackPoint;
|
||||
@@ -140,11 +131,7 @@ public class TrackStatisticsUpdater {
|
||||
|
||||
//Update absolute (GPS-based) altitude
|
||||
if (trackPoint.hasAltitude()) {
|
||||
// Update altitude using the smoothed average
|
||||
altitudeBuffer.setNext(trackPoint.getAltitude());
|
||||
Altitude newAverage = altitudeBuffer.getAverage();
|
||||
|
||||
currentSegment.updateAltitudeExtremities(newAverage);
|
||||
currentSegment.updateAltitudeExtremities(trackPoint.getAltitude());
|
||||
}
|
||||
|
||||
// Update heart rate
|
||||
@@ -198,7 +185,6 @@ public class TrackStatisticsUpdater {
|
||||
currentSegment.reset(trackPoint.getTime());
|
||||
|
||||
lastTrackPoint = null;
|
||||
altitudeBuffer.reset();
|
||||
speedBuffer.reset();
|
||||
resetAverageHeartRate();
|
||||
}
|
||||
@@ -208,14 +194,6 @@ public class TrackStatisticsUpdater {
|
||||
totalHeartRateDuration = Duration.ZERO;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the smoothed altitude over several readings.
|
||||
* The altitude readings is noisy so the smoothed altitude is better than the raw altitude for many tasks.
|
||||
*/
|
||||
public Altitude getSmoothedAltitude() {
|
||||
return altitudeBuffer.getAverage();
|
||||
}
|
||||
|
||||
public Speed getSmoothedSpeed() {
|
||||
return speedBuffer.getAverage();
|
||||
}
|
||||
|
||||
@@ -107,17 +107,17 @@ public class IntervalsFragment extends Fragment {
|
||||
// TODO handle empty view: before we did viewBinding.intervalList.setEmptyView(viewBinding.intervalListEmptyView);
|
||||
viewBinding.intervalList.setAdapter(adapter);
|
||||
|
||||
final DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setUnit(unitSystem)
|
||||
.build(getContext());
|
||||
|
||||
intervalsAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, IntervalStatisticsModel.IntervalOption.values()) {
|
||||
@NonNull
|
||||
@Override
|
||||
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||
TextView v = (TextView) super.getView(position, convertView, parent);
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setUnit(unitSystem)
|
||||
.build(getContext());
|
||||
|
||||
IntervalStatisticsModel.IntervalOption option = getItem(position);
|
||||
String stringValue = formatter.formatDistance(option.getDistance(unitSystem));
|
||||
v.setText(stringValue);
|
||||
|
||||
@@ -181,7 +181,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
insertMarkerMenuItem.setVisible(track != null && track.getId().equals(recordingStatus.getTrackId()) && !recordingStatus.isPaused());
|
||||
insertMarkerMenuItem.setVisible(track != null && track.getId().equals(recordingStatus.getTrackId()));
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,12 +85,6 @@ public class ExportUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isExportFileExists(UUID uuuid, String trackFileFormatExtension, List<String> filesName) {
|
||||
String word = uuuid.toString().substring(0, 8) + ".*\\." + trackFileFormatExtension;
|
||||
Pattern pattern = Pattern.compile(word);
|
||||
return filesName.stream().anyMatch(w -> pattern.matcher(w).matches());
|
||||
}
|
||||
|
||||
public static List<String> getAllFiles(Context context, Uri directoryUri) {
|
||||
List<String> fileNames = new ArrayList<>();
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
|
||||
@@ -5,31 +5,45 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||
import de.dennisguse.opentracks.data.ShareContentProvider;
|
||||
import de.dennisguse.opentracks.data.models.Track;
|
||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
||||
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||
|
||||
/**
|
||||
* Create an {@link Intent} to request showing a Dashboard.
|
||||
* Create an {@link Intent} to request showing tracks on a Map or a Dashboard.
|
||||
* The receiving {@link android.app.Activity} gets temporary access to the {@link TracksColumns} and the {@link TrackPointsColumns} (incl. update).
|
||||
*/
|
||||
public class IntentDashboardUtils {
|
||||
|
||||
private static final String TAG = IntentDashboardUtils.class.getSimpleName();
|
||||
|
||||
private static final String ACTION_DASHBOARD = "Intent.OpenTracks-Dashboard";
|
||||
|
||||
private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload";
|
||||
|
||||
public static final TrackFileFormat[] SHOW_ON_MAP_TRACK_FILE_FORMATS = new TrackFileFormat[] {
|
||||
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
|
||||
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||
TrackFileFormat.GPX};
|
||||
|
||||
public static final String PREFERENCE_ID_DASHBOARD = ACTION_DASHBOARD;
|
||||
public static final String PREFERENCE_ID_ASK = "ASK";
|
||||
|
||||
/**
|
||||
* Assume "v1" if not present.
|
||||
*/
|
||||
@@ -49,24 +63,78 @@ public class IntentDashboardUtils {
|
||||
private static final int TRACK_URI_INDEX = 0;
|
||||
private static final int TRACKPOINTS_URI_INDEX = 1;
|
||||
private static final int MARKERS_URI_INDEX = 2;
|
||||
private static final int NONE_SELECTED = -1;
|
||||
|
||||
private IntentDashboardUtils() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
||||
* Shows an AlertDialog with different format option if none is defined as preference.
|
||||
*
|
||||
* @param context the context
|
||||
* @param isRecording are we currently recording?
|
||||
* @param trackIds the track ids
|
||||
*/
|
||||
public static void startDashboard(Context context, boolean isRecording, Track.Id... trackIds) {
|
||||
startDashboard(context, isRecording, null, null, trackIds);
|
||||
public static void showTrackOnMap(Context context, boolean isRecording, Track.Id... trackIds) {
|
||||
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(context.getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
|
||||
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, context.getString(R.string.show_on_dashboard));
|
||||
final String[] optionLabels = options.values().toArray(new String[0]);
|
||||
final String[] optionValues = options.keySet().toArray(new String[0]);
|
||||
final AtomicInteger checkedItem = new AtomicInteger(NONE_SELECTED);
|
||||
String preferenceValue = PreferencesUtils.getShowOnMapFormat();
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
if (optionValues[i].equals(preferenceValue)) {
|
||||
checkedItem.set(i);
|
||||
}
|
||||
}
|
||||
if (checkedItem.get() == NONE_SELECTED) {
|
||||
checkedItem.set(0); // set first option as default
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
builder.setTitle(R.string.select_show_on_map_behavior);
|
||||
builder.setSingleChoiceItems(optionLabels, checkedItem.get(), (dialog, which) -> checkedItem.set(which));
|
||||
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, false));
|
||||
builder.setNeutralButton(R.string.always, ((dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, true)));
|
||||
builder.setNegativeButton(android.R.string.cancel, null);
|
||||
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
} else {
|
||||
onFormatSelected(context, isRecording, preferenceValue, trackIds, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A format was selected, remember if <code>always</code> is true and start the necessary action
|
||||
*
|
||||
* @param context the context
|
||||
* @param isRecording are we currently recording?
|
||||
* @param selectedValue the chosen format
|
||||
* @param trackIds the track ids
|
||||
* @param always set the selectedValue as default preference
|
||||
*/
|
||||
private static void onFormatSelected(final Context context, final boolean isRecording, final String selectedValue, final Track.Id[] trackIds, final boolean always) {
|
||||
if (always) {
|
||||
PreferencesUtils.setShowOnMapFormat(selectedValue);
|
||||
}
|
||||
TrackFileFormat trackFileFormat = TrackFileFormat.valueOfPreferenceId(selectedValue);
|
||||
if (trackFileFormat != null) {
|
||||
showTrackOnMapWithFileFormat(context, trackFileFormat, Set.of(trackIds));
|
||||
} else {
|
||||
startDashboard(context, isRecording, null, null, trackIds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
||||
* By providing a targetPackage and targetClass an explicit intent can be sent,
|
||||
* thus bypassing the need for the user to select an app.
|
||||
*
|
||||
* @param context the context
|
||||
* @param isRecording are we currently recording?
|
||||
* @param targetPackage the target package
|
||||
* @param targetClass the target class
|
||||
* @param trackIds the track ids
|
||||
*/
|
||||
public static void startDashboard(Context context, boolean isRecording, String targetPackage, String targetClass, Track.Id... trackIds) {
|
||||
if (trackIds.length == 0) {
|
||||
@@ -108,16 +176,27 @@ public class IntentDashboardUtils {
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
public static Set<Track.Id> extractTrackIdsFromIntent(@NonNull Intent intent) {
|
||||
final ArrayList<Uri> uris = intent.getParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD);
|
||||
final Uri tracksUri = uris.get(TRACK_URI_INDEX);
|
||||
|
||||
String[] trackIdsString = ContentProviderUtils.parseTrackIdsFromUri(tracksUri);
|
||||
Set<Track.Id> trackIds = new HashSet<>(trackIdsString.length);
|
||||
for (String s : trackIdsString) {
|
||||
trackIds.add(new Track.Id(Long.parseLong(s)));
|
||||
/**
|
||||
* Send intent to show tracks on a map (needs an another app) to support specific trackFileFormat.
|
||||
*
|
||||
* @param context the context
|
||||
* @param trackFileFormat the track file format
|
||||
* @param trackIds the track ids
|
||||
*/
|
||||
private static void showTrackOnMapWithFileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
|
||||
if (trackIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
return trackIds;
|
||||
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
|
||||
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
|
||||
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
|
||||
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#000000"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
|
||||
</vector>
|
||||
@@ -6,18 +6,18 @@
|
||||
<path
|
||||
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
|
||||
android:strokeWidth="5.03185"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ff6d00"/>
|
||||
android:fillColor="@android:color/transparent"
|
||||
android:strokeColor="@color/opentracks_secondary_color"/>
|
||||
<path
|
||||
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
|
||||
android:strokeWidth="6.91728"
|
||||
android:fillColor="#ff6d00"
|
||||
android:strokeColor="#00000000"/>
|
||||
android:strokeWidth="1.0"
|
||||
android:fillColor="@color/opentracks_secondary_color"
|
||||
android:strokeColor="@color/opentracks_secondary_color"/>
|
||||
<path
|
||||
android:pathData="M38.62,63.866 L52.899,78.144 86.38,44.664"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="6.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ffffff"
|
||||
android:fillColor="@color/opentracks_secondary_color"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="butt"/>
|
||||
</vector>
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
|
||||
android:strokeWidth="5.03185225"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#a31a1f" />
|
||||
<path
|
||||
android:fillAlpha="0.87843137"
|
||||
android:fillColor="#efefef"
|
||||
android:pathData="M54,54.059h5v17.941h-5z"
|
||||
android:strokeWidth="4.82273912"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000" />
|
||||
<path
|
||||
android:fillAlpha="0.87843137"
|
||||
android:fillColor="#efefef"
|
||||
android:pathData="M66,54h5v17.941h-5z"
|
||||
android:strokeWidth="4.82273865"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
@@ -1,27 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
|
||||
android:strokeWidth="5.03185225"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#a31a1f" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9a191d"
|
||||
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
|
||||
android:strokeWidth="6.9172821"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M62.5,61.5m-9.189,0a9.189,9.189 0,1 1,18.378 0a9.189,9.189 0,1 1,-18.378 0"
|
||||
android:strokeWidth="1.62162137"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#7e3b3d" />
|
||||
</vector>
|
||||
@@ -1,34 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
|
||||
android:strokeWidth="5.0319"
|
||||
android:strokeColor="#a31a1f" />
|
||||
<path android:pathData="M62.5,62.5m-0,-50a50,50 0,1 1,-0 100a50,50 0,1 1,-0 -100">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="62.5"
|
||||
android:endY="112.5"
|
||||
android:startX="62.5"
|
||||
android:startY="12.5"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF721212"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FFA21A1F"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#fff"
|
||||
android:pathData="M62.5,61.5m-9.189,0a9.189,9.189 0,1 1,18.378 0a9.189,9.189 0,1 1,-18.378 0"
|
||||
android:strokeWidth="1.6216"
|
||||
android:strokeColor="#7e3b3d" />
|
||||
</vector>
|
||||
@@ -6,17 +6,17 @@
|
||||
<path
|
||||
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
|
||||
android:strokeWidth="5.03185"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ff6d00"/>
|
||||
android:fillColor="@android:color/transparent"
|
||||
android:strokeColor="@color/opentracks_secondary_color"/>
|
||||
<path
|
||||
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
|
||||
android:strokeWidth="6.91728"
|
||||
android:fillColor="#ff6d00"
|
||||
android:strokeColor="#00000000"/>
|
||||
android:fillColor="@color/opentracks_secondary_color"
|
||||
android:strokeColor="@android:color/transparent"/>
|
||||
<path
|
||||
android:pathData="M87.6,62.5 L67.991,73.822 48.381,85.143l-0,-22.643 0,-22.643 19.61,11.322z"
|
||||
android:strokeWidth="6.67087"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillColor="@android:color/white"
|
||||
android:strokeColor="@android:color/transparent"
|
||||
android:strokeLineCap="round"/>
|
||||
</vector>
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M2.516,63.008a60.239,59.73 134.879,1 0,119.968 -1.017a60.239,59.73 134.879,1 0,-119.968 1.017z"
|
||||
android:strokeWidth="5.03194237"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#555555" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#484848"
|
||||
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
|
||||
android:strokeWidth="6.9172821"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M53.02,54.02h17.46v17.46h-17.46z"
|
||||
android:strokeWidth="1.04023623"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#414141" />
|
||||
<path
|
||||
android:name="fade_out_circle"
|
||||
android:fillAlpha="0.0"
|
||||
android:fillColor="#a31a1f"
|
||||
android:pathData="M62.5,62.5m-0,-62a50,50 0,1 1,-0 123a50,50 0,1 1,-0 -123" />
|
||||
</vector>
|
||||
@@ -1,28 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M2.516,63.008a60.239,59.73 134.879,1 0,119.968 -1.017a60.239,59.73 134.879,1 0,-119.968 1.017z"
|
||||
android:strokeWidth="5.03194237"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#2a2a2a" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#2a2a2a"
|
||||
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
|
||||
android:strokeWidth="6.9172821"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000" />
|
||||
<path
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#555555"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M54,56h15v15h-15z"
|
||||
android:strokeWidth="1.56054175"
|
||||
android:strokeAlpha="0.4"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
@@ -1,34 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="82dp"
|
||||
android:height="82dp"
|
||||
android:viewportWidth="125"
|
||||
android:viewportHeight="125">
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M2.516,63.009a60.239,59.73 134.856,1 0,119.967 -1.017a60.239,59.73 134.856,1 0,-119.967 1.017z"
|
||||
android:strokeWidth="5.0319"
|
||||
android:strokeColor="#555" />
|
||||
<path android:pathData="M62.5,62.5m-0,-50a50,50 0,1 1,-0 100a50,50 0,1 1,-0 -100">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="62.5"
|
||||
android:endY="112.5"
|
||||
android:startX="62.5"
|
||||
android:startY="12.5"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF404040"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF555555"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#dbdbdb"
|
||||
android:pathData="M53.02,54.02h17.46v17.46h-17.46z"
|
||||
android:strokeWidth="1.0402"
|
||||
android:strokeColor="#414141" />
|
||||
</vector>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/loading_indeterminate"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loading_text"
|
||||
style="@style/TextAppearance.MaterialComponents.Headline5"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="center"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/loading_indicator"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:text="Text" />
|
||||
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/loading_indicator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/loading_text"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:indeterminate="true" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -74,8 +74,8 @@ limitations under the License.
|
||||
style="?attr/textAppearanceHeadline6"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="5"
|
||||
android:gravity="right"
|
||||
android:layout_weight="10"
|
||||
android:gravity="end"
|
||||
android:text="@string/track_list_empty_message" />
|
||||
|
||||
<View
|
||||
@@ -101,6 +101,7 @@ limitations under the License.
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_baseline_record_24"
|
||||
android:contentDescription="@string/image_record"
|
||||
app:layout_anchor="@id/bottom_app_bar" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
@@ -45,6 +45,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_baseline_record_24"
|
||||
android:contentDescription="@string/image_stop"
|
||||
app:layout_anchor="@id/bottom_app_bar" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
@@ -2,114 +2,224 @@
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
android:id="@+id/fields"
|
||||
layout="@layout/track_edit_fields" />
|
||||
android:id="@+id/loading_layout"
|
||||
layout="@layout/loading_indeterminate"
|
||||
android:visibility="gone" />
|
||||
|
||||
<LinearLayout style="@style/BottomButtonBar">
|
||||
<LinearLayout
|
||||
android:id="@+id/content_linear_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:visibility="visible">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp">
|
||||
<ScrollView style="@style/ScrollView.WithBottomButtons">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/guideline"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_percent="0.5" />
|
||||
android:padding="8dp">
|
||||
|
||||
<!-- Time -->
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
style="?attr/textAppearanceHeadline2"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:text="04:54:36" />
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="?attr/textInputOutlinedStyle"
|
||||
android:hint="@string/generic_name"
|
||||
android:imeOptions="actionNext"
|
||||
android:importantForAutofill="no"
|
||||
android:layout_marginBottom="16dp">
|
||||
|
||||
<!-- Distance -->
|
||||
<TextView
|
||||
android:id="@+id/distance"
|
||||
style="?attr/textAppearanceHeadline3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/distance_unit"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/time"
|
||||
tools:layout_editor_absoluteX="52dp"
|
||||
tools:text="130" />
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/track_edit_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textCapSentences"
|
||||
android:selectAllOnFocus="true" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/distance_unit"
|
||||
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/distance"
|
||||
app:layout_constraintEnd_toStartOf="@id/guideline"
|
||||
app:layout_constraintStart_toEndOf="@+id/distance"
|
||||
tools:text="km" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<!-- Average moving speed -->
|
||||
<TextView
|
||||
android:id="@+id/speed"
|
||||
style="?attr/textAppearanceHeadline3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/speed_unit"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||
app:layout_constraintTop_toBottomOf="@id/time"
|
||||
tools:text="26,5" />
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/speed_unit"
|
||||
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@id/speed"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/speed"
|
||||
tools:text="km/h" />
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
style="?attr/textInputOutlinedExposedDropdownMenuStyle"
|
||||
android:imeOptions="actionNext"
|
||||
android:importantForAutofill="no"
|
||||
android:layout_marginBottom="16dp">
|
||||
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/stats_summary_barrier"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierDirection="bottom"
|
||||
app:constraint_referenced_ids="time,distance,speed" />
|
||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||
android:id="@+id/track_edit_activity_type"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:hint="@string/track_edit_activity_type_hint"
|
||||
android:imeOptions="actionNext"
|
||||
android:selectAllOnFocus="true" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/resume_button"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:layout_marginTop="48dp"
|
||||
app:srcCompat="@drawable/ic_button_resume"
|
||||
app:layout_constraintTop_toBottomOf="@id/stats_summary_barrier"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/finish_button"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/finish_button"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
app:srcCompat="@drawable/ic_button_done"
|
||||
app:layout_constraintTop_toTopOf="@id/resume_button"
|
||||
app:layout_constraintStart_toEndOf="@id/resume_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/resume_button" />
|
||||
<ImageView
|
||||
android:id="@+id/track_edit_activity_type_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
tools:src="@drawable/ic_activity_bike_24dp"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="?attr/textInputOutlinedStyle"
|
||||
android:hint="@string/generic_description"
|
||||
android:imeOptions="actionNext"
|
||||
android:importantForAutofill="no"
|
||||
android:layout_marginBottom="16dp">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/track_edit_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textCapSentences"
|
||||
android:selectAllOnFocus="true" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/guideline"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_percent="0.5" />
|
||||
|
||||
<!-- Time -->
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
style="?attr/textAppearanceHeadline2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="04:54:36" />
|
||||
|
||||
<!-- Distance -->
|
||||
<TextView
|
||||
android:id="@+id/distance"
|
||||
style="?attr/textAppearanceHeadline3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/distance_unit"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/time"
|
||||
tools:layout_editor_absoluteX="52dp"
|
||||
tools:text="130" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/distance_unit"
|
||||
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/distance"
|
||||
app:layout_constraintEnd_toStartOf="@id/guideline"
|
||||
app:layout_constraintStart_toEndOf="@+id/distance"
|
||||
tools:text="km" />
|
||||
|
||||
<!-- Average moving speed -->
|
||||
<TextView
|
||||
android:id="@+id/speed"
|
||||
style="?attr/textAppearanceHeadline3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/speed_unit"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||
app:layout_constraintTop_toBottomOf="@id/time"
|
||||
tools:text="26,5" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/speed_unit"
|
||||
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@id/speed"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/speed"
|
||||
tools:text="km/h" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
<LinearLayout style="@style/BottomButtonBar">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="8dp">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/buttons_guideline"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_percent="0.5" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/discard_button"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_marginEnd="52dp"
|
||||
android:contentDescription="@string/image_discard"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/resume_button"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:srcCompat="@drawable/ic_delete_forever_24dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/resume_button"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:contentDescription="@string/image_record"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/buttons_guideline"
|
||||
app:layout_constraintStart_toEndOf="@id/buttons_guideline"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:srcCompat="@drawable/ic_button_resume" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/finish_button"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:contentDescription="@string/image_stop"
|
||||
android:layout_marginStart="36dp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/resume_button"
|
||||
app:layout_constraintStart_toEndOf="@id/resume_button"
|
||||
app:layout_constraintTop_toTopOf="@id/resume_button"
|
||||
app:srcCompat="@drawable/ic_button_done" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">الوصف: %1$s</string>
|
||||
<string name="generic_name">الاسم</string>
|
||||
<string name="generic_name_line">الاسم: %1$s</string>
|
||||
<string name="generic_paused">متوقف مؤقتًا</string>
|
||||
<string name="generic_recording">جارٍ التسجيل…</string>
|
||||
<string name="generic_save">حفظ</string>
|
||||
<string name="generic_tracks">المسارات</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">سهم</string>
|
||||
<string name="image_marker">علامة</string>
|
||||
<string name="image_marker_count">عدد العلامات</string>
|
||||
<string name="image_pause">إيقاف مؤقت</string>
|
||||
<string name="image_photo_marker">علامة الصورة</string>
|
||||
<string name="image_record">تسجيل</string>
|
||||
<string name="image_stop">إيقاف</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">نوع المُحدد (على سبيل المثال شلال)</string>
|
||||
<string name="marker_edit_marker_type_hint">نوع المُحدد</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">ليس لديك أية علامات</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">خدمة التسجيل</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">مستوى شحن البطارية</string>
|
||||
<string name="sensor_state_cadence">الإيقاع</string>
|
||||
<string name="sensor_state_cadence_value">%1$d دورة في الدقيقة</string>
|
||||
<string name="sensor_state_heart_rate">معدل ضربات القلب</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d نبضة في الدقيقة</string>
|
||||
<string name="sensor_state_power">الطاقة</string>
|
||||
<string name="sensor_state_power_value">%1$d واط</string>
|
||||
<string name="settings_not_while_recording">غير متاح أثناء تسجيل مسار</string>
|
||||
<string name="settings_show">إظهار</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">خيارات متقدمة</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">بحسب المسافة</string>
|
||||
<string name="settings_chart_by_time">بحسب الوقت</string>
|
||||
<string name="settings_recording">التسجيل</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>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">عدد</string>
|
||||
<string name="settings_recording_track_name_title">اسم المسار الافتراضي</string>
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
@@ -311,25 +300,6 @@ limitations under the License.
|
||||
<item quantity="many">%1$.1f ميلاً في الساعة</item>
|
||||
<item quantity="other">%1$.1f من الأميال في الساعة</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s لكل كيلومتر</string>
|
||||
<string name="voice_pace_per_mile">%1$s لكل ميل</string>
|
||||
<string name="voice_template">%1$s في %2$s بسرعة %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="zero">المسافة الإجمالية 0 كيلومتر</item>
|
||||
<item quantity="one">المسافة الإجمالية كيلومتر واحد</item>
|
||||
<item quantity="two">المسافة الإجمالية 2 كيلومتر</item>
|
||||
<item quantity="few">المسافة الإجمالية %1$.2f كيلومتر</item>
|
||||
<item quantity="many">المسافة الإجمالية %1$.2f كيلومتر</item>
|
||||
<item quantity="other">المسافة الإجمالية %1$.2f كيلومتر</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="zero">المسافة الإجمالية 2 ميل</item>
|
||||
<item quantity="one">إجمالي المسافة ميل واحد</item>
|
||||
<item quantity="two">المسافة الإجمالية 0 ميل</item>
|
||||
<item quantity="few">المسافة الإجمالية %1$.2f أميال</item>
|
||||
<item quantity="many">مجموع المسافة %1$.2f ميلاً</item>
|
||||
<item quantity="other">المسافة الإجمالية %1$.2f من الأميال</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">أجهزة الصراف الآلي</string>
|
||||
<string name="waypoint_type_bank">مصرف</string>
|
||||
|
||||
@@ -97,7 +97,6 @@
|
||||
<string name="generic_description_line">Description: %1$s</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_paused">Paused</string>
|
||||
<string name="generic_recording">Recording…</string>
|
||||
<string name="generic_save">Save</string>
|
||||
<string name="generic_tracks">Tracks</string>
|
||||
@@ -107,7 +106,6 @@
|
||||
<string name="image_arrow">Arrow</string>
|
||||
<string name="image_marker">Marker</string>
|
||||
<string name="image_marker_count">Marker count</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>
|
||||
@@ -122,7 +120,6 @@
|
||||
<string name="marker_name_format">Marker %1$d</string>
|
||||
<string name="marker_title">%1$d of %2$d</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>
|
||||
@@ -141,19 +138,12 @@
|
||||
<string name="menu_start_gps">Start GPS</string>
|
||||
<string name="menu_stop_gps">Stop GPS</string>
|
||||
<string name="recording_service">Recording service</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_heart_rate">Heart rate</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">Power</string>
|
||||
<string name="sensor_state_power_value">%1$d W</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_recording">Recording</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>
|
||||
@@ -166,7 +156,6 @@
|
||||
<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>
|
||||
@@ -243,9 +232,6 @@
|
||||
<item quantity="one">1 mile per hour</item>
|
||||
<item quantity="other">%1$.1f miles per hour</item>
|
||||
</plurals>
|
||||
<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_template">%1$s in %2$s at %3$s</string>
|
||||
<string name="waypoint_type_atm">Cashpoint</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar/pub</string>
|
||||
|
||||
@@ -97,7 +97,6 @@
|
||||
<string name="generic_description_line">Descripción: %1$s</string>
|
||||
<string name="generic_name">Nombre</string>
|
||||
<string name="generic_name_line">Nombre: %1$s</string>
|
||||
<string name="generic_paused">En pausa</string>
|
||||
<string name="generic_recording">Grabando…</string>
|
||||
<string name="generic_save">Guardar</string>
|
||||
<string name="generic_tracks">Recorridos</string>
|
||||
@@ -107,7 +106,6 @@
|
||||
<string name="image_arrow">Flecha</string>
|
||||
<string name="image_marker">Marcador</string>
|
||||
<string name="image_marker_count">Recuento de marcadores</string>
|
||||
<string name="image_pause">Pausa</string>
|
||||
<string name="image_photo_marker">Marcador de foto</string>
|
||||
<string name="image_record">Grabar</string>
|
||||
<string name="image_stop">Parar</string>
|
||||
@@ -122,7 +120,6 @@
|
||||
<string name="marker_name_format">Marcador %1$d</string>
|
||||
<string name="marker_title">%1$d de %2$d</string>
|
||||
<string name="marker_edit_marker_type">Tipo de marcador (p. ej., cascada)</string>
|
||||
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
|
||||
<string name="marker_list_empty_message">No tienes ningún marcador</string>
|
||||
<string name="menu_aggregated_statistics">Estadíst. globales</string>
|
||||
<string name="menu_delete">Eliminar</string>
|
||||
@@ -143,19 +140,12 @@
|
||||
<string name="menu_stop_gps">Detener GPS</string>
|
||||
<string name="menu_resume_track">Reanudar recorrido</string>
|
||||
<string name="recording_service">Servicio de grabación</string>
|
||||
<string name="sensor_state_battery">Nivel de la batería</string>
|
||||
<string name="sensor_state_cadence">Cadencia</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d lpm</string>
|
||||
<string name="sensor_state_power">Potencia</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">No está disponible durante la grabación de un recorrido</string>
|
||||
<string name="settings_show">Mostrar</string>
|
||||
<string name="settings_advanced">Opciones avanzadas</string>
|
||||
<string name="settings_chart_by_distance">Por distancia</string>
|
||||
<string name="settings_chart_by_time">Por tiempo</string>
|
||||
<string name="settings_recording">Grabación</string>
|
||||
<string name="settings_recording_default_activity_title">Tipo de actividad predeterminada</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre las ubicaciones grabadas</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Se crea un nuevo tramo si la distancia entre dos ubicaciones es superior a %1$s</string>
|
||||
@@ -168,7 +158,6 @@
|
||||
<string name="settings_recording_track_name_date_local_option">Fecha (local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Número</string>
|
||||
<string name="settings_recording_track_name_title">Nombre de recorrido predeterminado</string>
|
||||
<string name="settings_reset">Restablecer</string>
|
||||
<string name="settings_reset_confirm_message">Todos las configuraciones se restablecerán a los valores predeterminados. Esto no eliminará ningún recorrido en el dispositivo.</string>
|
||||
<string name="settings_reset_confirm_title">¿Restablecer ahora?</string>
|
||||
<string name="settings_reset_done">Se restablecieron los valores predeterminados de todas las configuraciones</string>
|
||||
@@ -246,17 +235,6 @@
|
||||
<item quantity="one">1 milla por hora</item>
|
||||
<item quantity="other">%1$.1f millas por hora</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s por kilómetro</string>
|
||||
<string name="voice_pace_per_mile">%1$s por milla</string>
|
||||
<string name="voice_template">%1$s en %2$s a %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distancia total de 1 kilómetro</item>
|
||||
<item quantity="other">distancia total de %1$.2f kilómetros</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distancia total de 1 milla</item>
|
||||
<item quantity="other">distancia total de %1$.2f millas</item>
|
||||
</plurals>
|
||||
<string name="waypoint_type_atm">cajero automático</string>
|
||||
<string name="waypoint_type_bank">banco</string>
|
||||
<string name="waypoint_type_bar">barra</string>
|
||||
@@ -320,10 +298,8 @@
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_title">Mostrar estadísticas en pantalla de bloqueo</string>
|
||||
<string name="permission_gps_failed">OpenTracks necesita permiso para usar el GPS.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Mantener la pantalla encendida</string>
|
||||
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
|
||||
<string name="instant_export_enabled_title">Exportación instantánea post-entrenamiento</string>
|
||||
<string name="hold_to_stop">Mantener para parar</string>
|
||||
<string name="hold_to_pause">Mantener para pausar</string>
|
||||
<string name="settings_sensor_wheel_circumference">Circunferencia de la rueda (mm)</string>
|
||||
<string name="sensor_state_cadence_avg">Ritmo promedio</string>
|
||||
<string name="sensor_state_heart_rate_avg">Tasa cardíaca promedio</string>
|
||||
@@ -337,8 +313,6 @@
|
||||
<string name="settings_night_mode_option_system">Sistema</string>
|
||||
<string name="settings_night_mode_option_day">Día</string>
|
||||
<string name="settings_night_mode_option_night">Noche</string>
|
||||
<string name="settings_error_initial_values_restored">Lo sentimos, pero ha ocurrido un error. Todas las configuraciones se han revertido a los valores predeterminados.</string>
|
||||
<string name="settings_sensor_connecting">Conectado a %1$s</string>
|
||||
<string name="track_speed_notification">Velocidad: %1$s</string>
|
||||
<string name="instant_export_enabled_summary">Exportar el recorrido al almacenamiento una vez finalizada la grabación</string>
|
||||
<string name="description_altitude_loss">Pérdida de elevación: %1$d m (%2$d pies)</string>
|
||||
@@ -378,8 +352,6 @@
|
||||
\na) (actualizaciones en vivo) Instale <a href="https://github.com/OpenTracksApp/OSMDashboard"> OSMDashboard </a>. Proporciona mapas en línea o fuera de línea a través de <a href="https://www.openstreetmap.org"> OpenStreetMap </a>.
|
||||
\nEn realidad, OSMDashboard es una aplicación separada que solo puede acceder (temporalmente) a los datos de los recorridos que se mostrarán.
|
||||
\nb) A través de una aplicación de mapas normal (p. ej., <a href="http://osmand.net/"> OsmAnd </a> y <a href="https://maps.me/"> MAPS.ME </a>). Estas aplicaciones deben admitir el formato de archivo KMZ (solo ubicaciones y marcas de tiempo). De hecho, una aplicación debe admitir <i> ACTION_VIEW </i> con MIME <i> application / vnd.google-earth.kmz</i>. </string>
|
||||
<string name="voice_speed_lap">Velocidad de vuelta de %1$s</string>
|
||||
<string name="voice_pace_lap">Tiempo de vuelta de %1$s</string>
|
||||
<string name="delete_service">Borrar servicio</string>
|
||||
<string name="about_third_party_data">Datos de terceros</string>
|
||||
<string name="about_libraries">Bibliotecas</string>
|
||||
@@ -447,7 +419,6 @@
|
||||
<string name="settings_announcements_totaltime_frequency">Intervalo de tiempo</string>
|
||||
<string name="settings_announcements_distance_frequency">Intervalo de distancia</string>
|
||||
<string name="settings_layout_reset">Restablecer pantalla personalizada</string>
|
||||
<string name="settings_announcements">Anuncios</string>
|
||||
<string name="settings_layout_reset_confirm_title">¿Restablecer todos los diseños\?</string>
|
||||
<string name="settings_layout_reset_done">Todos los diseños se han revertido a los valores predeterminados</string>
|
||||
<string name="settings_all_reset">Restablecer</string>
|
||||
@@ -464,7 +435,6 @@
|
||||
<string name="settings_sensor_running_speed_and_cadence">Distancia, velocidad y cadencia</string>
|
||||
<string name="stats_coordinates">Latitud/Longitud</string>
|
||||
<string name="location_coordinate">%1$s°</string>
|
||||
<string name="title_activity_settings_custom_layout">Personalizar pantalla de grabación</string>
|
||||
<string name="generic_choose_an_option">Selecciona una opción</string>
|
||||
<string name="settings_sensor_cycling_distance_speed">Distancia y velocidad</string>
|
||||
<string name="settings_sensor_cycling_cadence">Cadencia</string>
|
||||
@@ -550,6 +520,5 @@
|
||||
</plurals>
|
||||
<string name="average_heart_rate">Ritmo cardíaco promedio</string>
|
||||
<string name="current_heart_rate">Ritmo cardíaco actual</string>
|
||||
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
|
||||
<string name="settings_export_filename_title">Formato del nombre del archivo</string>
|
||||
</resources>
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Описание: %1$s</string>
|
||||
<string name="generic_name">Име</string>
|
||||
<string name="generic_name_line">Име: %1$s</string>
|
||||
<string name="generic_paused">На пауза</string>
|
||||
<string name="generic_recording">Записва се…</string>
|
||||
<string name="generic_save">Запазване</string>
|
||||
<string name="generic_tracks">Маршрути</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Стрелка</string>
|
||||
<string name="image_marker">Маркер</string>
|
||||
<string name="image_marker_count">Брой маркери</string>
|
||||
<string name="image_pause">Пауза</string>
|
||||
<string name="image_photo_marker">Маркер за снимки</string>
|
||||
<string name="image_record">Запис</string>
|
||||
<string name="image_stop">Спиране</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Тип маркер (напр. водопад)</string>
|
||||
<string name="marker_edit_marker_type_hint">Тип маркер</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Нямате маркери</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">Услуга за запис</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Ниво на батерията</string>
|
||||
<string name="sensor_state_cadence">Такт</string>
|
||||
<string name="sensor_state_cadence_value">%1$d об/мин</string>
|
||||
<string name="sensor_state_heart_rate">Сърдечен ритъм</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d уд/мин</string>
|
||||
<string name="sensor_state_power">Захранване</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Не е налице при записване на маршрут</string>
|
||||
<string name="settings_show">Показване</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Разширени</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">По разстояние</string>
|
||||
<string name="settings_chart_by_time">По време</string>
|
||||
<string name="settings_recording">Записване</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>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Число</string>
|
||||
<string name="settings_recording_track_name_title">Стандартен маршрут: Име</string>
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
@@ -292,17 +281,6 @@ limitations under the License.
|
||||
<item quantity="one">1 миля в час</item>
|
||||
<item quantity="other">%1$.1f мили в час</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s на километър</string>
|
||||
<string name="voice_pace_per_mile">%1$s на миля</string>
|
||||
<string name="voice_template">%1$s за %2$s при %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">общо разстояние 1 километър</item>
|
||||
<item quantity="other">общо разстояние %1$.2f километра</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">общо разстояние 1 миля</item>
|
||||
<item quantity="other">общо разстояние %1$.2f мили</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Банкомат</string>
|
||||
<string name="waypoint_type_bank">банка</string>
|
||||
@@ -404,7 +382,6 @@ limitations under the License.
|
||||
<string name="help_storage_pictures_title">Как OpenTracks съхранява снимките, които са направени като маркери\?</string>
|
||||
<string name="bluetooth_disabled">Моля, включете Bluetooth.</string>
|
||||
<string name="sensor_could_not_scan">Не можа да сканира за Bluetooth устройства (грешка %1$i).</string>
|
||||
<string name="hold_to_pause">Задръжте за пауза</string>
|
||||
<string name="interval_list_empty_message">Все още няма интервали</string>
|
||||
<string name="track_detail_intervals_tab">Интервали</string>
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">По време на запис показвайте статистически данни, без да отключвате устройството.</string>
|
||||
@@ -440,13 +417,12 @@ limitations under the License.
|
||||
<string name="export_track_errors">Не се експортират писти</string>
|
||||
<string name="gps_disabled_msg">GPS е изключен</string>
|
||||
<string name="share_image_body">Мисля, че тази снимка може да ви заинтересува.</string>
|
||||
<string name="voice_speed_lap">Скорост на обиколка от %1$s</string>
|
||||
|
||||
<string name="help_support_title">Как да подкрепя OpenTracks\?</string>
|
||||
<string name="permission_gps_failed">OpenTracks изисква разрешение за използване на GPS.</string>
|
||||
<string name="sensor_state_power_avg">Средна мощност</string>
|
||||
<string name="help_feature_title">OpenTracks има следните функции:</string>
|
||||
<string name="delete_service">Услуга за изтриване</string>
|
||||
<string name="settings_sensor_disconnected">Изключен от %1$s</string>
|
||||
<string name="settings_night_mode_option_system">Система</string>
|
||||
<string name="settings_prevent_reimport_tracks_title">Забрана за повторно импортиране на песни</string>
|
||||
<string name="export_progress_summary_skip_msg">Пропуснати писти</string>
|
||||
@@ -455,7 +431,6 @@ limitations under the License.
|
||||
<string name="about_libraries">Библиотеки</string>
|
||||
<string name="sensor_state_cadence_avg">Среден каданс</string>
|
||||
<string name="settings_sensor_wheel_circumference">Обиколка на колелото (mm)</string>
|
||||
<string name="settings_sensor_connecting">Свързан към %1$s</string>
|
||||
<string name="description_default_speed_or_pace">По вид дейност</string>
|
||||
<string name="import_error_list_dialog_title">Файловете не се импортират</string>
|
||||
<string name="generic_overwrite">Презапис</string>
|
||||
@@ -474,7 +449,6 @@ limitations under the License.
|
||||
\n д) да купувате в <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
|
||||
\n е) да направите дарение, и
|
||||
\n ж) направете всичко, което смятате, че помага на OpenTracks. </string>
|
||||
<string name="voice_pace_lap">Време на обиколка от %1$s</string>
|
||||
<string name="generic_click_twice_cancel">Кликнете отново назад, за да отмените</string>
|
||||
<plurals name="generic_completed_with_errors">
|
||||
<item quantity="one">Завърши с една грешка</item>
|
||||
@@ -488,7 +462,6 @@ limitations under the License.
|
||||
<string name="export_error_post_workout">Експортът след тренировка е неуспешен, моля, проверете директорията за експорт.</string>
|
||||
<string name="about_third_party_data">Данни от трети страни</string>
|
||||
<string name="import_unsupported_format">Неподдържан формат на файла</string>
|
||||
<string name="settings_error_initial_values_restored">Съжаляваме, но възникна грешка. Всички настройки са възстановени до стойностите по подразбиране.</string>
|
||||
<string name="import_parser_error">Грешка при парсера: %1$s</string>
|
||||
<string name="instant_export_enabled_summary">Експортиране на запис в хранилището след приключване на записа</string>
|
||||
<string name="settings_sensor_cycling_cadence">Колоездене: каданс</string>
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Descripció: %1$s</string>
|
||||
<string name="generic_name">Nom</string>
|
||||
<string name="generic_name_line">Nom: %1$s</string>
|
||||
<string name="generic_paused">En pausa</string>
|
||||
<string name="generic_recording">S\'està enregistrant…</string>
|
||||
<string name="generic_save">Desa</string>
|
||||
<string name="generic_tracks">Rutes</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Fletxa</string>
|
||||
<string name="image_marker">Marcador</string>
|
||||
<string name="image_marker_count">Recompte de marcadors</string>
|
||||
<string name="image_pause">Atura</string>
|
||||
<string name="image_photo_marker">Marcador de fotos</string>
|
||||
<string name="image_record">Enregistra</string>
|
||||
<string name="image_stop">Atura</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Tipus de marcador (p. ex. cascada)</string>
|
||||
<string name="marker_edit_marker_type_hint">Tipus de marcador</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">No teniu cap marcador.</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">Servei d\'enregistrament</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Nivell de la bateria</string>
|
||||
<string name="sensor_state_cadence">Cadència</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_heart_rate">Freqüència cardíaca</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
|
||||
<string name="sensor_state_power">Potència</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">No està disponible durant l\'enregistrament d\'una ruta.</string>
|
||||
<string name="settings_show">Mostra\'n més</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Avançades</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">Per distància</string>
|
||||
<string name="settings_chart_by_time">Per temps</string>
|
||||
<string name="settings_recording">Enregistrament</string>
|
||||
<string name="settings_recording_default_activity_title">Activitat predeterminada</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre ubicacions registrades</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Es crea un tram si la distància entre dues ubicacions és superior a %1$s.</string>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Número</string>
|
||||
<string name="settings_recording_track_name_title">Nom de la ruta</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Restableix</string>
|
||||
<string name="settings_reset_confirm_message">Es tornaran a definir els valors predeterminats de la configuració.</string>
|
||||
<string name="settings_reset_confirm_title">Voleu restablir-ho ara?</string>
|
||||
<string name="settings_reset_done">S\'ha recuperat la configuració predeterminada.</string>
|
||||
@@ -290,17 +279,6 @@ limitations under the License.
|
||||
<item quantity="one">1 milla per hora</item>
|
||||
<item quantity="other">%1$.1f milles per hora</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s per quilòmetre</string>
|
||||
<string name="voice_pace_per_mile">%1$s per milla</string>
|
||||
<string name="voice_template">%1$s en %2$s a %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">1 quilòmetre de distància total</item>
|
||||
<item quantity="other">%1$.2f quilòmetres de distància total</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">1 milla de distància total</item>
|
||||
<item quantity="other">%1$.2f milles de distància total</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">caixer</string>
|
||||
<string name="waypoint_type_bank">banc</string>
|
||||
|
||||
@@ -166,7 +166,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Popis: %1$s</string>
|
||||
<string name="generic_name">Název</string>
|
||||
<string name="generic_name_line">Název: %1$s</string>
|
||||
<string name="generic_paused">Pozastaveno</string>
|
||||
<string name="generic_recording">Nahrávání…</string>
|
||||
<string name="generic_save">Uložit</string>
|
||||
<string name="generic_tracks">Trasy</string>
|
||||
@@ -178,7 +177,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Šipka</string>
|
||||
<string name="image_marker">Značka</string>
|
||||
<string name="image_marker_count">Počet značek</string>
|
||||
<string name="image_pause">Pozastavit</string>
|
||||
<string name="image_photo_marker">Fotografická značka</string>
|
||||
<string name="image_record">Zaznamenat</string>
|
||||
<string name="image_stop">Ukončit</string>
|
||||
@@ -198,7 +196,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Typ značky (např. vodopád)</string>
|
||||
<string name="marker_edit_marker_type_hint">Typ značky</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Nemáte žádné značky</string>
|
||||
<!-- Menu -->
|
||||
@@ -226,17 +223,11 @@ limitations under the License.
|
||||
<string name="permission_gps_failed">OpenTracks vyžaduje povolení k používání GPS.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Stav baterie</string>
|
||||
<string name="sensor_state_cadence">Frekvence chůze</string>
|
||||
<string name="sensor_state_cadence_value">%1$d ot./min</string>
|
||||
<string name="sensor_state_heart_rate">Srdeční frekvence</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d úderů/min</string>
|
||||
<string name="sensor_state_power">Napájení</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Nelze vyhledat zařízení Bluetooth (chyba %1$i).</string>
|
||||
<string name="bluetooth_disabled">Aktivujte prosím Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Při záznamu trasy není tato funkce dostupná</string>
|
||||
<string name="settings_show">Zobrazit</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Pokročilé</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -247,7 +238,6 @@ limitations under the License.
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Během nahrávání zobrazte statistiky bez odemknutí zařízení.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Nechte obrazovku zapnutou</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Během nahrávání udržovat obrazovku zapnutou.</string>
|
||||
<string name="settings_recording">Záznam</string>
|
||||
<string name="settings_recording_default_activity_title">Výchozí typ aktivity</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s mezi zaznamenanými polohami</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Vytvořit nový segment pokud je vzdálenost mezi dvěma polohami větší než %1$s</string>
|
||||
@@ -261,15 +251,11 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Číslo</string>
|
||||
<string name="settings_recording_track_name_title">Výchozí název trasy</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Resetovat</string>
|
||||
<string name="settings_reset_confirm_message">Všechna nastavení budou obnovena na výchozí hodnoty. Toto nevymaže žádné trasy na přístroji.</string>
|
||||
<string name="settings_reset_confirm_title">Resetovat nyní?</string>
|
||||
<string name="settings_reset_done">Všechna nastavení byla obnovena na výchozí hodnoty</string>
|
||||
<string name="settings_error_initial_values_restored">Litujeme, ale došlo k chybě. Všechna nastavení byla vrácena na výchozí hodnoty.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Připojeno k senzoru %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Odpojeno od %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Preferovaná rychlost</string>
|
||||
<string name="settings_stats_units_imperial">Imperiální jednotky (míle, stopy)</string>
|
||||
@@ -362,19 +348,6 @@ limitations under the License.
|
||||
<item quantity="few">%1$.1f míle za hodinu</item>
|
||||
<item quantity="other">%1$.1f mil za hodinu</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s na kilometr</string>
|
||||
<string name="voice_pace_per_mile">%1$s na míli</string>
|
||||
<string name="voice_template">%1$s za %2$s rychlostí %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">celková vzdálenost 1 kilometr</item>
|
||||
<item quantity="few">celková vzdálenost %1$.2f kilometry</item>
|
||||
<item quantity="other">celková vzdálenost %1$.2f kilometrů</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">celková vzdálenost 1 míle</item>
|
||||
<item quantity="few">celková vzdálenost %1$.2f míle</item>
|
||||
<item quantity="other">celková vzdálenost %1$.2f mil</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Bankomat</string>
|
||||
<string name="waypoint_type_bank">banka</string>
|
||||
@@ -449,8 +422,6 @@ limitations under the License.
|
||||
<string name="settings_sensor_wheel_circumference">Obvod kola (mm)</string>
|
||||
<string name="stats_split_interval">Rozdělit interval</string>
|
||||
<string name="track_detail_intervals_tab">Intervaly</string>
|
||||
<string name="voice_pace_lap">Čas na kolo %1$s</string>
|
||||
<string name="hold_to_pause">Podržet pro pozastavení</string>
|
||||
<string name="instant_export_enabled_title">Instantní export po tréninku</string>
|
||||
<string name="settings_default_export_uri_title">Adresář pro export tras</string>
|
||||
<string name="import_thread_interrupted">Vlákno přerušeno</string>
|
||||
@@ -473,7 +444,6 @@ limitations under the License.
|
||||
<string name="settings_night_mode_option_system">Systémový</string>
|
||||
<string name="aggregated_stats_empty_message">Zaznamenejte svou první trasu pro zobrazení agregované statistiky</string>
|
||||
<string name="interval_list_empty_message">Ještě zde nejsou žádné intervaly</string>
|
||||
<string name="voice_speed_lap">Rychlost na kolo %1$s</string>
|
||||
<string name="hold_to_stop">Podržet pro ukončení</string>
|
||||
<string name="instant_export_enabled_summary">Exportovat trasu na úložiště po ukončení záznamu</string>
|
||||
<plurals name="generic_completed_with_errors">
|
||||
@@ -508,14 +478,12 @@ limitations under the License.
|
||||
<string name="settings_sensor_running_speed_and_cadence">Vzdálenost, rychlost a kadence</string>
|
||||
<string name="settings_recording_customize_layout_title">Přizpůsobit vzhled měření</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Počet polí na řádek</string>
|
||||
<string name="title_activity_settings_custom_layout">Přizpůsobit vzhled měření</string>
|
||||
<string name="field_set_primary">První</string>
|
||||
<string name="field_set_secondary">Druhý</string>
|
||||
<string name="field_remove_from_layout">Odstranit</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Časový interval</string>
|
||||
<string name="settings_announcements_distance_frequency">Interval vzdálenosti</string>
|
||||
<string name="settings_all_reset">Obnovení</string>
|
||||
<string name="settings_announcements">Oznámení</string>
|
||||
<string name="settings_layout_reset">Nastavit výchozí vzhled</string>
|
||||
<string name="settings_layout_reset_confirm_message">Všechna nastavení vzhledu se vrátí na výchozí hodnoty. Nebudou tím odstraněny žádné zaznamenané aktivity v zařízení.</string>
|
||||
<string name="settings_layout_reset_confirm_title">Výchozí vzhled\?</string>
|
||||
@@ -547,7 +515,7 @@ limitations under the License.
|
||||
<string name="settings_activity_defaults_category">Výchozí nastavení aktivity</string>
|
||||
<string name="settings_units_category">Jednotky</string>
|
||||
<string name="settings_import_export_summary">Import, export, automatický export</string>
|
||||
<string name="settings_import_export_title">Dovoz/vývoz</string>
|
||||
<string name="settings_import_export_title">Import/Export</string>
|
||||
<string name="settings_announcements_summary">Čas, vzdálenost, rychlost hlasu</string>
|
||||
<string name="settings_announcements_title">Hlasová oznámení</string>
|
||||
<string name="settings_sensors_title">Bluetooth senzory</string>
|
||||
@@ -578,7 +546,6 @@ limitations under the License.
|
||||
<string name="export_dir_not_writable">" (nelze zapisovat!)"</string>
|
||||
<string name="generic_today">Dnes</string>
|
||||
<string name="no_compatible_file_manager_installed">Není nainstalován kompatibilní správce souborů</string>
|
||||
<string name="settings_announcements_report_heart_rate">Hlásit tepovou frekvenci</string>
|
||||
<string name="voice_per_kilometer">za kilometr</string>
|
||||
<string name="lap_time">Čas kola</string>
|
||||
<string name="lap_speed">Rychlost kola</string>
|
||||
@@ -607,9 +574,4 @@ limitations under the License.
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">Aplikace, která zahájila nahrávání, může také přistupovat k nahraným datům.</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">Zaznamenaná data nebudou automaticky sdílena s jinými aplikacemi.</string>
|
||||
<string name="pace">Tempo</string>
|
||||
<plurals name="voiceDistanceMiles">
|
||||
<item quantity="one"></item>
|
||||
<item quantity="few"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -171,7 +171,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="generic_description_line">Beskrivelse: %1$s</string>
|
||||
<string name="generic_name">Navn</string>
|
||||
<string name="generic_name_line">Navn: %1$s</string>
|
||||
<string name="generic_paused">Midlertidigt afbrudt</string>
|
||||
<string name="generic_recording">Registrerer…</string>
|
||||
<string name="generic_save">Gem</string>
|
||||
<string name="generic_tracks">Ruter</string>
|
||||
@@ -183,7 +182,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="image_arrow">Pil</string>
|
||||
<string name="image_marker">Markør</string>
|
||||
<string name="image_marker_count">Antal markører</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Billedmarkør</string>
|
||||
<string name="image_record">Registrer</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
@@ -203,7 +201,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Markørtype (f.eks. vandfald)</string>
|
||||
<string name="marker_edit_marker_type_hint">Markørtype</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Du har ingen markører</string>
|
||||
<!-- Menu -->
|
||||
@@ -231,17 +228,11 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="permission_gps_failed">OpenTracks kræver tilladelse til at bruge GPS.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Batteriniveau</string>
|
||||
<string name="sensor_state_cadence">Kadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d omdr/min</string>
|
||||
<string name="sensor_state_heart_rate">Puls</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d slag per minut</string>
|
||||
<string name="sensor_state_power">Strøm</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Kunne ikke scanne efter Bluetooth-enheder (fejl %1$i).</string>
|
||||
<string name="bluetooth_disabled">Aktivér Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Ikke tilgængelig ved registrering af rute</string>
|
||||
<string name="settings_show">Vis</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Avanceret</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -252,7 +243,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Vis statistik, mens du optager, uden at låse enheden op.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Hold skærmen tændt</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Hold skærmen tændt, mens du optager.</string>
|
||||
<string name="settings_recording">Registrering</string>
|
||||
<string name="settings_recording_default_activity_title">Standardaktivitetstype</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s mellem registrerede placeringer</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Et nyt segment oprettes, hvis afstanden mellem to placeringer er større end %1$s</string>
|
||||
@@ -266,15 +256,11 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="settings_recording_track_name_number_option">Nummer</string>
|
||||
<string name="settings_recording_track_name_title">Standardnavn på spor</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Nulstil</string>
|
||||
<string name="settings_reset_confirm_message">Alle indstillinger vil blive ændret til standardværdierne..</string>
|
||||
<string name="settings_reset_confirm_title">Vil du nulstille nu?</string>
|
||||
<string name="settings_reset_done">Alle indstillinger er blevet gendannet til standardværdierne</string>
|
||||
<string name="settings_error_initial_values_restored">Beklager, men der opstod en fejl. Alle indstillinger er vendt tilbage til standardværdierne.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Tilsluttet %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Frakoblet %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Foretrukkenfartenhed</string>
|
||||
<string name="settings_stats_units_imperial">Britisk (mil, ft)</string>
|
||||
@@ -362,17 +348,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<item quantity="one">1 mil i timen</item>
|
||||
<item quantity="other">%1$.1f mil i timen</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s pr. kilometer</string>
|
||||
<string name="voice_pace_per_mile">%1$s pr. mil</string>
|
||||
<string name="voice_template">%1$s på %2$s ved %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">afstand i alt 1 kilometer</item>
|
||||
<item quantity="other">afstand i alt %1$.2f kilometer</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">afstand i alt 1 mil</item>
|
||||
<item quantity="other">afstand i alt %1$.2f mil</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Pengeautomat</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
@@ -464,9 +439,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="interval_list_empty_message">Der er ikke noget interval endnu</string>
|
||||
<string name="aggregated_stats_empty_message">Optag dit første spor for at se aggregerede statistikker</string>
|
||||
<string name="track_detail_intervals_tab">Intervaller</string>
|
||||
<string name="voice_pace_lap">Omgangstid på %1$s</string>
|
||||
<string name="voice_speed_lap">Omgangshastighed på %1$s</string>
|
||||
<string name="hold_to_pause">Hold nede for at holde pause</string>
|
||||
<string name="hold_to_stop">Hold for at stoppe</string>
|
||||
<string name="settings_prevent_reimport_tracks_title">Forhindre genimport af spor</string>
|
||||
<plurals name="generic_completed_with_errors">
|
||||
@@ -516,7 +488,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="settings_reset_summary">Nulstil indstillingerne til standardværdierne</string>
|
||||
<string name="settings_recording_customize_layout_title">Tilpas dit optagelseslayout</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Datafelter pr. række</string>
|
||||
<string name="settings_announcements">Meddelelser</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Tidsinterval</string>
|
||||
<string name="settings_announcements_distance_frequency">Afstandsinterval</string>
|
||||
<string name="custom_layout_list_title">Opsætning</string>
|
||||
@@ -562,7 +533,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
|
||||
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
|
||||
<string name="location_coordinate">%1$s°</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="title_activity_settings_custom_layout">Tilpas optagelseslayout</string>
|
||||
<string name="generic_undo">Fortryd</string>
|
||||
<string name="menu_select_layout">Vælg layout</string>
|
||||
<string name="settings_ui_summary">Udseende, Optagelse af layout, Tema</string>
|
||||
|
||||
@@ -172,7 +172,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="generic_description_line">Beschreibung: %1$s</string>
|
||||
<string name="generic_name">Name</string>
|
||||
<string name="generic_name_line">Name: %1$s</string>
|
||||
<string name="generic_paused">Pausiert</string>
|
||||
<string name="generic_recording">Aufzeichnung…</string>
|
||||
<string name="generic_save">Speichern</string>
|
||||
<string name="generic_tracks">Strecken</string>
|
||||
@@ -184,7 +183,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="image_arrow">Pfeil</string>
|
||||
<string name="image_marker">Markierung</string>
|
||||
<string name="image_marker_count">Anzahl der Markierungen</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>
|
||||
@@ -204,7 +202,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Art der Markierung, z. B. Wasserfall</string>
|
||||
<string name="marker_edit_marker_type_hint">Art der Markierung</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Sie haben noch keine Markierungen</string>
|
||||
<!-- Menu -->
|
||||
@@ -234,17 +231,11 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="permission_bluetooth_failed_rejected">Du musst OpenTracks die Berechtigung zum Zugriff auf Geräte in der Nähe manuell in den Systemeinstellungen geben.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<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_heart_rate">Herzfrequenz</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d Schläge pro Minute</string>
|
||||
<string name="sensor_state_power">Leistung</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Konnte nicht nach Bluetooth-Geräten scannen (Fehler %1$i).</string>
|
||||
<string name="bluetooth_disabled">Bitte Bluetooth aktivieren.</string>
|
||||
<string name="settings_not_while_recording">Während der Aufzeichnung eines Tracks nicht verfügbar</string>
|
||||
<string name="settings_show">Anzeigen</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Erweitert</string>
|
||||
<string name="settings_default_trackfileformat">Dateiformat für export/teilen</string>
|
||||
@@ -256,7 +247,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Zeige während der Aufzeichnung Statistiken an, ohne das Gerät zu entsperren.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Bildschirm eingeschaltet lassen</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Lasse während der Aufnahme den Bildschirm eingeschaltet.</string>
|
||||
<string name="settings_recording">Aufzeichnung</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>
|
||||
@@ -270,15 +260,11 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="settings_recording_track_name_number_option">Nummer</string>
|
||||
<string name="settings_recording_track_name_title">Standard-Trackname</string>
|
||||
<!-- Settings Reset -->
|
||||
<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_error_initial_values_restored">Entschuldigung, es ist ein Fehler aufgetreten. Alle Einstellungen wurden auf die Standardwerte zurückgesetzt.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Verbunden mit %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Verbindung getrennt von %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Bevorzugtes Maß</string>
|
||||
<string name="settings_stats_units_imperial">Imperiales Maß (mi, ft)</string>
|
||||
@@ -369,17 +355,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<item quantity="one">1 Meile pro Stunde</item>
|
||||
<item quantity="other">%1$.1f Meilen pro Stunde</item>
|
||||
</plurals>
|
||||
<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_template">%1$s in %2$s bei %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">Gesamtstrecke: 1 Kilometer</item>
|
||||
<item quantity="other">Gesamtstrecke: %1$.2f Kilometer</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">Gesamtstrecke: 1 Meile</item>
|
||||
<item quantity="other">Gesamtstrecke: %1$.2f Meilen</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Geldautomat</string>
|
||||
<string name="waypoint_type_bank">Bank</string>
|
||||
@@ -457,7 +432,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
</plurals>
|
||||
<string name="import_error_info">%1$s: %2$s</string>
|
||||
<string name="import_file_imported">Datei %1$s wurde importiert</string>
|
||||
<string name="hold_to_pause">Halten für Pause</string>
|
||||
<string name="description_altitude_loss">Höhenverlust: %1$d m (%2$d ft)</string>
|
||||
<string name="export_error_post_workout">Der Datenexport im Anschluss an die Übung ist fehlgeschlagen. Bitte prüfe den Exportordner.</string>
|
||||
<string name="settings_recording_fullscreen_on_while_recording_title">Vollbild</string>
|
||||
@@ -473,8 +447,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="export_progress_summary_errors_msg">Fehler</string>
|
||||
<string name="generic_click_twice_cancel">Klicke nochmal auf zurück, um abzubrechen</string>
|
||||
<string name="import_error_list_dialog_title">Dateien wurden nicht importiert</string>
|
||||
<string name="voice_speed_lap">Rundengeschwindigkeit von %1$s</string>
|
||||
<string name="voice_pace_lap">Rundenzeit von %1$s</string>
|
||||
<string name="export_track_already_exists_msg">Die Streckenaufzeichung %1$s existiert bereits im Zielverzeichnis.</string>
|
||||
<string name="gps_fixed_and_ready">GPS-Position bestimmt und bereit</string>
|
||||
<string name="instant_export_enabled_title">Sofortiger Export im Anschluss an die Übung</string>
|
||||
@@ -502,8 +474,8 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="import_thread_interrupted">Thread unterbrochen</string>
|
||||
<string name="import_unable_to_import_file">Importieren der Datei gescheitert: %1$s</string>
|
||||
<string name="delete_service">Löschdienst</string>
|
||||
<string name="settings_sensor_cycling_cadence">Radfahren: Trittfrequenz</string>
|
||||
<string name="settings_sensor_cycling_distance_speed">Radfahren: Entfernung und Geschwindigkeit</string>
|
||||
<string name="settings_sensor_cycling_cadence">Trittfrequenz</string>
|
||||
<string name="settings_sensor_cycling_distance_speed">Entfernung und Geschwindigkeit</string>
|
||||
<string name="generic_filter">Filter</string>
|
||||
<string name="generic_from">Von</string>
|
||||
<string name="generic_to">Bis</string>
|
||||
@@ -513,7 +485,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="settings_reset_summary">Einstellungen zurücksetzen</string>
|
||||
<string name="settings_recording_customize_layout_title">Layout anpassen</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Felder pro Zeile</string>
|
||||
<string name="settings_announcements">Sprachansagen</string>
|
||||
<string name="custom_layout_list_title">Layouts</string>
|
||||
<string name="description_speed_source_gps">GPS</string>
|
||||
<string name="menu_select_layout">Wähle Layout</string>
|
||||
@@ -553,4 +524,55 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="settings_public_api_dashboard_enabled_title">Automatischer Datentransfer</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">Eine Anwendung, welche eine Aufzeichnung gestartet hat, darf auch auf die aufgezeichneten Daten zugreifen.</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">Aufgezeichnete Daten werden nicht automatisch mit anderen Anwendungen geteilt.</string>
|
||||
<string name="settings_export_filename_title">Format des Dateinamens</string>
|
||||
<string name="settings_announcements_average_heart_rate">Durchschnittlicher Puls</string>
|
||||
<string name="settings_announcements_lap_heart_rate">Runden-Herzfrequenz</string>
|
||||
<string name="settings_announcements_average_speed_pace">Durchschnittliche Geschwindigkeit/Tempo</string>
|
||||
<string name="settings_announcements_lap_speed_pace">Runden-Geschwindigkeit/Tempo</string>
|
||||
<string name="field_set_secondary">Sekundär</string>
|
||||
<string name="export_dir_not_writable">" (nicht schreibbar)"</string>
|
||||
<string name="stats_clock">Uhr</string>
|
||||
<string name="image_discard">Verwerfen</string>
|
||||
<string name="settings_announcements_distance_frequency">Entfernungsintervall</string>
|
||||
<string name="settings_public_api_enabled_title">Öffentliche API</string>
|
||||
<string name="track_discarding">Verwerfe Track</string>
|
||||
<string name="average_heart_rate">Durchschnittlicher Puls</string>
|
||||
<string name="current_heart_rate">Aktueller Puls</string>
|
||||
<string name="export_cannot_write_to_dir">Kann nicht in Export-Verzeichnis schreiben.</string>
|
||||
<string name="stats_sensors_cadence">Trittfrequenz</string>
|
||||
<plurals name="voiceDistanceMiles">
|
||||
<item quantity="one">1 Meile</item>
|
||||
<item quantity="other">%1$.2f Meilen</item>
|
||||
</plurals>
|
||||
<string name="field_set_primary">Primär</string>
|
||||
<string name="voice_per_mile">pro Meile</string>
|
||||
<string name="lap_time">Rundenzeit</string>
|
||||
<string name="voice_per_kilometer">pro Kilometer</string>
|
||||
<string name="pace">Tempo</string>
|
||||
<string name="lap_speed">Rundengeschwindigkeit</string>
|
||||
<string name="speed">Geschwindigkeit</string>
|
||||
<string name="total_distance">Gesamtstrecke</string>
|
||||
<plurals name="voiceDistanceKilometers">
|
||||
<item quantity="one">1 Kilometer</item>
|
||||
<item quantity="other">%1$.2f Kilometer</item>
|
||||
</plurals>
|
||||
<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="settings_announcements_summary">Zeit, Entfernung, Sprachgeschwindigkeit</string>
|
||||
<string name="generic_dismiss">Ablehnen</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">Individuelle Layouts zurücksetzen</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="field_remove_from_layout">Entfernen</string>
|
||||
<string name="error_crash_title">%1$s abgestürzt</string>
|
||||
<string name="share_crash_report">Teile Absturzbericht</string>
|
||||
<string name="always">Immer</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_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="settings_ui_summary">Erscheinungsbild, Aufzeichnungslayout, Theme</string>
|
||||
<string name="settings_gps_summary">Zeitintervall, Entfernungsintervall, Max Entfernung, Genauigkeit</string>
|
||||
</resources>
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Περιγραφή: %1$s</string>
|
||||
<string name="generic_name">Όνομα</string>
|
||||
<string name="generic_name_line">Όνομα: %1$s</string>
|
||||
<string name="generic_paused">Σε παύση</string>
|
||||
<string name="generic_recording">Καταγραφή…</string>
|
||||
<string name="generic_save">αποθήκευση</string>
|
||||
<string name="generic_tracks">Διαδρομές</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Βέλος</string>
|
||||
<string name="image_marker">Δείκτης</string>
|
||||
<string name="image_marker_count">Αριθμός δείκτη</string>
|
||||
<string name="image_pause">Παύση</string>
|
||||
<string name="image_photo_marker">Δείκτης φωτογραφίας</string>
|
||||
<string name="image_record">Εγγραφή</string>
|
||||
<string name="image_stop">Στοπ</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Τύπος σήμανσης (π.χ. καταρράκτης)</string>
|
||||
<string name="marker_edit_marker_type_hint">Τύπος σήμανσης</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Δεν έχετε κανένα δείκτη</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">Υπηρεσία καταγραφής</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<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_heart_rate">Καρδιακοί παλμοί</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">Ισχύς</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Η επιλογή δεν είναι διαθέσιμη κατά την εγγραφή ίχνους</string>
|
||||
<string name="settings_show">Εμφάνιση</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Προηγμένες</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">Κατά απόσταση</string>
|
||||
<string name="settings_chart_by_time">Κατά χρόνο</string>
|
||||
<string name="settings_recording">Εγγραφή</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>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Αριθμός</string>
|
||||
<string name="settings_recording_track_name_title">Προεπιλεγμένο όνομα ίχνους</string>
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
@@ -291,17 +280,6 @@ limitations under the License.
|
||||
<item quantity="one">1 μίλι ανά ώρα</item>
|
||||
<item quantity="other">%1$.1f μίλια ανά ώρα</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s ανά χιλιόμετρο</string>
|
||||
<string name="voice_pace_per_mile">%1$s ανά μίλι</string>
|
||||
<string name="voice_template">%1$s σε %2$s με ταχύτητα %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">συνολική απόσταση 1 χιλιόμετρο</item>
|
||||
<item quantity="other">συνολική απόσταση %1$.2f χιλιόμετρα</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">συνολική απόσταση 1 μίλι</item>
|
||||
<item quantity="other">συνολική απόσταση %1$.2f μίλια</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">ATM</string>
|
||||
<string name="waypoint_type_bank">τράπεζα</string>
|
||||
|
||||
@@ -166,7 +166,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Descripción: %1$s</string>
|
||||
<string name="generic_name">Nombre</string>
|
||||
<string name="generic_name_line">Nombre: %1$s</string>
|
||||
<string name="generic_paused">En pausa</string>
|
||||
<string name="generic_recording">Grabando…</string>
|
||||
<string name="generic_save">Guardar</string>
|
||||
<string name="generic_tracks">Recorridos</string>
|
||||
@@ -178,7 +177,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Flecha</string>
|
||||
<string name="image_marker">Marcador</string>
|
||||
<string name="image_marker_count">Recuento de marcadores</string>
|
||||
<string name="image_pause">Pausa</string>
|
||||
<string name="image_photo_marker">Marcador de foto</string>
|
||||
<string name="image_record">Grabar</string>
|
||||
<string name="image_stop">Parar</string>
|
||||
@@ -198,7 +196,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Tipo de marcador (p. ej., cascada)</string>
|
||||
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">No tienes ningún marcador</string>
|
||||
<!-- Menu -->
|
||||
@@ -226,17 +223,11 @@ limitations under the License.
|
||||
<string name="permission_gps_failed">OpenTracks necesita permiso para usar el GPS.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Nivel de la batería</string>
|
||||
<string name="sensor_state_cadence">Cadencia</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d lpm</string>
|
||||
<string name="sensor_state_power">Potencia</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">No se pudieron buscar dispositivos Bluetooth (error %1$i).</string>
|
||||
<string name="bluetooth_disabled">Por favor habilite Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">No está disponible durante la grabación de un recorrido</string>
|
||||
<string name="settings_show">Mostrar</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Opciones avanzadas</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -247,7 +238,6 @@ limitations under the License.
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Mientras graba, mostrar estadísticas sin desbloquear el dispositivo.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Mantener la pantalla encendida</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Mientras graba, mantener la pantalla encendida.</string>
|
||||
<string name="settings_recording">Grabación</string>
|
||||
<string name="settings_recording_default_activity_title">Tipo de actividad predeterminada</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre las ubicaciones grabadas</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Se crea un nuevo tramo si la distancia entre dos ubicaciones es superior a %1$s</string>
|
||||
@@ -261,15 +251,11 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Número</string>
|
||||
<string name="settings_recording_track_name_title">Nombre de recorrido predeterminado</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Restablecer</string>
|
||||
<string name="settings_reset_confirm_message">Todos las configuraciones se restablecerán a los valores predeterminados. Esto no eliminará ningún recorrido en el dispositivo.</string>
|
||||
<string name="settings_reset_confirm_title">¿Restablecer ahora?</string>
|
||||
<string name="settings_reset_done">Se restablecieron los valores predeterminados de todas las configuraciones</string>
|
||||
<string name="settings_error_initial_values_restored">Lo sentimos, pero ha ocurrido un error. Todas las configuraciones se han revertido a los valores predeterminados.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Conectado a %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Tasa preferida</string>
|
||||
<string name="settings_stats_units_imperial">Imperiales (millas, pies)</string>
|
||||
@@ -357,17 +343,6 @@ limitations under the License.
|
||||
<item quantity="one">1 milla por hora</item>
|
||||
<item quantity="other">%1$.1f millas por hora</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s por kilómetro</string>
|
||||
<string name="voice_pace_per_mile">%1$s por milla</string>
|
||||
<string name="voice_template">%1$s en %2$s a %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distancia total de 1 kilómetro</item>
|
||||
<item quantity="other">distancia total de %1$.2f kilómetros</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distancia total de 1 milla</item>
|
||||
<item quantity="other">distancia total de %1$.2f millas</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">cajero automático</string>
|
||||
<string name="waypoint_type_bank">banco</string>
|
||||
@@ -449,8 +424,6 @@ limitations under the License.
|
||||
<string name="stats_split_interval">Intervalo partido</string>
|
||||
<string name="track_detail_intervals_tab">Intervalos</string>
|
||||
<string name="aggregated_stats_empty_message">Grabe su primer recorrido para ver estadísticas agregadas</string>
|
||||
<string name="voice_pace_lap">Tiempo de vuelta de %1$s</string>
|
||||
<string name="hold_to_pause">Mantener para pausar</string>
|
||||
<string name="instant_export_enabled_title">Exportación instantánea post-entrenamiento</string>
|
||||
<string name="settings_default_export_uri_title">Directorio de exportación de recorrido</string>
|
||||
<string name="export_track_already_exists_msg">El recorrido %1$s ya existe en el directorio de destino.</string>
|
||||
@@ -464,7 +437,6 @@ limitations under the License.
|
||||
<string name="settings_default_trackfileformat">Formato para exportar/compartir</string>
|
||||
<string name="settings_recording_fullscreen_on_while_recording_title">Pantalla completa</string>
|
||||
<string name="interval_list_empty_message">Aún no hay ningún intervalo</string>
|
||||
<string name="voice_speed_lap">Velocidad de vuelta de %1$s</string>
|
||||
<string name="hold_to_stop">Mantener para parar</string>
|
||||
<string name="instant_export_enabled_summary">Exportar el recorrido al almacenamiento una vez finalizada la grabación</string>
|
||||
<string name="stats_loss">Pérdida</string>
|
||||
@@ -498,7 +470,6 @@ limitations under the License.
|
||||
<string name="settings_sensor_running_speed_and_cadence">Distancia, velocidad y cadencia</string>
|
||||
<string name="settings_sensor_cycling_distance_speed">Distancia y velocidad</string>
|
||||
<string name="settings_sensor_cycling_cadence">Cadencia</string>
|
||||
<string name="settings_announcements">Anuncios</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Intervalo de tiempo</string>
|
||||
<string name="settings_announcements_distance_frequency">Intervalo de distancia</string>
|
||||
<string name="stats_sensors_heart_rate">Ritmo cardíaco</string>
|
||||
@@ -518,7 +489,6 @@ limitations under the License.
|
||||
<string name="generic_choose_an_option">Selecciona una opción</string>
|
||||
<string name="settings_layout_reset">Restablecer pantalla personalizada</string>
|
||||
<string name="stats_coordinates">Latitud/Longitud</string>
|
||||
<string name="title_activity_settings_custom_layout">Personalizar pantalla de grabación</string>
|
||||
<string name="field_set_secondary">Secundario</string>
|
||||
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
|
||||
<string name="value_float_mile_hour">%1$.1f mi/h</string>
|
||||
@@ -584,7 +554,6 @@ limitations under the License.
|
||||
<string name="settings_public_api_dashboard_enabled_title">Transferencia automática de datos</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">Una aplicación que ha iniciado una grabación puede también acceder a los datos grabados.</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">Los datos grabados no se compartirán automáticamente con otras aplicaciones.</string>
|
||||
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
|
||||
<string name="voice_per_kilometer">por kilometro</string>
|
||||
<string name="voice_per_mile">por milla</string>
|
||||
<string name="lap_time">Tiempo de vuelta</string>
|
||||
|
||||
@@ -166,7 +166,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Kirjeldus: %1$s</string>
|
||||
<string name="generic_name">Nimi</string>
|
||||
<string name="generic_name_line">Nimi: %1$s</string>
|
||||
<string name="generic_paused">Peatatud</string>
|
||||
<string name="generic_recording">Salvestamine…</string>
|
||||
<string name="generic_save">Salvesta</string>
|
||||
<string name="generic_tracks">Rajad</string>
|
||||
@@ -178,7 +177,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Nool</string>
|
||||
<string name="image_marker">Märgis</string>
|
||||
<string name="image_marker_count">Märgistuste arv</string>
|
||||
<string name="image_pause">Peata</string>
|
||||
<string name="image_photo_marker">Fotomärgis</string>
|
||||
<string name="image_record">Salvesta</string>
|
||||
<string name="image_stop">Peata</string>
|
||||
@@ -198,7 +196,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Märgise tüüp (nt juga)</string>
|
||||
<string name="marker_edit_marker_type_hint">Märgise tüüp</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Teil ei ole märgiseid</string>
|
||||
<!-- Menu -->
|
||||
@@ -226,17 +223,11 @@ limitations under the License.
|
||||
<string name="permission_gps_failed">OpenTracks vajab GPS-i kasutamiseks luba.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Aku tase</string>
|
||||
<string name="sensor_state_cadence">Rütm</string>
|
||||
<string name="sensor_state_cadence_value">%1$d p/min (pööret minutis)</string>
|
||||
<string name="sensor_state_heart_rate">Pulsisagedus</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d lööki minutis</string>
|
||||
<string name="sensor_state_power">Võimsus</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Bluetooth seadmeid ei õnnestunud skannida (tõrge %1$i).</string>
|
||||
<string name="bluetooth_disabled">Lubage Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Raja salvestamise ajal ei ole kättesaadav</string>
|
||||
<string name="settings_show">Kuva</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Täpsemad seaded</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -247,7 +238,6 @@ limitations under the License.
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Salvestamise ajal näidake statistikat ilma seadet avamata.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Hoia ekraan sisse lülitatud</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Salvestamise ajal hoidke ekraani sisse lülitatud.</string>
|
||||
<string name="settings_recording">Salvestamine</string>
|
||||
<string name="settings_recording_default_activity_title">Tegevuse vaiketüüp</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s salvestatud asukohtade vahel</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Kui vahemaa kahe asukoha vahel on üle %1$s, luuakse uus lõik</string>
|
||||
@@ -261,15 +251,11 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Raja vaikenimi</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Lähtesta</string>
|
||||
<string name="settings_reset_confirm_message">Taastatakse kõikide seadete vaikeväärtus.</string>
|
||||
<string name="settings_reset_confirm_title">Kas lähtestada kohe?</string>
|
||||
<string name="settings_reset_done">Kõik seaded on taastatud vaikeväärtustena</string>
|
||||
<string name="settings_error_initial_values_restored">Vabandust, kuid ilmnes viga. Kõik sätted on taastatud vaikeväärtustele.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Ühendatud anduriga %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Lahti ühendatud %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Eelistatud määr</string>
|
||||
<string name="settings_stats_units_imperial">Inglise mõõtühikud (miili, jalga)</string>
|
||||
@@ -357,17 +343,6 @@ limitations under the License.
|
||||
<item quantity="one">1 miil tunnis</item>
|
||||
<item quantity="other">%1$.1f miili tunnis</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s kilomeetri kohta</string>
|
||||
<string name="voice_pace_per_mile">%1$s miilis</string>
|
||||
<string name="voice_template">%1$s ajaga %2$s ja kiirusega %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">kogupikkus 1 kilomeeter</item>
|
||||
<item quantity="other">kogupikkus %1$.2f kilomeetrit</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">kogupikkus 1 miil</item>
|
||||
<item quantity="other">kogupikkus %1$.2f miili</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Sularahaautomaat</string>
|
||||
<string name="waypoint_type_bank">pank</string>
|
||||
@@ -444,7 +419,6 @@ limitations under the License.
|
||||
<string name="export_track_errors">Eksportimata rajad</string>
|
||||
<string name="export_track_already_exists_msg">Rada %1$s on sihtkataloogis juba olemas.</string>
|
||||
<string name="aggregated_stats_empty_message">Salvestage oma esimene pala, et näha koondatud statistikat</string>
|
||||
<string name="voice_pace_lap">Ringiaeg %1$s</string>
|
||||
<string name="settings_prevent_reimport_tracks_title">Palade reimportimise vältimine</string>
|
||||
<string name="settings_night_mode_option_night">Öö</string>
|
||||
<string name="settings_night_mode_option_day">Päev</string>
|
||||
@@ -463,9 +437,7 @@ limitations under the License.
|
||||
<string name="track_detail_intervals_tab">Intervallid</string>
|
||||
<string name="stats_split_interval">Jagatud intervall</string>
|
||||
<string name="interval_list_empty_message">Ei ole ühtegi intervalli veel</string>
|
||||
<string name="voice_speed_lap">Ringi kiirus %1$s</string>
|
||||
<string name="hold_to_stop">Hoidke lõpetada</string>
|
||||
<string name="hold_to_pause">Hoidke pausi</string>
|
||||
<string name="instant_export_enabled_summary">Ekspordi pala salvestusruumi pärast salvestamise lõpetamist</string>
|
||||
<string name="settings_default_export_uri_title">Track ekspordi kataloog</string>
|
||||
<string name="instant_export_enabled_title">Vahetu treeningujärgne eksport</string>
|
||||
@@ -541,12 +513,10 @@ limitations under the License.
|
||||
<string name="stats_sensors_cadence">Rütm</string>
|
||||
<string name="stats_sensors_heart_rate">Südamerütm</string>
|
||||
<string name="field_set_secondary">Teisene</string>
|
||||
<string name="title_activity_settings_custom_layout">Salvestamise Paigutuse Kohandamine</string>
|
||||
<string name="settings_sensors_summary">Rattaandurid, Ratta Ümbermõõt, Jooksuandurid</string>
|
||||
<string name="settings_activity_defaults_category">Tegevuse Vaikeväärtused</string>
|
||||
<string name="field_remove_from_layout">Eemaldama</string>
|
||||
<string name="stats_coordinates">Laiuskraad/Pikkuskraad</string>
|
||||
<string name="settings_announcements">Teade</string>
|
||||
<string name="settings_layout_reset_confirm_message">Kõik paigutuse seaded tagastatakse vaikeväärtustele. See ei kustuta seadmes olevaid lugusid.</string>
|
||||
<string name="settings_running_sensor">Töötama</string>
|
||||
<string name="settings_generic_sensor">Geneeriline</string>
|
||||
|
||||
@@ -169,7 +169,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="generic_description_line">Azalpena: %1$s</string>
|
||||
<string name="generic_name">Izena</string>
|
||||
<string name="generic_name_line">Izena: %1$s</string>
|
||||
<string name="generic_paused">Etenda</string>
|
||||
<string name="generic_recording">Grabatzen…</string>
|
||||
<string name="generic_save">Gorde</string>
|
||||
<string name="generic_tracks">Ibilbideak</string>
|
||||
@@ -181,7 +180,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="image_arrow">Gezia</string>
|
||||
<string name="image_marker">Markatzailea</string>
|
||||
<string name="image_marker_count">Markatzaile kopurua</string>
|
||||
<string name="image_pause">Pausatu</string>
|
||||
<string name="image_photo_marker">Argazki-markatzailea</string>
|
||||
<string name="image_record">Grabatu</string>
|
||||
<string name="image_stop">Gelditu</string>
|
||||
@@ -201,7 +199,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Markatzaile mota (adibidez, ur-jauzia)</string>
|
||||
<string name="marker_edit_marker_type_hint">Markatzaile mota</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Ez duzu markatzailerik</string>
|
||||
<!-- Menu -->
|
||||
@@ -229,17 +226,11 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="permission_gps_failed">OpenTracks GPSa erabiltzeko baimena behar du.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Bateria maila</string>
|
||||
<string name="sensor_state_cadence">Erritmoa</string>
|
||||
<string name="sensor_state_cadence_value">%1$d mbi</string>
|
||||
<string name="sensor_state_heart_rate">Maiztasun kardiakoa</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d mbb</string>
|
||||
<string name="sensor_state_power">Potentzia</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Ezin izan da Bluetooth gailuak bilatu (%1$i errorea).</string>
|
||||
<string name="bluetooth_disabled">Mesedez, aktibatu Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Ez dago erabilgarri ibilbidea grabatzen ari den bitartean</string>
|
||||
<string name="settings_show">Erakutsi</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Aurreratua</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -250,7 +241,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Grabatzen ari zaren bitartean, erakutsi estatistikak gailua desblokeatu gabe.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Mantendu pantaila</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Grabatzen ari zaren bitartean, mantendu pantaila.</string>
|
||||
<string name="settings_recording">Grabaketa</string>
|
||||
<string name="settings_recording_default_activity_title">Jarduera mota lehenetsia</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s erregistratutako kokapenen artean</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Segmentu berri bat sortzen da bi kokapenen arteko distantzia %1$s baino gehiagokoa bada</string>
|
||||
@@ -264,15 +254,11 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="settings_recording_track_name_number_option">Zenbakia</string>
|
||||
<string name="settings_recording_track_name_title">Ibilbidearen izen lehenetsia</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Berrezarri</string>
|
||||
<string name="settings_reset_confirm_message">Ezarpen guztiak balio lehenetsietara leheneratuko dira.</string>
|
||||
<string name="settings_reset_confirm_title">Berrezarri egin nahi duzu?</string>
|
||||
<string name="settings_reset_done">Ezarpen guztiak balio lehenetsietara leheneratu dira</string>
|
||||
<string name="settings_error_initial_values_restored">Sentitzen dugu, baina akats bat gertatu da. Ezarpen guztiak lehenetsitako balioetara itzuli dira.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetootha</string>
|
||||
<string name="settings_sensor_connecting">Honekin konektatuta: %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Deskonektatuta %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Erritmo hobetsia</string>
|
||||
<string name="settings_stats_units_imperial">Inperiala (mi, ft)</string>
|
||||
@@ -360,17 +346,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<item quantity="one">1 milia orduko</item>
|
||||
<item quantity="other">%1$.1f milia orduko</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s kilometro bakoitzeko</string>
|
||||
<string name="voice_pace_per_mile">%1$s miliako</string>
|
||||
<string name="voice_template">Distantzia: %1$s. Denbora: %2$s. Abiadura: %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distantzia, guztira: 1 kilometro</item>
|
||||
<item quantity="other">distantzia, guztira: %1$.2f kilometro</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distantzia, guztira: 1 milia</item>
|
||||
<item quantity="other">distantzia, guztira: %1$.2f milia</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">kutxazaina</string>
|
||||
<string name="waypoint_type_bank">bankua</string>
|
||||
@@ -468,9 +443,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="track_detail_intervals_tab">Tarteak</string>
|
||||
<string name="stats_split_interval">Zatitu tarte</string>
|
||||
<string name="stats_loss">Galera</string>
|
||||
<string name="voice_pace_lap">Itzulian-denbora %1$s</string>
|
||||
<string name="voice_speed_lap">Itzulian abiadura %1$s</string>
|
||||
<string name="hold_to_pause">Eutsi eteteko</string>
|
||||
<string name="hold_to_stop">Eutsi gelditzeko</string>
|
||||
<string name="export_progress_summary_skip_msg">Ibilbideak saltatu</string>
|
||||
<string name="export_progress_summary_errors_msg">Akatsak</string>
|
||||
@@ -537,7 +509,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="settings_recording_customize_layout_select_columns">Datu-eremuak errenkadako</string>
|
||||
<string name="settings_recording_customize_layout_title">Pertsonalizatu zure grabazioaren diseinua</string>
|
||||
<string name="settings_recording_idle_speed_title">Inaktibitatearen abiaduraren muga</string>
|
||||
<string name="settings_announcements">Iragarkiak</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Denbora-tartea</string>
|
||||
<string name="settings_announcements_distance_frequency">Distantzia tartea</string>
|
||||
<string name="settings_running_sensor">Exekutatzen</string>
|
||||
@@ -569,7 +540,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
|
||||
<string name="aggregated_stats_filter_no_results">Ez dago jarduerarik zehaztutako iragazkiarentzat</string>
|
||||
<string name="field_set_secondary">Bigarren mailakoa</string>
|
||||
<string name="field_set_primary">Nagusia</string>
|
||||
<string name="title_activity_settings_custom_layout">Pertsonalizatu Grabazioaren Diseinua</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="generic_undo">Desegin</string>
|
||||
<string name="no_compatible_file_manager_installed">Fitxategi-kudeatzaile bateragarririk ez da instalatu</string>
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">شرح: %1$s</string>
|
||||
<string name="generic_name">نام</string>
|
||||
<string name="generic_name_line">نام: %1$s</string>
|
||||
<string name="generic_paused">در حال مکث</string>
|
||||
<string name="generic_recording">در حال ضبط…</string>
|
||||
<string name="generic_save">ذخیره</string>
|
||||
<string name="generic_tracks">مسیرها</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">پیکان</string>
|
||||
<string name="image_marker">نشانگر</string>
|
||||
<string name="image_marker_count">تعداد نشانگر</string>
|
||||
<string name="image_pause">مکث</string>
|
||||
<string name="image_photo_marker">نشانگر عکس</string>
|
||||
<string name="image_record">ضبط</string>
|
||||
<string name="image_stop">توقف</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">نوع نشانگر (برای مثال آبشار)</string>
|
||||
<string name="marker_edit_marker_type_hint">نوع نشانگر</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">شما هیچ نشانگری ندارید</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">خدمات ضبط</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">مقدار شارژ باتری</string>
|
||||
<string name="sensor_state_cadence">سرعت دورانی</string>
|
||||
<string name="sensor_state_cadence_value">%1$d دور در دقیقه</string>
|
||||
<string name="sensor_state_heart_rate">ضربان قلب</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d ضربان در دقیقه</string>
|
||||
<string name="sensor_state_power">توان</string>
|
||||
<string name="sensor_state_power_value">%1$d وات</string>
|
||||
<string name="settings_not_while_recording">در حال ضبط گذر، در دسترس نیست</string>
|
||||
<string name="settings_show">نمایش</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">پیشرفته</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">بر حسب مسافت</string>
|
||||
<string name="settings_chart_by_time">بر حسب زمان</string>
|
||||
<string name="settings_recording">در حال ضبط</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>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">شماره</string>
|
||||
<string name="settings_recording_track_name_title">نام پیشفرض گذر</string>
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
@@ -291,17 +280,6 @@ limitations under the License.
|
||||
<item quantity="one">%1$.1f مایل در ساعت</item>
|
||||
<item quantity="other">%1$.1f مایل در ساعت</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s در کیلومتر</string>
|
||||
<string name="voice_pace_per_mile">%1$s در مایل</string>
|
||||
<string name="voice_template"> %1$s در %2$s با %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">کل مسافت %1$.2f کیلومتر</item>
|
||||
<item quantity="other">کل مسافت %1$.2f کیلومتر</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">کل مسافت %1$.2f مایل</item>
|
||||
<item quantity="other">کل مسافت %1$.2f مایل</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">خودپرداز</string>
|
||||
<string name="waypoint_type_bank">بانک</string>
|
||||
|
||||
@@ -172,7 +172,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Kuvaus: %1$s</string>
|
||||
<string name="generic_name">Nimi</string>
|
||||
<string name="generic_name_line">Nimi: %1$s</string>
|
||||
<string name="generic_paused">Keskeytetty</string>
|
||||
<string name="generic_recording">Tallennetaan…</string>
|
||||
<string name="generic_save">Tallenna</string>
|
||||
<string name="generic_tracks">Reitit</string>
|
||||
@@ -184,7 +183,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Nuoli</string>
|
||||
<string name="image_marker">Merkki</string>
|
||||
<string name="image_marker_count">Merkkien määrä</string>
|
||||
<string name="image_pause">Tauko</string>
|
||||
<string name="image_photo_marker">Kuvamerkki</string>
|
||||
<string name="image_record">Tallenna</string>
|
||||
<string name="image_stop">Lopeta</string>
|
||||
@@ -204,7 +202,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Merkin tyyppi (esim. vesiputous)</string>
|
||||
<string name="marker_edit_marker_type_hint">Merkkityyppi</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Sinulla ei ole merkkejä</string>
|
||||
<!-- Menu -->
|
||||
@@ -232,17 +229,11 @@ limitations under the License.
|
||||
<string name="permission_gps_failed">OpenTracks tarvitsee luvan käyttää satelliittipaikannusta.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Akun taso</string>
|
||||
<string name="sensor_state_cadence">Kierrosluku</string>
|
||||
<string name="sensor_state_cadence_value">%1$d kierr./min</string>
|
||||
<string name="sensor_state_heart_rate">Syke</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
|
||||
<string name="sensor_state_power">Virransyöttö</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Bluetooth-laitteita ei saatu etsittyä (virhe %1$i).</string>
|
||||
<string name="bluetooth_disabled">Ota Bluetooth käyttöön.</string>
|
||||
<string name="settings_not_while_recording">Ei saatavilla reitin tallennuksen aikana</string>
|
||||
<string name="settings_show">Näytä</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Lisäasetukset</string>
|
||||
<string name="settings_default_trackfileformat">Tiedostomuoto vientiä ja jakamista varten</string>
|
||||
@@ -254,7 +245,6 @@ limitations under the License.
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Näytä tilastot myös ilman laitteen lukituksen avaamista tallentaessa.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Pidä näyttö päällä</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Pidä näyttö päällä tallentaessa.</string>
|
||||
<string name="settings_recording">Tallennus</string>
|
||||
<string name="settings_recording_default_activity_title">Toiminnan oletustyyppi</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s tallennettujen sijaintien välillä</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Uusi segmentti luodaan, jos kahden sijainnin etäisyys on suurempi kuin %1$s</string>
|
||||
@@ -268,15 +258,11 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Numero</string>
|
||||
<string name="settings_recording_track_name_title">Reitin oletusnimi</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Palauta</string>
|
||||
<string name="settings_reset_confirm_message">Kaikki asetukset palautetaan oletusarvoisiksi.</string>
|
||||
<string name="settings_reset_confirm_title">Palautetaanko oletukset nyt?</string>
|
||||
<string name="settings_reset_done">Kaikki asetukset on palautettu oletusarvoisiksi</string>
|
||||
<string name="settings_error_initial_values_restored">Pahoittelut, mutta virhe tapahtui. Kaikki asetukset on palautettu oletuksiinsa.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Yhdistetty: %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Yhteys katkaistu: %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Haluttu nopeus</string>
|
||||
<string name="settings_stats_units_imperial">Brittiläinen järj.
|
||||
@@ -367,17 +353,6 @@ limitations under the License.
|
||||
<item quantity="one">1 maili tunnissa</item>
|
||||
<item quantity="other">%1$.1f mailia tunnissa</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s kilometriä kohti</string>
|
||||
<string name="voice_pace_per_mile">%1$s mailia kohti</string>
|
||||
<string name="voice_template">%1$s ajassa %2$s nopeudella %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">kokonaisetäisyys 1 kilometri</item>
|
||||
<item quantity="other">kokonaisetäisyys %1$.2f kilometriä</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">kokonaisetäisyys 1 maili</item>
|
||||
<item quantity="other">kokonaisetäisyys %1$.2f mailia</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">pankkiautomaatti</string>
|
||||
<string name="waypoint_type_bank">pankki</string>
|
||||
@@ -436,15 +411,12 @@ limitations under the License.
|
||||
<string name="stats_split_interval">Jakoväli</string>
|
||||
<string name="stats_loss">Tappio</string>
|
||||
<string name="track_detail_intervals_tab">Välein</string>
|
||||
<string name="voice_pace_lap">Kierrosaika %1$s</string>
|
||||
<string name="instant_export_enabled_title">Instant post-workout vienti</string>
|
||||
<string name="hold_to_pause">Pidä tauko</string>
|
||||
<string name="hold_to_stop">Pidä lopettaa</string>
|
||||
<string name="gps_fixed_and_ready">GPS kiinteä ja valmis</string>
|
||||
<string name="import_no_kml_file_found">Ei doc.KML tiedosto löytyy KMZ</string>
|
||||
<string name="settings_default_export_uri_title">Seuraa vientihakemistoa</string>
|
||||
<string name="instant_export_enabled_summary">Vie reitti tiedostoon tallennuksen loputtua</string>
|
||||
<string name="voice_speed_lap">Kierrosnopeus %1$s</string>
|
||||
<string name="settings_sensor_wheel_circumference">Pyörän ympärysmitta (mm)</string>
|
||||
<string name="import_thread_interrupted">Lanka keskeytetty</string>
|
||||
<string name="import_unsupported_format">Tukematon tiedostomuoto</string>
|
||||
@@ -554,4 +526,44 @@ limitations under the License.
|
||||
<string name="stats_sensors_heart_rate">Sykenopeus</string>
|
||||
<string name="stats_sensors_power">Teho</string>
|
||||
<string name="no_compatible_file_manager_installed">Yhteensopiva tiedostojen hallinta puuttuu</string>
|
||||
<string name="settings_export_filename_title">Tiedostonimen muoto</string>
|
||||
<string name="settings_export_section">Vienti</string>
|
||||
<string name="settings_recording_customize_layout_title">Muokkaa tallennuksen asettelua</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_enabled">Näytä vain Bluetooth-laitteet, jotka ilmoittavat tarvittavat palvelut</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">Tallennettuja tietoja ei jaeta automaattisesti muiden sovellusten kanssa.</string>
|
||||
<string name="voice_per_mile">per maili</string>
|
||||
<string name="voice_per_kilometer">kilometriä kohti</string>
|
||||
<string name="lap_time">Kierrosaika</string>
|
||||
<string name="pace">Tahti</string>
|
||||
<string name="aggregated_stats_filter_no_results">Määritetylle suodattimelle ei ole toimintoja</string>
|
||||
<string name="activity_type_swimming">uiminen</string>
|
||||
<string name="activity_type_swimming_open">uiminen avovedessä</string>
|
||||
<string name="settings_activity_defaults_category">Aktiviteetin oletusarvot</string>
|
||||
<string name="gps_recording_status">%1$s: %2$s</string>
|
||||
<string name="settings_import_section">Tuonti</string>
|
||||
<string name="settings_public_api_dashboard_enabled_title">Automaattinen tiedonsiirto</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">Tallennuksen aloittanut sovellus voi myös käyttää tallennettuja tietoja.</string>
|
||||
<string name="menu_filter">Suodatin</string>
|
||||
<string name="settings_recording_idle_speed_title">Joutokäyntinopeuden kynnysarvo</string>
|
||||
<string name="stats_sensors_cadence">Kadenssi</string>
|
||||
<string name="stats_clock">Kello</string>
|
||||
<string name="current_heart_rate">Nykyinen syke</string>
|
||||
<string name="average_heart_rate">Keskimääräinen syke</string>
|
||||
<string name="speed">Nopeus</string>
|
||||
<string name="lap_speed">Kierrosnopeus</string>
|
||||
<string name="total_distance">Kokonaismatka</string>
|
||||
<string name="always">Aina</string>
|
||||
<string name="show_on_map_format_ask">Kysyä</string>
|
||||
<string name="error_crash_title">%1$s kaatui</string>
|
||||
<string name="share_crash_report">Jaa kaatumisraportti</string>
|
||||
<string name="report_bug">Ilmoita virheestä</string>
|
||||
<string name="generic_dismiss">Vapauta</string>
|
||||
<string name="gps_recording_without_signal">OpenTracks tallentaa ilman GPS-tietoja.</string>
|
||||
<string name="settings_defaults_title">Oletusyksiköt ja toiminta</string>
|
||||
<string name="settings_defaults_summary">Suositeltavat yksiköt, Oletusaktiviteetti, Seurannan oletusnimi</string>
|
||||
<string name="select_show_on_map_behavior">Valitse\" Näytä kartalla\"käyttäytyminen</string>
|
||||
<string name="settings_sensors_summary">Pyöräilyanturit, Pyörän ympärysmitta, Juoksuanturit</string>
|
||||
<string name="settings_announcements_title">Ääni-ilmoitukset</string>
|
||||
<string name="settings_announcements_summary">Aika, etäisyys, äänennopeus</string>
|
||||
<string name="settings_gps_summary">Aikaväli, etäisyysväli, maksimietäisyys, tarkkuus</string>
|
||||
</resources>
|
||||
@@ -97,7 +97,6 @@
|
||||
<string name="generic_description_line">Description : %1$s</string>
|
||||
<string name="generic_name">Nom</string>
|
||||
<string name="generic_name_line">Nom : %1$s</string>
|
||||
<string name="generic_paused">Suspendue</string>
|
||||
<string name="generic_recording">Enregistrement en cours…</string>
|
||||
<string name="generic_save">Enregistrer</string>
|
||||
<string name="generic_tracks">Parcours</string>
|
||||
@@ -107,7 +106,6 @@
|
||||
<string name="image_arrow">Flèche</string>
|
||||
<string name="image_marker">Repère</string>
|
||||
<string name="image_marker_count">Nombre de repères</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Repère de photo</string>
|
||||
<string name="image_record">Enregistrer</string>
|
||||
<string name="image_stop">Arrêter</string>
|
||||
@@ -122,7 +120,6 @@
|
||||
<string name="marker_name_format">Repère %1$d</string>
|
||||
<string name="marker_title">%1$d sur %2$d</string>
|
||||
<string name="marker_edit_marker_type">Type de repère (p. ex. : cascade)</string>
|
||||
<string name="marker_edit_marker_type_hint">Type de repère</string>
|
||||
<string name="marker_list_empty_message">Vous n\'avez aucun repère</string>
|
||||
<string name="menu_aggregated_statistics">Statistiques cumulées</string>
|
||||
<string name="menu_delete">Supprimer</string>
|
||||
@@ -141,19 +138,12 @@
|
||||
<string name="menu_start_gps">Démarrer le GPS</string>
|
||||
<string name="menu_stop_gps">Arrêter le GPS</string>
|
||||
<string name="recording_service">Service d\'enregistrement</string>
|
||||
<string name="sensor_state_battery">Niveau de charge de la pile</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d tr/min</string>
|
||||
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d b/m</string>
|
||||
<string name="sensor_state_power">Alimentation</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Cette option n\'est pas accessible pendant l\'enregistrement d\'un parcours.</string>
|
||||
<string name="settings_show">Afficher</string>
|
||||
<string name="settings_advanced">Options avancées</string>
|
||||
<string name="settings_chart_by_distance">Par distance</string>
|
||||
<string name="settings_chart_by_time">Par heure</string>
|
||||
<string name="settings_recording">Enregistrement</string>
|
||||
<string name="settings_recording_default_activity_title">Type d\'activité par défaut</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre les positions enregistrées</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Un nouveau segment sera créé si la distance entre deux positions enregistrées est supérieure à %1$s</string>
|
||||
@@ -166,7 +156,6 @@
|
||||
<string name="settings_recording_track_name_date_local_option">Date (format local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Numéro</string>
|
||||
<string name="settings_recording_track_name_title">Nom par défaut du parcours</string>
|
||||
<string name="settings_reset">Réinitialiser</string>
|
||||
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
|
||||
<string name="settings_reset_confirm_title">Réinitialiser maintenant?</string>
|
||||
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies</string>
|
||||
@@ -242,17 +231,6 @@
|
||||
<item quantity="one">%1$.1f mille à l\'heure</item>
|
||||
<item quantity="other">%1$.1f milles à l\'heure</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
|
||||
<string name="voice_pace_per_mile">%1$s par mille</string>
|
||||
<string name="voice_template">%1$s en %2$s à %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distance totale %1$.2f kilomètre</item>
|
||||
<item quantity="other">distance totale %1$.2f kilomètres</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distance totale %1$.2f mile</item>
|
||||
<item quantity="other">distance totale %1$.2f miles</item>
|
||||
</plurals>
|
||||
<string name="waypoint_type_atm">guichet automatique bancaire</string>
|
||||
<string name="waypoint_type_bank">banque</string>
|
||||
<string name="waypoint_type_bar">bar</string>
|
||||
|
||||
@@ -97,7 +97,6 @@
|
||||
<string name="generic_description_line">Description : %1$s</string>
|
||||
<string name="generic_name">Nom</string>
|
||||
<string name="generic_name_line">Nom : %1$s</string>
|
||||
<string name="generic_paused">En pause</string>
|
||||
<string name="generic_recording">Enregistrement…</string>
|
||||
<string name="generic_save">Enregistrer</string>
|
||||
<string name="generic_tracks">Parcours</string>
|
||||
@@ -107,7 +106,6 @@
|
||||
<string name="image_arrow">Flèche</string>
|
||||
<string name="image_marker">Repère</string>
|
||||
<string name="image_marker_count">Nombre de repères</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Repère de photo</string>
|
||||
<string name="image_record">Enregistrer</string>
|
||||
<string name="image_stop">Arrêter</string>
|
||||
@@ -122,7 +120,6 @@
|
||||
<string name="marker_name_format">Repère %1$d</string>
|
||||
<string name="marker_title">%1$d sur %2$d</string>
|
||||
<string name="marker_edit_marker_type">Type de repère (exemple : cascade)</string>
|
||||
<string name="marker_edit_marker_type_hint">Type de repère</string>
|
||||
<string name="marker_list_empty_message">Vous n\'avez aucun repère.</string>
|
||||
<string name="menu_aggregated_statistics">Statistiques cumulées</string>
|
||||
<string name="menu_delete">Supprimer</string>
|
||||
@@ -141,19 +138,12 @@
|
||||
<string name="menu_start_gps">Démarrer le GPS</string>
|
||||
<string name="menu_stop_gps">Arrêter le GPS</string>
|
||||
<string name="recording_service">Service enregistrement</string>
|
||||
<string name="sensor_state_battery">Niveau de la batterie</string>
|
||||
<string name="sensor_state_cadence">Cadence</string>
|
||||
<string name="sensor_state_cadence_value">%1$d tr/min</string>
|
||||
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">Puissance</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Non disponible pendant l\'enregistrement d\'un parcours.</string>
|
||||
<string name="settings_show">Afficher</string>
|
||||
<string name="settings_advanced">Avancé</string>
|
||||
<string name="settings_chart_by_distance">En fonction de la distance</string>
|
||||
<string name="settings_chart_by_time">En fonction de la durée</string>
|
||||
<string name="settings_recording">Enregistrement</string>
|
||||
<string name="settings_recording_default_activity_title">Type activité par déf.</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre chaque enregistrement de la position.</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Une nouvelle section est créée si la distance entre deux positions est supérieure à %1$s.</string>
|
||||
@@ -166,7 +156,6 @@
|
||||
<string name="settings_recording_track_name_date_local_option">Date (format local)</string>
|
||||
<string name="settings_recording_track_name_number_option">Numéro</string>
|
||||
<string name="settings_recording_track_name_title">Nom parcours par défaut</string>
|
||||
<string name="settings_reset">Réinitialiser</string>
|
||||
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
|
||||
<string name="settings_reset_confirm_title">Réinitialiser maintenant ?</string>
|
||||
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies.</string>
|
||||
@@ -242,17 +231,6 @@
|
||||
<item quantity="one">%1$.1f mile par heure</item>
|
||||
<item quantity="other">%1$.1f miles par heure</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
|
||||
<string name="voice_pace_per_mile">%1$s par mile</string>
|
||||
<string name="voice_template">%1$s en %2$s à %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distance totale %1$.2f kilomètre</item>
|
||||
<item quantity="other">distance totale %1$.2f kilomètres</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distance totale %1$.2f mile</item>
|
||||
<item quantity="other">distance totale %1$.2f miles</item>
|
||||
</plurals>
|
||||
<string name="waypoint_type_atm">bancomat</string>
|
||||
<string name="waypoint_type_bank">banque</string>
|
||||
<string name="waypoint_type_bar">bar</string>
|
||||
|
||||
@@ -13,8 +13,7 @@ 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.
|
||||
-->
|
||||
<resources>
|
||||
--><resources>
|
||||
<string name="about_preference_title">À propos d\'OpenTracks</string>
|
||||
<string name="about_description"><i>OpenTracks</i> est une application de suivi sportif qui respecte totalement votre vie privée.</string>
|
||||
<string name="about_url">Page web du projet : <a href="%1$s">%1$s</a></string>
|
||||
@@ -151,7 +150,7 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="description_sensor_cadence">Cadence (tr/min)</string>
|
||||
<string name="description_sensor_heart_rate">Fréquence cardiaque (bpm)</string>
|
||||
<string name="description_sensor_power">Puissance (W)</string>
|
||||
<string name="description_default_speed_or_pace">Par type d activité</string>
|
||||
<string name="description_default_speed_or_pace">Par type d\'activité</string>
|
||||
<string name="description_speed_imperial">Vitesse (mi/h)</string>
|
||||
<string name="description_speed_metric">Vitesse (km/h)</string>
|
||||
<string name="description_time">Durée</string>
|
||||
@@ -169,7 +168,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="generic_description_line">Description : %1$s</string>
|
||||
<string name="generic_name">Nom</string>
|
||||
<string name="generic_name_line">Nom : %1$s</string>
|
||||
<string name="generic_paused">En pause</string>
|
||||
<string name="generic_recording">Enregistrement…</string>
|
||||
<string name="generic_save">Enregistrer</string>
|
||||
<string name="generic_tracks">Parcours</string>
|
||||
@@ -181,7 +179,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="image_arrow">Flèche</string>
|
||||
<string name="image_marker">Repère</string>
|
||||
<string name="image_marker_count">Nombre de repères</string>
|
||||
<string name="image_pause">Pause</string>
|
||||
<string name="image_photo_marker">Repère de photo</string>
|
||||
<string name="image_record">Enregistrer</string>
|
||||
<string name="image_stop">Arrêter</string>
|
||||
@@ -201,7 +198,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Type de repère (exemple : cascade)</string>
|
||||
<string name="marker_edit_marker_type_hint">Type de repère</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Vous n\'avez aucun repère</string>
|
||||
<!-- Menu -->
|
||||
@@ -229,17 +225,11 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="permission_gps_failed">OpenTracks nécessite une autorisation pour utiliser le GPS.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Niveau de la batterie</string>
|
||||
<string name="sensor_state_cadence">Cadences</string>
|
||||
<string name="sensor_state_cadence_value">%1$d tr/min</string>
|
||||
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
|
||||
<string name="sensor_state_power">Puissance</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Impossible de rechercher les appareils Bluetooth (erreur %1$i).</string>
|
||||
<string name="bluetooth_disabled">Veuillez activer Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Non disponible pendant l\'enregistrement d\'un parcours</string>
|
||||
<string name="settings_show">Afficher</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Avancé</string>
|
||||
<!-- Settings Chart -->
|
||||
@@ -250,7 +240,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Pendant l\'enregistrement, afficher les statistiques sans déverrouiller l\'appareil.</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_title">Garder l\'écran allumé</string>
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Pendant l\'enregistrement, garder l\'écran allumé.</string>
|
||||
<string name="settings_recording">Enregistrement</string>
|
||||
<string name="settings_recording_default_activity_title">Type activité par déf</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre chaque enregistrement de la position</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Une nouvelle section est créée si la distance entre deux positions est supérieure à %1$s</string>
|
||||
@@ -264,15 +253,11 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="settings_recording_track_name_number_option">Numéro</string>
|
||||
<string name="settings_recording_track_name_title">Nom parcours par défaut</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Réinitialiser</string>
|
||||
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
|
||||
<string name="settings_reset_confirm_title">Réinitialiser maintenant ?</string>
|
||||
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies</string>
|
||||
<string name="settings_error_initial_values_restored">Désolé, mais une erreur sest produite. Tous les paramètres ont été rétablis aux valeurs par défaut.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Connecté à %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Déconnecté de %1$s</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Mode de calcul souhaité</string>
|
||||
<string name="settings_stats_units_imperial">Unités impériales (mi, pi)</string>
|
||||
@@ -360,17 +345,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<item quantity="one">%1$.1f mile par heure</item>
|
||||
<item quantity="other">%1$.1f miles par heure</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
|
||||
<string name="voice_pace_per_mile">%1$s par mile</string>
|
||||
<string name="voice_template">%1$s en %2$s à %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distance totale %1$.2f kilomètre</item>
|
||||
<item quantity="other">distance totale %1$.2f kilomètres</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distance totale %1$.2f mile</item>
|
||||
<item quantity="other">distance totale %1$.2f miles</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">distributeur de billets</string>
|
||||
<string name="waypoint_type_bank">banque</string>
|
||||
@@ -431,8 +405,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="track_detail_intervals_tab">Intervalles</string>
|
||||
<string name="interval_list_empty_message">Il n\'y a pas encore d\'intervalle</string>
|
||||
<string name="aggregated_stats_empty_message">Enregistrez votre première trace pour voir les statistiques agrégées</string>
|
||||
<string name="voice_pace_lap">Temps au tour de %1$s</string>
|
||||
<string name="voice_speed_lap">Vitesse du tour de %1$s</string>
|
||||
<string name="settings_default_export_uri_title">Répertoire d\'exportation des traces</string>
|
||||
<string name="instant_export_enabled_title">Exportation instantanée après l\'entraînement</string>
|
||||
<string name="stats_loss">Dénivelé négatif</string>
|
||||
@@ -442,7 +414,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="settings_night_mode_option_system">Système</string>
|
||||
<string name="stats_split_interval">Intervalle partagé</string>
|
||||
<string name="instant_export_enabled_summary">Exportation de la trace vers le stockage après la fin de l\'enregistrement</string>
|
||||
<string name="hold_to_pause">Tenir pour faire une pause</string>
|
||||
<string name="hold_to_stop">Maintenir pour arrêter</string>
|
||||
<string name="track_distance_notification">Distance : %1$s</string>
|
||||
<string name="open_track_as_KML">Ouvert comme KML</string>
|
||||
@@ -513,7 +484,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="stats_sensors_power">Énergie</string>
|
||||
<string name="permission_bluetooth_failed_rejected">Vous devez accorder manuellement l\'accès aux appareils à proximité à OpenTracks dans les paramètres système.</string>
|
||||
<string name="settings_recording_customize_layout_title">Personnalisez votre disposition d\'enregistrement</string>
|
||||
<string name="settings_announcements">Annonces</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Intervalle de temps</string>
|
||||
<string name="settings_announcements_distance_frequency">Intervalle de distance</string>
|
||||
<string name="settings_layout_reset_confirm_title">Réinitialiser vos dispositions \?</string>
|
||||
@@ -521,7 +491,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="settings_all_reset">Réinitialiser</string>
|
||||
<string name="location_coordinate">%1$s°</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="title_activity_settings_custom_layout">Personnaliser la disposition d\'enregistrement</string>
|
||||
<string name="permission_bluetooth_failed">OpenTracks a besoin de la permission d\'utiliser le Bluetooth.</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Champs de données pas rangée</string>
|
||||
<string name="field_set_primary">Principal</string>
|
||||
@@ -556,8 +525,8 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="generic_undo">Annuler</string>
|
||||
<string name="menu_add_custom_layout">Nouvelle présentation</string>
|
||||
<string name="generic_filter">Filtre</string>
|
||||
<string name="generic_to">A</string>
|
||||
<string name="generic_from">Sur</string>
|
||||
<string name="generic_to">Au</string>
|
||||
<string name="generic_from">Du</string>
|
||||
<string name="menu_select_layout">Sélectionner la mise en page</string>
|
||||
<string name="menu_filter">Filtre</string>
|
||||
<string name="custom_layout_list_edit_name">Tapez le nom du modèle à ajouter</string>
|
||||
@@ -573,4 +542,49 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="export_cannot_write_to_dir">Impossible d\'écrire dans le répertoire d\'exportation.</string>
|
||||
<string name="export_dir_not_writable">" (non inscriptible !)"</string>
|
||||
<string name="no_compatible_file_manager_installed">Aucun gestionnaire de fichiers compatible n\'est installé</string>
|
||||
<string name="settings_public_api_enabled_title">API publique</string>
|
||||
<string name="average_heart_rate">Fréquence cardiaque moyenne</string>
|
||||
<string name="current_heart_rate">Fréquence cardiaque actuelle</string>
|
||||
<plurals name="voiceDistanceMiles">
|
||||
<item quantity="one">%1$.2f mile</item>
|
||||
<item quantity="other">%1$.2f miles</item>
|
||||
</plurals>
|
||||
<string name="lap_time">Temps par tour</string>
|
||||
<string name="speed">Vitesse</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">Les données enregistrées ne seront pas automatiquement partagées avec d\'autres applications.</string>
|
||||
<string name="settings_public_api_enabled_summary_on">D\'autres applications installées peuvent démarrer ou arrêter les enregistrements.</string>
|
||||
<string name="settings_public_api_enabled_summary_off">Seul OpenTracks peut démarrer et arrêter les enregistrements.</string>
|
||||
<plurals name="voiceDistanceKilometers">
|
||||
<item quantity="one">%1$.2f kilomètre</item>
|
||||
<item quantity="other">%1$.2f kilomètres</item>
|
||||
</plurals>
|
||||
<string name="total_distance">Distance totale</string>
|
||||
<string name="activity_type_swimming">natation</string>
|
||||
<string name="activity_type_swimming_open">natation en eau libre</string>
|
||||
<string name="activity_type_workout">entraînement</string>
|
||||
<string name="generic_dismiss">Oublier</string>
|
||||
<string name="gps_recording_status">%1$s : %2$s</string>
|
||||
<string name="settings_api_title">API publique</string>
|
||||
<string name="settings_public_api_disabled_toast">L\'API publique d\'OpenTracks est désactivé : Elle peut être activé dans les paramètres.</string>
|
||||
<string name="voice_per_kilometer">par kilomètre</string>
|
||||
<string name="voice_per_mile">par mile</string>
|
||||
<string name="pace">Rythme</string>
|
||||
<string name="lap_speed">Vitesse par tour</string>
|
||||
<string name="show_on_map_format_ask">Demander</string>
|
||||
<string name="show_on_dashboard">Tableau de bord de l\'API OpenTracks</string>
|
||||
<string name="always">Toujours</string>
|
||||
<string name="share_crash_report">Partager le rapport de crash</string>
|
||||
<string name="report_bug">Signaler un problème</string>
|
||||
<string name="error_crash_title">%1$s a crashé</string>
|
||||
<string name="gps_recording_without_signal">OpenTracks enregistre actuellement sans les données GPS.</string>
|
||||
<string name="settings_export_filename_title">Format du nom de fichier</string>
|
||||
<string name="select_show_on_map_behavior">Sélectionner le comportement \"Montrer sur la carte\"</string>
|
||||
<string name="settings_public_api_dashboard_enabled_title">Transfert automatique des données</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">Une application qui a commencé un enregistrement peut aussi accéder aux données enregistrées.</string>
|
||||
<string name="settings_announcements_average_speed_pace">Allure/vitesse moyenne</string>
|
||||
<string name="settings_announcements_lap_speed_pace">Allure/vitesse au tour</string>
|
||||
<string name="settings_announcements_average_heart_rate">Moyenne de fréquence cardiaque</string>
|
||||
<string name="settings_announcements_lap_heart_rate">Fréquence cardiaque au tour</string>
|
||||
<string name="image_discard">Ignorer</string>
|
||||
<string name="track_discarding">Ignorer la trace</string>
|
||||
</resources>
|
||||
@@ -177,7 +177,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="generic_description_line">Descrición: %1$s</string>
|
||||
<string name="generic_name">Nome</string>
|
||||
<string name="generic_name_line">Nome: %1$s</string>
|
||||
<string name="generic_paused">En pausa</string>
|
||||
<string name="generic_recording">Gravando…</string>
|
||||
<string name="generic_save">Gardar</string>
|
||||
<string name="generic_tracks">Traxectos</string>
|
||||
@@ -191,7 +190,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="image_arrow">Frecha</string>
|
||||
<string name="image_marker">Marcador</string>
|
||||
<string name="image_marker_count">Reconto de marcadores</string>
|
||||
<string name="image_pause">Pausar</string>
|
||||
<string name="image_photo_marker">Marcador de fotos</string>
|
||||
<string name="image_record">Gravar</string>
|
||||
<string name="image_stop">Deter</string>
|
||||
@@ -211,7 +209,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Tipo de marcador (por exemplo, fervenza)</string>
|
||||
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Non tes marcadores</string>
|
||||
<!-- Menu -->
|
||||
@@ -239,17 +236,11 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="permission_gps_failed">OpenTracks precisa permiso para usar o GPS.</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Nivel da batería</string>
|
||||
<string name="sensor_state_cadence">Cadencia</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">Potencia</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="sensor_could_not_scan">Non se escanearon dispositivos Bluetooth (fallo %1$i).</string>
|
||||
<string name="bluetooth_disabled">Activa o Bluetooth.</string>
|
||||
<string name="settings_not_while_recording">Non dispoñible durante a gravación dunha ruta</string>
|
||||
<string name="settings_show">Mostrar</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Opcións avanzadas</string>
|
||||
<string name="settings_default_trackfileformat">Formato do ficheiro a exportar/compartir</string>
|
||||
@@ -263,7 +254,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="settings_recording_keep_screen_on_while_recording_summary">Ao gravar, manten a pantalla acesa.</string>
|
||||
<string name="settings_recording_fullscreen_on_while_recording_title">Pantalla completa</string>
|
||||
<string name="settings_recording_fullscreen_on_while_recording_summary">Mentras grava, mostrar a pantalla completa.</string>
|
||||
<string name="settings_recording">Gravación</string>
|
||||
<string name="settings_recording_default_activity_title">Tipo de actividade predeterminada</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s entre as situacións gravadas</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Créase un novo segmento se a distancia entre as situacións é superior a %1$s</string>
|
||||
@@ -277,15 +267,11 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="settings_recording_track_name_number_option">Número</string>
|
||||
<string name="settings_recording_track_name_title">Nome da ruta por omisión</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Restablecer</string>
|
||||
<string name="settings_reset_confirm_message">Toda a configuración volverá aos valores predeterminados.</string>
|
||||
<string name="settings_reset_confirm_title">Restablecer agora?</string>
|
||||
<string name="settings_reset_done">Restablecéronse todos os valores predeterminados da configuración</string>
|
||||
<string name="settings_error_initial_values_restored">Sentímolo, pero algo fallou. Os axustes foron restablecidos aos valores por omisión.</string>
|
||||
<!-- Settings Sensor -->
|
||||
<string name="settings_sensor_bluetooth">Bluetooth</string>
|
||||
<string name="settings_sensor_connecting">Conectado a %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
|
||||
<string name="settings_sensor_wheel_circumference">Circunferencia da roda (mm)</string>
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Indicador preferido</string>
|
||||
@@ -376,17 +362,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<item quantity="one">1 quilómetro por hora</item>
|
||||
<item quantity="other">%1$.1f quilómetros por hora</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s por quilómetro</string>
|
||||
<string name="voice_pace_per_mile">%1$s por quilómetro</string>
|
||||
<string name="voice_template">%1$s en %2$s a %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distancia total 1 quilómetro</item>
|
||||
<item quantity="other">distancia total %1$.2f quilómetros</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distancia total 1 milla</item>
|
||||
<item quantity="other">distancia total %1$.2f millas</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Caixeiro automático</string>
|
||||
<string name="waypoint_type_bank">banco</string>
|
||||
@@ -443,7 +418,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="share_image_subject">Quixera compartir unha imaxe contigo</string>
|
||||
<string name="share_image_body">Creo que che podería gustar esta imaxe.</string>
|
||||
<string name="hold_to_stop">Mantén preso para deter</string>
|
||||
<string name="hold_to_pause">Mantén preso para pausar</string>
|
||||
<string name="export_all_do_it_for_all">facelo para todos os conflitos</string>
|
||||
<string name="export_track_errors">Rutas non exportadas</string>
|
||||
<string name="generic_skip">Omitir</string>
|
||||
@@ -461,7 +435,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="settings_night_mode_option_night">Noite</string>
|
||||
<string name="stats_split_interval">Intervalo parcial</string>
|
||||
<string name="track_detail_intervals_tab">Intervalos</string>
|
||||
<string name="voice_pace_lap">Tempo da volta de %1$s</string>
|
||||
<string name="instant_export_enabled_title">Exportación instantánea tras o adestramento</string>
|
||||
<string name="settings_default_export_uri_title">Directorio onde exportar as rutas</string>
|
||||
<string name="export_track_already_exists_msg">A ruta %1$s xa existe no directorio de destino.</string>
|
||||
@@ -473,7 +446,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="settings_night_mode_title">Decorado IU</string>
|
||||
<string name="settings_night_mode_option_system">Sistema</string>
|
||||
<string name="interval_list_empty_message">Aínda non hai intervalos</string>
|
||||
<string name="voice_speed_lap">Velocidade da volta de %1$s</string>
|
||||
<string name="instant_export_enabled_summary">Rematou a exportación da ruta á almacenaxe tras a gravación</string>
|
||||
<string name="import_thread_interrupted">Fío interrumpido</string>
|
||||
<string name="export_progress_summary_new_msg">Exportadas as novas rutas</string>
|
||||
@@ -521,11 +493,9 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="stats_sensors_cadence">Cadencia</string>
|
||||
<string name="location_coordinate">%1$sº</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="title_activity_settings_custom_layout">Personaliza a disposición ao gravar</string>
|
||||
<string name="field_remove_from_layout">Eliminar</string>
|
||||
<string name="field_set_primary">Primario</string>
|
||||
<string name="field_set_secondary">Secundario</string>
|
||||
<string name="settings_announcements">Anuncios</string>
|
||||
<string name="settings_announcements_totaltime_frequency">Intervalo temporal</string>
|
||||
<string name="settings_generic_sensor">Xenérico</string>
|
||||
<string name="settings_cycling_sensor">Ciclismo</string>
|
||||
@@ -579,7 +549,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
||||
<string name="export_dir_not_writable">" (non escribible!)"</string>
|
||||
<string name="no_compatible_file_manager_installed">Non compatible xestor de ficheiros instalados</string>
|
||||
<string name="settings_api_title">API pública</string>
|
||||
<string name="settings_announcements_report_heart_rate">Informar do pulso</string>
|
||||
<string name="settings_public_api_enabled_title">API pública</string>
|
||||
<string name="settings_public_api_disabled_toast">API pública de OpenTracks desactivada: pode activarse nos axustes.</string>
|
||||
<string name="lap_time">Tempo da volta</string>
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">विवरण: %1$s</string>
|
||||
<string name="generic_name">नाम</string>
|
||||
<string name="generic_name_line">नाम: %1$s</string>
|
||||
<string name="generic_paused">पॉज़ किया गया</string>
|
||||
<string name="generic_recording">रेकॉर्ड हो रहा है…</string>
|
||||
<string name="generic_save">सहेजें</string>
|
||||
<string name="generic_tracks">ट्रैक</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">तीर</string>
|
||||
<string name="image_marker">मार्कर</string>
|
||||
<string name="image_marker_count">मार्कर गणना</string>
|
||||
<string name="image_pause">पॉज़ करें</string>
|
||||
<string name="image_photo_marker">फ़ोटो मार्कर</string>
|
||||
<string name="image_record">रिकॉर्ड करें</string>
|
||||
<string name="image_stop">रोकें</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">मार्कर प्रकार (उदा., झरना)</string>
|
||||
<string name="marker_edit_marker_type_hint">मार्कर प्रकार</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">आपके पास कोई मार्कर नहीं है</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">रिकॉर्डिंग सेवा</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<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_heart_rate">हृदय गति</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">पॉवर</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">ट्रैक रिकॉर्ड करते समय उपलब्ध नहीं</string>
|
||||
<string name="settings_show">दिखाएं</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">उन्नत</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">दूरी के अनुसार</string>
|
||||
<string name="settings_chart_by_time">समय के अनुसार</string>
|
||||
<string name="settings_recording">रिकॉर्डिंग</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>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">नंबर</string>
|
||||
<string name="settings_recording_track_name_title">डिफ़ॉल्ट ट्रैक नाम</string>
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
@@ -291,17 +280,6 @@ limitations under the License.
|
||||
<item quantity="one">%1$.1f मील प्रति घंटा</item>
|
||||
<item quantity="other">%1$.1f मील प्रति घंट</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s प्रति किलोमीटर</string>
|
||||
<string name="voice_pace_per_mile">%1$s प्रति मील</string>
|
||||
<string name="voice_template">%3$s पर %2$s में %1$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">कुल दूरी %1$.2f किलोमीटर</item>
|
||||
<item quantity="other">कुल दूरी %1$.2f किलोमीटर</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">कुल दूरी %1$.2f मील</item>
|
||||
<item quantity="other">कुल दूरी %1$.2f मील</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">ATM</string>
|
||||
<string name="waypoint_type_bank">बैंक</string>
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Opis: %1$s</string>
|
||||
<string name="generic_name">Ime</string>
|
||||
<string name="generic_name_line">Ime: %1$s</string>
|
||||
<string name="generic_paused">Pauzirano</string>
|
||||
<string name="generic_recording">Snimanje…</string>
|
||||
<string name="generic_save">Spremi</string>
|
||||
<string name="generic_tracks">Trase</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Strelica</string>
|
||||
<string name="image_marker">Oznaka</string>
|
||||
<string name="image_marker_count">Broj oznaka</string>
|
||||
<string name="image_pause">Pauza</string>
|
||||
<string name="image_photo_marker">Oznaka fotografije</string>
|
||||
<string name="image_record">Snimanje</string>
|
||||
<string name="image_stop">Stop</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Vrsta oznake (npr. slap)</string>
|
||||
<string name="marker_edit_marker_type_hint">Vrsta oznake</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Nemate nijednu oznaku</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">Usluga snimanja</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Razina baterije</string>
|
||||
<string name="sensor_state_cadence">Kadenca</string>
|
||||
<string name="sensor_state_cadence_value">%1$d o/min</string>
|
||||
<string name="sensor_state_heart_rate">Brzina otkucaja srca</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d otkuc./min.</string>
|
||||
<string name="sensor_state_power">Napajanje</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Nije dostupno tijekom snimanja staze</string>
|
||||
<string name="settings_show">Prikaži</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Napredno</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">Prema udaljenosti</string>
|
||||
<string name="settings_chart_by_time">Prema vremenu</string>
|
||||
<string name="settings_recording">Snimanje</string>
|
||||
<string name="settings_recording_default_activity_title">Zadana vrsta aktivnosti</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s između snimljenih lokacija</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Novi segment izrađuje se ako je udaljenost između dviju lokacija veća od %1$s</string>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Broj</string>
|
||||
<string name="settings_recording_track_name_title">Zadani naziv staze</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Poništiti</string>
|
||||
<string name="settings_reset_confirm_message">Sve će se postavke vratiti na zadane vrijednosti.</string>
|
||||
<string name="settings_reset_confirm_title">Želite li sada vratiti na zadano?</string>
|
||||
<string name="settings_reset_done">Sve su postavke vraćene na zadane vrijednosti</string>
|
||||
@@ -296,19 +285,6 @@ limitations under the License.
|
||||
<item quantity="few">%1$.1f milje na sat</item>
|
||||
<item quantity="other">%1$.1f milja na sat</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s po kilometru</string>
|
||||
<string name="voice_pace_per_mile">%1$s po milji</string>
|
||||
<string name="voice_template">%1$s za %2$s brzinom od %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">ukupna udaljenost %1$.2f kilometar</item>
|
||||
<item quantity="few">ukupna udaljenost %1$.2f kilometra</item>
|
||||
<item quantity="other">ukupna udaljenost %1$.2f kilometara</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">ukupna udaljenost %1$.2f milja</item>
|
||||
<item quantity="few">ukupna udaljenost %1$.2f milje</item>
|
||||
<item quantity="other">ukupna udaljenost %1$.2f milja</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Bankomat</string>
|
||||
<string name="waypoint_type_bank">banka</string>
|
||||
|
||||
@@ -117,7 +117,6 @@ limitations under the License.
|
||||
<string name="generic_description_line">Leírás: %1$s</string>
|
||||
<string name="generic_name">Név</string>
|
||||
<string name="generic_name_line">Név: %1$s</string>
|
||||
<string name="generic_paused">Szüneteltetett</string>
|
||||
<string name="generic_recording">Rögzítés…</string>
|
||||
<string name="generic_save">Mentés</string>
|
||||
<string name="generic_tracks">Számok</string>
|
||||
@@ -129,7 +128,6 @@ limitations under the License.
|
||||
<string name="image_arrow">Nyíl</string>
|
||||
<string name="image_marker">Jelölő</string>
|
||||
<string name="image_marker_count">Jelölőszámláló</string>
|
||||
<string name="image_pause">Szünet</string>
|
||||
<string name="image_photo_marker">Fényképjelölő</string>
|
||||
<string name="image_record">Rögzítés</string>
|
||||
<string name="image_stop">Leállítás</string>
|
||||
@@ -148,7 +146,6 @@ limitations under the License.
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Jelölő típusa (pl. vízesés)</string>
|
||||
<string name="marker_edit_marker_type_hint">Jelölő típusa</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Nincsenek jelölők</string>
|
||||
<!-- Menu -->
|
||||
@@ -172,21 +169,14 @@ limitations under the License.
|
||||
<string name="recording_service">Rögzítőszolgáltatás</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Akkumulátor töltöttségi szintje</string>
|
||||
<string name="sensor_state_cadence">Fordulatszám</string>
|
||||
<string name="sensor_state_cadence_value">%1$d fordulat/perc</string>
|
||||
<string name="sensor_state_heart_rate">Szívritmus</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d ütés/perc</string>
|
||||
<string name="sensor_state_power">Teljesítmény</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Pálya rögzítése közben nem érhető el</string>
|
||||
<string name="settings_show">Megjelenítés</string>
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Speciális</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">Távolság szerint</string>
|
||||
<string name="settings_chart_by_time">Idő szerint</string>
|
||||
<string name="settings_recording">Rögzítés</string>
|
||||
<string name="settings_recording_default_activity_title">Alapértelmezett tevékenységtípus</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s helyszínrögzítések között</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Új szegmens jön létre, ha a két hely közötti távolság nagyobb, mint %1$s</string>
|
||||
@@ -200,7 +190,6 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Szám</string>
|
||||
<string name="settings_recording_track_name_title">Pálya alapértelmezett neve</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Visszaállítás</string>
|
||||
<string name="settings_reset_confirm_message">Minden beállítás visszaáll az alapértelmezett értékekre.</string>
|
||||
<string name="settings_reset_confirm_title">Visszaállítja most?</string>
|
||||
<string name="settings_reset_done">Minden beállítás visszaállt az alapértelmezett értékre</string>
|
||||
@@ -292,17 +281,6 @@ limitations under the License.
|
||||
<item quantity="one">1 mérföld óránként</item>
|
||||
<item quantity="other">%1$.1f mérföld óránként</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s kilométerenként</string>
|
||||
<string name="voice_pace_per_mile">%1$s mérföldenként</string>
|
||||
<string name="voice_template">%1$s %2$s alatt %3$s sebességgel</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">össztávolság: 1 kilométer</item>
|
||||
<item quantity="other">össztávolság: %1$.2f kilométer</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">össztávolság: 1 mérföld</item>
|
||||
<item quantity="other">össztávolság: %1$.2f mérföld</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">bankautomata</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
@@ -388,7 +366,6 @@ limitations under the License.
|
||||
<string name="interval_list_empty_message">Még nincs intervallum</string>
|
||||
<string name="settings_default_export_uri_title">Pálya export könyvtár</string>
|
||||
<string name="instant_export_enabled_summary">Sáv exportálása a tárolóba a felvétel befejezése után</string>
|
||||
<string name="hold_to_pause">Tartsa a szünethez</string>
|
||||
<string name="hold_to_stop">Tartsa lenyomva a leállításhoz</string>
|
||||
<string name="track_distance_notification">Távolság: %1$s</string>
|
||||
<string name="instant_export_enabled_title">Azonnali edzés utáni export</string>
|
||||
@@ -402,7 +379,6 @@ limitations under the License.
|
||||
<string name="import_unsupported_format">Nem támogatott fájlformátum</string>
|
||||
<string name="description_default_speed_or_pace">Tevékenységtípus szerint</string>
|
||||
<string name="export_without_photos">fotók nélkül</string>
|
||||
<string name="voice_speed_lap">%1$s körsebessége</string>
|
||||
<string name="help_gps_troubleshooting_content"> Mit tehetsz:
|
||||
\n a) ellenőrizze, hogy a GPS engedélyezve van-e,
|
||||
\n b) javítsa a GPS-vételt (pl. menjen a szabadba),
|
||||
@@ -425,12 +401,8 @@ limitations under the License.
|
||||
<string name="settings_night_mode_option_system">Rendszer</string>
|
||||
<string name="settings_night_mode_option_day">Nap</string>
|
||||
<string name="settings_night_mode_option_night">Éjszaka</string>
|
||||
<string name="settings_error_initial_values_restored">Sajnáljuk, de hiba történt. Minden beállítás visszaállt az alapértelmezett értékekre.</string>
|
||||
<string name="settings_sensor_connecting">Csatlakoztatva %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Megszakadt a kapcsolat %1$s</string>
|
||||
<string name="stats_loss">Veszteség</string>
|
||||
<string name="track_recording_notification_accuracy">Helyszín pontossága: %1$s</string>
|
||||
<string name="voice_pace_lap">Köridő %1$s</string>
|
||||
<string name="export_progress_summary_overwrite_msg">Sávok felülírása</string>
|
||||
<string name="export_progress_summary_skip_msg">Kihagyott sávok</string>
|
||||
<string name="export_progress_summary_errors_msg">Hibák</string>
|
||||
@@ -494,4 +466,71 @@ limitations under the License.
|
||||
<string name="settings_sensor_cycling_cadence">Kerékpározás: lépésszám</string>
|
||||
<string name="settings_sensor_cycling_distance_speed">Kerékpározás: táv és sebesség</string>
|
||||
<string name="settings_sensor_running_speed_and_cadence">Futás: távolság, sebesség és ritmus</string>
|
||||
<string name="generic_today">Ma</string>
|
||||
<string name="generic_yesterday">Tegnap</string>
|
||||
<string name="generic_filter">Szűrő</string>
|
||||
<string name="generic_to">Hogy</string>
|
||||
<string name="generic_from">Tól től</string>
|
||||
<string name="activity_type_swimming">úszás</string>
|
||||
<string name="activity_type_swimming_open">úszás nyílt vízben</string>
|
||||
<string name="activity_type_workout">edzés</string>
|
||||
<string name="export_cannot_write_to_dir">Nem lehet írni az exportkönyvtárba.</string>
|
||||
<string name="export_dir_not_writable">" (nem írható!)"</string>
|
||||
<string name="generic_choose_an_option">Válasszon egy opciót</string>
|
||||
<string name="menu_select_layout">Válassza Ki Az Elrendezést</string>
|
||||
<string name="menu_add_custom_layout">Új Elrendezés</string>
|
||||
<string name="menu_filter">Szűrő</string>
|
||||
<string name="settings_defaults_title">Alapértelmezett egységek és tevékenység</string>
|
||||
<string name="gps_recording_status">%1$s: %2$s</string>
|
||||
<string name="settings_defaults_summary">Preferált Egységek, Alapértelmezett Tevékenység, Alapértelmezett Név Követése</string>
|
||||
<string name="settings_ui_title">Felhasználói Felület</string>
|
||||
<string name="settings_ui_summary">Megjelenés, Felvétel Elrendezése, Téma</string>
|
||||
<string name="settings_gps_summary">Időintervallum, távolság intervallum, Max távolság, pontosság</string>
|
||||
<string name="settings_sensors_title">Bluetooth Érzékelők</string>
|
||||
<string name="generic_dismiss">Elbocsátás</string>
|
||||
<string name="settings_sensors_summary">Kerékpáros Érzékelők, Kerék Kerülete, Futásérzékelők</string>
|
||||
<string name="settings_announcements_title">Voice Közlemények</string>
|
||||
<string name="settings_export_filename_title">A fájlnév formátuma</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_off">A rögzített adatokat nem osztják meg automatikusan más alkalmazásokkal.</string>
|
||||
<string name="field_remove_from_layout">Eltávolítás</string>
|
||||
<string name="stats_sensors_power">Teljesítmény</string>
|
||||
<string name="stats_sensors_cadence">Ütem</string>
|
||||
<string name="settings_all_reset">Visszaállítás</string>
|
||||
<string name="settings_layout_reset_confirm_message">Minden elrendezési beállítás visszaáll az alapértelmezett értékekre. Ez nem törli az eszközön lévő zeneszámokat.</string>
|
||||
<string name="settings_recording_idle_speed_title">Alapjárati fordulatszám-küszöbérték</string>
|
||||
<string name="custom_layout_list_title">Elrendezések</string>
|
||||
<string name="custom_layout_list_edit_name">Írja be az elrendezés nevét a hozzáadáshoz</string>
|
||||
<string name="aggregated_stats_filter_no_results">A megadott szűrőhöz nincsenek tevékenységek</string>
|
||||
<string name="speed">Sebesség</string>
|
||||
<string name="total_distance">Teljes távolság</string>
|
||||
<string name="settings_generic_sensor">Általános</string>
|
||||
<string name="no_compatible_file_manager_installed">Nincs kompatibilis fájlkezelő telepítve</string>
|
||||
<string name="field_set_secondary">Másodlagos</string>
|
||||
<string name="field_set_primary">Elsődleges</string>
|
||||
<string name="settings_running_sensor">Futás</string>
|
||||
<string name="settings_public_api_enabled_summary_on">Más telepített alkalmazások elindíthatják vagy leállíthatják a felvételeket.</string>
|
||||
<string name="settings_public_api_dashboard_enabled_title">Automatikus adatátvitel</string>
|
||||
<string name="settings_public_api_dashboard_enabled_summary_on">A felvételt elindító alkalmazás szintén hozzáférhet a rögzített adatokhoz.</string>
|
||||
<string name="stats_sensors_heart_rate">Pulzusszám</string>
|
||||
<string name="stats_clock">Óra</string>
|
||||
<string name="current_heart_rate">Jelenlegi pulzusszám</string>
|
||||
<string name="average_heart_rate">Átlagos pulzusszám</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_enabled">Csak azokat a Bluetooth-eszközöket jelenítse meg, amelyek bejelentik a szükséges szolgáltatásokat</string>
|
||||
<string name="settings_import_section">Behozatal</string>
|
||||
<string name="settings_export_section">Kivitel</string>
|
||||
<string name="settings_layout_reset_confirm_title">Állítsa vissza az elrendezéseket\?</string>
|
||||
<string name="settings_layout_reset_done">Az összes elrendezési beállítás visszaállt az alapértelmezett értékekre</string>
|
||||
<string name="custom_layout_list_layout_removed">Az elrendezést eltávolították</string>
|
||||
<string name="settings_recording_customize_layout_title">A felvétel elrendezésének testreszabása</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Adatmezők soronként</string>
|
||||
<string name="custom_layout_list_edit_already_exists">Az elrendezés neve már létezik</string>
|
||||
<string name="stats_custom_layout_default_layout">Alapértelmezett Elrendezés</string>
|
||||
<string name="settings_layout_reset">Az Egyéni Elrendezés Visszaállítása</string>
|
||||
<string name="settings_cycling_sensor">Kerékpározás</string>
|
||||
<string name="location_coordinate">%1$s°</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="always">Mindig</string>
|
||||
<string name="error_crash_title">%1$s összeomlott</string>
|
||||
<string name="settings_announcements_summary">Idő, Távolság, Hangsebesség</string>
|
||||
<string name="settings_units_category">Egységek</string>
|
||||
</resources>
|
||||
@@ -97,7 +97,6 @@
|
||||
<string name="generic_description_line">Keterangan: %1$s</string>
|
||||
<string name="generic_name">Nama</string>
|
||||
<string name="generic_name_line">Nama: %1$s</string>
|
||||
<string name="generic_paused">Dijeda</string>
|
||||
<string name="generic_recording">Merekam…</string>
|
||||
<string name="generic_save">Simpan</string>
|
||||
<string name="generic_tracks">Lintasan</string>
|
||||
@@ -107,7 +106,6 @@
|
||||
<string name="image_arrow">Panah</string>
|
||||
<string name="image_marker">Penanda</string>
|
||||
<string name="image_marker_count">Hitungan penanda</string>
|
||||
<string name="image_pause">Jeda</string>
|
||||
<string name="image_photo_marker">Penanda foto</string>
|
||||
<string name="image_record">Rekam</string>
|
||||
<string name="image_stop">Hentikan</string>
|
||||
@@ -122,7 +120,6 @@
|
||||
<string name="marker_name_format">Penanda %1$d</string>
|
||||
<string name="marker_title">%1$d dari %2$d</string>
|
||||
<string name="marker_edit_marker_type">Jenis penanda (misal: air terjun)</string>
|
||||
<string name="marker_edit_marker_type_hint">Jenis penanda</string>
|
||||
<string name="marker_list_empty_message">Anda tidak memiliki penanda</string>
|
||||
<string name="menu_aggregated_statistics">Statistik agregat</string>
|
||||
<string name="menu_delete">Hapus</string>
|
||||
@@ -141,19 +138,12 @@
|
||||
<string name="menu_start_gps">Nyalakan GPS</string>
|
||||
<string name="menu_stop_gps">Matikan GPS</string>
|
||||
<string name="recording_service">Layanan perekaman</string>
|
||||
<string name="sensor_state_battery">Level baterai</string>
|
||||
<string name="sensor_state_cadence">Tempo</string>
|
||||
<string name="sensor_state_cadence_value">%1$d rpm</string>
|
||||
<string name="sensor_state_heart_rate">Denyut jantung</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">Daya</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Tidak tersedia saat merekam trek</string>
|
||||
<string name="settings_show">Tampilkan</string>
|
||||
<string name="settings_advanced">Lanjutan</string>
|
||||
<string name="settings_chart_by_distance">Menurut jarak</string>
|
||||
<string name="settings_chart_by_time">Menurut waktu</string>
|
||||
<string name="settings_recording">Perekaman</string>
|
||||
<string name="settings_recording_default_activity_title">Jenis aktivitas default</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s antara lokasi yang direkam</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Segmen baru dibuat jika jarak antara dua lokasi lebih besar dari %1$s</string>
|
||||
@@ -166,7 +156,6 @@
|
||||
<string name="settings_recording_track_name_date_local_option">Tanggal (lokal)</string>
|
||||
<string name="settings_recording_track_name_number_option">Angka</string>
|
||||
<string name="settings_recording_track_name_title">Nama trek default</string>
|
||||
<string name="settings_reset">Setel ulang</string>
|
||||
<string name="settings_reset_confirm_message">Semua pengaturan akan dikembalikan ke nilai baku. Ini tidak akan menghapus trek apapun pada perangkat.</string>
|
||||
<string name="settings_reset_confirm_title">Setel ulang sekarang?</string>
|
||||
<string name="settings_reset_done">Semua setelan telah dikembalikan ke nilai default</string>
|
||||
@@ -239,15 +228,6 @@
|
||||
<plurals name="voiceSpeedMilesPerHour">
|
||||
<item quantity="other">%1$.1f mil per jam</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s per kilometer</string>
|
||||
<string name="voice_pace_per_mile">%1$s per mil</string>
|
||||
<string name="voice_template">%1$s dalam %2$s pada kecepatan %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="other">jarak total %1$.2f kilometer</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="other">jarak total %1$.2f mil</item>
|
||||
</plurals>
|
||||
<string name="waypoint_type_atm">ATM</string>
|
||||
<string name="waypoint_type_bank">bank</string>
|
||||
<string name="waypoint_type_bar">bar</string>
|
||||
@@ -307,7 +287,6 @@
|
||||
<string name="help_support_title">Bagaimana mendukung OpenTracks\?</string>
|
||||
<string name="import_progress_summary_errors_msg">Kesalahan</string>
|
||||
<string name="open_track_as_GPX">Buka sebagai GPX</string>
|
||||
<string name="settings_error_initial_values_restored">Maaf, tapi terjadi kesalahan. Semua pengaturan telah dikembalikan ke nilai baku.</string>
|
||||
<string name="track_speed_notification">Kecepatan: %1$s</string>
|
||||
<string name="import_unable_to_import_file">Tidak bisa mengimpor berkas: %1$s</string>
|
||||
<string name="open_track_as_trackfileformat">Buka sebagai %1$s</string>
|
||||
|
||||
@@ -157,7 +157,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="generic_description_line">Descrizione: %1$s</string>
|
||||
<string name="generic_name">Nome</string>
|
||||
<string name="generic_name_line">Nome: %1$s</string>
|
||||
<string name="generic_paused">In pausa</string>
|
||||
<string name="generic_recording">Registrazione…</string>
|
||||
<string name="generic_save">Salva</string>
|
||||
<string name="generic_tracks">Percorsi</string>
|
||||
@@ -169,7 +168,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="image_arrow">Freccia</string>
|
||||
<string name="image_marker">Indicatore</string>
|
||||
<string name="image_marker_count">Contatore indicatori</string>
|
||||
<string name="image_pause">Pausa</string>
|
||||
<string name="image_photo_marker">Indicatore fotografico</string>
|
||||
<string name="image_record">Registra</string>
|
||||
<string name="image_stop">Interrompi</string>
|
||||
@@ -188,7 +186,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Tipo di indicatore (ad es. cascata)</string>
|
||||
<string name="marker_edit_marker_type_hint">Tipo di indicatore</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">Non ci sono indicatori</string>
|
||||
<!-- Menu -->
|
||||
@@ -212,21 +209,15 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="recording_service">Servizio di registrazione</string>
|
||||
<!-- Search -->
|
||||
<!-- Sensor State -->
|
||||
<string name="sensor_state_battery">Livello batteria</string>
|
||||
<string name="sensor_state_cadence">Cadenza</string>
|
||||
<string name="sensor_state_cadence_value">%1$d giri al minuto</string>
|
||||
<string name="sensor_state_heart_rate">Battito cardiaco</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d battiti al minuto</string>
|
||||
<string name="sensor_state_power">Potenza</string>
|
||||
<string name="sensor_state_power_value">%1$d W</string>
|
||||
<string name="settings_not_while_recording">Non disponibile durante la registrazione di un percorso</string>
|
||||
<string name="settings_show">Mostra</string>
|
||||
|
||||
<!-- Settings Advanced -->
|
||||
<string name="settings_advanced">Avanzate</string>
|
||||
<!-- Settings Chart -->
|
||||
<string name="settings_chart_by_distance">Per distanza</string>
|
||||
<string name="settings_chart_by_time">Per durata</string>
|
||||
<string name="settings_recording">Registrazione</string>
|
||||
<string name="settings_recording_default_activity_title">Tipo di attività predefinita</string>
|
||||
<string name="settings_recording_location_frequency_summary">%1$s tra posizioni registrate</string>
|
||||
<string name="settings_recording_max_recording_distance_summary">Viene creato un nuovo segmento se la distanza tra due punti è maggiore di %1$s</string>
|
||||
@@ -240,7 +231,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="settings_recording_track_name_number_option">Numero</string>
|
||||
<string name="settings_recording_track_name_title">Nome percorso predefinito</string>
|
||||
<!-- Settings Reset -->
|
||||
<string name="settings_reset">Reimposta</string>
|
||||
<string name="settings_reset_confirm_message">Tutte le impostazioni verranno ripristinate sui valori predefiniti. Questo non eliminerà alcuna traccia dal dispositivo.</string>
|
||||
<string name="settings_reset_confirm_title">Reimpostare ora?</string>
|
||||
<string name="settings_reset_done">Tutte le impostazioni sono ripristinate sui valori predefiniti</string>
|
||||
@@ -332,17 +322,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<item quantity="one">1 miglio all\'ora</item>
|
||||
<item quantity="other">%1$.1f miglia all\'ora</item>
|
||||
</plurals>
|
||||
<string name="voice_pace_per_kilometer">%1$s per chilometro</string>
|
||||
<string name="voice_pace_per_mile">%1$s per miglio</string>
|
||||
<string name="voice_template">%1$s in %2$s a %3$s</string>
|
||||
<plurals name="voiceTotalDistanceKilometers">
|
||||
<item quantity="one">distanza totale 1 chilometro</item>
|
||||
<item quantity="other">distanza totale %1$.2f chilometri</item>
|
||||
</plurals>
|
||||
<plurals name="voiceTotalDistanceMiles">
|
||||
<item quantity="one">distanza totale 1 miglio</item>
|
||||
<item quantity="other">distanza totale %1$.2f miglia</item>
|
||||
</plurals>
|
||||
<!-- Waypoint Type -->
|
||||
<string name="waypoint_type_atm">Bancomat</string>
|
||||
<string name="waypoint_type_bank">banca</string>
|
||||
@@ -396,10 +375,8 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="waypoint_type_water_fountain">fontana ad acqua</string>
|
||||
<string name="waypoint_type_waypoint">tappa</string>
|
||||
<string name="settings_night_mode_title">Tema dell\'interfaccia utente</string>
|
||||
<string name="settings_error_initial_values_restored">Mi dispiace, ma si è verificato un errore. Tutte le impostazioni sono state riportate ai valori predefiniti.</string>
|
||||
<string name="stats_split_interval">Intervallo di divisione</string>
|
||||
<string name="aggregated_stats_empty_message">Registra il tuo primo percorso per vedere le statistiche aggregate</string>
|
||||
<string name="voice_speed_lap">Velocità per giro di %1$s</string>
|
||||
<string name="share_image_subject">Vorrei condividere un\'immagine con te</string>
|
||||
<string name="settings_default_export_uri_title">Cartella di esportazione dei percorsi</string>
|
||||
<string name="help_track_export_content"> Le tracce possono essere esportate dalle Impostazioni con formato KMZ, KML o GPX. KMZ/KML contiene tutti i dati; GPX contiene solo le posizioni. Le tracce condivise tramite l\'icona <i>condividi</i> sono esportate come KMZ. </string>
|
||||
@@ -463,14 +440,10 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="settings_night_mode_option_system">Sistema</string>
|
||||
<string name="settings_night_mode_option_day">Chiaro</string>
|
||||
<string name="settings_night_mode_option_night">Scuro</string>
|
||||
<string name="settings_sensor_connecting">Connesso a %1$s</string>
|
||||
<string name="settings_sensor_disconnected">Disconnesso da %1$s</string>
|
||||
<string name="track_detail_intervals_tab">Intervalli</string>
|
||||
<string name="interval_list_empty_message">Non c\'è ancora nessun intervallo</string>
|
||||
<string name="voice_pace_lap">Tempo sul giro di %1$s</string>
|
||||
<string name="share_image_body">Penso che potresti essere interessat* a questa immagine.</string>
|
||||
<string name="hold_to_stop">Tieni premuto per fermare</string>
|
||||
<string name="hold_to_pause">Tieni premuto per mettere in pausa</string>
|
||||
<string name="instant_export_enabled_summary">Esporta la traccia nella memoria al termine della registrazione</string>
|
||||
<string name="instant_export_enabled_title">Esportazione istantanea post-allenamento</string>
|
||||
<string name="generic_open_track">Traccia aperta</string>
|
||||
@@ -534,7 +507,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="settings_layout_reset_done">Tutte le impostazioni del layout sono state reimpostate ai valori predefiniti</string>
|
||||
<string name="settings_generic_sensor">Generico</string>
|
||||
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
|
||||
<string name="title_activity_settings_custom_layout">Personalizza Layout di Registrazione</string>
|
||||
<string name="settings_open_tracks_title">Binari aperti</string>
|
||||
<string name="settings_open_tracks_summary">Tutto a proposito del progetto OpenTracks</string>
|
||||
<string name="settings_ui_title">Interfaccia Utente</string>
|
||||
@@ -549,7 +521,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
|
||||
<string name="settings_units_category">Unità</string>
|
||||
<string name="settings_activity_defaults_category">Predefiniti dell\'Attività</string>
|
||||
<string name="settings_reset_summary">Reimposta Impostazioni ai Valori Predefiniti</string>
|
||||
<string name="settings_announcements">Annunci</string>
|
||||
<string name="settings_layout_reset">Reimposta Layout Personalizzato</string>
|
||||
<string name="settings_layout_reset_confirm_message">Tutte le impostazioni di layout saranno reimpostate ai valori predefiniti. Questo non eliminerà alcuna traccia dal dispositivo.</string>
|
||||
<string name="settings_layout_reset_confirm_title">Rempostare i tuoi layout\?</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user