mirror of
https://codeberg.org/OpenTracksApp/OpenTracks.git
synced 2026-10-23 02:35:18 +02:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 374656aa6b | |||
| c623475c95 | |||
| 316e21a2c4 | |||
| 9dedfb38bc | |||
| eb7552acdb | |||
| 79729cd4a7 | |||
| 12c2c7cae0 | |||
| 504e27a9df | |||
| 5fbc079d96 | |||
| 54fb70053c | |||
| ea7d754482 | |||
| 1647b821e6 | |||
| 5ced5e2c0b | |||
| 31ea1348de | |||
| 3995e2b609 | |||
| eddf6ffc04 | |||
| 88b860af5a | |||
| 1708e09c5a |
+4
-4
@@ -6,7 +6,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.2.0-beta04'
|
||||
classpath 'com.android.tools.build:gradle:8.2.0-beta06'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,8 +64,8 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "de.dennisguse.opentracks"
|
||||
versionCode 5447
|
||||
versionName "v4.9.1"
|
||||
versionCode 5465
|
||||
versionName "v4.9.2"
|
||||
|
||||
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
|
||||
|
||||
@@ -141,7 +141,7 @@ dependencies {
|
||||
androidTestImplementation 'androidx.test:rules:1.5.0'
|
||||
androidTestImplementation 'androidx.test:runner:1.5.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||
androidTestImplementation 'org.mockito:mockito-android:5.5.0'
|
||||
androidTestImplementation 'org.mockito:mockito-android:5.6.0'
|
||||
|
||||
androidTestUtil 'androidx.test:orchestrator:1.4.2'
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Un amic rastrejador esportiu que respecta la vostra privadesa.
|
||||
@@ -0,0 +1,9 @@
|
||||
v4.9.2: OpenTracks
|
||||
|
||||
Changes:
|
||||
- Option to use Android 12's Dynamic Color (Material Design)
|
||||
- Android 14's Predictive Back for some activities
|
||||
|
||||
Bugfix:
|
||||
- Settings for total distance voice announcement was accidentially removed
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -83,7 +83,8 @@ done
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
@@ -69,6 +69,7 @@ limitations under the License.
|
||||
android:allowBackup="true"
|
||||
android:fullBackupContent="@xml/backup_rules_30_lower"
|
||||
android:dataExtractionRules="@xml/backup_rules_31_higher"
|
||||
android:enableOnBackInvokedCallback="true"
|
||||
android:hardwareAccelerated="true"
|
||||
android:hasFragileUserData="false"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
|
||||
@@ -40,7 +40,7 @@ public abstract class AbstractActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
public boolean onSupportNavigateUp() {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ import android.os.Build;
|
||||
import android.os.StrictMode;
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.android.material.color.DynamicColors;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||
@@ -28,6 +30,11 @@ public class Startup extends Application {
|
||||
|
||||
// Include version information into stack traces.
|
||||
Log.i(TAG, BuildConfig.APPLICATION_ID + "; BuildType: " + BuildConfig.BUILD_TYPE + "; VersionName: " + BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_NAME_FULL + " VersionCode: " + BuildConfig.VERSION_CODE);
|
||||
// In debug builds: show thread and VM warnings.
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "Enabling strict mode");
|
||||
StrictMode.enableDefaults();
|
||||
}
|
||||
|
||||
PreferencesUtils.initPreferences(this, getResources());
|
||||
// Set default values of preferences on first start.
|
||||
@@ -35,11 +42,8 @@ public class Startup extends Application {
|
||||
PreferencesUtils.applyDefaultUnit();
|
||||
PreferencesUtils.applyNightMode();
|
||||
|
||||
|
||||
// In debug builds: show thread and VM warnings.
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "Enabling strict mode");
|
||||
StrictMode.enableDefaults();
|
||||
if (PreferencesUtils.shouldUseDynamicColors()) {
|
||||
DynamicColors.applyToActivitiesIfAvailable(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -307,6 +307,11 @@ public class PreferencesUtils {
|
||||
return getBoolean(R.string.stats_fullscreen_while_recording_key, DEFAULT);
|
||||
}
|
||||
|
||||
public static boolean shouldUseDynamicColors() {
|
||||
final boolean DEFAULT = resources.getBoolean(R.bool.settings_ui_dynamic_colors_default);
|
||||
return getBoolean(R.string.settings_ui_dynamic_colors_key, DEFAULT);
|
||||
}
|
||||
|
||||
public static boolean shouldVoiceAnnouncementOnDeviceSpeaker() {
|
||||
final boolean DEFAULT = resources.getBoolean(R.bool.voice_on_device_speaker_default);
|
||||
return getBoolean(R.string.voice_on_device_speaker_key, DEFAULT);
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.settings;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
@@ -34,6 +35,9 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
||||
return true;
|
||||
});
|
||||
|
||||
Preference dynamicColors = findPreference(getString(R.string.settings_ui_dynamic_colors_key));
|
||||
dynamicColors.setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU);
|
||||
|
||||
setShowOnMapFormatOptions();
|
||||
}
|
||||
|
||||
|
||||
@@ -245,7 +245,7 @@ public class TrackListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
viewBinding.trackListItemCategoryDescription.setText(categoryDescription);
|
||||
viewBinding.trackListItemCategoryDescription.setVisibility("".equals(categoryDescription) ? View.GONE : View.VISIBLE);
|
||||
|
||||
setSelected(selection.get(getLayoutPosition()));
|
||||
setSelected(selection.get((int) getId()));
|
||||
}
|
||||
|
||||
public void setSelected(boolean isSelected) {
|
||||
|
||||
@@ -113,13 +113,13 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
|
||||
selectionMode = true;
|
||||
actionModeCallback.onPrepare(menu, getCheckedPositions(), getCheckedIds(), true);
|
||||
actionModeCallback.onPrepare(menu, null, getCheckedIds(), true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
|
||||
if (actionModeCallback.onClick(menuItem.getItemId(), getCheckedPositions(), getCheckedIds())) {
|
||||
if (actionModeCallback.onClick(menuItem.getItemId(), null, getCheckedIds())) {
|
||||
actionMode.finish();
|
||||
}
|
||||
return true;
|
||||
@@ -130,37 +130,31 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
selectionMode = false;
|
||||
|
||||
setAllSelected(false);
|
||||
selection.clear();
|
||||
|
||||
actionModeCallback.onDestroy();
|
||||
}
|
||||
|
||||
public void setAllSelected(boolean isSelected) {
|
||||
for (int i = 0; i < getItemCount(); i++) {
|
||||
ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(i);
|
||||
if (isSelected) {
|
||||
for (Marker marker : markers) {
|
||||
selection.put((int) marker.getId().id(), true);
|
||||
}
|
||||
} else {
|
||||
selection.clear();
|
||||
}
|
||||
|
||||
for (int i = 0; i < recyclerView.getChildCount(); i++) {
|
||||
ViewHolder holder = (ViewHolder) recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
|
||||
holder.setSelected(isSelected);
|
||||
}
|
||||
}
|
||||
|
||||
private int[] getCheckedPositions() {
|
||||
List<Integer> positions = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < selection.size(); i++) {
|
||||
if (selection.valueAt(i)) {
|
||||
positions.add(selection.keyAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
return positions.stream().mapToInt(i -> i).toArray();
|
||||
}
|
||||
|
||||
private long[] getCheckedIds() {
|
||||
List<Long> ids = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < selection.size(); i++) {
|
||||
if (selection.valueAt(i)) {
|
||||
ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(selection.keyAt(i));
|
||||
ids.add(holder.getId());
|
||||
ids.add((long) selection.keyAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,11 +203,11 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
String categoryDescription = StringUtils.getCategoryDescription(marker.getCategory(), marker.getDescription());
|
||||
viewBinding.markerListItemTimeDistance.setText(categoryDescription);
|
||||
|
||||
setSelected(selection.get(getLayoutPosition()));
|
||||
setSelected(selection.get((int) getId()));
|
||||
}
|
||||
|
||||
public void setSelected(boolean isSelected) {
|
||||
selection.put(getLayoutPosition(), isSelected);
|
||||
selection.put((int) getId(), isSelected);
|
||||
view.setActivated(isSelected);
|
||||
}
|
||||
|
||||
@@ -235,8 +229,12 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
|
||||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
actionMode = context.startSupportActionMode(MarkerListAdapter.this);
|
||||
setSelected(true);
|
||||
setSelected(!view.isActivated());
|
||||
if (!selectionMode) {
|
||||
actionMode = context.startSupportActionMode(MarkerListAdapter.this);
|
||||
} else {
|
||||
actionMode.invalidate();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,77 +9,16 @@ import android.os.Build;
|
||||
import android.os.VibrationEffect;
|
||||
import android.os.Vibrator;
|
||||
import android.util.Log;
|
||||
import android.util.SparseBooleanArray;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
|
||||
public class ActivityUtils {
|
||||
|
||||
private static final String TAG = ActivityUtils.class.getSimpleName();
|
||||
|
||||
public static void configureListViewContextualMenu(final ListView listView, final ContextualActionModeCallback contextualActionModeCallback) {
|
||||
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
|
||||
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
|
||||
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||
mode.getMenuInflater().inflate(R.menu.list_context_menu, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
||||
contextualActionModeCallback.onPrepare(menu, getCheckedPositions(listView), listView.getCheckedItemIds(), true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyActionMode(ActionMode mode) {
|
||||
contextualActionModeCallback.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
|
||||
mode.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||
if (contextualActionModeCallback.onClick(item.getItemId(), getCheckedPositions(listView), listView.getCheckedItemIds())) {
|
||||
mode.finish();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the checked positions in a list view.
|
||||
*
|
||||
* @param list the list view
|
||||
*/
|
||||
private int[] getCheckedPositions(ListView list) {
|
||||
SparseBooleanArray positions = list.getCheckedItemPositions();
|
||||
ArrayList<Integer> arrayList = new ArrayList<>();
|
||||
for (int i = 0; i < positions.size(); i++) {
|
||||
int key = positions.keyAt(i);
|
||||
if (positions.valueAt(i)) {
|
||||
arrayList.add(key);
|
||||
}
|
||||
}
|
||||
return arrayList.stream().mapToInt(i -> i).toArray();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static SearchView configureSearchWidget(Activity activity, final MenuItem menuItem) {
|
||||
final SearchView searchView = (SearchView) menuItem.getActionView();
|
||||
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
||||
|
||||
@@ -30,7 +30,7 @@ limitations under the License.
|
||||
<string name="activity_type_driving_bus">conducció d\'autobús</string>
|
||||
<string name="activity_type_driving_car">conducció de cotxe</string>
|
||||
<string name="activity_type_ferry">ferri</string>
|
||||
<string name="activity_type_frisbee">frisbee</string>
|
||||
<string name="activity_type_frisbee">el frisbee</string>
|
||||
<string name="activity_type_gliding">ala delta</string>
|
||||
<string name="activity_type_hang_gliding">vol amb ala delta</string>
|
||||
<string name="activity_type_helicopter">helicòpter</string>
|
||||
@@ -75,7 +75,7 @@ limitations under the License.
|
||||
<string name="activity_type_trail_hiking">ruta de senderisme</string>
|
||||
<string name="activity_type_trail_running">cursa de muntanya</string>
|
||||
<string name="activity_type_train">tren</string>
|
||||
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
|
||||
<string name="activity_type_ultimate_frisbee">frisbee definitiu</string>
|
||||
<string name="activity_type_unknown">desconegut</string>
|
||||
<string name="activity_type_wakeboarding">esquí-surf</string>
|
||||
<string name="activity_type_walking">caminar</string>
|
||||
@@ -121,9 +121,9 @@ limitations under the License.
|
||||
<string name="generic_save">Desa</string>
|
||||
<string name="generic_tracks">Rutes</string>
|
||||
<!-- Gps -->
|
||||
<string name="gps_starting">El GPS s\'està iniciant.</string>
|
||||
<string name="gps_wait_for_better_signal">S\'està esperant un senyal GPS de millor qualitat.</string>
|
||||
<string name="gps_wait_for_signal">S\'està esperant el senyal GPS.</string>
|
||||
<string name="gps_starting">S \' està iniciant EL GPS</string>
|
||||
<string name="gps_wait_for_better_signal">Esperant un millor senyal GPS</string>
|
||||
<string name="gps_wait_for_signal">Esperant el senyal GPS</string>
|
||||
<!-- Image -->
|
||||
<string name="image_arrow">Fletxa</string>
|
||||
<string name="image_marker_count">Recompte de marcadors</string>
|
||||
@@ -135,23 +135,23 @@ limitations under the License.
|
||||
<string name="import_progress_message">S\'està important des de %1$s…</string>
|
||||
<!-- Marker -->
|
||||
<string name="marker_add_error">No es pot inserir un marcador. No hi ha senyal del GPS. Torneu-ho a provar.</string>
|
||||
<string name="marker_add_success">S\'ha inserit un marcador.</string>
|
||||
<string name="marker_add_canceled">L\'acció s\'ha cancel·lat. No s\'ha afegit cap marcador.</string>
|
||||
<string name="marker_delete_one_confirm_message">El marcador se suprimirà definitivament del dispositiu.</string>
|
||||
<string name="marker_add_success">S\'ha inserit un marcador</string>
|
||||
<string name="marker_add_canceled">Cancelat, no s \' ha afegit cap marcador</string>
|
||||
<string name="marker_delete_one_confirm_message">El marcador se suprimirà permanentment del dispositiu</string>
|
||||
<string name="marker_delete_one_confirm_title">Voleu suprimir el marcador?</string>
|
||||
<string name="marker_delete_multiple_confirm_message">Els marcadors seleccionats se suprimiran definitivament del dispositiu.</string>
|
||||
<string name="marker_delete_multiple_confirm_message">Els marcadors seleccionats se suprimiran permanentment del dispositiu</string>
|
||||
<string name="marker_name_format">Marcador %1$d</string>
|
||||
<string name="marker_title">%1$d de %2$d</string>
|
||||
<!-- Marker Detail -->
|
||||
<!-- Marker Edit -->
|
||||
<string name="marker_edit_marker_type">Tipus de marcador (p. ex. cascada)</string>
|
||||
<!-- Marker List -->
|
||||
<string name="marker_list_empty_message">No teniu cap marcador.</string>
|
||||
<string name="marker_list_empty_message">No teniu cap marcador</string>
|
||||
<!-- Menu -->
|
||||
<string name="menu_aggregated_statistics">Estadístiques globals</string>
|
||||
<string name="menu_delete">Suprimeix</string>
|
||||
<string name="menu_edit">Edita</string>
|
||||
<string name="menu_export_all">Exporta-ho tot</string>
|
||||
<string name="menu_export_all">Exporta-ho tot (un fitxer per pista)</string>
|
||||
<string name="menu_help">ajuda</string>
|
||||
<string name="menu_import_all">Importa-ho tot</string>
|
||||
<string name="menu_insert_marker">Insereix un marcador</string>
|
||||
@@ -176,7 +176,7 @@ limitations under the License.
|
||||
<string name="settings_chart_by_time">Per temps</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>
|
||||
<string name="settings_recording_max_recording_distance_summary">Es crea un segment nou si la distància entre dues ubicacions és més gran 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">Interval de distàncies</string>
|
||||
<string name="settings_recording_min_recording_interval_title">Interval de temps</string>
|
||||
@@ -188,7 +188,7 @@ limitations under the License.
|
||||
<!-- Settings Reset -->
|
||||
<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>
|
||||
<string name="settings_reset_done">Tots els paràmetres s\'han revertit als valors predeterminats</string>
|
||||
<!-- Settings Sensor -->
|
||||
<!-- Settings Stats -->
|
||||
<string name="settings_stats_rate_title">Mesura preferida</string>
|
||||
@@ -196,7 +196,9 @@ limitations under the License.
|
||||
<string name="settings_stats_units_metric">Sistema mètric (km, m)</string>
|
||||
<string name="settings_stats_units_title">Unitats preferides</string>
|
||||
<!-- Share Track -->
|
||||
<string name="share_track_share_file_body">Crec que aquesta ruta et podria interessar.\n\nLa pots veure amb Google Earth o qualsevol altre programari de mapatge.\n\n%1$s</string>
|
||||
<string name="share_track_share_file_body">Crec que aquesta ruta et podria interessar.
|
||||
\n
|
||||
\n%1$s</string>
|
||||
<string name="share_track_subject">Vull compartir una ruta amb tu</string>
|
||||
<!-- Stats -->
|
||||
<string name="stats_average_moving_pace">Ritme de moviment mitjà</string>
|
||||
@@ -228,7 +230,7 @@ limitations under the License.
|
||||
<string name="track_edit_activity_type">Tipus d\'activitat (p. ex. senderisme)</string>
|
||||
<string name="track_edit_activity_type_hint">Tipus d\'activitat</string>
|
||||
<!-- Track List -->
|
||||
<string name="track_list_empty_message">Comenceu a enregistrar aquí la vostra pròxima aventura.</string>
|
||||
<string name="track_list_empty_message">Comença a gravar la teva propera aventura aquí</string>
|
||||
<!-- Track Widget -->
|
||||
<!-- Tracks -->
|
||||
<!-- Unit -->
|
||||
@@ -308,4 +310,18 @@ limitations under the License.
|
||||
<!-- Share image -->
|
||||
<string name="share_image_subject">Vull compartir una imatge amb tu</string>
|
||||
<string name="share_image_body">Crec que aquesta imatge et podria interessar.</string>
|
||||
<string name="about_libraries">Biblioteques</string>
|
||||
<string name="help_feature_content">* crear pistes GPS
|
||||
\n * utilitzeu un sensor de freqüència cardíaca (Només Bluetooth le)
|
||||
\n * anuncis de veu (per temps o distància)
|
||||
\n * creeu marcadors (incl. imatges)
|
||||
\n * funciona completament fora de línia
|
||||
\n * mostra les pistes en un mapa (vegeu més avall)</string>
|
||||
<string name="about_version_name">Nom de la versió: %1$s</string>
|
||||
<string name="about_preference_title">Sobre OpenTracks</string>
|
||||
<string name="help_track_export_title">Com puc exportar/compartir pistes gravades\?</string>
|
||||
<string name="help_feature_title">OpenTracks té les següents característiques:</string>
|
||||
<string name="help_track_map_title">Com mostrar una pista en un mapa\?</string>
|
||||
<string name="about_version_code">Codi de versió: %1$d</string>
|
||||
<string name="about_third_party_data">Dades de tercers</string>
|
||||
</resources>
|
||||
@@ -535,4 +535,26 @@ limitations under the License.
|
||||
<string name="settings_announcements_statistics_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>
|
||||
<string name="activity_type_workout">treeni</string>
|
||||
<string name="help_data_google_play_services_content">Ei</string>
|
||||
<string name="settings_public_api_package_title">Julkisen API:n paketin nimi</string>
|
||||
<string name="voice_on_device_speaker_title">Käytä laitteen kaiutinta</string>
|
||||
<string name="settings_announcements_average_heart_rate">Keskimääräinen syke</string>
|
||||
<string name="description_pace_nautical">Tahti (min/NM)</string>
|
||||
<string name="settings_stats_units_nautical">Merenkulku (NM, ft)</string>
|
||||
<string name="settings_announcements_lap_heart_rate">Kierroksen syke</string>
|
||||
<string name="no_compatible_camera_installed">Yhteensopivaa kamerasovellusta ei ole asennettu</string>
|
||||
<string name="settings_api_summary">Kaukosäädin ja tilastosovellusliittymä muille sovelluksille</string>
|
||||
<string name="no_compatible_gallery_installed">Yhteensopivaa kuvagalleriasovellusta ei ole asennettu</string>
|
||||
<string name="show_on_dashboard_not_installed">OpenTracks Dashboard API -sovellusliittymää tukevia sovelluksia ei ole asennettu.</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_off">Näytä kaikki löydettävissä olevat Bluetooth-laitteet</string>
|
||||
<string name="settings_api_title">Julkinen API</string>
|
||||
<string name="value_float_mile_hour_recommended">%1$.1f mi/h (suositus)</string>
|
||||
<string name="value_float_kilometer_hour_recommended">%1$.1f km/h (suositus)</string>
|
||||
<string name="sensor_state_cadence_unit">rpm</string>
|
||||
<string name="introduction_osm_dashboard">OpenTracks itsessään ei tarjoa karttaa. Asenna OSMDashboard nähdäksesi tallenteet kartalla.</string>
|
||||
<string name="permission_bluetooth_failed_rejected">Sinun on manuaalisesti myönnettävä OpenTracks-käyttöoikeus lähellä oleville laitteille järjestelmäasetuksissa.</string>
|
||||
<string name="settings_recording_min_required_accuracy_summary">Sijainti ohitetaan, jos sen tarkkuus on suurempi kuin %1$s</string>
|
||||
<string name="value_int_seconds">%1$d s (suositus)</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_title">Suodata Bluetooth-laitteet</string>
|
||||
</resources>
|
||||
@@ -579,4 +579,5 @@ limitations under the License.
|
||||
<string name="voiceIdle">Blir inaktiv.</string>
|
||||
<string name="settings_announcements_idle_title">Inaktivitet</string>
|
||||
<string name="settings_recording_idle_timeout_title">Inaktivitetsterskel</string>
|
||||
<string name="activity_type_kickscooter">sparkesykkel</string>
|
||||
</resources>
|
||||
@@ -232,7 +232,7 @@ limitations under the License.
|
||||
<string name="generic_to">至</string>
|
||||
<string name="generic_today">今日</string>
|
||||
<string name="generic_yesterday">昨日</string>
|
||||
<string name="generic_dismiss">Dismiss</string>
|
||||
<string name="generic_dismiss">關閉</string>
|
||||
<!-- Gps -->
|
||||
<string name="gps_starting">正在啟用 GPS</string>
|
||||
<string name="gps_wait_for_better_signal">正在等待更清晰的 GPS 訊號</string>
|
||||
@@ -247,7 +247,7 @@ limitations under the License.
|
||||
<string name="image_photo_marker">相片標記</string>
|
||||
<string name="image_record">記錄</string>
|
||||
<string name="image_stop">停止</string>
|
||||
<string name="image_discard">Discard</string>
|
||||
<string name="image_discard">丟棄</string>
|
||||
<string name="image_track">蹤跡</string>
|
||||
<!-- Import -->
|
||||
<string name="import_thread_interrupted">執行緒中斷</string>
|
||||
@@ -312,7 +312,6 @@ limitations under the License.
|
||||
<string name="sensor_state_heart_rate">心率</string>
|
||||
<string name="sensor_state_heart_rate_avg">平均心率</string>
|
||||
<string name="sensor_state_heart_rate_max">最大心率</string>
|
||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||
<string name="sensor_state_power">功率</string>
|
||||
<string name="sensor_state_power_avg">平均功率</string>
|
||||
<string name="sensor_could_not_scan">無法掃描藍牙裝置 (錯誤 %1$i).</string>
|
||||
@@ -419,8 +418,10 @@ limitations under the License.
|
||||
<string name="settings_export_section">匯出</string>
|
||||
<string name="settings_prevent_reimport_tracks_title">防止重新匯入蹤跡</string>
|
||||
<!-- Share Track -->
|
||||
<string name="share_track_share_file_body">你應該會喜歡這個蹤跡。\n\n請使用 Google 地球或其他地圖繪製軟體查看蹤跡。\n\n%1$s</string>
|
||||
<string name="share_track_subject">我想跟你分享蹤跡資訊。</string>
|
||||
<string name="share_track_share_file_body">我想您應該會對這個路線感興趣。
|
||||
\n
|
||||
\n%1$s</string>
|
||||
<string name="share_track_subject">我想跟你分享蹤跡資訊</string>
|
||||
<!-- Stats -->
|
||||
<string name="stats_average_moving_pace">平均移動步速</string>
|
||||
<string name="stats_average_moving_speed">平均移動速度</string>
|
||||
@@ -599,4 +600,20 @@ limitations under the License.
|
||||
<string name="no_compatible_camera_installed">沒有安裝相容的攝影機應用程式</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_title">篩選藍芽裝置</string>
|
||||
<string name="settings_sensor_bluetooth_service_filter_off">顯示所有可發現的藍芽裝置</string>
|
||||
<string name="voiceDistanceNauticalMilesPlural">{ n, plural, other {{n,number,#.0} 海里} }</string>
|
||||
<string name="voiceMinutesPlural">{ n, plural, other {{n} 分鐘} }</string>
|
||||
<string name="settings_announcements_idle_category_title">閒置播報</string>
|
||||
<string name="voiceSpeedMilesPerHourPlural">{ n, plural, other {每小時 {n,number,#.0} 英里} }</string>
|
||||
<string name="voiceDistanceMilesPlural">{ n, plural, other {{n,number,#.0} 英里} }</string>
|
||||
<string name="voiceSpeedKilometersPerHourPlural">{ n, plural, other {每小時 {n,number,#.0} 公里} }</string>
|
||||
<string name="sensor_state_power_max">最大功率</string>
|
||||
<string name="activity_type_kickscooter">速克達</string>
|
||||
<string name="voiceSecondsPlural">{ n, plural, other {{n} 秒} }</string>
|
||||
<string name="voiceIdle">正在閒置。</string>
|
||||
<string name="voiceHoursPlural">{ n, plural, other {{n} 小時} }</string>
|
||||
<string name="settings_announcements_idle_title">閒置</string>
|
||||
<string name="settings_recording_idle_timeout_title">閒置閾值</string>
|
||||
<string name="voiceSpeedMKnotsPlural">{ n, plural, other {{n,number,#.0} 節} }</string>
|
||||
<string name="value_int_seconds">%1$d s (建議值)</string>
|
||||
<string name="voiceDistanceKilometersPlural">{ n, plural, other {{n,number,#.0} 公里} }</string>
|
||||
</resources>
|
||||
@@ -271,6 +271,9 @@
|
||||
<string name="show_introduction_screen_key" translatable="false">showIntroduction</string>
|
||||
<bool name="show_introduction_screen_default">true</bool>
|
||||
|
||||
<string name="settings_ui_dynamic_colors_key" translatable="false">uiDynamicColors</string>
|
||||
<bool name="settings_ui_dynamic_colors_default" translatable="false">false</bool>
|
||||
|
||||
<!-- androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode() -->
|
||||
<string name="night_mode_key" translatable="false">nightMode</string>
|
||||
<string name="night_mode_default" translatable="false">@string/night_mode_system_value</string>
|
||||
|
||||
@@ -373,6 +373,9 @@ limitations under the License.
|
||||
<string name="settings_chart_by_distance">By distance</string>
|
||||
<string name="settings_chart_by_time">By time</string>
|
||||
<!-- Settings Recording -->
|
||||
<string name="settings_recording_title">Recording</string>
|
||||
<string name="settings_ui_dynamic_colors_title">Dynamic Colors</string>
|
||||
<string name="settings_ui_dynamic_colors_summary">Use user-defined Dynamic Colors (Android 12+ only; requires a manual restart)</string>
|
||||
<string name="settings_recording_customize_layout_title">Customize your recording layout</string>
|
||||
<string name="settings_recording_customize_layout_select_columns">Data fields per row</string>
|
||||
<string name="settings_recording_show_on_lockscreen_while_recording_title">Show statistics on lockscreen</string>
|
||||
@@ -407,6 +410,8 @@ limitations under the License.
|
||||
<string name="settings_announcements_lap_speed_pace">Lap speed/pace</string>
|
||||
|
||||
<!-- Custom Layout -->
|
||||
|
||||
|
||||
<string name="custom_layout_list_title">Layouts</string>
|
||||
<string name="custom_layout_list_edit_name">Type layout\'s name to add</string>
|
||||
<string name="custom_layout_list_edit_already_exists">Layout\'s name already exists</string>
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="@bool/voice_announce_idle_default"
|
||||
android:key="@string/voice_announce_idle_key"
|
||||
android:title="@string/settings_announcements_idle_title" />
|
||||
android:defaultValue="@bool/voice_announce_total_distance_default"
|
||||
android:key="@string/voice_announce_total_distance_key"
|
||||
android:title="@string/total_distance" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="@bool/voice_announce_moving_time_default"
|
||||
|
||||
@@ -12,36 +12,11 @@
|
||||
android:title="@string/settings_night_mode_title"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<Preference
|
||||
app:key="@string/stats_custom_layout_key"
|
||||
app:title="@string/settings_recording_customize_layout_title" />
|
||||
|
||||
<de.dennisguse.opentracks.settings.ResetDialogPreference
|
||||
android:dialogMessage="@string/settings_layout_reset_confirm_message"
|
||||
android:dialogTitle="@string/settings_layout_reset_confirm_title"
|
||||
android:key="@string/settings_layout_reset_key"
|
||||
android:negativeButtonText="@android:string/cancel"
|
||||
android:persistent="false"
|
||||
android:positiveButtonText="@android:string/ok"
|
||||
android:title="@string/settings_layout_reset" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_show_on_lockscreen_while_recording_default"
|
||||
android:key="@string/stats_show_on_lockscreen_while_recording_key"
|
||||
android:summary="@string/settings_recording_show_on_lockscreen_while_recording_summary"
|
||||
android:title="@string/settings_recording_show_on_lockscreen_while_recording_title" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_keep_screen_on_while_recording_default"
|
||||
android:key="@string/stats_keep_screen_on_while_recording_key"
|
||||
android:summary="@string/settings_recording_keep_screen_on_while_recording_summary"
|
||||
android:title="@string/settings_recording_keep_screen_on_while_recording_title" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_fullscreen_while_recording_default"
|
||||
android:key="@string/stats_fullscreen_while_recording_key"
|
||||
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
|
||||
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
|
||||
android:defaultValue="@bool/settings_ui_dynamic_colors_default"
|
||||
android:key="@string/settings_ui_dynamic_colors_key"
|
||||
android:summary="@string/settings_ui_dynamic_colors_summary"
|
||||
android:title="@string/settings_ui_dynamic_colors_title" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="@string/show_on_map_format_ask"
|
||||
@@ -49,4 +24,38 @@
|
||||
android:title="@string/select_show_on_map_behavior"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_recording_title">
|
||||
|
||||
<Preference
|
||||
app:key="@string/stats_custom_layout_key"
|
||||
app:title="@string/settings_recording_customize_layout_title" />
|
||||
|
||||
<de.dennisguse.opentracks.settings.ResetDialogPreference
|
||||
android:dialogMessage="@string/settings_layout_reset_confirm_message"
|
||||
android:dialogTitle="@string/settings_layout_reset_confirm_title"
|
||||
android:key="@string/settings_layout_reset_key"
|
||||
android:negativeButtonText="@android:string/cancel"
|
||||
android:persistent="false"
|
||||
android:positiveButtonText="@android:string/ok"
|
||||
android:title="@string/settings_layout_reset" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_show_on_lockscreen_while_recording_default"
|
||||
android:key="@string/stats_show_on_lockscreen_while_recording_key"
|
||||
android:summary="@string/settings_recording_show_on_lockscreen_while_recording_summary"
|
||||
android:title="@string/settings_recording_show_on_lockscreen_while_recording_title" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_keep_screen_on_while_recording_default"
|
||||
android:key="@string/stats_keep_screen_on_while_recording_key"
|
||||
android:summary="@string/settings_recording_keep_screen_on_while_recording_summary"
|
||||
android:title="@string/settings_recording_keep_screen_on_while_recording_title" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="@bool/stats_fullscreen_while_recording_default"
|
||||
android:key="@string/stats_fullscreen_while_recording_key"
|
||||
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
|
||||
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
Reference in New Issue
Block a user