Compare commits

...

23 Commits

Author SHA1 Message Date
Peter Storch dae8eaa97a Release: v4.2.2 2023-02-04 21:53:35 +01:00
Peter Storch 565b1ce94d Correct link to F-Droid build monitor 2023-02-04 21:53:24 +01:00
dependabot[bot] 543d5e18bf Bump com.android.tools:desugar_jdk_libs from 2.0.0 to 2.0.1
Bumps [com.android.tools:desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/google/desugar_jdk_libs/releases)
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-03 05:05:29 +01:00
dependabot[bot] 01368df6b1 Bump com.android.tools.build:gradle from 7.4.0 to 7.4.1
Bumps com.android.tools.build:gradle from 7.4.0 to 7.4.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-02 07:03:02 +01:00
Dennis Guse c666d55211 Bug: crash due to color not found.
Introduced in 674d231b7a
2023-01-30 23:11:21 +01:00
Dennis Guse 8cc4fd1d4f Bugfix: not all activityTypes were shown in dropdownlist. 2023-01-29 16:50:04 +01:00
Dennis Guse c241a35861 Refactor: introduced ActivityType. 2023-01-29 16:50:04 +01:00
Dennis Guse 674d231b7a Bug: textcolor for heartrate zone 1 was ignoring theme.
Fixes #1455.
2023-01-27 02:00:38 +01:00
Dennis Guse bebee59eb2 Bug: Track icon wrongly shown in dialog.
Fixes #1453.
2023-01-25 16:37:35 +01:00
dependabot[bot] 24f843b0db Bump material from 1.7.0 to 1.8.0
Bumps [material](https://github.com/material-components/material-components-android) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.7.0...1.8.0)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-25 07:04:21 +01:00
Dennis Guse f0259d13dd Release: v4.2.1 2023-01-21 19:03:07 +01:00
Dennis Guse 9dff965a52 Cycling speed sensor: wheel diameter can now be 100mm until 4000mm
Fixes #1447.
2023-01-17 22:47:59 +01:00
Mario Ruiz b4e6d10fbe Translated using Weblate (Spanish)
Currently translated at 100.0% (503 of 503 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/es/
2023-01-16 12:22:26 +01:00
Dennis Guse 1a9d88277f Fix pt-PT translations. 2023-01-13 08:08:49 +01:00
Dennis Guse 4ea956ca0e Merge branch 'translations' 2023-01-13 08:02:27 +01:00
dependabot[bot] 8060c2e1e3 Bump desugar_jdk_libs from 1.2.2 to 2.0.0
Bumps [desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 1.2.2 to 2.0.0.
- [Release notes](https://github.com/google/desugar_jdk_libs/releases)
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

---
updated-dependencies:
- dependency-name: com.android.tools:desugar_jdk_libs
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-13 08:01:58 +01:00
dependabot[bot] 8c96b65e59 Bump gradle from 7.3.1 to 7.4.0
Bumps gradle from 7.3.1 to 7.4.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-13 07:47:56 +01:00
Dennis Guse a407e94d3c Upgrade to appcompat:1.6.0 2023-01-11 22:58:23 +01:00
ssantos 310c790324 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (503 of 503 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/pt_PT/
2023-01-11 13:50:39 +01:00
Dennis Guse 12b3d31f5c Bugfix: BluetoothLE requires to trigger reconnect on either disconnect or never connected.
Initial connection timeout seems to be 30s.
Fixes #1442.
2023-01-05 20:52:15 +01:00
dependabot[bot] d43dca61c1 Bump runner from 1.5.1 to 1.5.2
Bumps runner from 1.5.1 to 1.5.2.

---
updated-dependencies:
- dependency-name: androidx.test:runner
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 07:28:24 +01:00
dependabot[bot] 20c14a03b2 Bump junit from 1.1.4 to 1.1.5
Bumps junit from 1.1.4 to 1.1.5.

---
updated-dependencies:
- dependency-name: androidx.test.ext:junit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 07:27:28 +01:00
dependabot[bot] a6601f4eea Bump espresso-core from 3.5.0 to 3.5.1
Bumps espresso-core from 3.5.0 to 3.5.1.

---
updated-dependencies:
- dependency-name: androidx.test.espresso:espresso-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 07:27:04 +01:00
17 changed files with 645 additions and 439 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ Application id: de.dennisguse.opentracks
It if it properly tagged F-Droid takes care of building the app and publishing.
Usually, it takes two days before the update is published (build, signed, and published).
The recent build activity can be found [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500)
The recent build activity can be found [here](https://monitor.f-droid.org/builds/build)
## Google Play Store
Application id: `de.dennisguse.opentracks.playstore`
+9 -9
View File
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
@@ -59,8 +59,8 @@ android {
defaultConfig {
applicationId "de.dennisguse.opentracks"
versionCode 5119
versionName "v4.2.0"
versionCode 5141
versionName "v4.2.2"
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
@@ -120,21 +120,21 @@ android {
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.1'
implementation 'androidx.appcompat:appcompat:1.6.0-rc01'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'com.google.android.material:material:1.7.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.core:core-splashscreen:1.0.0'
androidTestImplementation 'androidx.test:core:1.5.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test:runner:1.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'org.mockito:mockito-android:4.11.0'
androidTestUtil 'androidx.test:orchestrator:1.4.2'
@@ -0,0 +1,8 @@
v4.2.1: OpenTracks
Changes:
- Speed sensor: acceptable wheel diameter is 100mm-4000mm
Bugfix:
- Reconnect to a sensor if connection is lost
@@ -0,0 +1,9 @@
v4.2.2: OpenTracks
Bugfix:
- Track icon wrongly shown in dialog
- Textcolor for heartrate zone 1 was ignoring theme
- Not all activityTypes were shown in dropdownlist
- Crash due to color not found
@@ -24,6 +24,7 @@ import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.databinding.TrackEditBinding;
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
@@ -75,7 +76,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
viewBinding.fields.trackEditActivityType.setText(track.getCategory());
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
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) -> {
@@ -8,6 +8,7 @@ import android.view.View;
import android.widget.ArrayAdapter;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.data.models.DistanceFormatter;
import de.dennisguse.opentracks.data.models.SpeedFormatter;
import de.dennisguse.opentracks.data.models.Track;
@@ -51,7 +52,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
viewBinding.trackEditActivityType.setText(track.getCategory());
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
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) -> {
@@ -0,0 +1,79 @@
package de.dennisguse.opentracks.data.models;
import android.content.Context;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import de.dennisguse.opentracks.R;
public enum ActivityType {
AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp, true, R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane),
BIKE("BIKE", R.drawable.ic_activity_bike_24dp, true, R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_road_biking, R.string.activity_type_track_cycling),
MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp, true, R.string.activity_type_mountain_biking),
MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp, true, R.string.activity_type_motor_bike),
KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp, true, R.string.activity_type_kayaking),
BOAT("BOAT", R.drawable.ic_activity_boat_24dp, true, R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat),
SAILING("SAILING", R.drawable.ic_activity_sailing_24dp, true, R.string.activity_type_sailing),
DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp, true, R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car),
RUN("RUN", R.drawable.ic_activity_run_24dp, false, R.string.activity_type_running, R.string.activity_type_street_running, R.string.activity_type_track_running, R.string.activity_type_trail_running),
SKI("SKI", R.drawable.ic_activity_skiing_24dp, true, R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing),
SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp, true, R.string.activity_type_snow_boarding),
UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp, true, R.string.activity_type_unknown),
WALK("WALK", R.drawable.ic_activity_walk_24dp, false, R.string.activity_type_hiking, R.string.activity_type_off_trail_hiking, R.string.activity_type_speed_walking, R.string.activity_type_trail_hiking, R.string.activity_type_walking),
ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp, true, R.string.activity_type_escooter),
INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp, true, R.string.activity_type_inline_skating),
SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp, true, R.string.activity_type_skate_boarding),
CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp, false, R.string.activity_type_climbing),
SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp, false, R.string.activity_type_swimming),
SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp, false, R.string.activity_type_swimming_open),
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout);
final String id;
final int iconId;
final boolean showSpeedPreferred;
final int[] localizedStringIds;
//isSpeed?
ActivityType(String id, int iconId, boolean showSpeedPreferred, int... localizedStringIds) {
this.id = id;
this.iconId = iconId;
this.showSpeedPreferred = showSpeedPreferred;
this.localizedStringIds = localizedStringIds;
}
public String getId() {
return id;
}
public int getIconId() {
return iconId;
}
public boolean isShowSpeedPreferred() {
return showSpeedPreferred;
}
public int[] getLocalizedStringIds() {
return localizedStringIds;
}
public int getFirstLocalizedStringId() {
return localizedStringIds[0];
}
public static List<String> getLocalizedStrings(Context context) {
List<String> result = new ArrayList<>();
for (ActivityType activityType : values()) {
List<String> strings = Arrays.stream(activityType.localizedStringIds)
.mapToObj(context::getString)
.collect(Collectors.toList());
result.addAll(strings);
}
return result;
}
}
@@ -1,8 +1,12 @@
package de.dennisguse.opentracks.data.models;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.ui.util.ThemeUtils;
public class HeartRateZones {
@@ -12,22 +16,23 @@ public class HeartRateZones {
this.max = max;
}
public int getColorForZone(HeartRate current) {
public int getTextColorForZone(Context context, HeartRate current) {
if (current != null) {
if (current.getBPM() >= max.getBPM() * 0.9) {
return R.color.heart_rate_zone_textcolor_5;
return ContextCompat.getColor(context, R.color.heart_rate_zone_textcolor_5);
}
if (current.getBPM() >= max.getBPM() * 0.8) {
return R.color.heart_rate_zone_textcolor_4;
return ContextCompat.getColor(context, R.color.heart_rate_zone_textcolor_4);
}
if (current.getBPM() >= max.getBPM() * 0.7) {
return R.color.heart_rate_zone_textcolor_3;
return ContextCompat.getColor(context, R.color.heart_rate_zone_textcolor_3);
}
if (current.getBPM() >= max.getBPM() * 0.6) {
return R.color.heart_rate_zone_textcolor_2;
return ContextCompat.getColor(context, R.color.heart_rate_zone_textcolor_2);
}
}
return R.color.heart_rate_zone_textcolor_1;
// Zone 1
return ThemeUtils.getTextColorPrimary(context);
}
}
@@ -54,20 +54,23 @@ public abstract class BluetoothConnectionManager<DataType> {
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
switch (newState) {
case BluetoothProfile.STATE_CONNECTING:
Log.d(TAG, "Connecting to sensor: " + gatt.getDevice());
Log.i(TAG, "Connecting to sensor: " + gatt.getDevice());
break;
case BluetoothProfile.STATE_CONNECTED:
Log.d(TAG, "Connected to sensor: " + gatt.getDevice());
Log.i(TAG, "Connected to sensor: " + gatt.getDevice() + "; discovering services.");
gatt.discoverServices();
break;
case BluetoothProfile.STATE_DISCONNECTING:
Log.d(TAG, "Disconnecting from sensor: " + gatt.getDevice());
Log.i(TAG, "Disconnecting from sensor: " + gatt.getDevice());
break;
case BluetoothProfile.STATE_DISCONNECTED:
Log.d(TAG, "Disconnected from sensor: " + gatt.getDevice());
//This is also triggered, if no connection was established (ca. 30s)
Log.i(TAG, "Disconnected from sensor: " + gatt.getDevice() + "; trying to reconnect");
if (gatt.connect()) {
Log.e(TAG, "Could not trigger reconnect for sensor: " + gatt.getDevice());
}
clearData();
break;
}
@@ -28,6 +28,7 @@ import androidx.preference.DialogPreference;
import androidx.preference.PreferenceDialogFragmentCompat;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
import de.dennisguse.opentracks.util.TrackIconUtils;
@@ -79,7 +80,7 @@ public class ActivityTypePreference extends DialogPreference {
textView = view.findViewById(R.id.activity_type_preference_text_view);
String category = PreferencesUtils.getDefaultActivity();
textView.setText(category);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context));
textView.setAdapter(adapter);
textView.setOnItemClickListener((parent, v, position, id) -> {
String iconValue = TrackIconUtils.getIconValue(context, (String) textView.getAdapter().getItem(position));
@@ -45,7 +45,7 @@ public class SensorsSettingsFragment extends PreferenceFragmentCompat {
if (newValue instanceof String) {
try {
int newValueInt = Integer.parseInt((String) newValue);
return newValueInt > 500 && newValueInt < 4000;
return newValueInt >= 100 && newValueInt < 4000;
} catch (NumberFormatException e) {
Log.w(TAG, "Entered string is no number.");
}
@@ -18,15 +18,15 @@ package de.dennisguse.opentracks.util;
import android.content.Context;
import android.content.res.Resources;
import android.util.Pair;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.ActivityType;
/**
* Utilities for track icon.
@@ -35,219 +35,71 @@ import de.dennisguse.opentracks.R;
*/
public class TrackIconUtils {
private static final String AIRPLANE = "AIRPLANE";
private static final String BIKE = "BIKE";
private static final String MOUNTAIN_BIKE = "MOUNTAIN_BIKE";
private static final String MOTOR_BIKE = "MOTOR_BIKE";
private static final String KAYAK = "KAYAK";
private static final String BOAT = "BOAT";
private static final String SAILING = "SAILING";
private static final String DRIVE = "DRIVE";
private static final String RUN = "RUN";
private static final String SKI = "SKI";
private static final String SNOW_BOARDING = "SNOW_BOARDING";
private static final String UNKNOWN = "UNKNOWN";
private static final String WALK = "WALK";
private static final String ESCOOTER = "ESCOOTER";
private static final String INLINE_SKATING = "INLINES_SKATING";
private static final String SKATE_BOARDING = "SKATE_BOARDING";
private static final String CLIMBING = "CLIMBING";
private static final String SWIMMING = "SWIMMING";
private static final String SWIMMING_OPEN = "SWIMMING_OPEN";
private static final String WORKOUT = "WORKOUT";
public static int getIconDrawable(String activityTypeId) {
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter(
it -> it.getId().equals(activityTypeId)
).findFirst();
private static final int ACTIVITY_UNKNOWN_LOGO = R.drawable.ic_logo_24dp;
private static final int[] AIRPLANE_LIST = new int[]{R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane};
private static final int[] BIKE_LIST = new int[]{R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_road_biking, R.string.activity_type_track_cycling};
private static final int[] BOAT_LIST = new int[]{R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat};
private static final int[] CLIMBING_LIST = new int[]{R.string.activity_type_climbing};
private static final int[] DRIVE_LIST = new int[]{R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car};
private static final int[] MOTOR_BIKE_LIST = new int[]{R.string.activity_type_motor_bike};
private static final int[] MOUNTAIN_BIKE_LIST = new int[]{R.string.activity_type_mountain_biking};
private static final int[] ESCOOTER_LIST = new int[]{R.string.activity_type_escooter};
private static final int[] INLINE_SKATING_LIST = new int[]{R.string.activity_type_inline_skating};
private static final int[] RUN_LIST = new int[]{R.string.activity_type_running, R.string.activity_type_street_running, R.string.activity_type_track_running, R.string.activity_type_trail_running};
private static final int[] SAILING_LIST = new int[]{R.string.activity_type_sailing};
private static final int[] SKI_LIST = new int[]{R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing};
private static final int[] SNOW_BOARDING_LIST = new int[]{R.string.activity_type_snow_boarding};
private static final int[] SKATE_BOARDING_LIST = new int[]{R.string.activity_type_skate_boarding};
private static final int[] KAYAKING_LIST = new int[]{R.string.activity_type_kayaking};
private static final int[] WALK_LIST = new int[]{R.string.activity_type_hiking, R.string.activity_type_off_trail_hiking, R.string.activity_type_speed_walking, R.string.activity_type_trail_hiking, R.string.activity_type_walking};
private static final int[] SWIM_LIST = new int[]{R.string.activity_type_swimming, R.string.activity_type_swimming_open};
private static final int[] WORKOUT_LIST = new int[]{R.string.activity_type_workout};
// List of icons whose sports associated use speed (in km/h or mi/h).
private static final int[] SPEED_ICON = {
// Unknown.
R.string.activity_type_unknown,
// All airplane categories.
R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane,
// All bike categories.
R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_motor_bike, R.string.activity_type_mountain_biking, R.string.activity_type_road_biking, R.string.activity_type_track_cycling, R.string.activity_type_inline_skating,
// All boat categories.
R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat, R.string.activity_type_sailing, R.string.activity_type_kayaking,
// All drive categories.
R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car, R.string.activity_type_escooter, R.string.activity_type_skate_boarding,
// All wintersport categories
R.string.activity_type_skiing, R.string.activity_type_snow_boarding
};
//TODO Use Map.of()
private static final LinkedHashMap<String, Pair<Integer, Integer>> MAP = new LinkedHashMap<>();
static {
//Reflects order in ChooseActivityTypeDialogFragmentActivity
MAP.put(UNKNOWN, new Pair<>(R.string.activity_type_unknown, ACTIVITY_UNKNOWN_LOGO));
MAP.put(RUN, new Pair<>(R.string.activity_type_running, R.drawable.ic_activity_run_24dp));
MAP.put(WALK, new Pair<>(R.string.activity_type_walking, R.drawable.ic_activity_walk_24dp));
MAP.put(CLIMBING, new Pair<>(R.string.activity_type_climbing, R.drawable.ic_activity_climbing_24dp));
MAP.put(SKATE_BOARDING, new Pair<>(R.string.activity_type_skate_boarding, R.drawable.ic_activity_skateboarding_24dp));
MAP.put(INLINE_SKATING, new Pair<>(R.string.activity_type_inline_skating, R.drawable.ic_activity_inline_skating_24dp));
MAP.put(SNOW_BOARDING, new Pair<>(R.string.activity_type_snow_boarding, R.drawable.ic_activity_snowboarding_24dp));
MAP.put(SKI, new Pair<>(R.string.activity_type_skiing, R.drawable.ic_activity_skiing_24dp));
MAP.put(ESCOOTER, new Pair<>(R.string.activity_type_escooter, R.drawable.ic_activity_escooter_24dp));
MAP.put(BIKE, new Pair<>(R.string.activity_type_biking, R.drawable.ic_activity_bike_24dp));
MAP.put(MOUNTAIN_BIKE, new Pair<>(R.string.activity_type_mountain_biking, R.drawable.ic_activity_mtb_24dp));
MAP.put(MOTOR_BIKE, new Pair<>(R.string.activity_type_motor_bike, R.drawable.ic_activity_motorbike_24dp));
MAP.put(DRIVE, new Pair<>(R.string.activity_type_driving, R.drawable.ic_activity_drive_24dp));
MAP.put(AIRPLANE, new Pair<>(R.string.activity_type_airplane, R.drawable.ic_activity_flight_24dp));
MAP.put(KAYAK, new Pair<>(R.string.activity_type_kayaking, R.drawable.ic_activity_kayaking_24dp));
MAP.put(BOAT, new Pair<>(R.string.activity_type_boat, R.drawable.ic_activity_boat_24dp));
MAP.put(SAILING, new Pair<>(R.string.activity_type_sailing, R.drawable.ic_activity_sailing_24dp));
MAP.put(SWIMMING, new Pair<>(R.string.activity_type_swimming, R.drawable.ic_activity_swimming_24dp));
MAP.put(SWIMMING_OPEN, new Pair<>(R.string.activity_type_swimming_open, R.drawable.ic_activity_swimming_open_24dp));
MAP.put(WORKOUT, new Pair<>(R.string.activity_type_workout, R.drawable.ic_activity_workout_24dp));
}
private TrackIconUtils() {
}
/**
* Gets the icon drawable.
*
* @param iconValue the icon value
*/
public static int getIconDrawable(String iconValue) {
if (iconValue == null || iconValue.equals("")) {
return ACTIVITY_UNKNOWN_LOGO;
if (found.isEmpty()) {
return ActivityType.UNKNOWN.getIconId();
}
Pair<Integer, Integer> pair = MAP.get(iconValue);
return pair == null ? ACTIVITY_UNKNOWN_LOGO : pair.second;
return found.get().getIconId();
}
/**
* Gets the icon activity type.
*
* @param iconValue the icon value
*/
public static int getIconActivityType(String iconValue) {
if (iconValue == null || iconValue.equals("")) {
return R.string.activity_type_unknown;
public static int getIconActivityType(String activityTypeId) {
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter(
it -> it.getId().equals(activityTypeId)
).findFirst();
if (found.isEmpty()) {
return ActivityType.UNKNOWN.getFirstLocalizedStringId();
}
Pair<Integer, Integer> pair = MAP.get(iconValue);
return pair == null ? R.string.activity_type_unknown : pair.first;
return found.get().getFirstLocalizedStringId();
}
/**
* Gets all icon values.
*/
public static List<String> getAllIconValues() {
return new ArrayList<>(MAP.keySet());
return Arrays.stream(ActivityType.values())
.map(ActivityType::getId)
.collect(Collectors.toList());
}
/**
* Gets the icon value.
*
* @param context the context
* @param activityType the activity type
* @param context the context
* @param activityTypeId the activity type
*/
@NonNull
public static String getIconValue(Context context, String activityType) {
Resources resources = context.getResources();
if (activityType == null || activityType.equals("")) {
return UNKNOWN;
public static String getIconValue(Context context, String activityTypeId) {
Optional<ActivityType> selected = Arrays.stream(ActivityType.values())
.filter(
it -> Arrays.stream(it.getLocalizedStringIds())
.anyMatch(id -> context.getString(id).equals(activityTypeId))
)
.findFirst();
if (selected.isEmpty()) {
return ActivityType.UNKNOWN.getId();
}
if (inList(resources, activityType, AIRPLANE_LIST)) {
return AIRPLANE;
}
if (inList(resources, activityType, BIKE_LIST)) {
return BIKE;
}
if (inList(resources, activityType, MOUNTAIN_BIKE_LIST)) {
return MOUNTAIN_BIKE;
}
if (inList(resources, activityType, CLIMBING_LIST)) {
return CLIMBING;
}
if (inList(resources, activityType, MOTOR_BIKE_LIST)) {
return MOTOR_BIKE;
}
if (inList(resources, activityType, KAYAKING_LIST)) {
return KAYAK;
}
if (inList(resources, activityType, BOAT_LIST)) {
return BOAT;
}
if (inList(resources, activityType, SAILING_LIST)) {
return SAILING;
}
if (inList(resources, activityType, DRIVE_LIST)) {
return DRIVE;
}
if (inList(resources, activityType, INLINE_SKATING_LIST)) {
return INLINE_SKATING;
}
if (inList(resources, activityType, ESCOOTER_LIST)) {
return ESCOOTER;
}
if (inList(resources, activityType, RUN_LIST)) {
return RUN;
}
if (inList(resources, activityType, SKI_LIST)) {
return SKI;
}
if (inList(resources, activityType, SNOW_BOARDING_LIST)) {
return SNOW_BOARDING;
}
if (inList(resources, activityType, SKATE_BOARDING_LIST)) {
return SKATE_BOARDING;
}
if (inList(resources, activityType, WALK_LIST)) {
return WALK;
}
if (inList(resources, activityType, SWIM_LIST)) {
return SWIMMING;
}
if (inList(resources, activityType, WORKOUT_LIST)) {
return WORKOUT;
}
return UNKNOWN;
return selected.get().getId();
}
/**
* Returns true if the activity type is in the list.
*
* @param context the context
* @param activityType the activity type
* @param list the list
*/
private static boolean inList(Resources context, String activityType, int[] list) {
for (int i : list) {
if (context.getString(i).equals(activityType)) {
return true;
}
}
return false;
}
public static boolean isSpeedIcon(Resources resources, String activityTypeId) {
Optional<ActivityType> selected = Arrays.stream(ActivityType.values())
.filter(
it -> Arrays.stream(it.getLocalizedStringIds())
.anyMatch(id -> resources.getString(id).equals(activityTypeId))
)
.findFirst();
/**
* Returns true if category is in the SPEED_ICON array. Otherwise returns false.
*
* @param category the name of the category, activity type.
*/
public static boolean isSpeedIcon(Resources resources, String category) {
return inList(resources, category, SPEED_ICON);
if (selected.isEmpty()) {
return false;
}
return selected.get().isShowSpeedPreferred();
}
}
@@ -4,8 +4,6 @@ import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import androidx.core.content.ContextCompat;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.DistanceFormatter;
import de.dennisguse.opentracks.data.models.HeartRateZones;
@@ -274,10 +272,10 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
if (sensorDataSet != null && sensorDataSet.getHeartRate() != null) {
valueAndUnit = StringUtils.getHeartRateParts(getContext(), sensorDataSet.getHeartRate().first);
sensorName = sensorDataSet.getHeartRate().second;
textColor = zones.getColorForZone(sensorDataSet.getHeartRate().first);
textColor = zones.getTextColorForZone(getContext(), sensorDataSet.getHeartRate().first);
} else {
valueAndUnit = StringUtils.getHeartRateParts(getContext(), null);
textColor = zones.getColorForZone(null);
textColor = zones.getTextColorForZone(getContext(), null);
}
getBinding().statsValue.setText(valueAndUnit.first);
@@ -287,7 +285,7 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
getBinding().statsDescriptionSecondary.setVisibility(View.VISIBLE);
getBinding().statsDescriptionSecondary.setText(sensorName);
getBinding().statsValue.setTextColor(ContextCompat.getColor(getContext(), textColor));
getBinding().statsValue.setTextColor(textColor);
}
}
+49 -3
View File
@@ -23,7 +23,7 @@ limitations under the License.
<string name="about_libraries">Bibliotecas</string>
<!-- Help -->
<string name="help_feature_title">OpenTracks tiene las siguientes características:</string>
<string name="help_feature_content">* crear pistas de GPS
<string name="help_feature_content">* crear recorridos de GPS
\n* utilizar un sensor de frecuencia cardíaca (solo Bluetooth LE)
\n* anuncios de voz (por tiempo o distancia)
\n* crear marcadores (incluidas imágenes)
@@ -220,7 +220,7 @@ limitations under the License.
<!-- OpenTracks -->
<string name="recording_service">Servicio de grabación</string>
<!-- Permission -->
<string name="permission_gps_failed">OpenTracks necesita permiso para usar el GPS.</string>
<string name="permission_gps_failed">OpenTracks requiere permiso para usar el GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
@@ -325,22 +325,27 @@ limitations under the License.
<!-- Voice -->
<plurals name="voiceHours">
<item quantity="one">1 hora</item>
<item quantity="many">%1$d horas</item>
<item quantity="other">%1$d horas</item>
</plurals>
<plurals name="voiceMinutes">
<item quantity="one">1 minuto</item>
<item quantity="many">%1$d minutos</item>
<item quantity="other">%1$d minutos</item>
</plurals>
<plurals name="voiceSeconds">
<item quantity="one">1 segundo</item>
<item quantity="many">%1$d segundos</item>
<item quantity="other">%1$d segundos</item>
</plurals>
<plurals name="voiceSpeedKilometersPerHour">
<item quantity="one">1 kilómetro por hora</item>
<item quantity="many">%1$.1f kilómetros por hora</item>
<item quantity="other">%1$.1f kilómetros por hora</item>
</plurals>
<plurals name="voiceSpeedMilesPerHour">
<item quantity="one">1 milla por hora</item>
<item quantity="many">%1$.1f millas por hora</item>
<item quantity="other">%1$.1f millas por hora</item>
</plurals>
<!-- Waypoint Type -->
@@ -409,6 +414,7 @@ limitations under the License.
<string name="generic_show_errors">Mostrar errores</string>
<plurals name="generic_completed_with_errors">
<item quantity="one">Completado con un error</item>
<item quantity="many">Completado con %1$d errores</item>
<item quantity="other">Completado con %1$d errores</item>
</plurals>
<string name="generic_completed">Completado</string>
@@ -476,7 +482,7 @@ limitations under the License.
<string name="stats_sensors_power">Poder</string>
<string name="field_set_primary">Primario</string>
<string name="description_speed_source_gps">GPS</string>
<string name="settings_recording_customize_layout_title">Personalice su pantalla de grabación</string>
<string name="settings_recording_customize_layout_title">Personalizar pantalla de grabación</string>
<string name="settings_recording_customize_layout_select_columns">Datos por columna</string>
<string name="settings_layout_reset_confirm_message">Todos los ajustes de diseño se revertirán a los valores predeterminados. Esto no eliminará ningún recorrido en el dispositivo.</string>
<string name="settings_layout_reset_confirm_title">¿Restablecer todos los diseños\?</string>
@@ -562,13 +568,53 @@ limitations under the License.
<string name="total_distance">Distancia total</string>
<plurals name="voiceDistanceKilometers">
<item quantity="one">1 kilómetro</item>
<item quantity="many">%1$.1f kilómetros</item>
<item quantity="other">%1$.1f kilómetros</item>
</plurals>
<plurals name="voiceDistanceMiles">
<item quantity="one">1 milla</item>
<item quantity="many">%1$.1f millas</item>
<item quantity="other">%1$.1f millas</item>
</plurals>
<string name="average_heart_rate">Ritmo cardíaco promedio</string>
<string name="current_heart_rate">Ritmo cardíaco actual</string>
<string name="settings_export_filename_title">Formato del nombre del archivo</string>
<string name="help_data_google_play_services_content">No</string>
<string name="description_pace_nautical">Ritmo (min/NM)</string>
<string name="description_speed_nautical">Velocidad (Nudos)</string>
<string name="image_discard">Descartar</string>
<string name="settings_announcements_average_heart_rate">Frecuencia cardíaca media</string>
<string name="settings_announcements_average_speed_pace">Velocidad/Ritmo medio</string>
<string name="settings_announcements_lap_speed_pace">Velocidad/Ritmo por vuelta</string>
<string name="settings_stats_units_nautical">Náutico (NM, pie)</string>
<string name="track_delete_number_of_tracks">%1$d recorridos</string>
<string name="track_discarding">Descartando recorrido</string>
<string name="unit_nautical_mile">NM</string>
<string name="unit_minute_per_nautical_mile">min/NM</string>
<string name="value_integer_knots">%1$d nudos</string>
<string name="value_float_knots">%1$.1f nudos</string>
<string name="value_float_knots_recommended">%1$.1f nudos (recomendado)</string>
<string name="voice_per_nautical_mile">por milla náutica</string>
<string name="error_crash_title">%1$s falló</string>
<string name="report_bug">Reportar error</string>
<string name="show_on_map_format_ask">Preguntar</string>
<string name="show_on_dashboard">Panel de control del API de OpenTracks</string>
<string name="show_on_dashboard_not_installed">No se ha instalado ninguna aplicación compatible con el panel de control del API de OpenTracks.</string>
<string name="always">Siempre</string>
<string name="settings_announcements_lap_heart_rate">Frecuencia cardiaca por vuelta</string>
<string name="settings_public_api_package_title">Nombre del paquete para el API público</string>
<string name="unit_knots">Nudo</string>
<plurals name="voiceSpeedMKnots">
<item quantity="one">%1$.1f nudo</item>
<item quantity="many">%1$.1f nudos</item>
<item quantity="other">%1$.1f nudos</item>
</plurals>
<plurals name="voiceDistanceNauticalMiles">
<item quantity="one">%1$.1f milla náutica</item>
<item quantity="many">%1$.1f millas náuticas</item>
<item quantity="other">%1$.1f millas náuticas</item>
</plurals>
<string name="select_show_on_map_behavior">Seleccionar el comportamiento de \"mostrar en el mapa\"</string>
<string name="introduction_osm_dashboard">OpenTracks en sí no proporciona un mapa. Por favor, instale OSMDashboard para ver sus grabaciones en un mapa.</string>
<string name="share_crash_report">Compartir informe de fallo</string>
</resources>
+413 -140
View File
@@ -1,173 +1,175 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="activity_type_airplane">avião</string>
<string name="activity_type_atv">Todo-o-Terreno</string>
<string name="activity_type_atv">quadriciclos</string>
<string name="activity_type_biking">ciclismo</string>
<string name="activity_type_blimp">dirigível</string>
<string name="activity_type_boat">barco</string>
<string name="activity_type_climbing">escalada</string>
<string name="activity_type_commercial_airplane">avião comercial</string>
<string name="activity_type_cross_country_skiing">esqui cross-country</string>
<string name="activity_type_cross_country_skiing">Esqui cross-country</string>
<string name="activity_type_cycling">ciclismo</string>
<string name="activity_type_dirt_bike">motocross</string>
<string name="activity_type_donkey_back_riding">passeio de burro</string>
<string name="activity_type_driving">condução</string>
<string name="activity_type_driving_bus">condução de autocarro</string>
<string name="activity_type_driving_car">condução de automóvel</string>
<string name="activity_type_ferry">ferry</string>
<string name="activity_type_frisbee">disco</string>
<string name="activity_type_gliding">voo livre</string>
<string name="activity_type_hang_gliding">asa delta</string>
<string name="activity_type_donkey_back_riding">passeio a burro</string>
<string name="activity_type_driving">dirigindo</string>
<string name="activity_type_driving_bus">ônibus</string>
<string name="activity_type_driving_car">carro</string>
<string name="activity_type_ferry">balsa</string>
<string name="activity_type_frisbee">frízebee</string>
<string name="activity_type_gliding">asa-delta</string>
<string name="activity_type_hang_gliding">voo livre</string>
<string name="activity_type_helicopter">helicóptero</string>
<string name="activity_type_hiking">caminhada</string>
<string name="activity_type_horse_back_riding">equitação</string>
<string name="activity_type_horse_back_riding">passeio a cavalo</string>
<string name="activity_type_hot_air_balloon">balão de ar quente</string>
<string name="activity_type_ice_sailing">vela sobre gelo</string>
<string name="activity_type_inline_skating">patins em linha</string>
<string name="activity_type_ice_sailing">iatismo no gelo</string>
<string name="activity_type_inline_skating">patinação em linha</string>
<string name="activity_type_kayaking">caiaque</string>
<string name="activity_type_kite_surfing">kite surfing</string>
<string name="activity_type_land_sailing">vela em terra</string>
<string name="activity_type_kite_surfing">kitesurfe</string>
<string name="activity_type_land_sailing">iatismo em terra</string>
<string name="activity_type_mixed_type">tipo misto</string>
<string name="activity_type_motor_bike">motos</string>
<string name="activity_type_motor_boating">barcos a motor</string>
<string name="activity_type_mountain_biking">BTT</string>
<string name="activity_type_off_trail_hiking">caminhada fora do trilho</string>
<string name="activity_type_other">outro</string>
<string name="activity_type_paddling">remar</string>
<string name="activity_type_motor_bike">motociclismo</string>
<string name="activity_type_motor_boating">barco a motor</string>
<string name="activity_type_mountain_biking">mountain bike</string>
<string name="activity_type_off_trail_hiking">caminhada fora da trilha</string>
<string name="activity_type_other">outra</string>
<string name="activity_type_paddling">paddle</string>
<string name="activity_type_para_gliding">parapente</string>
<string name="activity_type_rc_airplane">avião de controlo remoto</string>
<string name="activity_type_rc_boat">Barco de controlo remoto</string>
<string name="activity_type_rc_helicopter">Helicóptero de controlo remoto</string>
<string name="activity_type_riding">ciclismo</string>
<string name="activity_type_road_biking">ciclismo de estrada</string>
<string name="activity_type_roller_skiing">rollerski</string>
<string name="activity_type_rc_airplane">avião de controle remoto</string>
<string name="activity_type_rc_boat">barco de controle remoto</string>
<string name="activity_type_rc_helicopter">helicóptero de controle remoto</string>
<string name="activity_type_riding">equitação</string>
<string name="activity_type_road_biking">ciclismo em estrada</string>
<string name="activity_type_roller_skiing">esqui roller</string>
<string name="activity_type_rowing">remo</string>
<string name="activity_type_running">corrida</string>
<string name="activity_type_sailing">vela</string>
<string name="activity_type_sailing">iatismo</string>
<string name="activity_type_seaplane">hidroavião</string>
<string name="activity_type_skate_boarding">skate boarding</string>
<string name="activity_type_skating">patinagem</string>
<string name="activity_type_skate_boarding">skate</string>
<string name="activity_type_skating">patinação</string>
<string name="activity_type_skiing">esqui</string>
<string name="activity_type_sky_jumping">queda livre</string>
<string name="activity_type_sky_jumping">paraquedismo</string>
<string name="activity_type_sled">trenó</string>
<string name="activity_type_snow_boarding">snow boarding</string>
<string name="activity_type_snow_shoeing">Caminhada em raquetes de neve</string>
<string name="activity_type_speed_walking">caminhada veloz</string>
<string name="activity_type_snow_boarding">snowboard</string>
<string name="activity_type_snow_shoeing">raquete de neve</string>
<string name="activity_type_speed_walking">caminhada rápida</string>
<string name="activity_type_street_running">corrida na rua</string>
<string name="activity_type_surfing">surf</string>
<string name="activity_type_surfing">surfe</string>
<string name="activity_type_track_cycling">ciclismo de pista</string>
<string name="activity_type_track_running">atletismo de pista</string>
<string name="activity_type_trail_hiking">caminhada</string>
<string name="activity_type_trail_running">corta-mato</string>
<string name="activity_type_train">comboio</string>
<string name="activity_type_ultimate_frisbee">jogo do disco</string>
<string name="activity_type_unknown">desconhecido</string>
<string name="activity_type_wakeboarding">wakeboarding</string>
<string name="activity_type_walking">passeio</string>
<string name="activity_type_track_running">pista de atletismo</string>
<string name="activity_type_trail_hiking">caminhada em trilha</string>
<string name="activity_type_trail_running">corrida em trilha</string>
<string name="activity_type_train">treino</string>
<string name="activity_type_ultimate_frisbee">frízebee final</string>
<string name="activity_type_unknown">desconhecida</string>
<string name="activity_type_wakeboarding">esqui aquático</string>
<string name="activity_type_walking">caminhada</string>
<string name="activity_type_water_skiing">esqui aquático</string>
<string name="activity_type_wind_surfing">windsurf</string>
<string name="activity_type_wind_surfing">windsurfe</string>
<string name="description_activity_type">Tipo de atividade: %1$s</string>
<string name="description_average_moving_pace_in_minute">Ritmo médio de deslocação: %1$s min/km (%2$s min/mi)</string>
<string name="description_average_moving_speed">Velocidade média de deslocação: %1$.2f km/h ( %2$.1f mi / h)</string>
<string name="description_average_pace_in_minute">Ritmo médio: %1$s min/km ( %2$s min/mi)</string>
<string name="description_average_speed">Velocidade média: %1$.2f km/h ( %2$.1f mi/h)</string>
<string name="description_altitude_gain">Diferença de altitude: %1$d m ( %2$d ft)</string>
<string name="description_average_moving_pace_in_minute">Ritmo médio de deslocamento: %1$s min/km (%2$s min/mi)</string>
<string name="description_average_moving_speed">Velocidade média de deslocamento: %1$.2f km/h (%2$.1f milhas/h)</string>
<string name="description_average_pace_in_minute">Ritmo médio: %1$s min/km (%2$s min/mi)</string>
<string name="description_average_speed">Velocidade média: %1$.2f km/h (%2$.1f milhas/h)</string>
<string name="description_altitude_gain">Ganho de elevação: %1$d m (%2$d pés)</string>
<string name="description_altitude_imperial">Elevação (pés)</string>
<string name="description_altitude_metric">Elevação (m)</string>
<string name="description_fastest_pace_in_minute">Ritmo mais rápido: %1$s min/km (%2$s min/mi)</string>
<string name="description_max_altitude">Altitude máxima: %1$d m ( %2$d ft)</string>
<string name="description_max_speed">Velocidade máxima: %1$.2f km/h ( %2$.1f mi/h)</string>
<string name="description_min_altitude">Altitude mínima: %1$d m ( %2$d ft)</string>
<string name="description_moving_time">Tempo de deslocação: %1$s</string>
<string name="description_max_altitude">Elevação máx.: %1$d m (%2$d pés)</string>
<string name="description_max_speed">Velocidade máx.: %1$.2f km/h (%2$.1f milhas/h)</string>
<string name="description_min_altitude">Elevação mín.: %1$d m (%2$d pés)</string>
<string name="description_moving_time">Tempo de deslocamento: %1$s</string>
<string name="description_pace_imperial">Ritmo (min/mi)</string>
<string name="description_pace_metric">Ritmo (min/km)</string>
<string name="description_recorded_time">Gravado: %1$s</string>
<string name="description_recorded_time">Registro: %1$s</string>
<string name="description_sensor_cadence">Cadência (rpm)</string>
<string name="description_sensor_heart_rate">Ritmo cardíaco (bpm)</string>
<string name="description_sensor_heart_rate">Frequência cardíaca (bpm)</string>
<string name="description_sensor_power">Potência (W)</string>
<string name="description_speed_imperial">Velocidade (mi/h)</string>
<string name="description_speed_imperial">Velocidade (milhas/h)</string>
<string name="description_speed_metric">Velocidade (km/h)</string>
<string name="description_time">Tempo</string>
<string name="description_total_distance">Distância total: %1$.2f km ( %2$.1f mi)</string>
<string name="description_total_distance">Distância total: %1$.2f km (%2$.1f milhas)</string>
<string name="description_total_time">Tempo total: %1$s</string>
<string name="export_progress_message">A exportar para %1$s …</string>
<string name="export_progress_message">Exportando para %1$s…</string>
<string name="generic_add">Adicionar</string>
<string name="generic_delete_selected_confirm_title">Eliminar seleção?</string>
<string name="generic_delete_selected_confirm_title">Excluir selecionados\?</string>
<string name="generic_description">Descrição</string>
<string name="generic_description_line">Descrição: %1$s</string>
<string name="generic_name">Nome</string>
<string name="generic_name_line">Nome: %1$s</string>
<string name="generic_recording">A gravar…</string>
<string name="generic_save">Guardar</string>
<string name="generic_tracks">Percursos</string>
<string name="gps_starting">A iniciar o GPS</string>
<string name="gps_wait_for_better_signal">A aguardar melhor sinal de GPS</string>
<string name="gps_wait_for_signal">A aguardar por sinal de GPS</string>
<string name="generic_recording">Gravando…</string>
<string name="generic_save">Salvar</string>
<string name="generic_tracks">Rotas</string>
<string name="gps_starting">Iniciando GPS</string>
<string name="gps_wait_for_better_signal">Aguardando sinal de GPS melhor</string>
<string name="gps_wait_for_signal">Aguardando sinal de GPS</string>
<string name="image_arrow">Seta</string>
<string name="image_marker">Marcador</string>
<string name="image_marker_count">Contagem do marcador</string>
<string name="image_photo_marker">Marcador de fotografias</string>
<string name="image_photo_marker">Marcador de foto</string>
<string name="image_record">Gravar</string>
<string name="image_stop">Parar</string>
<string name="image_track">Localizar</string>
<string name="import_progress_message">A importar de %1$s…</string>
<string name="marker_add_error">Não é possível inserir um marcador. Sem sinal de GPS. Tente novamente.</string>
<string name="marker_add_success">Foi inserido um marcador</string>
<string name="marker_add_canceled">Cancelado, nenhum marcador adicionado</string>
<string name="marker_delete_one_confirm_message">O marcador será eliminado permanentemente do dispositivo</string>
<string name="marker_delete_one_confirm_title">Eliminar marcador?</string>
<string name="marker_delete_multiple_confirm_message">Os marcadores selecionados serão eliminados permanentemente do dispositivo</string>
<string name="image_track">Rota</string>
<string name="import_progress_message">Importando de %1$s…</string>
<string name="marker_add_error">Não foi possível inserir um marcador. Não há sinal de GPS. Tente novamente.</string>
<string name="marker_add_success">Um marcador foi inserido</string>
<string name="marker_add_canceled">Cancelado. Nenhum marcador foi adicionado</string>
<string name="marker_delete_one_confirm_message">O marcador será excluído permanentemente do dispositivo</string>
<string name="marker_delete_one_confirm_title">Excluir marcador\?</string>
<string name="marker_delete_multiple_confirm_message">Os marcadores selecionados serão permanentemente excluídos do dispositivo</string>
<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 (por exemplo, cascata)</string>
<string name="marker_list_empty_message">Não tem marcadores</string>
<string name="menu_aggregated_statistics">Estatísticas agregadas</string>
<string name="menu_delete">Eliminar</string>
<string name="marker_list_empty_message">Você não tem marcadores</string>
<string name="menu_aggregated_statistics">Estatísticas reunidas</string>
<string name="menu_delete">Excluir</string>
<string name="menu_edit">Editar</string>
<string name="menu_export_all">Exportar tudo</string>
<string name="menu_export_all">Exportar todas</string>
<string name="menu_help">Ajuda</string>
<string name="menu_import_all">Importar tudo</string>
<string name="menu_import_all">Importar todas</string>
<string name="menu_insert_marker">Inserir marcador</string>
<string name="menu_insert_photo">Inserir fotografia</string>
<string name="menu_insert_photo">Inserir foto</string>
<string name="menu_markers">Marcadores</string>
<string name="menu_search">Pesquisar</string>
<string name="menu_select_all">Selecionar tudo</string>
<string name="menu_settings">Definições</string>
<string name="menu_share">Partilhar</string>
<string name="menu_settings">Configurações</string>
<string name="menu_share">Compartilhar</string>
<string name="menu_show_on_map">Mostrar no mapa</string>
<string name="menu_start_gps">Ligar GPS</string>
<string name="menu_stop_gps">Desligar GPS</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Parar GPS</string>
<string name="recording_service">Serviço de gravação</string>
<string name="sensor_state_heart_rate">Frequência cardíaca</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Potência</string>
<string name="sensor_state_power">Alimentação</string>
<string name="settings_advanced">Avançado</string>
<string name="settings_chart_by_distance">Por distância</string>
<string name="settings_chart_by_time">Por tempo</string>
<string name="settings_recording_default_activity_title">Tipo de atividade predefinido</string>
<string name="settings_recording_location_frequency_summary">%1$s entre locais gravados</string>
<string name="settings_recording_max_recording_distance_summary">É criado um novo segmento quando a distância entre os dois locais é superior a %1$s</string>
<string name="settings_recording_default_activity_title">Tipo de atividade padrão</string>
<string name="settings_recording_location_frequency_summary">%1$s entre os locais gravados</string>
<string name="settings_recording_max_recording_distance_summary">Um novo segmento será criado se a distância entre os dois locais for maior que %1$s</string>
<string name="settings_recording_max_recording_distance_title">Distância máxima</string>
<string name="settings_recording_min_recording_distance_title">Distância entre gravações</string>
<string name="settings_recording_min_recording_interval_title">Tempo entre gravações</string>
<string name="settings_recording_min_required_accuracy_summary">A localização é ignorada se a precisão for inferior a %1$s</string>
<string name="settings_recording_min_recording_distance_title">Interv. distância grav</string>
<string name="settings_recording_min_recording_interval_title">Interv. tempo de grav</string>
<string name="settings_recording_min_required_accuracy_summary">O local será ignorado se a precisão for menor que %1$s</string>
<string name="settings_recording_min_required_accuracy_title">Precisão do GPS</string>
<string name="settings_recording_track_name_date_iso_8601_option">Data (ISO 8601)</string>
<string name="settings_recording_track_name_date_local_option">Data (local)</string>
<string name="settings_recording_track_name_number_option">Número</string>
<string name="settings_recording_track_name_title">Nome de percurso predefinido</string>
<string name="settings_reset_confirm_message">Todas as definições são revertidas para os valores predefinidos.</string>
<string name="settings_reset_confirm_title">Repor agora?</string>
<string name="settings_reset_done">Todas as definições foram revertidas para os valores predefinidos</string>
<string name="settings_recording_track_name_title">Nome padrão para trilhas</string>
<string name="settings_reset_confirm_message">Todas as configurações serão revertidas para os valores padrão.</string>
<string name="settings_reset_confirm_title">Redefinir agora\?</string>
<string name="settings_reset_done">Todas as configurações foram revertidas para os valores padrão</string>
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_stats_rate_title">Avaliação preferida</string>
<string name="settings_stats_rate_title">Taxa preferencial</string>
<string name="settings_stats_units_imperial">Imperial (milhas, pés)</string>
<string name="settings_stats_units_metric">Métrico (km, m)</string>
<string name="settings_stats_units_title">Unidades preferidas</string>
<string name="share_track_share_file_body">Acho que pode estar interessado neste percurso.\n\nPara ver este percurso, utilize o Google Earth ou outro software de mapeamento.\n\n%1$s</string>
<string name="share_track_subject">Gostaria de partilhar um percurso consigo</string>
<string name="stats_average_moving_pace">Espaço médio de deslocação</string>
<string name="stats_average_moving_speed">Velocidade média de deslocação</string>
<string name="settings_stats_units_metric">Métrica (km, m)</string>
<string name="settings_stats_units_title">Unidades preferenciais</string>
<string name="share_track_share_file_body">Achei que você pudesse se interessar por essa trilha.
\n
\n%1$s</string>
<string name="share_track_subject">Eu gostaria de compartilhar uma trilha com você</string>
<string name="stats_average_moving_pace">Ritmo médio de movimentação</string>
<string name="stats_average_moving_speed">Velocidade média de movimentação</string>
<string name="stats_average_pace">Ritmo médio</string>
<string name="stats_average_speed">Velocidade média</string>
<string name="stats_altitude">Elevação</string>
@@ -175,39 +177,39 @@
<string name="stats_gain">Ganho</string>
<string name="stats_latitude">Latitude</string>
<string name="stats_longitude">Longitude</string>
<string name="stats_max_speed">Velocidade máx.</string>
<string name="stats_moving_time">Tempo em movimento</string>
<string name="stats_max_speed">Velocidade máx</string>
<string name="stats_moving_time">Tempo decorrido</string>
<string name="stats_pace">Ritmo</string>
<string name="stats_speed">Velocidade</string>
<string name="stats_distance">Distância</string>
<string name="stats_total_time">Tempo total</string>
<string name="track_name_format">Trajeto %1$d</string>
<string name="track_markers">Marcadores %1$s</string>
<string name="track_delete_one_confirm_message">O percurso e respetivos marcadores são eliminados permanentemente do dispositivo.</string>
<string name="track_delete_one_confirm_title">Eliminar percurso?</string>
<string name="track_delete_multiple_confirm_message">Os percursos selecionados e respetivos marcadores serão eliminados permanentemente do dispositivo.</string>
<string name="track_delete_progress_message">A eliminar…</string>
<string name="track_name_format">Trilha %1$d</string>
<string name="track_markers">Marcadores de %1$s</string>
<string name="track_delete_one_confirm_message">A trilha e seus marcadores serão excluídos permanentemente do dispositivo.</string>
<string name="track_delete_one_confirm_title">Excluir rota\?</string>
<string name="track_delete_multiple_confirm_message">As trilhas selecionadas e seus respectivos marcadores serão excluídos permanentemente do dispositivo.</string>
<string name="track_delete_progress_message">Excluindo…</string>
<string name="track_detail_stats_tab">Estatísticas</string>
<string name="track_edit_activity_type">Tipo de atividade (por exemplo, caminhada)</string>
<string name="track_edit_activity_type_hint">Tipo de atividade</string>
<string name="track_list_empty_message">Comece a gravar a sua próxima aventura aqui</string>
<string name="track_list_empty_message">Comece a gravar sua próxima aventura aqui</string>
<string name="unit_feet">pés</string>
<string name="unit_kilometer">km</string>
<string name="unit_kilometer_per_hour">km/h</string>
<string name="unit_meter">m</string>
<string name="unit_mile">mi</string>
<string name="unit_mile_per_hour">mi/h</string>
<string name="unit_mile">milhas</string>
<string name="unit_mile_per_hour">milhas/h</string>
<string name="unit_minute_per_kilometer">min/km</string>
<string name="unit_minute_per_mile">min/milha</string>
<string name="unit_minute_per_mile">min/milhas</string>
<string name="value_integer_feet_excellent_gps">%1$d pés (GPS excelente)</string>
<string name="value_integer_feet_recommended">%1$d pés (recomendado)</string>
<string name="value_integer_kilometer_hour">%1$d km/h</string>
<string name="value_integer_meter_excellent_gps">%1$d m (GPS excelente)</string>
<string name="value_integer_meter_poor_gps">%1$d m (GPS fraco)</string>
<string name="value_integer_meter_poor_gps">%1$d m (GPS com sinal baixo)</string>
<string name="value_integer_meter_recommended">%1$d m (recomendado)</string>
<string name="value_integer_mile_hour">%1$d mi/h</string>
<string name="value_integer_mile_hour">%1$d milhas/h</string>
<string name="value_integer_minute">%1$d min</string>
<string name="value_integer_second">%1$d seg</string>
<string name="value_integer_second">%1$d s</string>
<string name="value_none">Nenhuma</string>
<string name="value_off">Desativar</string>
<string name="value_smallest_recommended">Menor (recomendado)</string>
@@ -224,62 +226,333 @@
<item quantity="other">%1$d segundos</item>
</plurals>
<plurals name="voiceSpeedKilometersPerHour">
<item quantity="one">%1$.1f quilômetro por hora</item>
<item quantity="one">%1$.1f quilómetro por hora</item>
<item quantity="other">%1$.1f quilómetros por hora</item>
</plurals>
<plurals name="voiceSpeedMilesPerHour">
<item quantity="one">%1$.1f milha por hora</item>
<item quantity="other">%1$.1f milhas por hora</item>
</plurals>
<string name="waypoint_type_atm">Multibanco</string>
<string name="waypoint_type_atm">caixa eletrônico</string>
<string name="waypoint_type_bank">banco</string>
<string name="waypoint_type_bar">bar</string>
<string name="waypoint_type_barbecue">churrasco</string>
<string name="waypoint_type_building">edifício</string>
<string name="waypoint_type_bus_stop">paragem de autocarro</string>
<string name="waypoint_type_cafe">café</string>
<string name="waypoint_type_building">construção</string>
<string name="waypoint_type_bus_stop">ponto de ônibus</string>
<string name="waypoint_type_cafe">cafeteria</string>
<string name="waypoint_type_campfire">fogueira</string>
<string name="waypoint_type_campground">parque de campismo</string>
<string name="waypoint_type_campground">acampamento</string>
<string name="waypoint_type_church">igreja</string>
<string name="waypoint_type_coffee_house">café</string>
<string name="waypoint_type_coffee_house">cafeteria</string>
<string name="waypoint_type_convenience_store">loja de conveniência</string>
<string name="waypoint_type_drinking_water">água potável</string>
<string name="waypoint_type_falling_rocks">queda de pedras</string>
<string name="waypoint_type_ferry">ferry</string>
<string name="waypoint_type_falling_rocks">área com desmoronamento</string>
<string name="waypoint_type_ferry">balsa</string>
<string name="waypoint_type_fire_place">lareira</string>
<string name="waypoint_type_fire_station">quartel de bombeiros</string>
<string name="waypoint_type_fire_station">bombeiros</string>
<string name="waypoint_type_fishing">pesca</string>
<string name="waypoint_type_gas_station">estação de serviço</string>
<string name="waypoint_type_gas_station">posto de gasolina</string>
<string name="waypoint_type_golf_course">campo de golfe</string>
<string name="waypoint_type_grocery_store">mercearia</string>
<string name="waypoint_type_grocery_store">supermercado</string>
<string name="waypoint_type_hair_dresser">cabeleireiro</string>
<string name="waypoint_type_harbor">porto</string>
<string name="waypoint_type_hiking_path">trilho de caminhada</string>
<string name="waypoint_type_hiking_path">trilha para caminhada</string>
<string name="waypoint_type_hotel">hotel</string>
<string name="waypoint_type_house">casa</string>
<string name="waypoint_type_information">informação</string>
<string name="waypoint_type_intersection">intersecção</string>
<string name="waypoint_type_information">informações</string>
<string name="waypoint_type_intersection">cruzamento</string>
<string name="waypoint_type_mail_box">caixa de correio</string>
<string name="waypoint_type_market">mercado</string>
<string name="waypoint_type_meeting_point">ponto de encontro</string>
<string name="waypoint_type_opera">ópera</string>
<string name="waypoint_type_parking">estacionamento</string>
<string name="waypoint_type_police_station">esquadra da polícia</string>
<string name="waypoint_type_post_office">correios</string>
<string name="waypoint_type_police_station">delegacia</string>
<string name="waypoint_type_post_office">correio</string>
<string name="waypoint_type_pothole">buraco</string>
<string name="waypoint_type_railway_crossing">travessia ferroviária</string>
<string name="waypoint_type_railway_crossing">travessia de via férrea</string>
<string name="waypoint_type_restaurant">restaurante</string>
<string name="waypoint_type_shopping">compras</string>
<string name="waypoint_type_sight">paisagem</string>
<string name="waypoint_type_sight">vista</string>
<string name="waypoint_type_store">loja</string>
<string name="waypoint_type_swimming_pool">piscina</string>
<string name="waypoint_type_telephone">telefone</string>
<string name="waypoint_type_theater">cinema</string>
<string name="waypoint_type_toilet">WC</string>
<string name="waypoint_type_theater">teatro</string>
<string name="waypoint_type_toilet">banheiro</string>
<string name="waypoint_type_tourist_information">informações turísticas</string>
<string name="waypoint_type_tree">árvore</string>
<string name="waypoint_type_tunnel">túnel</string>
<string name="waypoint_type_waterfall">queda de água</string>
<string name="waypoint_type_waterfall">Cascata</string>
<string name="waypoint_type_water_fountain">fonte de água</string>
<string name="waypoint_type_waypoint">ponto de referência</string>
</resources>
<string name="about_preference_title">Sobre o OpenTracks</string>
<string name="about_description"><i>OpenTracks</i> é uma aplicação de rastreamento de desportes que respeita totalmente a sua privacidade.</string>
<string name="about_url">Página do projeto: <a href="%1$s">%1$s</a></string>
<string name="about_third_party_data">Dados de terceiros</string>
<string name="help_track_map_title">Como mostrar uma pista num mapa\?</string>
<string name="help_storage_pictures_title">Como o OpenTracks armazena fotos tiradas como marcadores\?</string>
<string name="help_storage_pictures_content">Eles são armazenados no armazenamento interno da app (ou seja, acessíveis apenas no OpenTracks).</string>
<string name="help_data_google_play_services_title">O OpenTracks requer/usa o Google Play Services\?</string>
<string name="help_data_google_play_services_content">Não</string>
<string name="help_recording_title">Como o OpenTracks regista dados\?</string>
<string name="help_support_title">Como posso oferecer suporte a OpenTracks\?</string>
<string name="open_track_as_KML">Abrir como KML</string>
<string name="open_track_as_GPX">Abrir como GPX</string>
<string name="open_track_as_trackfileformat">Abrir como %1$s</string>
<string name="activity_type_escooter">escolta</string>
<string name="activity_type_swimming_open">nadando em águas abertas</string>
<string name="export_progress_summary_skip_msg">Trilhas puladas</string>
<string name="export_progress_summary_errors_msg">Erros</string>
<string name="generic_open_track">Trilho aberto</string>
<string name="sensor_state_cadence_max">Ritmo cardíaco médio</string>
<string name="sensor_state_heart_rate_avg">Ritmo cardíaco Avg</string>
<string name="sensor_state_heart_rate_max">Freqüência cardíaca máxima</string>
<string name="settings_default_trackfileformat">Exportar/compartilhar formato de ficheiro</string>
<string name="settings_export_filename_title">Formato do nome do ficheiro</string>
<string name="settings_recording_customize_layout_title">Personalize o seu layout de gravação</string>
<string name="settings_recording_customize_layout_select_columns">Campos de dados por linha</string>
<string name="settings_recording_show_on_lockscreen_while_recording_title">Mostrar estatísticas no ecrã de bloqueio</string>
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Durante a gravação, mostre estatísticas sem desbloquear o aparelho.</string>
<string name="settings_recording_fullscreen_on_while_recording_title">Ecrã inteiro</string>
<string name="settings_night_mode_option_day">Dia</string>
<string name="settings_announcements_totaltime_frequency">Intervalo de tempo</string>
<string name="settings_announcements_distance_frequency">Intervalo de distância</string>
<string name="settings_announcements_average_heart_rate">Frequência cardíaca média</string>
<string name="settings_announcements_lap_speed_pace">Velocidade/ritmo de volta</string>
<string name="custom_layout_list_title">Estrutura</string>
<string name="custom_layout_list_edit_name">Digite o nome do layout a ser adicionado</string>
<string name="custom_layout_list_layout_removed">Layout foi removido</string>
<string name="settings_layout_reset_confirm_message">Todas as configurações de layout serão revertidas para os valores padrão. Isso não excluirá nenhuma trilha do aparelho.</string>
<string name="settings_layout_reset_confirm_title">Redefinir os seus layouts\?</string>
<string name="settings_all_reset">Redefinir</string>
<string name="settings_stats_units_nautical">Milha náutica (NM, ft)</string>
<string name="settings_api_title">API pública</string>
<string name="settings_public_api_package_title">Nome do pacote para API pública</string>
<string name="settings_public_api_enabled_summary_on">Outras aplicações instaladas podem iniciar ou interromper gravações.</string>
<string name="track_recording_notification_accuracy">Precisão da localização: %1$s</string>
<string name="unit_nautical_mile">NM</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="value_integer_knots">%1$d nós</string>
<string name="average_heart_rate">Frequência cardíaca média</string>
<string name="current_heart_rate">Frequência cardíaca atual</string>
<string name="share_image_subject">Gostaria de compartilhar uma imagem consigo</string>
<string name="field_remove_from_layout">Remover</string>
<string name="about_libraries">Bibliotecas</string>
<string name="help_feature_title">OpenTracks tem os seguintes recursos:</string>
<string name="help_feature_content">* criar pistas GPS
\n * utilizar um sensor do ritmo cardíaco (apenas Bluetooth LE)
\n * anúncios de voz (por tempo ou distância)
\n * criar marcadores (incl. imagens)
\n * funciona completamente offline
\n * mostrar pistas num mapa (ver abaixo)</string>
<string name="about_version_name">Nome da versão: %1$s</string>
<string name="about_version_code">Código da versão: %1$d</string>
<string name="about_history">OpenTracks é um fork do <a href="https://code.google.com/archive/p/mytracks/"><i>Google\'s MyTracks</i></a> (descontinuado em 2016).</string>
<string name="help_track_export_title">Como posso exportar/compartilhar trilhas gravadas\?</string>
<string name="help_track_export_content"> As trilhas podem ser exportadas das configurações como KMZ, KML ou GPX. KMZ/KML todos os dados; Localizações apenas GPX. As trilhas compartilhadas por meio do <i>ícone de compartilhamento</i> são compartilhadas como KMZ. </string>
<string name="help_track_map_content"> Utilize o pequeno ícone do mapa.
\n a) (actualizações ao vivo) Instalar <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. Fornece mapas online ou offline através de <a href="https://www.openstreetmap.org">OpenStreetMap</a>.
\n Na verdade, o OSMDashboard é uma aplicação separada que só pode aceder (temporariamente) aos dados da(s) faixa(s) que vão ser mostrados.
\n b) Através de uma aplicação de mapa normal (por exemplo, <a href="http://osmand.net/">OsmAnd</a> e <a href="https://maps.me/">MAPS.ME</a>). Estas aplicações precisam de suportar o formato de ficheiro KMZ (apenas locais e timestamps). De facto, uma aplicação precisa de suportar <i>ACTION_VIEW</i> com MIME <i>application/vnd.google-earth.kmz</i>. </string>
<string name="help_recording_content">OpenTracks usa o sensor GPS do aparelho para registar a localização continuamente. Se o aparelho GPS relatar dados imprecisos (por exemplo, localização, velocidade, elevação), o OpenTracks não pode fazer nada a respeito.</string>
<string name="help_data_storage_title">Como o OpenTracks armazena dados do sensor\?</string>
<string name="help_data_storage_content"> Os dados do sensor são armazenados por local registado. Em termos de sensor de frequência cardíaca, isso significa que apenas <i>uma</i> medição de frequência cardíaca é armazenada por local. Se estiver parado ou dentro de casa, nenhum dado do sensor será registrdo (mas será mostrado). </string>
<string name="help_gps_troubleshooting_title">OpenTracks não está gravando locais\?</string>
<string name="help_gps_troubleshooting_content"> O que se pode fazer:
\n a) verificar se o GPS está activado,
\n b) melhorar a recepção GPS (por exemplo, ir para o exterior),
\n c) verificar com <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a> app, e
\n d) desactivar a poupança de energia.
\n
\n Se tudo isto não ajudar, por favor, informe um erro. </string>
<string name="help_support_content"> Pode:
\n a) espalhar a palavra sobre OpenTracks,
\n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">propose features</a>,
\n c) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">reportar bugs</a>,
\n d) ajuda no desenvolvimento de software,
\n e) comprar em <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
\n f) doar, e
\n g) fazer o que achar que ajuda a OpenTracks. </string>
<string name="activity_type_swimming">natação</string>
<string name="activity_type_workout">treino</string>
<string name="description_altitude_loss">Perda de elevação: %1$d m (%2$d ft)</string>
<string name="description_speed_ms">Velocidade (m/s)</string>
<string name="description_pace_nautical">Ritmo (min/NM)</string>
<string name="description_default_speed_or_pace">Por tipo de atividade</string>
<string name="description_speed_nautical">Velocidade (nós)</string>
<string name="description_speed_source_gps">GPS</string>
<string name="export_with_photos">com fotos</string>
<string name="export_without_photos">sem fotos</string>
<string name="export_error_post_workout">A exportação pós-treino falhou, verifique o diretório de exportação.</string>
<string name="export_cannot_write_to_dir">Não é possível escrever ao diretório de exportação.</string>
<string name="export_dir_not_writable">" (não se escreve!)"</string>
<string name="export_track_already_exists_msg">A trilha %1$s já existe no diretório de destino.</string>
<string name="export_all_do_it_for_all">faça isso para todos os conflitos</string>
<string name="export_track_errors">Trilhas não exportadas</string>
<string name="export_progress_summary_new_msg">Novas trilhas exportadas</string>
<string name="export_progress_summary_overwrite_msg">Trilhas sobrescritas</string>
<string name="generic_overwrite">Sobrescrever</string>
<string name="generic_skip">Pular</string>
<string name="generic_separator_done_total">/</string>
<string name="generic_show_errors">Mostrar erros</string>
<plurals name="generic_completed_with_errors">
<item quantity="one">Concluído com %1$d erro</item>
<item quantity="other">Concluído com %1$d erros</item>
</plurals>
<string name="generic_completed">Concluído</string>
<string name="generic_click_twice_cancel">Clique novamente para cancelar</string>
<string name="generic_undo">Desfazer</string>
<string name="generic_choose_an_option">Escolha uma opção</string>
<string name="generic_filter">Filtro</string>
<string name="generic_from">De</string>
<string name="generic_to">Para</string>
<string name="generic_today">Hoje</string>
<string name="generic_yesterday">Ontem</string>
<string name="generic_dismiss">Dispensar</string>
<string name="gps_disabled_msg">GPS desativado</string>
<string name="gps_fixed_and_ready">GPS corrigido e pronto</string>
<string name="gps_recording_status">%1$s: %2$s</string>
<string name="gps_recording_without_signal">O OpenTracks está gravando sem dados de GPS.</string>
<string name="image_discard">Descartar</string>
<string name="import_thread_interrupted">Tópico interrompido</string>
<string name="import_unsupported_format">Formato de ficheiro não suportado</string>
<string name="import_parser_error">Erro do analisador: %1$s</string>
<string name="import_unable_to_import_file">Não foi possível importar o ficheiro: %1$s</string>
<string name="import_no_kml_file_found">Nenhum ficheiro doc.kml encontrado no KMZ</string>
<string name="import_error_info">%1$s: %2$s</string>
<string name="import_error_list_dialog_title">Ficheiros não importados</string>
<string name="import_file_imported">Ficheiro %1$s importado</string>
<string name="import_prevent_reimport">Definiu evitar reimportar a trilha</string>
<string name="import_progress_summary_ok_msg">Ficheiros importados</string>
<string name="import_progress_summary_exists_msg">Já existe</string>
<string name="import_progress_summary_errors_msg">Erros</string>
<string name="marker_add_photo_canceled">Cancelado, nenhum marcador de foto adicionado</string>
<string name="menu_insert_gallery_img">Inserir imagem da galeria</string>
<string name="menu_select_layout">Selecione o layout</string>
<string name="menu_voice_rate">Velocidade da voz</string>
<string name="menu_resume_track">Retomar trilha</string>
<string name="menu_add_custom_layout">Novo Layout</string>
<string name="menu_filter">Filtro</string>
<string name="delete_service">Serviço de exclusão</string>
<string name="permission_gps_failed">OpenTracks requer permissão para usar GPS.</string>
<string name="permission_bluetooth_failed">OpenTracks requer permissão para usar Bluetooth.</string>
<string name="sensor_state_cadence_avg">Avg Cadência</string>
<string name="permission_bluetooth_failed_rejected">Precisa conceder acesso ao OpenTracks manualmente para aparelhos próximos nas configurações do sistema.</string>
<string name="sensor_state_power_avg">Energia Avg</string>
<string name="sensor_could_not_scan">Não foi possível procurar aparelhos Bluetooth (erro %1$i).</string>
<string name="bluetooth_disabled">Ative o Bluetooth.</string>
<string name="settings_open_tracks_title">Trilhas abertas</string>
<string name="settings_open_tracks_summary">Tudo sobre o Projeto OpenTracks</string>
<string name="settings_defaults_title">Unidades e Atividade Default</string>
<string name="settings_defaults_summary">Unidades Preferidas, Atividade Padrão, Nome Padrão da Pista</string>
<string name="settings_ui_title">Interface do utilizador</string>
<string name="settings_ui_summary">Aparência, Layout de gravação, Tema</string>
<string name="settings_gps_title">GPS</string>
<string name="settings_gps_summary">Intervalo de tempo, Intervalo de distância, Distância máxima, Precisão</string>
<string name="settings_sensors_title">Sensores Bluetooth</string>
<string name="settings_sensors_summary">Voice announcements</string>
<string name="settings_announcements_title">Anúncios de voz</string>
<string name="settings_announcements_summary">Tempo, distância, velocidade da voz</string>
<string name="settings_import_export_title">Importar/Exportar</string>
<string name="settings_import_export_summary">Importar, Exportar, Auto Export</string>
<string name="settings_units_category">Unidades</string>
<string name="settings_activity_defaults_category">Defaults da atividade</string>
<string name="settings_reset_summary">Redefinir configurações para valores padrão</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Mantenha o ecrã ligada</string>
<string name="settings_recording_fullscreen_on_while_recording_summary">Durante a gravação, apresente em ecrã inteiro.</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Durante a gravação, mantenha o ecrã ligado.</string>
<string name="settings_recording_idle_speed_title">Limite de velocidade de marcha lenta</string>
<string name="settings_night_mode_title">Tema UI</string>
<string name="settings_night_mode_option_system">Sistema</string>
<string name="settings_night_mode_option_night">Noite</string>
<string name="settings_announcements_lap_heart_rate">Frequência cardíaca da volta</string>
<string name="settings_announcements_average_speed_pace">Velocidade/ritmo médio</string>
<string name="custom_layout_list_edit_already_exists">O nome do layout já existe</string>
<string name="custom_layout_select_layout">Selecionar layout</string>
<string name="settings_layout_reset_done">Todas as configurações de layout foram revertidas para os valores padrão</string>
<string name="settings_generic_sensor">Genérico</string>
<string name="stats_custom_layout_default_layout">Layout padrão</string>
<string name="settings_layout_reset">Redefinir layout personalizado</string>
<string name="settings_cycling_sensor">Ciclismo</string>
<string name="settings_running_sensor">Correndo</string>
<string name="settings_sensor_cycling_distance_speed">Distância e velocidade</string>
<string name="settings_sensor_cycling_cadence">Cadência</string>
<string name="settings_sensor_running_speed_and_cadence">Distância, velocidade e cadência</string>
<string name="settings_sensor_wheel_circumference">Circunferência da Roda (mm)</string>
<string name="settings_sensor_bluetooth_service_filter_enabled">Mostrar apenas aparelhos Bluetooth que anunciam os serviços necessários</string>
<string name="settings_public_api_enabled_summary_off">Apenas o OpenTracks pode iniciar e parar gravações.</string>
<string name="settings_public_api_enabled_title">API pública</string>
<string name="settings_public_api_disabled_toast">A API pública do OpenTracks está desativada: pode ser ativada nas configurações.</string>
<string name="settings_public_api_dashboard_enabled_title">Transferência automática de dados</string>
<string name="settings_public_api_dashboard_enabled_summary_on">Uma aplicação que iniciou uma gravação também pode acessar os dados gravados.</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Os dados gravados não serão compartilhados automaticamente com outras aplicações.</string>
<string name="settings_import_section">Importar</string>
<string name="settings_export_section">Exportar</string>
<string name="settings_prevent_reimport_tracks_title">Impedir a reimportação de trilhas</string>
<string name="stats_loss">Perda</string>
<string name="stats_coordinates">Latitude/Longitude</string>
<string name="stats_split_interval">Intervalo de divisão</string>
<string name="stats_sensors_power">Poder</string>
<string name="stats_clock">Relógio</string>
<string name="stats_sensors_heart_rate">Frequência cardíaca</string>
<string name="stats_sensors_cadence">Cadência</string>
<string name="track_distance_notification">Distância: %1$s</string>
<string name="track_speed_notification">Velocidade: %1$s</string>
<string name="track_pace_notification">Parcela: %1$s</string>
<string name="track_delete_number_of_tracks">%1$d trilhas</string>
<string name="track_detail_intervals_tab">intervalos</string>
<string name="aggregated_stats_empty_message">Registe a sua primeira trilha para ver as estatísticas agregadas</string>
<string name="track_delete_not_recording">Esta trilha não pode ser excluída porque está gravada no momento.</string>
<string name="track_discarding">Descartando trilha</string>
<string name="aggregated_stats_filter_no_results">Não há atividades para o filtro especificado</string>
<string name="interval_list_empty_message">Não há nenhum intervalo ainda</string>
<string name="unit_knots">kn</string>
<string name="location_coordinate">%1$s°</string>
<string name="unit_minute_per_nautical_mile">min/NM</string>
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
<string name="value_float_kilometer_hour_recommended">%1$.1f km/h (Recomendado)</string>
<string name="value_float_mile_hour">%1$.1f mi/h</string>
<string name="value_float_knots">%1$.1f nós</string>
<string name="value_float_mile_hour_recommended">%1$.1f mi/h (Recomendado)</string>
<string name="value_float_knots_recommended">%1$.1f nós (recomendado)</string>
<plurals name="voiceSpeedMKnots">
<item quantity="one">%1$.1f nó</item>
<item quantity="other">%1$.1f nós</item>
</plurals>
<string name="voice_per_kilometer">por quilômetro</string>
<string name="voice_per_mile">por milha</string>
<string name="voice_per_nautical_mile">por milha náutica</string>
<string name="lap_time">Tempo da volta</string>
<string name="pace">Ritmo</string>
<string name="lap_speed">Velocidade da volta</string>
<string name="speed">Velocidade</string>
<string name="total_distance">Distância total</string>
<plurals name="voiceDistanceKilometers">
<item quantity="one">%1$.1f quilómetro</item>
<item quantity="other">%1$.1f quilómetros</item>
</plurals>
<plurals name="voiceDistanceMiles">
<item quantity="one">%1$.1f milha</item>
<item quantity="other">%1$.1f milhas</item>
</plurals>
<plurals name="voiceDistanceNauticalMiles">
<item quantity="one">%1$.1f milha náutica</item>
<item quantity="other">%1$.1f milhas náuticas</item>
</plurals>
<string name="share_image_body">Acho que pode estar interessado nesta imagem.</string>
<string name="hold_to_stop">Segure para parar</string>
<string name="instant_export_enabled_summary">Exportar trilha para armazenamento depois que a gravação for concluída</string>
<string name="instant_export_enabled_title">Exportação instantânea pós-treino</string>
<string name="field_set_primary">Primário</string>
<string name="settings_default_export_uri_title">Diretório de exportação de trilhas</string>
<string name="field_set_secondary">Secundário</string>
<string name="no_compatible_file_manager_installed">Nenhum gestor de ficheiros compatível instalado</string>
<string name="error_crash_title">%1$s falharam</string>
<string name="share_crash_report">Compartilhar relatório de falha</string>
<string name="report_bug">Relatório de problema</string>
<string name="select_show_on_map_behavior">Selecionar comportamento de \"mostrar no mapa\"</string>
<string name="show_on_map_format_ask">Perguntas</string>
<string name="show_on_dashboard">Painel API do OpenTracks</string>
<string name="always">Sempre</string>
<string name="show_on_dashboard_not_installed">Nenhuma aplicação compatível com o painel API do OpenTracks instalado.</string>
<string name="introduction_osm_dashboard">O próprio OpenTracks não fornece um mapa. Instale o OSMDashboard para visualizar as suas gravações num mapa.</string>
</resources>
-1
View File
@@ -61,5 +61,4 @@ limitations under the License.
<color name="heart_rate_zone_textcolor_4">#FFBD04</color>
<color name="heart_rate_zone_textcolor_3">#6ACC2B</color>
<color name="heart_rate_zone_textcolor_2">#64D1FD</color>
<color name="heart_rate_zone_textcolor_1">@color/opentracks_on_primary_color</color>
</resources>
-69
View File
@@ -64,75 +64,6 @@
<!-- Stats layout customization default layout -->
<string name="default_activity_key" translatable="false">defaultActivity</string>
<string name="default_activity_default" translatable="false">@string/activity_type_unknown</string>
<string-array name="activity_types">
<item>@string/default_activity_default</item>
<item>@string/activity_type_airplane</item>
<item>@string/activity_type_atv</item>
<item>@string/activity_type_biking</item>
<item>@string/activity_type_blimp</item>
<item>@string/activity_type_boat</item>
<item>@string/activity_type_climbing</item>
<item>@string/activity_type_commercial_airplane</item>
<item>@string/activity_type_cross_country_skiing</item>
<item>@string/activity_type_cycling</item>
<item>@string/activity_type_dirt_bike</item>
<item>@string/activity_type_donkey_back_riding</item>
<item>@string/activity_type_driving</item>
<item>@string/activity_type_driving_bus</item>
<item>@string/activity_type_driving_car</item>
<item>@string/activity_type_ferry</item>
<item>@string/activity_type_frisbee</item>
<item>@string/activity_type_gliding</item>
<item>@string/activity_type_hang_gliding</item>
<item>@string/activity_type_helicopter</item>
<item>@string/activity_type_hiking</item>
<item>@string/activity_type_horse_back_riding</item>
<item>@string/activity_type_hot_air_balloon</item>
<item>@string/activity_type_ice_sailing</item>
<item>@string/activity_type_inline_skating</item>
<item>@string/activity_type_kayaking</item>
<item>@string/activity_type_kite_surfing</item>
<item>@string/activity_type_land_sailing</item>
<item>@string/activity_type_mixed_type</item>
<item>@string/activity_type_motor_bike</item>
<item>@string/activity_type_motor_boating</item>
<item>@string/activity_type_mountain_biking</item>
<item>@string/activity_type_off_trail_hiking</item>
<item>@string/activity_type_other</item>
<item>@string/activity_type_paddling</item>
<item>@string/activity_type_para_gliding</item>
<item>@string/activity_type_rc_airplane</item>
<item>@string/activity_type_rc_boat</item>
<item>@string/activity_type_rc_helicopter</item>
<item>@string/activity_type_riding</item>
<item>@string/activity_type_road_biking</item>
<item>@string/activity_type_roller_skiing</item>
<item>@string/activity_type_rowing</item>
<item>@string/activity_type_running</item>
<item>@string/activity_type_sailing</item>
<item>@string/activity_type_seaplane</item>
<item>@string/activity_type_skate_boarding</item>
<item>@string/activity_type_skating</item>
<item>@string/activity_type_skiing</item>
<item>@string/activity_type_sky_jumping</item>
<item>@string/activity_type_sled</item>
<item>@string/activity_type_snow_boarding</item>
<item>@string/activity_type_snow_shoeing</item>
<item>@string/activity_type_speed_walking</item>
<item>@string/activity_type_street_running</item>
<item>@string/activity_type_surfing</item>
<item>@string/activity_type_track_cycling</item>
<item>@string/activity_type_track_running</item>
<item>@string/activity_type_trail_hiking</item>
<item>@string/activity_type_trail_running</item>
<item>@string/activity_type_train</item>
<item>@string/activity_type_ultimate_frisbee</item>
<item>@string/activity_type_wakeboarding</item>
<item>@string/activity_type_walking</item>
<item>@string/activity_type_water_skiing</item>
<item>@string/activity_type_wind_surfing</item>
</string-array>
<string name="recording_distance_interval_key" translatable="false">recordingDistanceInterval</string>
<string name="recording_distance_interval_default" translatable="false">10</string>